From 9bc28b88e52e1146c355069b66bccec78c345d65 Mon Sep 17 00:00:00 2001 From: fred Date: Mon, 2 Apr 2018 08:29:19 +0200 Subject: [PATCH] Dev-827-0.0.8.1 --- CHANGES-DEV.MD | 28 + LICENSE | 674 +++ README.md | 55 + core/core.js.php | 350 ++ core/core.php | 2864 ++++++++++++ core/layout/blank.css | 19 + core/layout/blank.php | 20 + core/layout/common.css | 1019 +++++ core/layout/light.css | 20 + core/layout/light.php | 24 + core/layout/mail.php | 127 + core/layout/main.php | 155 + core/module/config/config.php | 265 ++ core/module/config/view/index/index.php | 137 + core/module/install/install.php | 198 + core/module/install/view/index/index.js.php | 36 + core/module/install/view/index/index.php | 46 + core/module/install/view/update/update.js.php | 63 + core/module/install/view/update/update.php | 29 + core/module/maintenance/maintenance.php | 33 + core/module/maintenance/view/index/index.php | 10 + core/module/page/page.php | 239 + core/module/page/view/edit/edit.js.php | 102 + core/module/page/view/edit/edit.php | 137 + core/module/sitemap/sitemap.php | 32 + core/module/sitemap/view/index/index.php | 14 + core/module/theme/resource/custom.css | 126 + core/module/theme/theme.php | 412 ++ .../theme/view/advanced/advanced.js.php | 34 + core/module/theme/view/advanced/advanced.php | 31 + core/module/theme/view/body/body.js.php | 43 + core/module/theme/view/body/body.php | 67 + core/module/theme/view/footer/footer.js.php | 78 + core/module/theme/view/footer/footer.php | 104 + core/module/theme/view/header/header.js.php | 119 + core/module/theme/view/header/header.php | 143 + core/module/theme/view/index/index.css | 48 + core/module/theme/view/index/index.js.php | 75 + core/module/theme/view/index/index.php | 49 + core/module/theme/view/menu/menu.js.php | 97 + core/module/theme/view/menu/menu.php | 106 + core/module/theme/view/site/site.js.php | 53 + core/module/theme/view/site/site.php | 134 + core/module/user/user.php | 412 ++ core/module/user/view/add/add.js.php | 44 + core/module/user/view/add/add.php | 79 + core/module/user/view/edit/edit.js.php | 19 + core/module/user/view/edit/edit.php | 101 + core/module/user/view/forgot/forgot.php | 20 + core/module/user/view/index/index.js.php | 21 + core/module/user/view/index/index.php | 18 + core/module/user/view/login/login.php | 39 + core/module/user/view/reset/reset.php | 21 + core/vendor/codemirror/codemirror.min.css | 1 + core/vendor/codemirror/codemirror.min.js | 7 + core/vendor/codemirror/inc.json | 7 + core/vendor/codemirror/init.css | 4 + core/vendor/codemirror/init.js | 18 + core/vendor/codemirror/mode/css.min.js | 2 + core/vendor/filemanager/UploadHandler.php | 1543 +++++++ core/vendor/filemanager/ajax_calls.php | 703 +++ core/vendor/filemanager/callback.js | 7 + core/vendor/filemanager/config/.htaccess | 1 + core/vendor/filemanager/config/config.php | 451 ++ .../css/jquery.fileupload-noscript.css | 22 + .../css/jquery.fileupload-ui-noscript.css | 17 + .../filemanager/css/jquery.fileupload-ui.css | 53 + .../filemanager/css/jquery.fileupload.css | 37 + core/vendor/filemanager/css/rtl-style.css | Bin 0 -> 6224 bytes core/vendor/filemanager/css/style.css | 40 + core/vendor/filemanager/dialog.php | 1224 +++++ core/vendor/filemanager/execute.php | 528 +++ core/vendor/filemanager/force_download.php | 151 + .../filemanager/img/clipboard_apply.png | Bin 0 -> 189 bytes .../filemanager/img/clipboard_clear.png | Bin 0 -> 195 bytes core/vendor/filemanager/img/copy.png | Bin 0 -> 238 bytes core/vendor/filemanager/img/cut.png | Bin 0 -> 173 bytes core/vendor/filemanager/img/date.png | Bin 0 -> 611 bytes core/vendor/filemanager/img/dimension.png | Bin 0 -> 489 bytes core/vendor/filemanager/img/down.png | Bin 0 -> 163 bytes core/vendor/filemanager/img/download.png | Bin 0 -> 674 bytes core/vendor/filemanager/img/duplicate.png | Bin 0 -> 245 bytes core/vendor/filemanager/img/edit_img.png | Bin 0 -> 673 bytes core/vendor/filemanager/img/file_edit.png | Bin 0 -> 764 bytes .../img/glyphicons-halflings-white.png | Bin 0 -> 8583 bytes .../filemanager/img/glyphicons-halflings.png | Bin 0 -> 15602 bytes core/vendor/filemanager/img/ico/ac3.jpg | Bin 0 -> 1692 bytes core/vendor/filemanager/img/ico/accdb.jpg | Bin 0 -> 2613 bytes core/vendor/filemanager/img/ico/ade.jpg | Bin 0 -> 2290 bytes core/vendor/filemanager/img/ico/adp.jpg | Bin 0 -> 2290 bytes core/vendor/filemanager/img/ico/ai.jpg | Bin 0 -> 1776 bytes core/vendor/filemanager/img/ico/aiff.jpg | Bin 0 -> 1717 bytes core/vendor/filemanager/img/ico/avi.jpg | Bin 0 -> 1548 bytes core/vendor/filemanager/img/ico/bmp.jpg | Bin 0 -> 1979 bytes core/vendor/filemanager/img/ico/c4d.jpg | Bin 0 -> 6241 bytes core/vendor/filemanager/img/ico/css.jpg | Bin 0 -> 1722 bytes core/vendor/filemanager/img/ico/csv.jpg | Bin 0 -> 2558 bytes core/vendor/filemanager/img/ico/default.jpg | Bin 0 -> 1723 bytes core/vendor/filemanager/img/ico/dmg.jpg | Bin 0 -> 1579 bytes core/vendor/filemanager/img/ico/doc.jpg | Bin 0 -> 2511 bytes core/vendor/filemanager/img/ico/docx.jpg | Bin 0 -> 2511 bytes core/vendor/filemanager/img/ico/dwg.jpg | Bin 0 -> 5457 bytes core/vendor/filemanager/img/ico/dxf.jpg | Bin 0 -> 5419 bytes core/vendor/filemanager/img/ico/favicon.ico | Bin 0 -> 1150 bytes core/vendor/filemanager/img/ico/fla.jpg | Bin 0 -> 1859 bytes core/vendor/filemanager/img/ico/flv.jpg | Bin 0 -> 1806 bytes core/vendor/filemanager/img/ico/folder.png | Bin 0 -> 737 bytes .../filemanager/img/ico/folder_back.png | Bin 0 -> 1128 bytes core/vendor/filemanager/img/ico/gif.jpg | Bin 0 -> 1979 bytes core/vendor/filemanager/img/ico/gz.jpg | Bin 0 -> 1718 bytes core/vendor/filemanager/img/ico/html.jpg | Bin 0 -> 2152 bytes core/vendor/filemanager/img/ico/iso.jpg | Bin 0 -> 1496 bytes core/vendor/filemanager/img/ico/jpeg.jpg | Bin 0 -> 1960 bytes core/vendor/filemanager/img/ico/jpg.jpg | Bin 0 -> 1979 bytes core/vendor/filemanager/img/ico/log.jpg | Bin 0 -> 1765 bytes core/vendor/filemanager/img/ico/m4a.jpg | Bin 0 -> 1529 bytes core/vendor/filemanager/img/ico/mdb.jpg | Bin 0 -> 2613 bytes core/vendor/filemanager/img/ico/mid.jpg | Bin 0 -> 1630 bytes core/vendor/filemanager/img/ico/mov.jpg | Bin 0 -> 1574 bytes core/vendor/filemanager/img/ico/mp3.jpg | Bin 0 -> 1555 bytes core/vendor/filemanager/img/ico/mp4.jpg | Bin 0 -> 1529 bytes core/vendor/filemanager/img/ico/mpeg.jpg | Bin 0 -> 1589 bytes core/vendor/filemanager/img/ico/mpg.jpg | Bin 0 -> 1532 bytes core/vendor/filemanager/img/ico/odb.jpg | Bin 0 -> 1748 bytes core/vendor/filemanager/img/ico/odf.jpg | Bin 0 -> 1760 bytes core/vendor/filemanager/img/ico/odg.jpg | Bin 0 -> 1748 bytes core/vendor/filemanager/img/ico/odp.jpg | Bin 0 -> 1760 bytes core/vendor/filemanager/img/ico/ods.jpg | Bin 0 -> 1748 bytes core/vendor/filemanager/img/ico/odt.jpg | Bin 0 -> 1748 bytes core/vendor/filemanager/img/ico/ogg.jpg | Bin 0 -> 1557 bytes core/vendor/filemanager/img/ico/otg.jpg | Bin 0 -> 1759 bytes core/vendor/filemanager/img/ico/otp.jpg | Bin 0 -> 1870 bytes core/vendor/filemanager/img/ico/ots.jpg | Bin 0 -> 1748 bytes core/vendor/filemanager/img/ico/ott.jpg | Bin 0 -> 1748 bytes core/vendor/filemanager/img/ico/pdf.jpg | Bin 0 -> 2050 bytes core/vendor/filemanager/img/ico/png.jpg | Bin 0 -> 1979 bytes core/vendor/filemanager/img/ico/ppt.jpg | Bin 0 -> 2386 bytes core/vendor/filemanager/img/ico/pptx.jpg | Bin 0 -> 2479 bytes core/vendor/filemanager/img/ico/psd.jpg | Bin 0 -> 2110 bytes core/vendor/filemanager/img/ico/rar.jpg | Bin 0 -> 1718 bytes core/vendor/filemanager/img/ico/rtf.jpg | Bin 0 -> 2511 bytes core/vendor/filemanager/img/ico/skp.jpg | Bin 0 -> 6347 bytes core/vendor/filemanager/img/ico/sql.jpg | Bin 0 -> 1695 bytes core/vendor/filemanager/img/ico/stp.jpg | Bin 0 -> 5539 bytes core/vendor/filemanager/img/ico/svg.jpg | Bin 0 -> 1979 bytes core/vendor/filemanager/img/ico/tar.jpg | Bin 0 -> 1747 bytes core/vendor/filemanager/img/ico/tiff.jpg | Bin 0 -> 1953 bytes core/vendor/filemanager/img/ico/txt.jpg | Bin 0 -> 1765 bytes core/vendor/filemanager/img/ico/vwx.jpg | Bin 0 -> 5463 bytes core/vendor/filemanager/img/ico/wav.jpg | Bin 0 -> 1557 bytes core/vendor/filemanager/img/ico/webm.jpg | Bin 0 -> 1548 bytes core/vendor/filemanager/img/ico/wma.jpg | Bin 0 -> 1548 bytes core/vendor/filemanager/img/ico/xhtml.jpg | Bin 0 -> 1920 bytes core/vendor/filemanager/img/ico/xls.jpg | Bin 0 -> 2691 bytes core/vendor/filemanager/img/ico/xlsx.jpg | Bin 0 -> 2539 bytes core/vendor/filemanager/img/ico/xml.jpg | Bin 0 -> 1714 bytes core/vendor/filemanager/img/ico/zip.jpg | Bin 0 -> 1718 bytes core/vendor/filemanager/img/info.png | Bin 0 -> 345 bytes core/vendor/filemanager/img/key.png | Bin 0 -> 185 bytes core/vendor/filemanager/img/label.png | Bin 0 -> 479 bytes core/vendor/filemanager/img/loading.gif | Bin 0 -> 1688 bytes core/vendor/filemanager/img/logo.png | Bin 0 -> 24774 bytes core/vendor/filemanager/img/preview.png | Bin 0 -> 376 bytes core/vendor/filemanager/img/processing.gif | Bin 0 -> 3209 bytes core/vendor/filemanager/img/rename.png | Bin 0 -> 262 bytes core/vendor/filemanager/img/size.png | Bin 0 -> 660 bytes core/vendor/filemanager/img/sort.png | Bin 0 -> 584 bytes .../filemanager/img/storing_animation.gif | Bin 0 -> 3887 bytes core/vendor/filemanager/img/trans.jpg | Bin 0 -> 4024 bytes core/vendor/filemanager/img/up.png | Bin 0 -> 163 bytes core/vendor/filemanager/img/upload.png | Bin 0 -> 324 bytes core/vendor/filemanager/img/url.png | Bin 0 -> 593 bytes core/vendor/filemanager/img/zip.png | Bin 0 -> 819 bytes core/vendor/filemanager/inc.json | 3 + core/vendor/filemanager/include/FtpClient.php | 884 ++++ .../filemanager/include/FtpException.php | 20 + .../vendor/filemanager/include/FtpWrapper.php | 115 + core/vendor/filemanager/include/Response.php | 365 ++ core/vendor/filemanager/include/ftp_class.php | 82 + .../filemanager/include/mime_type_lib.php | 266 ++ .../include/php_image_magician.php | 3785 +++++++++++++++ core/vendor/filemanager/include/utils.php | 1168 +++++ .../js/cors/jquery.postmessage-transport.js | 126 + .../js/cors/jquery.xdr-transport.js | 89 + .../filemanager/js/include.commercial.js | 2 + core/vendor/filemanager/js/include.js | 2 + .../filemanager/js/jPlayer/MIT-LICENSE.txt | 21 + core/vendor/filemanager/js/jPlayer/README.md | 32 + .../js/jPlayer/actionscript/Jplayer.as | 638 +++ .../js/jPlayer/actionscript/Jplayer.fla | Bin 0 -> 61952 bytes .../happyworm/jPlayer/ConnectManager.as | 295 ++ .../happyworm/jPlayer/JplayerEvent.as | 68 + .../happyworm/jPlayer/JplayerMp3.as | 367 ++ .../happyworm/jPlayer/JplayerMp4.as | 412 ++ .../happyworm/jPlayer/JplayerRtmp.as | 983 ++++ .../happyworm/jPlayer/JplayerStatus.as | 110 + .../happyworm/jPlayer/TraceOut.as | 62 + .../js/jPlayer/add-on/jplayer.playlist.js | 496 ++ .../js/jPlayer/add-on/jplayer.playlist.min.js | 2 + .../add-on/jquery.jplayer.inspector.js | 338 ++ .../add-on/jquery.jplayer.inspector.min.js | 2 + .../js/jPlayer/jplayer.jquery.json | 33 + .../js/jPlayer/jplayer/jquery.jplayer.js | 3506 ++++++++++++++ .../js/jPlayer/jplayer/jquery.jplayer.min.js | 3 + .../js/jPlayer/jplayer/jquery.jplayer.swf | Bin 0 -> 13714 bytes .../js/jPlayer/jquery.jplayer/Jplayer.swf | Bin 0 -> 14085 bytes .../jPlayer/jquery.jplayer/jquery.jplayer.js | 2840 ++++++++++++ .../filemanager/js/jPlayer/package.json | 27 + .../js/jPlayer/popcorn/popcorn.jplayer.js | 579 +++ .../js/jPlayer/popcorn/popcorn.jplayer.min.js | 2 + .../blue.monday/css/jplayer.blue.monday.css | 551 +++ .../css/jplayer.blue.monday.min.css | 1 + .../blue.monday/image/jplayer.blue.monday.jpg | Bin 0 -> 23189 bytes .../image/jplayer.blue.monday.seeking.gif | Bin 0 -> 3284 bytes .../image/jplayer.blue.monday.video.play.png | Bin 0 -> 17692 bytes .../skin/blue.monday/jplayer.blue.monday.css | 640 +++ .../skin/blue.monday/jplayer.blue.monday.jpg | Bin 0 -> 23189 bytes .../jplayer.blue.monday.seeking.gif | Bin 0 -> 3284 bytes .../jplayer.blue.monday.video.play.png | Bin 0 -> 17692 bytes .../jplayer.blue.monday.audio.playlist.html | 42 + .../jplayer.blue.monday.audio.single.html | 37 + .../jplayer.blue.monday.audio.stream.html | 24 + .../jplayer.blue.monday.video.playlist.html | 52 + .../jplayer.blue.monday.video.single.html | 43 + .../jPlayer/skin/blue.monday/skin.handlebars | 40 + .../skin/pink.flag/css/jplayer.pink.flag.css | 572 +++ .../pink.flag/css/jplayer.pink.flag.min.css | 1 + .../pink.flag/image/jplayer.pink.flag.jpg | Bin 0 -> 18426 bytes .../image/jplayer.pink.flag.seeking.gif | Bin 0 -> 3284 bytes .../image/jplayer.pink.flag.video.play.png | Bin 0 -> 17692 bytes .../jplayer.pink.flag.audio.playlist.html | 42 + .../jplayer.pink.flag.audio.single.html | 37 + .../jplayer.pink.flag.audio.stream.html | 24 + .../jplayer.pink.flag.video.playlist.html | 52 + .../jplayer.pink.flag.video.single.html | 43 + .../blue.monday/jplayer.blue.monday.css | 640 +++ .../blue.monday/jplayer.blue.monday.jpg | Bin 0 -> 23189 bytes .../jplayer.blue.monday.seeking.gif | Bin 0 -> 3284 bytes .../jplayer.blue.monday.video.play.png | Bin 0 -> 17692 bytes .../skin_ol/blue.monday/skin.handlebars | 40 + .../skin_ol/pink.flag/jplayer.pink.flag.css | 670 +++ .../skin_ol/pink.flag/jplayer.pink.flag.jpg | Bin 0 -> 18426 bytes .../pink.flag/jplayer.pink.flag.seeking.gif | Bin 0 -> 3284 bytes .../jplayer.pink.flag.video.play.png | Bin 0 -> 17692 bytes .../js/jquery.fileupload-angular.js | 437 ++ .../filemanager/js/jquery.fileupload-audio.js | 113 + .../filemanager/js/jquery.fileupload-image.js | 326 ++ .../js/jquery.fileupload-jquery-ui.js | 161 + .../js/jquery.fileupload-process.js | 178 + .../filemanager/js/jquery.fileupload-ui.js | 714 +++ .../js/jquery.fileupload-validate.js | 125 + .../filemanager/js/jquery.fileupload-video.js | 113 + .../filemanager/js/jquery.fileupload.js | 1482 ++++++ .../filemanager/js/jquery.iframe-transport.js | 224 + .../vendor/filemanager/js/modernizr.custom.js | 1 + core/vendor/filemanager/js/plugins.js | 3 + .../filemanager/js/vendor/jquery.ui.widget.js | 572 +++ core/vendor/filemanager/lang/fr_FR.php | 143 + core/vendor/filemanager/lang/languages.php | 41 + core/vendor/filemanager/plugin.min.js | 1 + core/vendor/filemanager/upload.php | 141 + core/vendor/flatpickr/flatpickr.min.css | 13 + core/vendor/flatpickr/flatpickr.min.js | 2 + core/vendor/flatpickr/inc.json | 6 + core/vendor/flatpickr/init.js | 13 + core/vendor/flatpickr/l10n/fr.js | 75 + core/vendor/jquery/inc.json | 3 + core/vendor/jquery/jquery.min.js | 2 + core/vendor/lity/inc.json | 4 + core/vendor/lity/lity.min.css | 3 + core/vendor/lity/lity.min.js | 4 + core/vendor/normalize/inc.json | 3 + core/vendor/normalize/normalize.min.css | 1 + core/vendor/phpmailer/.htaccess | 3 + core/vendor/phpmailer/phpmailer.php | 4039 +++++++++++++++++ core/vendor/tinycolorpicker/inc.json | 4 + core/vendor/tinycolorpicker/init.js | 26 + .../tinycolorpicker/tinycolorpicker.min.js | 3 + core/vendor/tinymce/content.css | 85 + core/vendor/tinymce/inc.json | 6 + core/vendor/tinymce/init.css | 45 + core/vendor/tinymce/init.js | 125 + core/vendor/tinymce/jquery.tinymce.min.js | 1 + core/vendor/tinymce/langs/fr_FR.js | 260 ++ .../tinymce/plugins/advlist/plugin.min.js | 1 + .../tinymce/plugins/anchor/plugin.min.js | 1 + .../tinymce/plugins/autolink/plugin.min.js | 1 + .../tinymce/plugins/autoresize/plugin.min.js | 1 + .../tinymce/plugins/autosave/plugin.min.js | 1 + .../vendor/tinymce/plugins/code/plugin.min.js | 1 + .../tinymce/plugins/codesample/plugin.min.js | 1 + .../tinymce/plugins/colorpicker/plugin.min.js | 1 + .../tinymce/plugins/contextmenu/plugin.min.js | 1 + .../tinymce/plugins/fullscreen/plugin.min.js | 1 + core/vendor/tinymce/plugins/hr/plugin.min.js | 1 + .../tinymce/plugins/image/plugin.min.js | 1 + .../tinymce/plugins/imagetools/plugin.min.js | 1 + .../vendor/tinymce/plugins/link/plugin.min.js | 1 + .../tinymce/plugins/lists/plugin.min.js | 1 + .../tinymce/plugins/media/plugin.min.js | 1 + .../tinymce/plugins/paste/plugin.min.js | 1 + .../plugins/searchreplace/plugin.min.js | 1 + .../plugins/stickytoolbar/plugin.min.js | 1 + .../tinymce/plugins/tabfocus/plugin.min.js | 1 + .../tinymce/plugins/table/plugin.min.js | 1 + .../tinymce/plugins/template/plugin.min.js | 1 + .../tinymce/plugins/textcolor/plugin.min.js | 1 + .../skins/lightgray/content.inline.min.css | 1 + .../tinymce/skins/lightgray/content.min.css | 1 + .../skins/lightgray/content.mobile.min.css | 1 + .../skins/lightgray/fonts/tinymce-mobile.woff | Bin 0 -> 4624 bytes .../skins/lightgray/fonts/tinymce-small.eot | Bin 0 -> 9492 bytes .../skins/lightgray/fonts/tinymce-small.svg | 63 + .../skins/lightgray/fonts/tinymce-small.ttf | Bin 0 -> 9304 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 0 -> 9380 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 0 -> 18808 bytes .../tinymce/skins/lightgray/fonts/tinymce.svg | 131 + .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 0 -> 18644 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 0 -> 18720 bytes .../tinymce/skins/lightgray/img/anchor.gif | Bin 0 -> 53 bytes .../tinymce/skins/lightgray/img/loader.gif | Bin 0 -> 2608 bytes .../tinymce/skins/lightgray/img/object.gif | Bin 0 -> 152 bytes .../tinymce/skins/lightgray/img/trans.gif | Bin 0 -> 43 bytes .../tinymce/skins/lightgray/skin.min.css | 1 + .../skins/lightgray/skin.mobile.min.css | 2 + core/vendor/tinymce/templates/block.html | 4 + core/vendor/tinymce/templates/col10-2.html | 8 + core/vendor/tinymce/templates/col2-10.html | 8 + core/vendor/tinymce/templates/col3.html | 14 + core/vendor/tinymce/templates/col4-8.html | 8 + core/vendor/tinymce/templates/col4.html | 11 + core/vendor/tinymce/templates/col6.html | 8 + core/vendor/tinymce/templates/col8-4.html | 8 + .../vendor/tinymce/themes/mobile/theme.min.js | 1 + .../vendor/tinymce/themes/modern/theme.min.js | 1 + core/vendor/tinymce/tinymce.min.js | 2 + core/vendor/tippy/inc.json | 5 + core/vendor/tippy/init.js | 14 + core/vendor/tippy/tippy.min.css | 1 + core/vendor/tippy/tippy.min.js | 1 + core/vendor/zwiico/css/zwiico.min.css | 1 + core/vendor/zwiico/font/zwiico.eot | Bin 0 -> 14520 bytes core/vendor/zwiico/font/zwiico.svg | 78 + core/vendor/zwiico/font/zwiico.ttf | Bin 0 -> 14360 bytes core/vendor/zwiico/font/zwiico.woff | Bin 0 -> 9152 bytes core/vendor/zwiico/font/zwiico.woff2 | Bin 0 -> 7812 bytes core/vendor/zwiico/inc.json | 4 + core/vendor/zwiico/init.css | 94 + index.php | 29 + module/blog/blog.php | 359 ++ module/blog/view/add/add.js.php | 19 + module/blog/view/add/add.php | 72 + module/blog/view/article/article.css | 13 + module/blog/view/article/article.js.php | 43 + module/blog/view/article/article.php | 94 + module/blog/view/comment/comment.js.php | 21 + module/blog/view/comment/comment.php | 16 + module/blog/view/config/config.js.php | 21 + module/blog/view/config/config.php | 29 + module/blog/view/edit/edit.js.php | 19 + module/blog/view/edit/edit.php | 77 + module/blog/view/index/index.css | 20 + module/blog/view/index/index.php | 35 + module/form/form.php | 237 + .../vendor/html-sortable/html-sortable.min.js | 1 + module/form/vendor/html-sortable/inc.json | 3 + module/form/view/config/config.css | 3 + module/form/view/config/config.js.php | 161 + module/form/view/config/config.php | 123 + module/form/view/data/data.js.php | 21 + module/form/view/data/data.php | 12 + module/form/view/index/index.php | 50 + module/gallery/gallery.php | 287 ++ module/gallery/vendor/simplelightbox/inc.json | 5 + module/gallery/vendor/simplelightbox/init.css | 9 + .../simplelightbox/simplelightbox.min.css | 1 + .../simplelightbox/simplelightbox.min.js | 6 + module/gallery/view/config/config.css | 4 + module/gallery/view/config/config.js.php | 61 + module/gallery/view/config/config.php | 46 + module/gallery/view/edit/edit.js.php | 51 + module/gallery/view/edit/edit.php | 43 + module/gallery/view/gallery/gallery.css | 24 + module/gallery/view/gallery/gallery.js.php | 20 + module/gallery/view/gallery/gallery.php | 33 + module/gallery/view/index/index.css | 24 + module/gallery/view/index/index.php | 24 + module/news/news.php | 221 + module/news/view/add/add.js.php | 19 + module/news/view/add/add.php | 61 + module/news/view/config/config.js.php | 21 + module/news/view/config/config.php | 23 + module/news/view/edit/edit.js.php | 19 + module/news/view/edit/edit.php | 63 + module/news/view/index/index.php | 20 + module/redirection/redirection.php | 72 + module/redirection/view/config/config.php | 37 + module/redirection/view/index/index.js.php | 14 + module/redirection/view/index/index.php | 1 + site/backup/.htaccess | 3 + site/data/.htaccess | 5 + site/data/custom.css | 126 + site/data/theme.css | 1 + site/file/source/favicon.ico | Bin 0 -> 5430 bytes site/file/source/gallery/landscape/desert.jpg | Bin 0 -> 131426 bytes .../file/source/gallery/landscape/iceberg.jpg | Bin 0 -> 204017 bytes site/file/source/gallery/landscape/meadow.jpg | Bin 0 -> 163569 bytes site/file/source/gallery/space/cosmos.jpg | Bin 0 -> 164249 bytes site/file/source/gallery/space/earth.jpg | Bin 0 -> 162452 bytes site/file/source/gallery/space/nebula.jpg | Bin 0 -> 124112 bytes site/file/thumb/gallery/landscape/desert.jpg | Bin 0 -> 3142 bytes site/file/thumb/gallery/landscape/iceberg.jpg | Bin 0 -> 3619 bytes site/file/thumb/gallery/landscape/meadow.jpg | Bin 0 -> 3532 bytes site/file/thumb/gallery/space/cosmos.jpg | Bin 0 -> 1767 bytes site/file/thumb/gallery/space/earth.jpg | Bin 0 -> 2426 bytes site/file/thumb/gallery/space/nebula.jpg | Bin 0 -> 2500 bytes 416 files changed, 48096 insertions(+) create mode 100755 CHANGES-DEV.MD create mode 100755 LICENSE create mode 100755 README.md create mode 100755 core/core.js.php create mode 100755 core/core.php create mode 100755 core/layout/blank.css create mode 100755 core/layout/blank.php create mode 100755 core/layout/common.css create mode 100755 core/layout/light.css create mode 100755 core/layout/light.php create mode 100755 core/layout/mail.php create mode 100755 core/layout/main.php create mode 100755 core/module/config/config.php create mode 100755 core/module/config/view/index/index.php create mode 100755 core/module/install/install.php create mode 100755 core/module/install/view/index/index.js.php create mode 100755 core/module/install/view/index/index.php create mode 100755 core/module/install/view/update/update.js.php create mode 100755 core/module/install/view/update/update.php create mode 100755 core/module/maintenance/maintenance.php create mode 100755 core/module/maintenance/view/index/index.php create mode 100755 core/module/page/page.php create mode 100755 core/module/page/view/edit/edit.js.php create mode 100755 core/module/page/view/edit/edit.php create mode 100755 core/module/sitemap/sitemap.php create mode 100755 core/module/sitemap/view/index/index.php create mode 100755 core/module/theme/resource/custom.css create mode 100755 core/module/theme/theme.php create mode 100755 core/module/theme/view/advanced/advanced.js.php create mode 100755 core/module/theme/view/advanced/advanced.php create mode 100755 core/module/theme/view/body/body.js.php create mode 100755 core/module/theme/view/body/body.php create mode 100755 core/module/theme/view/footer/footer.js.php create mode 100755 core/module/theme/view/footer/footer.php create mode 100755 core/module/theme/view/header/header.js.php create mode 100755 core/module/theme/view/header/header.php create mode 100755 core/module/theme/view/index/index.css create mode 100755 core/module/theme/view/index/index.js.php create mode 100755 core/module/theme/view/index/index.php create mode 100755 core/module/theme/view/menu/menu.js.php create mode 100755 core/module/theme/view/menu/menu.php create mode 100755 core/module/theme/view/site/site.js.php create mode 100755 core/module/theme/view/site/site.php create mode 100755 core/module/user/user.php create mode 100755 core/module/user/view/add/add.js.php create mode 100755 core/module/user/view/add/add.php create mode 100755 core/module/user/view/edit/edit.js.php create mode 100755 core/module/user/view/edit/edit.php create mode 100755 core/module/user/view/forgot/forgot.php create mode 100755 core/module/user/view/index/index.js.php create mode 100755 core/module/user/view/index/index.php create mode 100755 core/module/user/view/login/login.php create mode 100755 core/module/user/view/reset/reset.php create mode 100755 core/vendor/codemirror/codemirror.min.css create mode 100755 core/vendor/codemirror/codemirror.min.js create mode 100755 core/vendor/codemirror/inc.json create mode 100755 core/vendor/codemirror/init.css create mode 100755 core/vendor/codemirror/init.js create mode 100755 core/vendor/codemirror/mode/css.min.js create mode 100755 core/vendor/filemanager/UploadHandler.php create mode 100755 core/vendor/filemanager/ajax_calls.php create mode 100755 core/vendor/filemanager/callback.js create mode 100755 core/vendor/filemanager/config/.htaccess create mode 100755 core/vendor/filemanager/config/config.php create mode 100755 core/vendor/filemanager/css/jquery.fileupload-noscript.css create mode 100755 core/vendor/filemanager/css/jquery.fileupload-ui-noscript.css create mode 100755 core/vendor/filemanager/css/jquery.fileupload-ui.css create mode 100755 core/vendor/filemanager/css/jquery.fileupload.css create mode 100755 core/vendor/filemanager/css/rtl-style.css create mode 100755 core/vendor/filemanager/css/style.css create mode 100755 core/vendor/filemanager/dialog.php create mode 100755 core/vendor/filemanager/execute.php create mode 100755 core/vendor/filemanager/force_download.php create mode 100755 core/vendor/filemanager/img/clipboard_apply.png create mode 100755 core/vendor/filemanager/img/clipboard_clear.png create mode 100755 core/vendor/filemanager/img/copy.png create mode 100755 core/vendor/filemanager/img/cut.png create mode 100755 core/vendor/filemanager/img/date.png create mode 100755 core/vendor/filemanager/img/dimension.png create mode 100755 core/vendor/filemanager/img/down.png create mode 100755 core/vendor/filemanager/img/download.png create mode 100755 core/vendor/filemanager/img/duplicate.png create mode 100755 core/vendor/filemanager/img/edit_img.png create mode 100755 core/vendor/filemanager/img/file_edit.png create mode 100755 core/vendor/filemanager/img/glyphicons-halflings-white.png create mode 100755 core/vendor/filemanager/img/glyphicons-halflings.png create mode 100755 core/vendor/filemanager/img/ico/ac3.jpg create mode 100755 core/vendor/filemanager/img/ico/accdb.jpg create mode 100755 core/vendor/filemanager/img/ico/ade.jpg create mode 100755 core/vendor/filemanager/img/ico/adp.jpg create mode 100755 core/vendor/filemanager/img/ico/ai.jpg create mode 100755 core/vendor/filemanager/img/ico/aiff.jpg create mode 100755 core/vendor/filemanager/img/ico/avi.jpg create mode 100755 core/vendor/filemanager/img/ico/bmp.jpg create mode 100755 core/vendor/filemanager/img/ico/c4d.jpg create mode 100755 core/vendor/filemanager/img/ico/css.jpg create mode 100755 core/vendor/filemanager/img/ico/csv.jpg create mode 100755 core/vendor/filemanager/img/ico/default.jpg create mode 100755 core/vendor/filemanager/img/ico/dmg.jpg create mode 100755 core/vendor/filemanager/img/ico/doc.jpg create mode 100755 core/vendor/filemanager/img/ico/docx.jpg create mode 100755 core/vendor/filemanager/img/ico/dwg.jpg create mode 100755 core/vendor/filemanager/img/ico/dxf.jpg create mode 100755 core/vendor/filemanager/img/ico/favicon.ico create mode 100755 core/vendor/filemanager/img/ico/fla.jpg create mode 100755 core/vendor/filemanager/img/ico/flv.jpg create mode 100755 core/vendor/filemanager/img/ico/folder.png create mode 100755 core/vendor/filemanager/img/ico/folder_back.png create mode 100755 core/vendor/filemanager/img/ico/gif.jpg create mode 100755 core/vendor/filemanager/img/ico/gz.jpg create mode 100755 core/vendor/filemanager/img/ico/html.jpg create mode 100755 core/vendor/filemanager/img/ico/iso.jpg create mode 100755 core/vendor/filemanager/img/ico/jpeg.jpg create mode 100755 core/vendor/filemanager/img/ico/jpg.jpg create mode 100755 core/vendor/filemanager/img/ico/log.jpg create mode 100755 core/vendor/filemanager/img/ico/m4a.jpg create mode 100755 core/vendor/filemanager/img/ico/mdb.jpg create mode 100755 core/vendor/filemanager/img/ico/mid.jpg create mode 100755 core/vendor/filemanager/img/ico/mov.jpg create mode 100755 core/vendor/filemanager/img/ico/mp3.jpg create mode 100755 core/vendor/filemanager/img/ico/mp4.jpg create mode 100755 core/vendor/filemanager/img/ico/mpeg.jpg create mode 100755 core/vendor/filemanager/img/ico/mpg.jpg create mode 100755 core/vendor/filemanager/img/ico/odb.jpg create mode 100755 core/vendor/filemanager/img/ico/odf.jpg create mode 100755 core/vendor/filemanager/img/ico/odg.jpg create mode 100755 core/vendor/filemanager/img/ico/odp.jpg create mode 100755 core/vendor/filemanager/img/ico/ods.jpg create mode 100755 core/vendor/filemanager/img/ico/odt.jpg create mode 100755 core/vendor/filemanager/img/ico/ogg.jpg create mode 100755 core/vendor/filemanager/img/ico/otg.jpg create mode 100755 core/vendor/filemanager/img/ico/otp.jpg create mode 100755 core/vendor/filemanager/img/ico/ots.jpg create mode 100755 core/vendor/filemanager/img/ico/ott.jpg create mode 100755 core/vendor/filemanager/img/ico/pdf.jpg create mode 100755 core/vendor/filemanager/img/ico/png.jpg create mode 100755 core/vendor/filemanager/img/ico/ppt.jpg create mode 100755 core/vendor/filemanager/img/ico/pptx.jpg create mode 100755 core/vendor/filemanager/img/ico/psd.jpg create mode 100755 core/vendor/filemanager/img/ico/rar.jpg create mode 100755 core/vendor/filemanager/img/ico/rtf.jpg create mode 100755 core/vendor/filemanager/img/ico/skp.jpg create mode 100755 core/vendor/filemanager/img/ico/sql.jpg create mode 100755 core/vendor/filemanager/img/ico/stp.jpg create mode 100755 core/vendor/filemanager/img/ico/svg.jpg create mode 100755 core/vendor/filemanager/img/ico/tar.jpg create mode 100755 core/vendor/filemanager/img/ico/tiff.jpg create mode 100755 core/vendor/filemanager/img/ico/txt.jpg create mode 100755 core/vendor/filemanager/img/ico/vwx.jpg create mode 100755 core/vendor/filemanager/img/ico/wav.jpg create mode 100755 core/vendor/filemanager/img/ico/webm.jpg create mode 100755 core/vendor/filemanager/img/ico/wma.jpg create mode 100755 core/vendor/filemanager/img/ico/xhtml.jpg create mode 100755 core/vendor/filemanager/img/ico/xls.jpg create mode 100755 core/vendor/filemanager/img/ico/xlsx.jpg create mode 100755 core/vendor/filemanager/img/ico/xml.jpg create mode 100755 core/vendor/filemanager/img/ico/zip.jpg create mode 100755 core/vendor/filemanager/img/info.png create mode 100755 core/vendor/filemanager/img/key.png create mode 100755 core/vendor/filemanager/img/label.png create mode 100755 core/vendor/filemanager/img/loading.gif create mode 100755 core/vendor/filemanager/img/logo.png create mode 100755 core/vendor/filemanager/img/preview.png create mode 100755 core/vendor/filemanager/img/processing.gif create mode 100755 core/vendor/filemanager/img/rename.png create mode 100755 core/vendor/filemanager/img/size.png create mode 100755 core/vendor/filemanager/img/sort.png create mode 100755 core/vendor/filemanager/img/storing_animation.gif create mode 100755 core/vendor/filemanager/img/trans.jpg create mode 100755 core/vendor/filemanager/img/up.png create mode 100755 core/vendor/filemanager/img/upload.png create mode 100755 core/vendor/filemanager/img/url.png create mode 100755 core/vendor/filemanager/img/zip.png create mode 100755 core/vendor/filemanager/inc.json create mode 100755 core/vendor/filemanager/include/FtpClient.php create mode 100755 core/vendor/filemanager/include/FtpException.php create mode 100755 core/vendor/filemanager/include/FtpWrapper.php create mode 100755 core/vendor/filemanager/include/Response.php create mode 100755 core/vendor/filemanager/include/ftp_class.php create mode 100755 core/vendor/filemanager/include/mime_type_lib.php create mode 100755 core/vendor/filemanager/include/php_image_magician.php create mode 100755 core/vendor/filemanager/include/utils.php create mode 100755 core/vendor/filemanager/js/cors/jquery.postmessage-transport.js create mode 100755 core/vendor/filemanager/js/cors/jquery.xdr-transport.js create mode 100755 core/vendor/filemanager/js/include.commercial.js create mode 100755 core/vendor/filemanager/js/include.js create mode 100755 core/vendor/filemanager/js/jPlayer/MIT-LICENSE.txt create mode 100755 core/vendor/filemanager/js/jPlayer/README.md create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/Jplayer.as create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/Jplayer.fla create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/ConnectManager.as create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerEvent.as create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerMp3.as create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerMp4.as create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerRtmp.as create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerStatus.as create mode 100755 core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/TraceOut.as create mode 100755 core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.js create mode 100755 core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.min.js create mode 100755 core/vendor/filemanager/js/jPlayer/add-on/jquery.jplayer.inspector.js create mode 100755 core/vendor/filemanager/js/jPlayer/add-on/jquery.jplayer.inspector.min.js create mode 100755 core/vendor/filemanager/js/jPlayer/jplayer.jquery.json create mode 100755 core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.js create mode 100755 core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.min.js create mode 100755 core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.swf create mode 100755 core/vendor/filemanager/js/jPlayer/jquery.jplayer/Jplayer.swf create mode 100755 core/vendor/filemanager/js/jPlayer/jquery.jplayer/jquery.jplayer.js create mode 100755 core/vendor/filemanager/js/jPlayer/package.json create mode 100755 core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.js create mode 100755 core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.min.js create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/css/jplayer.blue.monday.css create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/css/jplayer.blue.monday.min.css create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/image/jplayer.blue.monday.jpg create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/image/jplayer.blue.monday.seeking.gif create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/image/jplayer.blue.monday.video.play.png create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.css create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.jpg create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.seeking.gif create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.video.play.png create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.playlist.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.single.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.stream.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.playlist.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.single.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/blue.monday/skin.handlebars create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.css create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.min.css create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/image/jplayer.pink.flag.jpg create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/image/jplayer.pink.flag.seeking.gif create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/image/jplayer.pink.flag.video.play.png create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.playlist.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.single.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.stream.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.playlist.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.single.html create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.css create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.jpg create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.seeking.gif create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.video.play.png create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/skin.handlebars create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.css create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.jpg create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.seeking.gif create mode 100755 core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.video.play.png create mode 100755 core/vendor/filemanager/js/jquery.fileupload-angular.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload-audio.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload-image.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload-jquery-ui.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload-process.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload-ui.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload-validate.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload-video.js create mode 100755 core/vendor/filemanager/js/jquery.fileupload.js create mode 100755 core/vendor/filemanager/js/jquery.iframe-transport.js create mode 100755 core/vendor/filemanager/js/modernizr.custom.js create mode 100755 core/vendor/filemanager/js/plugins.js create mode 100755 core/vendor/filemanager/js/vendor/jquery.ui.widget.js create mode 100755 core/vendor/filemanager/lang/fr_FR.php create mode 100755 core/vendor/filemanager/lang/languages.php create mode 100755 core/vendor/filemanager/plugin.min.js create mode 100755 core/vendor/filemanager/upload.php create mode 100755 core/vendor/flatpickr/flatpickr.min.css create mode 100755 core/vendor/flatpickr/flatpickr.min.js create mode 100755 core/vendor/flatpickr/inc.json create mode 100755 core/vendor/flatpickr/init.js create mode 100755 core/vendor/flatpickr/l10n/fr.js create mode 100755 core/vendor/jquery/inc.json create mode 100755 core/vendor/jquery/jquery.min.js create mode 100755 core/vendor/lity/inc.json create mode 100755 core/vendor/lity/lity.min.css create mode 100755 core/vendor/lity/lity.min.js create mode 100755 core/vendor/normalize/inc.json create mode 100755 core/vendor/normalize/normalize.min.css create mode 100755 core/vendor/phpmailer/.htaccess create mode 100755 core/vendor/phpmailer/phpmailer.php create mode 100755 core/vendor/tinycolorpicker/inc.json create mode 100755 core/vendor/tinycolorpicker/init.js create mode 100755 core/vendor/tinycolorpicker/tinycolorpicker.min.js create mode 100755 core/vendor/tinymce/content.css create mode 100755 core/vendor/tinymce/inc.json create mode 100755 core/vendor/tinymce/init.css create mode 100755 core/vendor/tinymce/init.js create mode 100755 core/vendor/tinymce/jquery.tinymce.min.js create mode 100755 core/vendor/tinymce/langs/fr_FR.js create mode 100755 core/vendor/tinymce/plugins/advlist/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/anchor/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/autolink/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/autoresize/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/autosave/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/code/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/codesample/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/colorpicker/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/contextmenu/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/fullscreen/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/hr/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/image/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/imagetools/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/link/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/lists/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/media/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/paste/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/searchreplace/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/stickytoolbar/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/tabfocus/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/table/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/template/plugin.min.js create mode 100755 core/vendor/tinymce/plugins/textcolor/plugin.min.js create mode 100755 core/vendor/tinymce/skins/lightgray/content.inline.min.css create mode 100755 core/vendor/tinymce/skins/lightgray/content.min.css create mode 100755 core/vendor/tinymce/skins/lightgray/content.mobile.min.css create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce-mobile.woff create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce-small.eot create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce-small.svg create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce-small.ttf create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce-small.woff create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce.eot create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce.svg create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce.ttf create mode 100755 core/vendor/tinymce/skins/lightgray/fonts/tinymce.woff create mode 100755 core/vendor/tinymce/skins/lightgray/img/anchor.gif create mode 100755 core/vendor/tinymce/skins/lightgray/img/loader.gif create mode 100755 core/vendor/tinymce/skins/lightgray/img/object.gif create mode 100755 core/vendor/tinymce/skins/lightgray/img/trans.gif create mode 100755 core/vendor/tinymce/skins/lightgray/skin.min.css create mode 100755 core/vendor/tinymce/skins/lightgray/skin.mobile.min.css create mode 100755 core/vendor/tinymce/templates/block.html create mode 100755 core/vendor/tinymce/templates/col10-2.html create mode 100755 core/vendor/tinymce/templates/col2-10.html create mode 100755 core/vendor/tinymce/templates/col3.html create mode 100755 core/vendor/tinymce/templates/col4-8.html create mode 100755 core/vendor/tinymce/templates/col4.html create mode 100755 core/vendor/tinymce/templates/col6.html create mode 100755 core/vendor/tinymce/templates/col8-4.html create mode 100755 core/vendor/tinymce/themes/mobile/theme.min.js create mode 100755 core/vendor/tinymce/themes/modern/theme.min.js create mode 100755 core/vendor/tinymce/tinymce.min.js create mode 100755 core/vendor/tippy/inc.json create mode 100755 core/vendor/tippy/init.js create mode 100755 core/vendor/tippy/tippy.min.css create mode 100755 core/vendor/tippy/tippy.min.js create mode 100755 core/vendor/zwiico/css/zwiico.min.css create mode 100755 core/vendor/zwiico/font/zwiico.eot create mode 100755 core/vendor/zwiico/font/zwiico.svg create mode 100755 core/vendor/zwiico/font/zwiico.ttf create mode 100755 core/vendor/zwiico/font/zwiico.woff create mode 100755 core/vendor/zwiico/font/zwiico.woff2 create mode 100755 core/vendor/zwiico/inc.json create mode 100755 core/vendor/zwiico/init.css create mode 100755 index.php create mode 100755 module/blog/blog.php create mode 100755 module/blog/view/add/add.js.php create mode 100755 module/blog/view/add/add.php create mode 100755 module/blog/view/article/article.css create mode 100755 module/blog/view/article/article.js.php create mode 100755 module/blog/view/article/article.php create mode 100755 module/blog/view/comment/comment.js.php create mode 100755 module/blog/view/comment/comment.php create mode 100755 module/blog/view/config/config.js.php create mode 100755 module/blog/view/config/config.php create mode 100755 module/blog/view/edit/edit.js.php create mode 100755 module/blog/view/edit/edit.php create mode 100755 module/blog/view/index/index.css create mode 100755 module/blog/view/index/index.php create mode 100755 module/form/form.php create mode 100755 module/form/vendor/html-sortable/html-sortable.min.js create mode 100755 module/form/vendor/html-sortable/inc.json create mode 100755 module/form/view/config/config.css create mode 100755 module/form/view/config/config.js.php create mode 100755 module/form/view/config/config.php create mode 100755 module/form/view/data/data.js.php create mode 100755 module/form/view/data/data.php create mode 100755 module/form/view/index/index.php create mode 100755 module/gallery/gallery.php create mode 100755 module/gallery/vendor/simplelightbox/inc.json create mode 100755 module/gallery/vendor/simplelightbox/init.css create mode 100755 module/gallery/vendor/simplelightbox/simplelightbox.min.css create mode 100755 module/gallery/vendor/simplelightbox/simplelightbox.min.js create mode 100755 module/gallery/view/config/config.css create mode 100755 module/gallery/view/config/config.js.php create mode 100755 module/gallery/view/config/config.php create mode 100755 module/gallery/view/edit/edit.js.php create mode 100755 module/gallery/view/edit/edit.php create mode 100755 module/gallery/view/gallery/gallery.css create mode 100755 module/gallery/view/gallery/gallery.js.php create mode 100755 module/gallery/view/gallery/gallery.php create mode 100755 module/gallery/view/index/index.css create mode 100755 module/gallery/view/index/index.php create mode 100755 module/news/news.php create mode 100755 module/news/view/add/add.js.php create mode 100755 module/news/view/add/add.php create mode 100755 module/news/view/config/config.js.php create mode 100755 module/news/view/config/config.php create mode 100755 module/news/view/edit/edit.js.php create mode 100755 module/news/view/edit/edit.php create mode 100755 module/news/view/index/index.php create mode 100755 module/redirection/redirection.php create mode 100755 module/redirection/view/config/config.php create mode 100755 module/redirection/view/index/index.js.php create mode 100755 module/redirection/view/index/index.php create mode 100755 site/backup/.htaccess create mode 100755 site/data/.htaccess create mode 100755 site/data/custom.css create mode 100755 site/data/theme.css create mode 100755 site/file/source/favicon.ico create mode 100755 site/file/source/gallery/landscape/desert.jpg create mode 100755 site/file/source/gallery/landscape/iceberg.jpg create mode 100755 site/file/source/gallery/landscape/meadow.jpg create mode 100755 site/file/source/gallery/space/cosmos.jpg create mode 100755 site/file/source/gallery/space/earth.jpg create mode 100755 site/file/source/gallery/space/nebula.jpg create mode 100755 site/file/thumb/gallery/landscape/desert.jpg create mode 100755 site/file/thumb/gallery/landscape/iceberg.jpg create mode 100755 site/file/thumb/gallery/landscape/meadow.jpg create mode 100755 site/file/thumb/gallery/space/cosmos.jpg create mode 100755 site/file/thumb/gallery/space/earth.jpg create mode 100755 site/file/thumb/gallery/space/nebula.jpg diff --git a/CHANGES-DEV.MD b/CHANGES-DEV.MD new file mode 100755 index 00000000..b61abefa --- /dev/null +++ b/CHANGES-DEV.MD @@ -0,0 +1,28 @@ +ChangeLog : + +0.8.2 + + Erreur dans la présentation d'un lien vide dans le menu + +0.8.1 + + Modification cosmétique dans la présentation du thème l'option d'inactivation d'une page disparaît si masquée + +0.8 + + suppression message lors du clic sur une page de redirection en mode connecté + suppression droits modérateurs sur l'édition de la redirection (plugin PetterRabit) + ajout d'une option dans le thème header permettant de rendre la bannière cliquable ou pas + +0.7 la bannière devient cliquable et renvoie vers la page d'accueil + +0.6 Cascade aux pages filles, désactivation et image + +0.5 modification d'étiquette (Bulle au lieu de Titre) + nouvelle option : activer ou désactiver une page +0.4 correction module/page.php +0.3 noyau 8.2.6 dev + désactivation mise à jour auto + +0.2 Ajouter des options texte et image + +0.1 Version initiale \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100755 index 00000000..30ace6a8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100755 index 00000000..6cbf5285 --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# Zwii 8 + +Zwii est un CMS sans base de données (Flat-File) qui permet à ses utilisateurs de créer et gérer facilement un site web sans aucune connaissance en programmation. + +[Site](http://zwiicms.com/) - [Forum](http://forum.zwiicms.com/) - [GitHub](https://github.com/remijean/ZwiiCMS/) + +## Configuration recommandée + +* PHP 5.6 ou plus +* Support du .htaccess + +## Installation + +Décompressez l'archive de Zwii sur votre serveur et c'est tout ! + +## Procédure de mise à jour de Zwii + +### Mise à jour automatique + +* Connectez vous à votre site, +* Allez dans l'interface de configuration, +* Cliquez sur le bouton "Mettre à jour". + +### Mise à jour manuelle + +**Note : La réécriture d'URL est automatiquement désactivée après une mise à jour manuelle. À vous de la réactiver depuis l'interface de configuration du site.** + +* Sauvegardez le dossier "site" de votre serveur, +* Décompressez la nouvelle version sur votre serveur, +* Remplacez le dossier "site" de la nouvelle version par le votre. + +## Arborescence générale + +*Légende : [D] Dossier ; [F] Fichier* + +```text +[D] core Contient le coeur de Zwii + [D] layout Contient les différentes structure de thème + [D] module Contient les modules du coeur + [D] vendor Contient les librairies + [F] core.js.php Coeur JavaScript de Zwii + [F] core.php Coeur PHP de Zwii +[D] module Contient les modules de page +[D] site Contient les données du site + [D] backup Contient les 30 dernière sauvegardes automatiques du fichier data.json + [D] data Contient les fichiers de données + [F] data.json Fichier de données + [F] custom.css Feuille de style de la personnalisation avancée + [F] theme.css Thème stocké dans le fichier data.json compilé en CSS + [D] file Contient les fichiers envoyés sur le serveur depuis le gestionnaire de fichiers + [D] source Contient les fichiers + [D] thumb Contient les miniatures des fichiers de type image + [D] tmp Contient les fichiers temporaire +[F] index.php Fichier d'initialisation de Zwii +``` \ No newline at end of file diff --git a/core/core.js.php b/core/core.js.php new file mode 100755 index 00000000..0ffdfc8a --- /dev/null +++ b/core/core.js.php @@ -0,0 +1,350 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +var core = {}; + +/** + * Crée un message d'alerte + */ +core.alert = function(text) { + var lightbox = lity(function($) { + return $("
") + .addClass("lightbox") + .append( + $("").text(text), + $("
") + .addClass("lightboxButtons") + .append( + $("") + .addClass("button") + .text("Ok") + .on("click", function() { + lightbox.close(); + }) + ) + ) + }(jQuery)); + // Validation de la lightbox avec le bouton entrée + $(document).on("keyup", function(event) { + if(event.keyCode === 13) { + lightbox.close(); + } + }); + return false; +}; + +/** + * Génère des variations d'une couleur + */ +core.colorVariants = function(rgba) { + rgba = rgba.match(/\(+(.*)\)/); + rgba = rgba[1].split(", "); + return { + "normal": "rgba(" + rgba[0] + "," + rgba[1] + "," + rgba[2] + "," + rgba[3] + ")", + "darken": "rgba(" + Math.max(0, rgba[0] - 15) + "," + Math.max(0, rgba[1] - 15) + "," + Math.max(0, rgba[2] - 15) + "," + rgba[3] + ")", + "veryDarken": "rgba(" + Math.max(0, rgba[0] - 20) + "," + Math.max(0, rgba[1] - 20) + "," + Math.max(0, rgba[2] - 20) + "," + rgba[3] + ")", + "text": core.relativeLuminanceW3C(rgba) > .22 ? "inherit" : "white" + }; +}; + +/** + * Crée un message de confirmation + */ +core.confirm = function(text, yesCallback, noCallback) { + var lightbox = lity(function($) { + return $("
") + .addClass("lightbox") + .append( + $("").text(text), + $("
") + .addClass("lightboxButtons") + .append( + $("") + .addClass("button grey") + .text("Non") + .on("click", function() { + lightbox.options('button', true); + lightbox.close(); + if(typeof noCallback !== "undefined") { + noCallback(); + } + }), + $("") + .addClass("button") + .text("Oui") + .on("click", function() { + lightbox.options('button', true); + lightbox.close(); + if(typeof yesCallback !== "undefined") { + yesCallback(); + } + }) + ) + ) + }(jQuery)); + // Callback lors d'un clic sur le fond et sur la croix de fermeture + lightbox.options('button', false); + $(document).on('lity:close', function(event, instance) { + if( + instance.options('button') === false + && typeof noCallback !== "undefined" + ) { + noCallback(); + } + }); + // Validation de la lightbox avec le bouton entrée + $(document).on("keyup", function(event) { + if(event.keyCode === 13) { + lightbox.close(); + if(typeof yesCallback !== "undefined") { + yesCallback(); + } + } + }); + return false; +}; + +/** + * Scripts à exécuter en dernier + */ +core.end = function() { + /** + * Modifications non enregistrées du formulaire + */ + var formDOM = $("form"); + // Ignore : + // - TinyMCE car il gère lui même le message + // - Les champs avec data-no-dirty + var inputsDOM = formDOM.find("input:not([data-no-dirty]), select:not([data-no-dirty]), textarea:not(.editorWysiwyg):not([data-no-dirty])"); + var inputSerialize = inputsDOM.serialize(); + $(window).on("beforeunload", function() { + if(inputsDOM.serialize() !== inputSerialize) { + return "Les modifications que vous avez apportées ne seront peut-être pas enregistrées."; + } + }); + formDOM.submit(function() { + $(window).off("beforeunload"); + }); +}; +$(function() { + core.end(); +}); + +/** + * Ajoute une notice + */ +core.noticeAdd = function(id, notice) { + $("#" + id + "Notice").text(notice).removeClass("displayNone"); + $("#" + id).addClass("notice"); +}; + +/** + * Supprime une notice + */ +core.noticeRemove = function(id) { + $("#" + id + "Notice").text("").addClass("displayNone"); + $("#" + id).removeClass("notice"); +}; + +/** + * Scripts à exécuter en premier + */ +core.start = function() { + /** + * Remonter en haut au clic sur le bouton + */ + var backToTopDOM = $("#backToTop"); + backToTopDOM.on("click", function() { + $("body, html").animate({scrollTop: 0}, "400"); + }); + /** + * Affiche / Cache le bouton pour remonter en haut + */ + $(window).on("scroll", function() { + if($(this).scrollTop() > 200) { + backToTopDOM.fadeIn(); + } + else { + backToTopDOM.fadeOut(); + } + }); + /** + * Cache les notifications + */ + var notificationTimer; + $("#notification") + .on("mouseenter", function() { + clearTimeout(notificationTimer); + $("#notificationProgress") + .stop() + .width("100%"); + }) + .on("mouseleave", function() { + // Disparition de la notification + notificationTimer = setTimeout(function() { + $("#notification").fadeOut(); + }, 4000); + // Barre de progression + $("#notificationProgress").animate({ + "width": "0%" + }, 4000, "linear"); + }) + .trigger("mouseleave"); + $("#notificationClose").on("click", function() { + clearTimeout(notificationTimer); + $("#notification").fadeOut(); + $("#notificationProgress").stop(); + }); + /** + * Affiche / Cache le menu en mode responsive + */ + var menuDOM = $("#menu"); + $("#toggle").on("click", function() { + menuDOM.slideToggle(); + }); + $(window).on("resize", function() { + if($(window).width() > 768) { + menuDOM.css("display", ""); + } + }); + /** + * Message sur l'utilisation des cookies + */ + if(getData(['config', 'cookieConsent'])); ?>) { + if(document.cookie.indexOf("ZWII_COOKIE_CONSENT") === -1) { + $("body").append( + $("
").attr("id", "cookieConsent").append( + $("").text("En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies."), + $("") + .attr("id", "cookieConsentConfirm") + .text("OK") + .on("click", function() { + // Créé le cookie d'acceptation + var expires = new Date(); + expires.setFullYear(expires.getFullYear() + 1); + expires = "expires=" + expires.toUTCString(); + document.cookie = "ZWII_COOKIE_CONSENT=true;" + expires; + // Ferme le message + $(this).parents("#cookieConsent").fadeOut(); + }) + ) + ); + } + } + /** + * Choix de page dans la barre de membre + */ + $("#barSelectPage").on("change", function() { + var pageUrl = $(this).val(); + if(pageUrl) { + $(location).attr("href", pageUrl); + } + }); + /** + * Champs d'upload de fichiers + */ + // Mise à jour de l'affichage des champs d'upload + $(".inputFileHidden").on("change", function() { + var inputFileHiddenDOM = $(this); + var fileName = inputFileHiddenDOM.val(); + if(fileName === "") { + fileName = "Choisissez un fichier"; + $(".inputFileDelete").addClass("disabled"); + } + else { + $(".inputFileDelete").removeClass("disabled"); + } + inputFileHiddenDOM.parent().find(".inputFileLabel").text(fileName); + }).trigger("change"); + // Suppression du fichier contenu dans le champ + $(".inputFileDelete").on("click", function() { + $(this).parents(".inputWrapper").find(".inputFileHidden").val("").trigger("change"); + }); + // Confirmation de mise à jour + $("#barUpdate").on("click", function() { + return core.confirm("Effectuer la mise à jour ?", function() { + $(location).attr("href", $("#barUpdate").attr("href")); + }); + }); + // Confirmation de déconnexion + $("#barLogout").on("click", function() { + return core.confirm("Se déconnecter ?", function() { + $(location).attr("href", $("#barLogout").attr("href")); + }); + }); + /** + * Bloque la multi-soumission des boutons + */ + $("form").on("submit", function() { + $(this).find(".uniqueSubmission") + .addClass("disabled") + .prop("disabled", true) + .empty() + .append( + $("").addClass("zwiico-spin animate-spin") + ) + }); + /** + * Check adresse email + */ + $("[type=email]").on("change", function() { + var _this = $(this); + var pattern = /^([a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'*+\-\/=?^_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)*|"((([ \t]*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))*(([ \t]*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-._~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i; + if(pattern.test(_this.val())) { + core.noticeRemove(_this.attr("id")); + } + else { + core.noticeAdd(_this.attr("id"), "Format incorrect"); + } + }); + /** + * Iframes et vidéos responsives + */ + var elementDOM = $("iframe, video, embed"); + // Calcul du ratio et suppression de la hauteur / largeur des iframes + elementDOM.each(function() { + var _this = $(this); + _this + .data("ratio", _this.height() / _this.width()) + .removeAttr("width height"); + }); + // Prend la largeur du parent et détermine la hauteur à l'aide du ratio lors du resize de la fenêtre + $(window).on("resize", function() { + elementDOM.each(function() { + var _this = $(this); + var width = _this.parent().first().width(); + _this + .width(width) + .height(width * _this.data("ratio")); + }); + }).trigger("resize"); +}; +core.start(); + +/** + * Calcul de la luminance relative d'une couleur + */ +core.relativeLuminanceW3C = function(rgba) { + // Conversion en sRGB + var RsRGB = rgba[0] / 255; + var GsRGB = rgba[1] / 255; + var BsRGB = rgba[2] / 255; + // Ajout de la transparence + var RsRGBA = rgba[3] * RsRGB + (1 - rgba[3]); + var GsRGBA = rgba[3] * GsRGB + (1 - rgba[3]); + var BsRGBA = rgba[3] * BsRGB + (1 - rgba[3]); + // Calcul de la luminance + var R = (RsRGBA <= .03928) ? RsRGBA / 12.92 : Math.pow((RsRGBA + .055) / 1.055, 2.4); + var G = (GsRGBA <= .03928) ? GsRGBA / 12.92 : Math.pow((GsRGBA + .055) / 1.055, 2.4); + var B = (BsRGBA <= .03928) ? BsRGBA / 12.92 : Math.pow((BsRGBA + .055) / 1.055, 2.4); + return .2126 * R + .7152 * G + .0722 * B; +}; \ No newline at end of file diff --git a/core/core.php b/core/core.php new file mode 100755 index 00000000..eee33a17 --- /dev/null +++ b/core/core.php @@ -0,0 +1,2864 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +class common { + + const DISPLAY_RAW = 0; + const DISPLAY_JSON = 1; + const DISPLAY_LAYOUT_BLANK = 2; + const DISPLAY_LAYOUT_MAIN = 3; + const DISPLAY_LAYOUT_LIGHT = 4; + const GROUP_BANNED = -1; + const GROUP_VISITOR = 0; + const GROUP_MEMBER = 1; + const GROUP_MODERATOR = 2; + const GROUP_ADMIN = 3; + const ZWII_VERSION = '8.2.6'; + + public static $actions = []; + public static $coreModuleIds = [ + 'config', + 'install', + 'maintenance', + 'page', + 'sitemap', + 'theme', + 'user' + ]; + private $data = []; + private $defaultData = [ + 'config' => [ + 'analyticsId' => '', + 'autoBackup' => true, + 'cookieConsent' => true, + 'favicon' => 'favicon.ico', + 'homePageId' => 'accueil', + 'maintenance' => false, + 'metaDescription' => 'Zwii est un CMS sans base de données qui permet à ses utilisateurs de créer et gérer facilement un site web sans aucune connaissance en programmation.', + 'social' => [ + 'facebookId' => '', + 'googleplusId' => '', + 'instagramId' => '', + 'pinterestId' => '', + 'twitterId' => '', + 'youtubeId' => '' + ], + 'timezone' => 'Europe/Paris', + 'title' => 'Zwii, votre site en quelques clics !' + ], + 'core' => [ + 'dataVersion' => 0, + 'lastBackup' => 0, + 'lastClearTmp' => 0 + ], + 'page' => [ + 'accueil' => [ + // menu image + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // menu image + 'content' => "

Bienvenue sur votre nouveau site Zwii !

\r\n

Un email contenant le récapitulatif de votre installation vient de vous être envoyé.

\r\n

Connectez-vous dès maintenant à votre espace membre afin de créer un site à votre image ! Vous allez pouvoir personnaliser le thème, créer des pages, ajouter des utilisateurs et bien plus encore !

\r\n

Si vous avez besoin d'aide ou si vous cherchez des informations sur Zwii, n'hésitez pas à jeter un œil à notre forum.

", + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'parentPageId' => '', + 'position' => 1, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Accueil' + ], + 'enfant' => [ + // menu image + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // menu image + 'content' => "

Vous pouvez assigner des parents à vos pages afin de mieux organiser votre menu !

\r\n
\r\n
\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

\r\n
\r\n
\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

\r\n
\r\n
\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

\r\n
\r\n
", + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'parentPageId' => 'accueil', + 'position' => 1, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Enfant' + ], + 'cachee' => [ + // menu image + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // menu image + 'content' => "

Cette page n'est visible que par les membres de votre site !

\r\n
\r\n
\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

\r\n
\r\n
\r\n

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

\r\n
r\n
", + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'parentPageId' => '', + 'position' => 2, + 'group' => self::GROUP_MEMBER, + 'targetBlank' => false, + 'title' => 'Cachée' + ], + 'blog' => [ + // menu image + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // menu image + 'content' => "

Cette page contient une instance du module de blog. Cliquez sur un article afin de le lire et de poster des commentaires.

", + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => 'blog', + 'parentPageId' => '', + 'position' => 3, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Blog' + ], + 'galeries' => [ + // menu image + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // menu image + 'content' => "

Cette page contient une instance du module de galeries photos. Cliquez sur la galerie ci-dessous afin de voir les photos qu'elle contient.

", + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => 'gallery', + 'parentPageId' => '', + 'position' => 4, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Galeries' + ], + 'site-de-zwii' => [ + // menu image + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // menu image + 'content' => "", + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => 'redirection', + 'parentPageId' => '', + 'position' => 5, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => true, + 'title' => 'Site de Zwii' + ], + 'contact' => [ + // menu image + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // menu image + 'content' => "

Cette page contient un exemple de formulaire conçu à partir du module de génération de formulaires. Il est configuré pour envoyer les données saisies par mail aux administrateurs du site.

", + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => 'form', + 'parentPageId' => '', + 'position' => 6, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Contact' + ] + ], + 'module' => [ + 'blog' => [ + 'mon-premier-article' => [ + 'closeComment' => false, + 'comment' => [ + '58e11d09e5aff' => [ + 'author' => 'Rémi', + 'content' => 'Article bien rédigé et très pertinent, bravo !', + 'createdOn' => 1421786100, + 'userId' => '' + ] + ], + 'content' => "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In a placerat metus. Morbi luctus laoreet dolor et euismod. Phasellus eget eros ac eros pretium tincidunt. Sed maximus magna lectus, non vestibulum sapien pretium maximus. Donec convallis leo tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras convallis lacus eu risus gravida varius. Etiam mattis massa vitae eros placerat bibendum.

\r\n

Vivamus tempus magna augue, in bibendum quam blandit at. Morbi felis tortor, suscipit ut ipsum ut, volutpat consectetur orci. Nulla tincidunt quis ligula non viverra. Sed pretium dictum blandit. Donec fringilla, nunc at dictum pretium, arcu massa viverra leo, et porta turpis ipsum eget risus. Quisque quis maximus purus, in elementum arcu. Donec nisi orci, aliquam non luctus non, congue volutpat massa. Curabitur sed risus congue, porta arcu vel, tincidunt nisi. Duis tincidunt quam ut velit maximus ornare. Nullam sagittis, ante quis pharetra hendrerit, lorem massa dapibus mi, a hendrerit dolor odio nec augue. Nunc sem nisl, tincidunt vitae nunc et, viverra tristique diam. In eget dignissim lectus. Nullam volutpat lacus id ex dapibus viverra. Pellentesque ultricies lorem ut nunc elementum volutpat. Cras id ultrices justo.

\r\n

Phasellus nec erat leo. Praesent at sem nunc. Vestibulum quis condimentum turpis. Cras semper diam vitae enim fringilla, ut fringilla mauris efficitur. In nec porttitor urna. Nam eros leo, vehicula eget lobortis sed, gravida id mauris. Nulla bibendum nunc tortor, non bibendum justo consectetur vel. Phasellus nec risus diam. In commodo tellus nec nulla fringilla, nec feugiat nunc consectetur. Etiam non eros sodales, sodales lacus vel, finibus leo. Quisque hendrerit tristique congue. Phasellus nec augue vitae libero elementum facilisis. Mauris pretium ornare nisi, non scelerisque velit consectetur sit amet.

", + 'picture' => 'gallery/landscape/meadow.jpg', + 'publishedOn' => 1420903200, + 'state' => true, + 'title' => 'Mon premier article', + 'userId' => '' // Géré au moment de l'installation + ], + 'mon-deuxieme-article' => [ + 'closeComment' => false, + 'comment' => [], + 'content' => "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam lobortis eros pharetra metus rutrum pretium et sagittis mauris. Donec commodo venenatis sem nec suscipit. In tempor sollicitudin scelerisque. Etiam quis nibh eleifend, congue nisl quis, ultricies ipsum. Integer at est a eros vulputate pellentesque eu vitae tellus. Nullam suscipit quam nisl. Vivamus dui odio, luctus ac fringilla ultrices, eleifend vel sapien. Integer sem ex, lobortis eu mattis eu, condimentum non libero. Aliquam non porttitor elit, eu hendrerit neque. Praesent tortor urna, tincidunt sed dictum id, rutrum tempus sapien.

\r\n

Donec accumsan ante ac odio laoreet porttitor. Pellentesque et leo a leo scelerisque mattis id vel elit. Quisque egestas congue enim nec semper. Morbi mollis nibh sapien. Nunc quis fringilla lorem. Donec vel venenatis nunc. Donec lectus velit, tempor sit amet dui sed, consequat commodo enim. Nam porttitor neque semper, dapibus nunc bibendum, lobortis urna. Morbi ullamcorper molestie lectus a elementum. Curabitur eu cursus orci, sed tristique justo. In massa lacus, imperdiet eu elit quis, consectetur maximus magna. Integer suscipit varius ante vitae egestas. Morbi scelerisque fermentum ipsum, euismod faucibus mi tincidunt id. Sed at consectetur velit. Ut fermentum nunc nibh, at commodo felis lacinia nec.

\r\n

Nullam a justo quis lectus facilisis semper eget quis sem. Morbi suscipit erat sem, non fermentum nunc luctus vel. Proin venenatis quam ut arcu luctus efficitur. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam sollicitudin tristique nunc nec convallis. Maecenas id tortor semper, tempus nisl laoreet, cursus lacus. Aliquam sagittis est in leo congue, a pharetra felis aliquet. Nulla gravida lobortis sapien, quis viverra enim ullamcorper sed. Donec ultrices sem eu volutpat dapibus. Nam euismod, tellus eu congue mollis, massa nisi finibus odio, vitae porta arcu urna ac lorem. Sed faucibus dignissim pretium. Pellentesque eget ante tellus. Pellentesque a elementum odio, sit amet vulputate diam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In hendrerit consequat dolor, malesuada pellentesque tellus molestie non. Aenean quis purus a lectus pellentesque laoreet.

", + 'picture' => 'gallery/landscape/desert.jpg', + 'publishedOn' => 1421748000, + 'state' => true, + 'title' => 'Mon deuxième article', + 'userId' => '' // Géré au moment de l'installation + ], + 'mon-troisieme-article' => [ + 'closeComment' => true, + 'comment' => [], + 'content' => "

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ut tempus nibh. Cras eget iaculis justo, ac laoreet lacus. Nunc tellus nulla, auctor id hendrerit eu, pellentesque in sapien. In hac habitasse platea dictumst. Aliquam leo urna, hendrerit id nunc eget, finibus maximus dolor. Sed rutrum sapien consectetur, tincidunt nulla at, blandit quam. Duis ex enim, vehicula vel nisi vitae, lobortis volutpat nisl. Vivamus enim libero, euismod nec risus vel, interdum placerat elit. In cursus sapien condimentum dui imperdiet, sed lobortis ante consectetur. Maecenas hendrerit eget felis non consequat.

\r\n

Nullam nec risus non velit efficitur tempus eget tincidunt mauris. Etiam venenatis leo id justo sagittis, commodo dignissim sapien tristique. Vivamus finibus augue malesuada sapien gravida rutrum. Integer mattis lectus ac pulvinar scelerisque. Integer suscipit feugiat metus, ac molestie odio suscipit eget. Fusce at elit in tellus venenatis finibus id sit amet magna. Integer sodales luctus neque blandit posuere. Cras pellentesque dictum lorem eget vestibulum. Quisque vitae metus non nisi efficitur rhoncus ut vitae ipsum. Donec accumsan massa at est faucibus lacinia. Quisque imperdiet luctus neque eu vestibulum. Phasellus pellentesque felis ligula, id imperdiet elit ultrices eu.

", + 'picture' => 'gallery/landscape/iceberg.jpg', + 'publishedOn' => 1423154400, + 'state' => true, + 'title' => 'Mon troisième article', + 'userId' => '' // Géré au moment de l'installation + ] + ], + 'galeries' => [ + 'beaux-paysages' => [ + 'config' => [ + 'name' => 'Beaux paysages', + 'directory' => 'site/file/source/gallery/landscape' + ], + 'legend' => [ + 'desert.jpg' => 'Un désert', + 'iceberg.jpg' => 'Un iceberg', + 'meadow.jpg' => 'Une prairie' + ] + ], + 'espace' => [ + 'config' => [ + 'name' => 'Espace', + 'directory' => 'site/file/source/gallery/space' + ], + 'legend' => [ + 'earth.jpg' => 'La Terre et la Lune', + 'cosmos.jpg' => 'Le cosmos', + 'nebula.jpg' => 'Une nébuleuse' + ] + ] + ], + 'site-de-zwii' => [ + 'url' => 'http://zwiicms.com/', + 'count' => 0 + ], + 'contact' => [ + 'config' => [ + 'button' => '', + 'capcha' => true, + 'group' => self::GROUP_ADMIN, + 'pageId' => '', + 'subject' => '' + ], + 'data' => [], + 'input' => [ + [ + 'name' => 'Adresse mail', + 'position' => 1, + 'required' => true, + 'type' => 'mail', + 'values' => '' + ], + [ + 'name' => 'Sujet', + 'position' => 2, + 'required' => true, + 'type' => 'text', + 'values' => '' + ], + [ + 'name' => 'Message', + 'position' => 3, + 'required' => true, + 'type' => 'textarea', + 'values' => '' + ] + ] + ] + ], + 'user' => [], + 'theme' => [ + 'body' => [ + 'backgroundColor' => 'rgba(236, 239, 241, 1)', + 'image' => '', + 'imageAttachment' => 'scroll', + 'imageRepeat' => 'no-repeat', + 'imagePosition' => 'top center', + 'imageSize' => 'auto' + ], + 'button' => [ + 'backgroundColor' => 'rgba(74, 105, 189, 1)' + ], + 'footer' => [ + 'backgroundColor' => 'rgba(255, 255, 255, 1)', + 'copyrightAlign' => 'center', + 'height' => '10px', + 'loginLink' => true, + 'margin' => false, + 'position' => 'site', + 'socialsAlign' => 'center', + 'text' => '', + 'textAlign' => 'center', + 'textColor' => 'rgba(33, 34, 35, 1)' + ], + 'header' => [ + 'backgroundColor' => 'rgba(255, 255, 255, 1)', + 'font' => 'Oswald', + 'fontSize' => '2em', + 'fontWeight' => 'normal', + 'height' => '150px', + 'image' => '', + 'imagePosition' => 'center center', + 'imageRepeat' => 'no-repeat', + 'margin' => false, + 'position' => 'site', + 'textAlign' => 'center', + 'textColor' => 'rgba(33, 34, 35, 1)', + 'textHide' => false, + 'textTransform' => 'none', + // Menu Image + 'linkHome' => 'false' + // Menu Image + ], + 'link' => [ + 'textColor' => 'rgba(74, 105, 189, 1)' + ], + 'menu' => [ + 'backgroundColor' => 'rgba(74, 105, 189, 1)', + 'fontSize' => '1em', + 'fontWeight' => 'normal', + 'height' => '15px 10px', + 'loginLink' => true, + 'margin' => false, + 'position' => 'site-second', + 'textAlign' => 'left', + 'textColor' => 'rgba(255, 255, 255, 1)', + 'textTransform' => 'none' + ], + 'site' => [ + 'backgroundColor' => 'rgba(255, 255, 255, 1)', + 'radius' => '0', + 'shadow' => '0', + 'width' => '1170px' + ], + 'text' => [ + 'font' => 'Open+Sans', + 'fontSize' => '14px', + 'textColor' => 'rgba(33, 34, 35, 1)' + ], + 'title' => [ + 'font' => 'Oswald', + 'fontWeight' => 'normal', + 'textColor' => 'rgba(74, 105, 189, 1)', + 'textTransform' => 'none' + ] + ] + ]; + private $hierarchy = [ + 'all' => [], + 'visible' => [] + ]; + private $input = [ + '_COOKIE' => [], + '_POST' => [] + ]; + public static $inputBefore = []; + public static $inputNotices = []; + public $output = [ + 'access' => true, + 'content' => '', + 'display' => self::DISPLAY_LAYOUT_MAIN, + 'metaDescription' => '', + 'metaTitle' => '', + 'notification' => '', + 'redirect' => '', + 'script' => '', + 'showBarEditButton' => false, + 'showPageContent' => false, + 'state' => false, + 'style' => '', + 'title' => null, // Null car un titre peut être vide + // Trié par ordre d'exécution + 'vendor' => [ + 'jquery', + 'normalize', + 'lity', + 'filemanager', + // 'flatpickr', Désactivé par défaut + // 'tinycolorpicker', Désactivé par défaut + // 'tinymce', Désactivé par défaut + // 'codemirror', // Désactivé par défaut + 'tippy', + 'zwiico' + ], + 'view' => '' + ]; + public static $groups = [ + self::GROUP_BANNED => 'Banni', + self::GROUP_VISITOR => 'Visiteur', + self::GROUP_MEMBER => 'Membre', + self::GROUP_MODERATOR => 'Modérateur', + self::GROUP_ADMIN => 'Administrateur' + ]; + public static $groupEdits = [ + self::GROUP_BANNED => 'Banni', + self::GROUP_MEMBER => 'Membre', + self::GROUP_MODERATOR => 'Modérateur', + self::GROUP_ADMIN => 'Administrateur' + ]; + public static $groupNews = [ + self::GROUP_MEMBER => 'Membre', + self::GROUP_MODERATOR => 'Modérateur', + self::GROUP_ADMIN => 'Administrateur' + ]; + public static $groupPublics = [ + self::GROUP_VISITOR => 'Visiteur', + self::GROUP_MEMBER => 'Membre', + self::GROUP_MODERATOR => 'Modérateur', + self::GROUP_ADMIN => 'Administrateur' + ]; + public static $timezone; + private $url = ''; + private $user = []; + + /** + * Constructeur commun + */ + public function __construct() { + // Extraction des données http + if(isset($_POST)) { + $this->input['_POST'] = $_POST; + } + if(isset($_COOKIE)) { + $this->input['_COOKIE'] = $_COOKIE; + } + // Génère le fichier de donnée + if(file_exists('site/data/data.json') === false) { + $this->setData([$this->defaultData]); + $this->saveData(); + chmod('site/data/data.json', 0755); + } + // Import des données + if($this->data === []) { + // Trois tentatives + for($i = 0; $i < 3; $i++) { + $this->setData([json_decode(file_get_contents('site/data/data.json'), true)]); + if($this->data) { + break; + } + elseif($i === 2) { + exit('Unable to read data file.'); + } + // Pause de 10 millisecondes + usleep(10000); + } + } + // Mise à jour + $this->update(); + // Utilisateur connecté + if($this->user === []) { + $this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]); + } + // Construit la liste des pages parents/enfants + if($this->hierarchy['all'] === []) { + $pages = helper::arrayCollumn($this->getData(['page']), 'position', 'SORT_ASC'); + // Parents + foreach($pages as $pageId => $pagePosition) { + if( + // Page parent + $this->getData(['page', $pageId, 'parentPageId']) === "" + // Ignore les pages dont l'utilisateur n'a pas accès + AND ( + $this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR + OR ( + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) + ) + ) + ) { + if($pagePosition !== 0) { + $this->hierarchy['visible'][$pageId] = []; + } + $this->hierarchy['all'][$pageId] = []; + } + } + // Enfants + foreach($pages as $pageId => $pagePosition) { + if( + // Page parent + $parentId = $this->getData(['page', $pageId, 'parentPageId']) + // Ignore les pages dont l'utilisateur n'a pas accès + AND ( + ( + $this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR + AND $this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR + ) + OR ( + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND $this->getUser('group') >= $this->getData(['page', $parentId, 'group']) + AND $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) + ) + ) + ) { + if($pagePosition !== 0) { + $this->hierarchy['visible'][$parentId][] = $pageId; + } + $this->hierarchy['all'][$parentId][] = $pageId; + } + } + } + // Construit l'url + if($this->url === '') { + if($url = $_SERVER['QUERY_STRING']) { + $this->url = $url; + } + else { + $this->url = $this->getData(['config', 'homePageId']); + } + } + } + + /** + * Ajoute les valeurs en sortie + * @param array $output Valeurs en sortie + */ + public function addOutput($output) { + $this->output = array_merge($this->output, $output); + } + + /** + * Ajoute une notice de champ obligatoire + * @param string $key Clef du champ + */ + public function addRequiredInputNotices($key) { + // La clef est un tableau + if(preg_match('#\[(.*)\]#', $key, $secondKey)) { + $firstKey = explode('[', $key)[0]; + $secondKey = $secondKey[1]; + if(empty($this->input['_POST'][$firstKey][$secondKey])) { + common::$inputNotices[$firstKey . '_' . $secondKey] = 'Obligatoire'; + } + } + // La clef est une chaine + elseif(empty($this->input['_POST'][$key])) { + common::$inputNotices[$key] = 'Obligatoire'; + } + } + + /** + * Check du token CSRF (true = bo + */ + public function checkCSRF() { + return ((empty($_POST['csrf']) OR hash_equals($_SESSION['csrf'], $_POST['csrf']) === false) === false); + } + + /** + * Supprime des données + * @param array $keys Clé(s) des données + */ + public function deleteData($keys) { + switch(count($keys)) { + case 1 : + unset($this->data[$keys[0]]); + break; + case 2: + unset($this->data[$keys[0]][$keys[1]]); + break; + case 3: + unset($this->data[$keys[0]][$keys[1]][$keys[2]]); + break; + case 4: + unset($this->data[$keys[0]][$keys[1]][$keys[2]][$keys[3]]); + break; + case 5: + unset($this->data[$keys[0]][$keys[1]][$keys[2]][$keys[3]][$keys[4]]); + break; + case 6: + unset($this->data[$keys[0]][$keys[1]][$keys[2]][$keys[3]][$keys[4]][$keys[5]]); + break; + case 7: + unset($this->data[$keys[0]][$keys[1]][$keys[2]][$keys[3]][$keys[4]][$keys[5]][$keys[6]]); + break; + } + } + + /** + * Accède aux données + * @param array $keys Clé(s) des données + * @return mixed + */ + public function getData($keys = null) { + // Retourne l'ensemble des données + if($keys === null) { + return $this->data; + } + // Décent dans les niveaux de la variable $data + $data = $this->data; + foreach($keys as $key) { + // Si aucune donnée n'existe retourne null + if(isset($data[$key]) === false) { + return null; + } + // Sinon décent dans les niveaux + else { + $data = $data[$key]; + } + } + // Retourne les données + return $data; + } + + /** + * Accède à la liste des pages parents et de leurs enfants ou aux enfants d'une page parent + * @param int $parentId Id de la page parent + * @param bool $onlyVisible Affiche seulement les pages visibles + * @return array + */ + public function getHierarchy($parentId = null, $onlyVisible = true) { + $hierarchy = $onlyVisible ? $this->hierarchy['visible'] : $this->hierarchy['all']; + // Enfants d'un parent + if($parentId) { + if(array_key_exists($parentId, $hierarchy)) { + return $hierarchy[$parentId]; + } + else { + return []; + } + } + // Parents et leurs enfants + else { + return $hierarchy; + } + } + + /** + * Accède à une valeur des variables http (ordre de recherche en l'absence de type : _COOKIE, _POST) + * @param string $key Clé de la valeur + * @param int $filter Filtre à appliquer à la valeur + * @param bool $required Champ requis + * @return mixed + */ + public function getInput($key, $filter = helper::FILTER_STRING_SHORT, $required = false) { + // La clef est un tableau + if(preg_match('#\[(.*)\]#', $key, $secondKey)) { + $firstKey = explode('[', $key)[0]; + $secondKey = $secondKey[1]; + foreach($this->input as $type => $values) { + // Champ obligatoire + if($required) { + $this->addRequiredInputNotices($key); + } + // Check de l'existence + // Également utile pour les checkboxs qui ne retournent rien lorsqu'elles ne sont pas cochées + if( + array_key_exists($firstKey, $values) + AND array_key_exists($secondKey, $values[$firstKey]) + ) { + // Retourne la valeur filtrée + if($filter) { + return helper::filter($this->input[$type][$firstKey][$secondKey], $filter); + } + // Retourne la valeur + else { + return $this->input[$type][$firstKey][$secondKey]; + } + } + } + } + // La clef est une chaine + else { + foreach($this->input as $type => $values) { + // Champ obligatoire + if($required) { + $this->addRequiredInputNotices($key); + } + // Check de l'existence + // Également utile pour les checkboxs qui ne retournent rien lorsqu'elles ne sont pas cochées + if(array_key_exists($key, $values)) { + // Retourne la valeur filtrée + if($filter) { + return helper::filter($this->input[$type][$key], $filter); + } + // Retourne la valeur + else { + return $this->input[$type][$key]; + } + } + } + } + + // Sinon retourne null + return helper::filter(null, $filter); + } + + /** + * Accède à une partie l'url ou à l'url complète + * @param int $key Clé de l'url + * @return string|null + */ + public function getUrl($key = null) { + // Url complète + if($key === null) { + return $this->url; + } + // Une partie de l'url + else { + $url = explode('/', $this->url); + return array_key_exists($key, $url) ? $url[$key] : null; + } + } + + /** + * Accède à l'utilisateur connecté + * @param int $key Clé de la valeur + * @return string|null + */ + public function getUser($key) { + if(is_array($this->user) === false) { + return false; + } + elseif($key === 'id') { + return $this->getInput('ZWII_USER_ID'); + } + elseif(array_key_exists($key, $this->user)) { + return $this->user[$key]; + } + else { + return false; + } + } + + /** + * Check qu'une valeur est transmise par la méthode _POST + * @return bool + */ + public function isPost() { + return ($this->checkCSRF() AND $this->input['_POST'] !== []); + } + + /** + * Enregistre les données + */ + public function saveData() { + // Trois tentatives + for($i = 0; $i < 3; $i++) { + if(file_put_contents('site/data/data.json', json_encode($this->getData()), LOCK_EX) !== false) { + break; + } + // Pause de 10 millisecondes + usleep(10000); + } + } + + /** + * Envoi un mail + * @param string|array $to Destinataire + * @param string $subject Sujet + * @param string $content Contenu + * @return bool + */ + public function sendMail($to, $subject, $content) { + // Layout + ob_start(); + include 'core/layout/mail.php'; + $layout = ob_get_clean(); + // Mail + $mail = new PHPMailer; + $mail->CharSet = 'UTF-8'; + $host = str_replace('www.', '', $_SERVER['HTTP_HOST']); + $mail->setFrom('no-reply@' . $host, $this->getData(['config', 'title'])); + $mail->addReplyTo('no-reply@' . $host, $this->getData(['config', 'title'])); + if(is_array($to)) { + foreach($to as $userMail) { + $mail->addAddress($userMail); + } + } + else { + $mail->addAddress($to); + } + $mail->isHTML(true); + $mail->Subject = $subject; + $mail->Body = $layout; + $mail->AltBody = strip_tags($content); + if($mail->send()) { + return true; + } + else { + return $mail->ErrorInfo; + } + } + + /** + * Insert des données + * @param array $keys Clé(s) des données + */ + public function setData($keys) { + switch(count($keys)) { + case 1: + $this->data = $keys[0]; + break; + case 2: + $this->data[$keys[0]] = $keys[1]; + break; + case 3: + $this->data[$keys[0]][$keys[1]] = $keys[2]; + break; + case 4: + $this->data[$keys[0]][$keys[1]][$keys[2]] = $keys[3]; + break; + case 5: + $this->data[$keys[0]][$keys[1]][$keys[2]][$keys[3]] = $keys[4]; + break; + case 6: + $this->data[$keys[0]][$keys[1]][$keys[2]][$keys[3]][$keys[4]] = $keys[5]; + break; + case 7: + $this->data[$keys[0]][$keys[1]][$keys[2]][$keys[3]][$keys[4]][$keys[5]] = $keys[6]; + break; + } + } + + /** + * Mises à jour + */ + private function update() { + // Version 8.1.0 + if($this->getData(['core', 'dataVersion']) < 810) { + $this->setData(['config', 'timezone', 'Europe/Paris']); + $this->setData(['core', 'dataVersion', 810]); + $this->saveData(); + } + // Version 8.2.0 + if($this->getData(['core', 'dataVersion']) < 820) { + $this->setData(['theme', 'body', 'backgroundColor', 'rgba(236, 239, 241, 1)']); + $this->setData(['theme', 'site', 'backgroundColor', 'rgba(255, 255, 255, 1)']); + $this->setData(['theme', 'text', 'fontSize', '14px']); + $this->setData(['theme', 'text', 'textColor', 'rgba(33, 34, 35, 1)']); + $this->setData(['theme', 'menu', 'fontSize', '1em']); + $this->setData(['theme', 'menu', 'textColor', 'rgba(255, 255, 255, 1)']); + $this->setData(['theme', 'header', 'fontSize', '2em']); + $this->setData(['theme', 'footer', 'textColor', 'rgba(33, 34, 35, 1)']); + $this->setData(['core', 'dataVersion', 820]); + $this->saveData(); + } + // Version 8.2.2 + if($this->getData(['core', 'dataVersion']) < 822) { + $this->setData(['config', 'maintenance', false]); + $this->setData(['core', 'dataVersion', 822]); + $this->saveData(); + } + // Version 8.2.6 + if($this->getData(['core', 'dataVersion']) < 826) { + $this->setData(['theme','header','linkHome',false]); + $this->setData(['core', 'dataVersion', 826]); + $this->SaveData(); + } + } + +} + +class core extends common { + + /** + * Constructeur du coeur + */ + public function __construct() { + parent::__construct(); + // Token CSRF + if(empty($_SESSION['csrf'])) { + $_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(32)); + } + // Fuseau horaire + self::$timezone = $this->getData(['config', 'timezone']); // Utile pour transmettre le timezone à la classe helper + date_default_timezone_set(self::$timezone); + // Supprime les fichiers temporaires + $lastClearTmp = mktime(0, 0, 0); + if($lastClearTmp > $this->getData(['core', 'lastClearTmp']) + 86400) { + $iterator = new DirectoryIterator('site/tmp/'); + foreach($iterator as $fileInfos) { + if($fileInfos->isFile() AND $fileInfos->getBasename() !== '.gitkeep') { + @unlink($fileInfos->getPathname()); + } + } + // Date de la dernière suppression + $this->setData(['core', 'lastClearTmp', $lastClearTmp]); + // Enregistre les données + $this->saveData(); + } + // Backup automatique des données + $lastBackup = mktime(0, 0, 0); + if( + $this->getData(['config', 'autoBackup']) + AND $lastBackup > $this->getData(['core', 'lastBackup']) + 86400 + AND $this->getData(['user']) // Pas de backup pendant l'installation + ) { + // Copie du fichier de données + copy('site/data/data.json', 'site/backup/' . date('Y-m-d', $lastBackup) . '.json'); + // Date du dernier backup + $this->setData(['core', 'lastBackup', $lastBackup]); + // Enregistre les données + $this->saveData(); + // Supprime les backups de plus de 30 jours + $iterator = new DirectoryIterator('site/backup/'); + foreach($iterator as $fileInfos) { + if( + $fileInfos->isFile() + AND $fileInfos->getBasename() !== '.htaccess' + AND $fileInfos->getMTime() + (86400 * 30) < time() + ) { + @unlink($fileInfos->getPathname()); + } + } + } + // Crée le fichier de personnalisation avancée + if(file_exists('site/data/custom.css') === false) { + file_put_contents('site/data/custom.css', file_get_contents('core/module/theme/resource/custom.css')); + chmod('site/data/custom.css', 0755); + } + // Crée le fichier de personnalisation + if(file_exists('site/data/theme.css') === false) { + file_put_contents('site/data/theme.css', ''); + chmod('site/data/theme.css', 0755); + } + // Check la version + $cssVersion = preg_split('/\*+/', file_get_contents('site/data/theme.css')); + if(empty($cssVersion[1]) OR $cssVersion[1] !== md5(json_encode($this->getData(['theme'])))) { + // Version + $css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/'; + // Import des polices de caractères + $css .= '@import url("https://fonts.googleapis.com/css?family=' . $this->getData(['theme', 'text', 'font']) . '|' . $this->getData(['theme', 'title', 'font']) . '|' . $this->getData(['theme', 'header', 'font']) . '");'; + // Fond du site + $colors = helper::colorVariants($this->getData(['theme', 'body', 'backgroundColor'])); + $css .= 'body{background-color:' . $colors['normal'] . ';font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'text', 'font'])) . '",sans-serif}'; + if($themeBodyImage = $this->getData(['theme', 'body', 'image'])) { + $css .= 'body{background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}'; + } + // Site + $colors = helper::colorVariants($this->getData(['theme', 'link', 'textColor'])); + $css .= 'a{color:' . $colors['normal'] . '}'; + $css .= 'a:hover{color:' . $colors['darken'] . '}'; + $css .= 'body,.row > div{font-size:' . $this->getData(['theme', 'text', 'fontSize']) . '}'; + $css .= 'body,.block h4,input[type=\'email\'],input[type=\'text\'],input[type=\'password\'],.inputFile,select,textarea,.inputFile,.button.buttonGrey,.button.buttonGrey:hover{color:' . $this->getData(['theme', 'text', 'textColor']) . '}'; + $css .= '.container{max-width:' . $this->getData(['theme', 'site', 'width']) . '}'; + $css .= '#site{background-color:' . $this->getData(['theme', 'site', 'backgroundColor']) . ';border-radius:' . $this->getData(['theme', 'site', 'radius']) . ';box-shadow:' . $this->getData(['theme', 'site', 'shadow']) . ' #212223}'; + $colors = helper::colorVariants($this->getData(['theme', 'button', 'backgroundColor'])); + $css .= '.speechBubble,.button,.button:hover,button[type=\'submit\'],.pagination a,.pagination a:hover,input[type=\'checkbox\']:checked + label:before,input[type=\'radio\']:checked + label:before,.helpContent{background-color:' . $colors['normal'] . ';color:' . $colors['text'] . '}'; + $css .= '.helpButton span{color:' . $colors['normal'] . '}'; + $css .= 'input[type=\'text\']:hover,input[type=\'password\']:hover,.inputFile:hover,select:hover,textarea:hover{border-color:' . $colors['normal'] . '}'; + $css .= '.speechBubble:before{border-color:' . $colors['normal'] . ' transparent transparent transparent}'; + $css .= '.button:hover,button[type=\'submit\']:hover,.pagination a:hover,input[type=\'checkbox\']:not(:active):checked:hover + label:before,input[type=\'checkbox\']:active + label:before,input[type=\'radio\']:checked:hover + label:before,input[type=\'radio\']:not(:checked):active + label:before{background-color:' . $colors['darken'] . '}'; + $css .= '.helpButton span:hover{color:' . $colors['darken'] . '}'; + $css .= '.button:active,button[type=\'submit\']:active,.pagination a:active{background-color:' . $colors['veryDarken'] . '}'; + $colors = helper::colorVariants($this->getData(['theme', 'title', 'textColor'])); + $css .= 'h1,h2,h3,h4,h5,h6{color:' . $colors['normal'] . ';font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'title', 'font'])) . '",sans-serif;font-weight:' . $this->getData(['theme', 'title', 'fontWeight']) . ';text-transform:' . $this->getData(['theme', 'title', 'textTransform']) . '}'; + // Bannière + $colors = helper::colorVariants($this->getData(['theme', 'header', 'backgroundColor'])); + if($this->getData(['theme', 'header', 'margin'])) { + if($this->getData(['theme', 'menu', 'position']) === 'site-first') { + $css .= 'header{margin:0 20px}'; + } + else { + $css .= 'header{margin:20px 20px 0 20px}'; + } + } + $css .= 'header{background-color:' . $colors['normal'] . ';height:' . $this->getData(['theme', 'header', 'height']) . ';line-height:' . $this->getData(['theme', 'header', 'height']) . ';text-align:' . $this->getData(['theme', 'header', 'textAlign']) . '}'; + if($themeHeaderImage = $this->getData(['theme', 'header', 'image'])) { + $css .= 'header{background-image:url("../file/source/' . $themeHeaderImage . '");background-position:' . $this->getData(['theme', 'header', 'imagePosition']) . ';background-repeat:' . $this->getData(['theme', 'header', 'imageRepeat']) . '}'; + } + $colors = helper::colorVariants($this->getData(['theme', 'header', 'textColor'])); + $css .= 'header span{color:' . $colors['normal'] . ';font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'header', 'font'])) . '",sans-serif;font-weight:' . $this->getData(['theme', 'header', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'header', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'header', 'textTransform']) . '}'; + // Menu + $colors = helper::colorVariants($this->getData(['theme', 'menu', 'backgroundColor'])); + $css .= 'nav,nav a{background-color:' . $colors['normal'] . '}'; + $css .= 'nav a,#toggle span,nav a:hover{color:' . $this->getData(['theme', 'menu', 'textColor']) . '}'; + $css .= 'nav a:hover{background-color:' . $colors['darken'] . '}'; + $css .= 'nav a.active{background-color:' . $colors['veryDarken'] . '}'; + $css .= '#menu{text-align:' . $this->getData(['theme', 'menu', 'textAlign']) . '}'; + if($this->getData(['theme', 'menu', 'margin'])) { + if( + $this->getData(['theme', 'menu', 'position']) === 'site-first' + OR $this->getData(['theme', 'header', 'position']) === 'body' + ) { + $css .= 'nav{margin:20px 20px 0 20px}'; + } + else { + $css .= 'nav{margin:0 20px 0}'; + } + } + $css .= '#toggle span,#menu a{padding:' . $this->getData(['theme', 'menu', 'height']) . ';font-weight:' . $this->getData(['theme', 'menu', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'menu', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'menu', 'textTransform']) . '}'; + // Pied de page + $colors = helper::colorVariants($this->getData(['theme', 'footer', 'backgroundColor'])); + if($this->getData(['theme', 'footer', 'margin'])) { + $css .= 'footer{margin:0 20px 20px}'; + } + $css .= 'footer{background-color:' . $colors['normal'] . ';color:' . $this->getData(['theme', 'footer', 'textColor']) . '}'; + $css .= 'footer a{color:' . $this->getData(['theme', 'footer', 'textColor']) . '}'; + $css .= 'footer .container > div{margin:' . $this->getData(['theme', 'footer', 'height']) . ' 0}'; + $css .= '#footerSocials{text-align:' . $this->getData(['theme', 'footer', 'socialsAlign']) . '}'; + $css .= '#footerText{text-align:' . $this->getData(['theme', 'footer', 'textAlign']) . '}'; + $css .= '#footerCopyright{text-align:' . $this->getData(['theme', 'footer', 'copyrightAlign']) . '}'; + // Enregistre la personnalisation + file_put_contents('site/data/theme.css', $css); + } + } + + /** + * Auto-chargement des classes + * @param string $className Nom de la classe à charger + */ + public static function autoload($className) { + $classPath = strtolower($className) . '/' . strtolower($className) . '.php'; + // Module du coeur + if(is_readable('core/module/' . $classPath)) { + require 'core/module/' . $classPath; + } + // Module + elseif(is_readable('module/' . $classPath)) { + require 'module/' . $classPath; + } + // Librairie + elseif(is_readable('core/vendor/' . $classPath)) { + require 'core/vendor/' . $classPath; + } + } + + /** + * Routage des modules + */ + public function router() { + // Installation + if( + $this->getData(['user']) === [] + AND $this->getUrl(0) !== 'install' + ) { + http_response_code(302); + header('Location:' . helper::baseUrl() . 'install'); + exit(); + } + // Force la déconnexion des membres bannis + if ( + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND $this->getUser('group') === self::GROUP_BANNED + ) { + $user = new user; + $user->logout(); + } + // Mode maintenance + if( + $this->getData(['config', 'maintenance']) + AND in_array($this->getUrl(0), ['maintenance', 'user']) === false + AND $this->getUrl(1) !== 'login' + AND ( + $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') + OR ( + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND $this->getUser('group') < self::GROUP_ADMIN + ) + ) + ) { + // Déconnexion + $user = new user; + $user->logout(); + // Rédirection + http_response_code(302); + header('Location:' . helper::baseUrl() . 'maintenance'); + exit(); + } + // Check l'accès à la page + $access = null; + if($this->getData(['page', $this->getUrl(0)]) !== null) { + if( + $this->getData(['page', $this->getUrl(0), 'group']) === self::GROUP_VISITOR + OR ( + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group']) + ) + ) { + $access = true; + } + else { + if($this->getUrl(0) === $this->getData(['config', 'homePageId'])) { + $access = 'login'; + } + else { + $access = false; + } + } + } + // Importe la page + if( + $this->getData(['page', $this->getUrl(0)]) !== null + AND $this->getData(['page', $this->getUrl(0), 'moduleId']) === '' + AND $access + ) { + $this->addOutput([ + 'title' => $this->getData(['page', $this->getUrl(0), 'title']), + 'content' => $this->getData(['page', $this->getUrl(0), 'content']), + 'metaDescription' => $this->getData(['page', $this->getUrl(0), 'metaDescription']), + 'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']), + // Menu image + 'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']), + 'iconUrl' => $this->getData(['page', $this->getUrl(0), 'iconUrl']), + 'disable' => $this->getData(['page', $this->getUrl(0), 'disable']) + // Menu Image + ]); + } + // Importe le module + else { + // Id du module, et valeurs en sortie de la page si il s'agit d'un module de page + if($access AND $this->getData(['page', $this->getUrl(0), 'moduleId'])) { + $moduleId = $this->getData(['page', $this->getUrl(0), 'moduleId']); + $this->addOutput([ + 'title' => $this->getData(['page', $this->getUrl(0), 'title']), + 'metaDescription' => $this->getData(['page', $this->getUrl(0), 'metaDescription']), + 'metaTitle' => $this->getData(['page', $this->getUrl(0), 'metaTitle']), + // Menu image + 'typeMenu' => $this->getData(['page', $this->getUrl(0), 'typeMenu']), + 'iconUrl' => $this->getData(['page', $this->getUrl(0), 'iconUrl']), + 'disable' => $this->getData(['page', $this->getUrl(0), 'disable']) + // Menu image + ]); + $pageContent = $this->getData(['page', $this->getUrl(0), 'content']); + } + else { + $moduleId = $this->getUrl(0); + $pageContent = ''; + } + // Check l'existence du module + if(class_exists($moduleId)) { + /** @var common $module */ + $module = new $moduleId; + // Check l'existence de l'action + $action = ''; + $ignore = true; + foreach(explode('-', $this->getUrl(1)) as $actionPart) { + if($ignore) { + $action .= $actionPart; + $ignore = false; + } + else { + $action .= ucfirst($actionPart); + } + } + $action = array_key_exists($action, $module::$actions) ? $action : 'index'; + if(array_key_exists($action, $module::$actions)) { + $module->$action(); + $output = $module->output; + // Check le groupe de l'utilisateur + if( + ( + $module::$actions[$action] === self::GROUP_VISITOR + OR ( + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND $this->getUser('group') >= $module::$actions[$action] + ) + ) + AND $output['access'] === true + ) { + // Enregistrement du contenu de la méthode POST lorsqu'une notice est présente + if(common::$inputNotices) { + foreach($_POST as $postId => $postValue) { + if(is_array($postValue)) { + foreach($postValue as $subPostId => $subPostValue) { + self::$inputBefore[$postId . '_' . $subPostId] = $subPostValue; + } + } + else { + self::$inputBefore[$postId] = $postValue; + } + } + } + // Sinon traitement des données de sortie qui requiert qu'aucune notice ne soit présente + else { + // Enregistrement des données + if($output['state'] !== false) { + $this->setData([$module->getData()]); + $this->saveData(); + } + // Notification + if($output['notification']) { + if($output['state'] === true) { + $notification = 'ZWII_NOTIFICATION_SUCCESS'; + } + elseif($output['state'] === false) { + $notification = 'ZWII_NOTIFICATION_ERROR'; + } + else { + $notification = 'ZWII_NOTIFICATION_OTHER'; + } + $_SESSION[$notification] = $output['notification']; + } + // Redirection + if($output['redirect']) { + http_response_code(301); + header('Location:' . $output['redirect']); + exit(); + } + } + // Données en sortie applicables même lorsqu'une notice est présente + // Affichage + if($output['display']) { + $this->addOutput([ + 'display' => $output['display'] + ]); + } + // Contenu brut + if($output['content']) { + $this->addOutput([ + 'content' => $output['content'] + ]); + } + // Contenu par vue + elseif($output['view']) { + // Chemin en fonction d'un module du coeur ou d'un module + $modulePath = in_array($moduleId, self::$coreModuleIds) ? 'core/' : ''; + // CSS + $stylePath = $modulePath . 'module/' . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.css'; + if(file_exists($stylePath)) { + $this->addOutput([ + 'style' => file_get_contents($stylePath) + ]); + } + // JS + $scriptPath = $modulePath . 'module/' . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.js.php'; + if(file_exists($scriptPath)) { + ob_start(); + include $scriptPath; + $this->addOutput([ + 'script' => ob_get_clean() + ]); + } + // Vue + $viewPath = $modulePath . 'module/' . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.php'; + if(file_exists($viewPath)) { + ob_start(); + include $viewPath; + $this->addOutput([ + 'content' => ($output['showPageContent'] ? $pageContent : '') . ob_get_clean() + ]); + } + } + // Librairies + if($output['vendor'] !== $this->output['vendor']) { + $this->addOutput([ + 'vendor' => array_merge($this->output['vendor'], $output['vendor']) + ]); + } + if($output['title'] !== null) { + $this->addOutput([ + 'title' => $output['title'] + ]); + } + // Affiche le bouton d'édition de la page dans la barre de membre + if($output['showBarEditButton']) { + $this->addOutput([ + 'showBarEditButton' => $output['showBarEditButton'] + ]); + } + } + // Erreur 403 + else { + $access = false; + } + } + } + } + // Erreurs + if($access === 'login') { + http_response_code(302); + header('Location:' . helper::baseUrl() . 'user/login/'); + exit(); + } + if($access === false) { + http_response_code(403); + $this->addOutput([ + 'title' => 'Erreur 403', + 'content' => template::speech('Vous n\'êtes pas autorisé à accéder à cette page...') + ]); + } + elseif($this->output['content'] === '') { + http_response_code(404); + $this->addOutput([ + 'title' => 'Erreur 404', + 'content' => template::speech('Oups ! La page demandée est introuvable...') + ]); + } + // Mise en forme des métas + if($this->output['metaTitle'] === '') { + if($this->output['title']) { + $this->addOutput([ + 'metaTitle' => $this->output['title'] . ' - ' . $this->getData(['config', 'title']) + ]); + } + else { + $this->addOutput([ + 'metaTitle' => $this->getData(['config', 'title']) + ]); + } + } + if($this->output['metaDescription'] === '') { + $this->addOutput([ + 'metaDescription' => $this->getData(['config', 'metaDescription']) + ]); + } + // Choix du type d'affichage + switch($this->output['display']) { + // Layout vide + case self::DISPLAY_LAYOUT_BLANK: + require 'core/layout/blank.php'; + break; + // Affichage en JSON + case self::DISPLAY_JSON: + header('Content-Type: application/json'); + echo json_encode($this->output['content']); + break; + // Layout alléger + case self::DISPLAY_LAYOUT_LIGHT: + require 'core/layout/light.php'; + break; + // Layout principal + case self::DISPLAY_LAYOUT_MAIN: + require 'core/layout/main.php'; + break; + // Layout brut + case self::DISPLAY_RAW: + echo $this->output['content']; + break; + } + } + +} + +class helper { + + /** Statut de la réécriture d'URL (pour éviter de lire le contenu du fichier .htaccess à chaque self::baseUrl()) */ + public static $rewriteStatus = null; + + /** Filtres personnalisés */ + const FILTER_BOOLEAN = 1; + const FILTER_DATETIME = 2; + const FILTER_FLOAT = 3; + const FILTER_ID = 4; + const FILTER_INT = 5; + const FILTER_MAIL = 6; + const FILTER_PASSWORD = 7; + const FILTER_STRING_LONG = 8; + const FILTER_STRING_SHORT = 9; + const FILTER_TIMESTAMP = 10; + const FILTER_URL = 11; + + /** + * Retourne les valeurs d'une colonne du tableau de données + * @param array $array Tableau cible + * @param string $column Colonne à extraire + * @param string $sort Type de tri à appliquer au tableau (SORT_ASC, SORT_DESC, ou null) + * @return array + */ + public static function arrayCollumn($array, $column, $sort = null) { + $newArray = []; + if(empty($array) === false) { + $newArray = array_map(function($element) use($column) { + return $element[$column]; + }, $array); + switch($sort) { + case 'SORT_ASC': + asort($newArray); + break; + case 'SORT_DESC': + arsort($newArray); + break; + } + } + return $newArray; + } + + /** + * Retourne l'URL de base du site + * @param bool $queryString Affiche ou non le point d'interrogation + * @param bool $host Affiche ou non l'host + * @return string + */ + public static function baseUrl($queryString = true, $host = true) { + // Protocol + if( + (empty($_SERVER['HTTPS']) === false AND $_SERVER['HTTPS'] !== 'off') + OR $_SERVER['SERVER_PORT'] === 443 + ) { + $protocol = 'https://'; + } + else { + $protocol = 'http://'; + } + // Host + if($host) { + $host = $protocol . $_SERVER['HTTP_HOST']; + } + // Pathinfo + $pathInfo = pathinfo($_SERVER['PHP_SELF']); + // Querystring + if($queryString AND helper::checkRewrite() === false) { + $queryString = '?'; + } + else { + $queryString = ''; + } + return $host . rtrim($pathInfo['dirname'], ' /') . '/' . $queryString; + } + + /** + * Check le statut de l'URL rewriting + * @return bool + */ + public static function checkRewrite() { + if(self::$rewriteStatus === null) { + // Ouvre et scinde le fichier .htaccess + $htaccess = explode('# URL rewriting', file_get_contents('.htaccess')); + // Retourne un boolean en fonction du contenu de la partie réservée à l'URL rewriting + self::$rewriteStatus = (empty($htaccess[1]) === false); + } + return self::$rewriteStatus; + } + + /** + * Check si une nouvelle version de Zwii est disponible + * @return bool + */ + public static function checkNewVersion() { + if($version = @file_get_contents('http://zwiicms.com/version')) { + return (trim($version) !== common::ZWII_VERSION); + } + else { + return false; + } + } + + /** + * Génère des variations d'une couleur + * @param string $rgba Code rgba de la couleur + * @return array + */ + public static function colorVariants($rgba) { + preg_match('#\(+(.*)\)+#', $rgba, $matches); + $rgba = explode(', ', $matches[1]); + return [ + 'normal' => 'rgba(' . $rgba[0] . ',' . $rgba[1] . ',' . $rgba[2] . ',' . $rgba[3] . ')', + 'darken' => 'rgba(' . max(0, $rgba[0] - 15) . ',' . max(0, $rgba[1] - 15) . ',' . max(0, $rgba[2] - 15) . ',' . $rgba[3] . ')', + 'veryDarken' => 'rgba(' . max(0, $rgba[0] - 20) . ',' . max(0, $rgba[1] - 20) . ',' . max(0, $rgba[2] - 20) . ',' . $rgba[3] . ')', + 'text' => self::relativeLuminanceW3C($rgba) > .22 ? "inherit" : "white" + ]; + } + + /** + * Supprime un cookie + * @param string $cookieKey Clé du cookie à supprimer + */ + public static function deleteCookie($cookieKey) { + unset($_COOKIE[$cookieKey]); + setcookie($cookieKey, '', time() - 3600, helper::baseUrl(false, false)); + } + + /** + * Filtre une chaîne en fonction d'un tableau de données + * @param string $text Chaîne à filtrer + * @param int $filter Type de filtre à appliquer + * @return string + */ + public static function filter($text, $filter) { + $text = trim($text); + switch($filter) { + case self::FILTER_BOOLEAN: + $text = (bool) $text; + break; + case self::FILTER_DATETIME: + $timezone = new DateTimeZone(core::$timezone); + $date = new DateTime($text); + $date->setTimezone($timezone); + $text = (int) $date->format('U'); + break; + case self::FILTER_FLOAT: + $text = filter_var($text, FILTER_SANITIZE_NUMBER_FLOAT); + $text = (float) $text; + break; + case self::FILTER_ID: + $text = mb_strtolower($text, 'UTF-8'); + $text = str_replace( + explode(',', 'á,à,â,ä,ã,å,ç,é,è,ê,ë,í,ì,î,ï,ñ,ó,ò,ô,ö,õ,ú,ù,û,ü,ý,ÿ,\',", '), + explode(',', 'a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,n,o,o,o,o,o,u,u,u,u,y,y,-,-,-'), + $text + ); + $text = preg_replace('/([^a-z0-9-])/', '', $text); + // Un ID ne peut pas être un entier, pour éviter les conflits avec le système de pagination + if(intval($text) !== 0) { + $text = 'i' . $text; + } + break; + case self::FILTER_INT: + $text = (int) filter_var($text, FILTER_SANITIZE_NUMBER_INT); + break; + case self::FILTER_MAIL: + $text = filter_var($text, FILTER_SANITIZE_EMAIL); + break; + case self::FILTER_PASSWORD: + $text = password_hash($text, PASSWORD_BCRYPT); + break; + case self::FILTER_STRING_LONG: + $text = mb_substr(filter_var($text, FILTER_SANITIZE_STRING), 0, 500000); + break; + case self::FILTER_STRING_SHORT: + $text = mb_substr(filter_var($text, FILTER_SANITIZE_STRING), 0, 500); + break; + case self::FILTER_TIMESTAMP: + $text = date('Y-m-d H:i:s', $text); + break; + case self::FILTER_URL: + $text = filter_var($text, FILTER_SANITIZE_URL); + break; + } + return get_magic_quotes_gpc() ? stripslashes($text) : $text; + } + + /** + * Incrémente une clé en fonction des clés ou des valeurs d'un tableau + * @param mixed $key Clé à incrémenter + * @param array $array Tableau à vérifier + * @return string + */ + public static function increment($key, $array = []) { + // Pas besoin d'incrémenter si la clef n'existe pas + if($array === []) { + return $key; + } + // Incrémente la clef + else { + // Si la clef est numérique elle est incrémentée + if(is_numeric($key)) { + $newKey = $key; + while(array_key_exists($newKey, $array) OR in_array($newKey, $array)) { + $newKey++; + } + } + // Sinon l'incrémentation est ajoutée après la clef + else { + $i = 2; + $newKey = $key; + while(array_key_exists($newKey, $array) OR in_array($newKey, $array)) { + $newKey = $key . '-' . $i; + $i++; + } + } + return $newKey; + } + } + + /** + * Minimise du css + * @param string $css Css à minimiser + * @return string + */ + public static function minifyCss($css) { + // Supprime les commentaires + $css = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css); + // Supprime les tabulations, espaces, nouvelles lignes, etc... + $css = str_replace(["\r\n", "\r", "\n" ,"\t", ' ', ' ', ' '], '', $css); + $css = preg_replace(['(( )+{)', '({( )+)'], '{', $css); + $css = preg_replace(['(( )+})', '(}( )+)', '(;( )*})'], '}', $css); + $css = preg_replace(['(;( )+)', '(( )+;)'], ';', $css); + // Retourne le css minifié + return $css; + } + + /** + * Minimise du js + * @param string $js Js à minimiser + * @return string + */ + public static function minifyJs($js) { + // Supprime les commentaires + $js = preg_replace('/\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/|\s*(?getUrl() + * @param null|int $sufix Suffixe de l'url + * @return array + */ + public static function pagination($array, $url, $sufix = null) { + // Scinde l'url + $url = explode('/', $url); + // Url de pagination + $urlPagination = is_numeric($url[count($url) - 1]) ? array_pop($url) : 1; + // Url de la page courante + $urlCurrent = implode('/', $url); + // Nombre d'éléments à afficher + $nbElements = count($array); + // Nombre de page + $nbPage = ceil($nbElements / 10); + // Page courante + $currentPage = is_numeric($urlPagination) ? self::filter($urlPagination, self::FILTER_INT) : 1; + // Premier élément de la page + $firstElement = ($currentPage - 1) * 10; + // Dernier élément de la page + $lastElement = $firstElement + 10; + $lastElement = ($lastElement > $nbElements) ? $nbElements : $lastElement; + // Mise en forme de la liste des pages + $pages = ''; + if($nbPage > 1) { + for($i = 1; $i <= $nbPage; $i++) { + $disabled = ($i === $currentPage) ? ' class="disabled"' : false; + $pages .= '' . $i . ''; + } + $pages = ''; + } + // Retourne un tableau contenant les informations sur la pagination + return [ + 'first' => $firstElement, + 'last' => $lastElement, + 'pages' => $pages + ]; + } + + /** + * Calcul de la luminance relative d'une couleur + */ + public static function relativeLuminanceW3C($rgba) { + // Conversion en sRGB + $RsRGB = $rgba[0] / 255; + $GsRGB = $rgba[1] / 255; + $BsRGB = $rgba[2] / 255; + // Ajout de la transparence + $RsRGBA = $rgba[3] * $RsRGB + (1 - $rgba[3]); + $GsRGBA = $rgba[3] * $GsRGB + (1 - $rgba[3]); + $BsRGBA = $rgba[3] * $BsRGB + (1 - $rgba[3]); + // Calcul de la luminance + $R = ($RsRGBA <= .03928) ? $RsRGBA / 12.92 : pow(($RsRGBA + .055) / 1.055, 2.4); + $G = ($GsRGBA <= .03928) ? $GsRGBA / 12.92 : pow(($GsRGBA + .055) / 1.055, 2.4); + $B = ($BsRGBA <= .03928) ? $BsRGBA / 12.92 : pow(($BsRGBA + .055) / 1.055, 2.4); + return .2126 * $R + .7152 * $G + .0722 * $B; + } + + /** + * Retourne les attributs d'une balise au bon format + * @param array $array Liste des attributs ($key => $value) + * @param array $exclude Clés à ignorer ($key) + * @return string + */ + public static function sprintAttributes(array $array = [], array $exclude = []) { + $exclude = array_merge( + [ + 'before', + 'classWrapper', + 'help', + 'label' + ], + $exclude + ); + $attributes = []; + foreach($array as $key => $value) { + if(($value OR $value === 0) AND in_array($key, $exclude) === false) { + // Désactive le message de modifications non enregistrées pour le champ + if($key === 'noDirty') { + $attributes[] = 'data-no-dirty'; + } + // Disabled + // Readonly + elseif(in_array($key, ['disabled', 'readonly'])) { + $attributes[] = sprintf('%s', $key); + } + // Autres + else { + $attributes[] = sprintf('%s="%s"', $key, $value); + } + } + } + return implode(' ', $attributes); + } + + /** + * Retourne un segment de chaîne sans couper de mot + * @param string $text Texte à scinder + * @param int $start (voir substr de PHP pour fonctionnement) + * @param int $length (voir substr de PHP pour fonctionnement) + * @return string + */ + public static function subword($text, $start, $length) { + $text = trim($text); + if(strlen($text) > $length) { + $text = mb_substr($text, $start, $length); + $text = mb_substr($text, 0, min(mb_strlen($text), mb_strrpos($text, ' '))); + } + return $text; + } + +} + +class layout extends common { + + private $core; + + /** + * Constructeur du layout + */ + public function __construct(core $core) { + parent::__construct(); + $this->core = $core; + } + + /** + * Affiche le script Google Analytics + */ + public function showAnalytics() { + if($code = $this->getData(['config', 'analyticsId'])) { + echo ''; + } + } + + /** + * Affiche le contenu + */ + public function showContent() { + if( + $this->core->output['title'] + AND ( + $this->getData(['page', $this->getUrl(0)]) === null + OR $this->getData(['page', $this->getUrl(0), 'hideTitle']) === false + ) + ) { + echo '

' . $this->core->output['title'] . '

'; + } + echo $this->core->output['content']; + } + + /** + * Affiche le coyright + */ + public function showCopyright() { + $items = '
'; + $items .= 'Motorisé par Zwii'; + $items .= ' | Plan du site'; + if( + ( + $this->getData(['theme', 'footer', 'loginLink']) + AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') + ) + OR $this->getUrl(0) === 'theme' + ) { + $items .= 'getUrl(0) === 'theme' ? 'class="displayNone"' : '') . '> | Connexion'; + } + $items .= '
'; + echo $items; + } + + /** + * Affiche le favicon + */ + public function showFavicon() { + if($favicon = $this->getData(['config', 'favicon'])) { + echo ''; + } + } + + /** + * Affiche le texte du footer + */ + public function showFooterText() { + if($footerText = $this->getData(['theme', 'footer', 'text']) OR $this->getUrl(0) === 'theme') { + echo '
' . nl2br($footerText) . '
'; + } + } + + /** + * Affiche le menu + */ + public function showMenu() { + // Met en forme les items du menu + $items = ''; + $currentPageId = $this->getData(['page', $this->getUrl(0)]) ? $this->getUrl(0) : $this->getUrl(2); + foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) { + // Propriétés de l'item + $active = ($parentPageId === $currentPageId OR in_array($currentPageId, $childrenPageIds)) ? ' class="active"' : ''; + $targetBlank = $this->getData(['page', $parentPageId, 'targetBlank']) ? ' target="_blank"' : ''; + // Mise en page de l'item + $items .= '
  • '; + // Menu image + + if ($this->getData(['page',$parentPageId,'disable']) === true ) + { $items .= ''; } + else + { $items .= ''; } + + + switch ($this->getData(['page', $parentPageId, 'typeMenu'])) { + case '' : + $items .= $this->getData(['page', $parentPageId, 'title']); + break; + case 'text' : + $items .= $this->getData(['page', $parentPageId, 'title']); + break; + case 'icon' : + if ($this->getData(['page', $parentPageId, 'iconUrl']) != "") { + $items .= ''; + } else { + $items .= $this->getData(['page', $parentPageId, 'title']); + } + break; + case 'icontitle' : + if ($this->getData(['page', $parentPageId, 'iconUrl']) != "") { + $items .= ''; + } else { + $items .= $this->getData(['page', $parentPageId, 'title']); + } + break; + case 'icontext' : + if ($this->getData(['page', $parentPageId, 'iconUrl']) != "") { + $items .= ''; + $items .= $this->getData(['page', $parentPageId, 'title']); + } else { + $items .= $this->getData(['page', $parentPageId, 'title']); + } + break; + } + // Menu Image + + + + if($childrenPageIds) { + $items .= template::ico('down', 'left'); + } + $items .= ''; + + + + $items .= ''; + $items .= '
  • '; + } + // Lien de connexion + if( + ( + $this->getData(['theme', 'menu', 'loginLink']) + AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') + ) + OR $this->getUrl(0) === 'theme' + ) { + $items .= '
  • '; + $leftItems .= '
  • ' . template::ico('plus') . '
  • '; + if( + // Sur un module de page qui autorise le bouton de modification de la page + $this->core->output['showBarEditButton'] + // Sur une page sans module + OR $this->getData(['page', $this->getUrl(0), 'moduleId']) === '' + // Sur une page d'accueil + OR $this->getUrl(0) === '' + ) { + $leftItems .= '
  • ' . template::ico('pencil') . '
  • '; + } + } + // Items de droite + $rightItems = ''; + if($this->getUser('group') >= self::GROUP_MODERATOR) { + + $rightItems .= '
  • ' . template::ico('folder') . '
  • '; + } + if($this->getUser('group') >= self::GROUP_ADMIN) { + $rightItems .= '
  • ' . template::ico('users') . '
  • '; + $rightItems .= '
  • ' . template::ico('brush') . '
  • '; + $rightItems .= '
  • ' . template::ico('gear') . '
  • '; + // menu image + // if(helper::checkNewVersion()) { + // $rightItems .= '
  • ' . template::ico('update colorRed') . '
  • '; + // } + // menu image + } + $rightItems .= '
  • ' . template::ico('user', 'right') . $this->getUser('firstname') . ' ' . $this->getUser('lastname') . '
  • '; + $rightItems .= '
  • ' . template::ico('logout') . '
  • '; + // Barre de membre + echo '
      ' . $leftItems . '
      ' . $rightItems . '
    '; + } + } + + /** + * Affiche le script + */ + public function showScript() { + ob_start(); + require 'core/core.js.php'; + $coreScript = ob_get_clean(); + echo ''; + } + + /** + * Affiche le style + */ + public function showStyle() { + if($this->core->output['style']) { + echo ''; + } + } + + /** + * Affiche les réseaux sociaux + */ + public function showSocials() { + $socials = ''; + foreach($this->getData(['config', 'social']) as $socialName => $socialId) { + switch($socialName) { + case 'facebookId': + $socialUrl = 'https://www.facebook.com/'; + break; + case 'googleplusId': + $socialUrl = 'https://plus.google.com/'; + break; + case 'instagramId': + $socialUrl = 'https://www.instagram.com/'; + break; + case 'pinterestId': + $socialUrl = 'https://pinterest.com/'; + break; + case 'twitterId': + $socialUrl = 'https://twitter.com/'; + break; + case 'youtubeId': + $socialUrl = 'https://www.youtube.com/channel/'; + break; + default: + $socialUrl = ''; + } + if($socialId !== '') { + $socials .= '' . template::ico(substr($socialName, 0, -2)) . ''; + } + } + if($socials !== '') { + echo '
    ' . $socials . '
    '; + } + } + + /** + * Affiche l'import des librairies + */ + public function showVendor() { + // Variables partagées + $vars = 'var baseUrl = ' . json_encode(helper::baseUrl(false)) . ';'; + $vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';'; + if( + $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + AND $this->getUser('group') >= self::GROUP_MODERATOR + ) { + $vars .= 'var privateKey = ' . json_encode(md5_file('site/data/data.json')) . ';'; + } + echo ''; + // Librairies + $moduleId = $this->getData(['page', $this->getUrl(0), 'moduleId']); + foreach($this->core->output['vendor'] as $vendorName) { + // Coeur + if(file_exists('core/vendor/' . $vendorName . '/inc.json')) { + $vendorPath = 'core/vendor/' . $vendorName . '/'; + } + // Module + elseif( + $moduleId + AND in_array($moduleId, self::$coreModuleIds) === false + AND file_exists('module/' . $moduleId . '/vendor/' . $vendorName . '/inc.json') + ) { + $vendorPath = 'module/' . $moduleId . '/vendor/' . $vendorName . '/'; + } + // Sinon continue + else { + continue; + } + // Détermine le type d'import en fonction de l'extension de la librairie + $vendorFiles = json_decode(file_get_contents($vendorPath . 'inc.json')); + foreach($vendorFiles as $vendorFile) { + switch(pathinfo($vendorFile, PATHINFO_EXTENSION)) { + case 'css': + echo ''; + break; + case 'js': + echo ''; + break; + } + } + } + } + +} + +class template { + + /** + * Crée un bouton + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function button($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'class' => '', + 'disabled' => false, + 'href' => 'javascript:void(0);', + 'ico' => '', + 'id' => $nameId, + 'name' => $nameId, + 'target' => '', + 'uniqueSubmission' => false, + 'value' => 'Bouton' + ], $attributes); + // Retourne le html + return sprintf( + '%s', + helper::sprintAttributes($attributes, ['class', 'disabled', 'ico', 'value']), + $attributes['disabled'] ? 'disabled' : '', + $attributes['class'], + $attributes['uniqueSubmission'] ? 'uniqueSubmission' : '', + ($attributes['ico'] ? template::ico($attributes['ico'], 'right') : '') . $attributes['value'] + ); + } + + /** + * Crée un champ capcha + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function capcha($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'class' => '', + 'classWrapper' => '', + 'help' => '', + 'id' => $nameId, + 'name' => $nameId, + 'value' => '' + ], $attributes); + // Génère deux nombres pour le capcha + $firstNumber = mt_rand(1, 15); + $secondNumber = mt_rand(1, 15); + // Début du wrapper + $html = '
    '; + // Label + $html .= self::label($attributes['id'], 'Combien font ' . $firstNumber . ' + ' . $secondNumber . ' ?', [ + 'help' => $attributes['help'] + ]); + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Capcha + $html .= sprintf( + '', + helper::sprintAttributes($attributes) + ); + // Champs cachés contenant les nombres + $html .= self::hidden($attributes['id'] . 'FirstNumber', [ + 'value' => $firstNumber, + 'before' => false + ]); + $html .= self::hidden($attributes['id'] . 'SecondNumber', [ + 'value' => $secondNumber, + 'before' => false + ]); + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée une case à cocher à sélection multiple + * @param string $nameId Nom et id du champ + * @param string $value Valeur de la case à cocher + * @param string $label Label de la case à cocher + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function checkbox($nameId, $value, $label, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'before' => true, + 'checked' => '', + 'class' => '', + 'classWrapper' => '', + 'disabled' => false, + 'help' => '', + 'id' => $nameId, + 'name' => $nameId + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['checked'] = (bool) common::$inputBefore[$attributes['id']]; + } + // Début du wrapper + $html = '
    '; + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Case à cocher + $html .= sprintf( + '', + $value, + helper::sprintAttributes($attributes) + ); + // Label + $html .= self::label($attributes['id'], '' . $label . '', [ + 'help' => $attributes['help'] + ]); + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée un champ date + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function date($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'autocomplete' => 'on', + 'before' => true, + 'class' => '', + 'classWrapper' => '', + 'noDirty' => false, + 'disabled' => false, + 'help' => '', + 'id' => $nameId, + 'label' => '', + 'name' => $nameId, + 'placeholder' => '', + 'readonly' => true, + 'value' => '' + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['value'] = common::$inputBefore[$attributes['id']]; + } + else { + $attributes['value'] = ($attributes['value'] ? helper::filter($attributes['value'], helper::FILTER_TIMESTAMP) : ''); + } + // Début du wrapper + $html = '
    '; + // Label + if($attributes['label']) { + $html .= self::label($attributes['id'], $attributes['label'], [ + 'help' => $attributes['help'] + ]); + } + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Date visible + $html .= sprintf( + '', + $attributes['class'], + $attributes['value'], + helper::sprintAttributes($attributes, ['class', 'value']) + ); + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée un champ d'upload de fichier + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function file($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'before' => true, + 'class' => '', + 'classWrapper' => '', + 'noDirty' => false, + 'disabled' => false, + 'extensions' => '', + 'help' => '', + 'id' => $nameId, + 'label' => '', + 'maxlength' => '500', + 'name' => $nameId, + 'type' => 2, + 'value' => '' + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['value'] = common::$inputBefore[$attributes['id']]; + } + // Début du wrapper + $html = '
    '; + // Label + if($attributes['label']) { + $html .= self::label($attributes['id'], $attributes['label'], [ + 'help' => $attributes['help'] + ]); + } + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Champ caché contenant l'url de la page + $html .= self::hidden($attributes['id'], [ + 'class' => 'inputFileHidden', + 'disabled' => $attributes['disabled'], + 'maxlength' => $attributes['maxlength'], + 'value' => $attributes['value'] + ]); + // Champ d'upload + $html .= '
    '; + $html .= sprintf( + ' + ' . self::ico('download', 'right') . ' + + ', + $attributes['class'], + $attributes['disabled'] ? 'disabled' : '', + helper::sprintAttributes($attributes, ['class', 'extensions', 'type', 'maxlength']) + ); + $html .= self::button($attributes['id'] . 'Delete', [ + 'class' => 'inputFileDelete', + 'value' => self::ico('cancel') + ]); + $html .= '
    '; + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Ferme un formulaire + * @return string + */ + public static function formClose() { + return ''; + } + + /** + * Ouvre un formulaire protégé par CSRF + * @param string $id Id du formulaire + * @return string + */ + public static function formOpen($id) { + // Ouverture formulaire + $html = '
    '; + // Stock le token CSRF + $html .= self::hidden('csrf', [ + 'value' => $_SESSION['csrf'] + ]); + // Retourne le html + return $html; + } + + + + /** + * Crée une aide qui s'affiche au survole + * @param string $text Texte de l'aide + * @return string + */ + public static function help($text) { + return '' . self::ico('help') . ''; + } + + /** + * Crée un champ caché + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function hidden($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'before' => true, + 'class' => '', + 'noDirty' => false, + 'id' => $nameId, + 'maxlength' => '500', + 'name' => $nameId, + 'value' => '' + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['value'] = common::$inputBefore[$attributes['id']]; + } + // Texte + $html = sprintf('', helper::sprintAttributes($attributes, ['before'])); + // Retourne le html + return $html; + } + + /** + * Crée un icône + * @param string $ico Classe de l'icône + * @param string $margin Ajoute un margin autour de l'icône (choix : left, right, all) + * @param bool $animate Ajoute une animation à l'icône + * @param string $fontSize Taille de la police + * @return string + */ + public static function ico($ico, $margin = '', $animate = false, $fontSize = '1em') { + return ''; + } + + /** + * Crée un label + * @param string $for For du label + * @param array $attributes Attributs ($key => $value) + * @param string $text Texte du label + * @return string + */ + public static function label($for, $text, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'class' => '', + 'for' => $for, + 'help' => '' + ], $attributes); + // Ajout d'une aide + if($attributes['help'] !== '') { + $text = $text . self::help($attributes['help']); + } + // Retourne le html + return sprintf( + '', + helper::sprintAttributes($attributes), + $text + ); + } + + /** + * Crée un champ mail + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function mail($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'autocomplete' => 'on', + 'before' => true, + 'class' => '', + 'classWrapper' => '', + 'noDirty' => false, + 'disabled' => false, + 'help' => '', + 'id' => $nameId, + 'label' => '', + 'maxlength' => '500', + 'name' => $nameId, + 'placeholder' => '', + 'readonly' => false, + 'value' => '' + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['value'] = common::$inputBefore[$attributes['id']]; + } + // Début du wrapper + $html = '
    '; + // Label + if($attributes['label']) { + $html .= self::label($attributes['id'], $attributes['label'], [ + 'help' => $attributes['help'] + ]); + } + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Texte + $html .= sprintf( + '', + helper::sprintAttributes($attributes) + ); + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée une notice + * @param string $id Id du champ + * @param string $notice Notice + * @return string + */ + public static function notice($id, $notice) { + return ' ' . $notice . ''; + } + + /** + * Crée un champ mot de passe + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function password($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'autocomplete' => 'on', + 'class' => '', + 'classWrapper' => '', + 'noDirty' => false, + 'disabled' => false, + 'help' => '', + 'id' => $nameId, + 'label' => '', + 'maxlength' => '500', + 'name' => $nameId, + 'placeholder' => '', + 'readonly' => false + ], $attributes); + // Début du wrapper + $html = '
    '; + // Label + if($attributes['label']) { + $html .= self::label($attributes['id'], $attributes['label'], [ + 'help' => $attributes['help'] + ]); + } + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Mot de passe + $html .= sprintf( + '', + helper::sprintAttributes($attributes) + ); + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée un champ sélection + * @param string $nameId Nom et id du champ + * @param array $options Liste des options du champ de sélection ($value => $text) + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function select($nameId, array $options, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'before' => true, + 'class' => '', + 'classWrapper' => '', + 'noDirty' => false, + 'disabled' => false, + 'help' => '', + 'id' => $nameId, + 'label' => '', + 'name' => $nameId, + 'selected' => '' + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['selected'] = common::$inputBefore[$attributes['id']]; + } + // Début du wrapper + $html = '
    '; + // Label + if($attributes['label']) { + $html .= self::label($attributes['id'], $attributes['label'], [ + 'help' => $attributes['help'] + ]); + } + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Début sélection + $html .= sprintf(''; + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée une bulle de dialogue + * @param string $text Texte de la bulle + * @return string + */ + public static function speech($text) { + return '
    ' . $text . '
    ' . template::ico('mimi speechMimi', '', false, '7em') . '
    '; + } + + /** + * Crée un bouton validation + * @param string $nameId Nom & id du bouton validation + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function submit($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'class' => '', + 'disabled' => false, + 'ico' => 'check', + 'id' => $nameId, + 'name' => $nameId, + 'uniqueSubmission' => true, + 'value' => 'Enregistrer' + ], $attributes); + // Retourne le html + return sprintf( + '', + $attributes['class'], + $attributes['uniqueSubmission'] ? 'uniqueSubmission' : '', + helper::sprintAttributes($attributes, ['class', 'ico', 'value']), + ($attributes['ico'] ? template::ico($attributes['ico'], 'right') : '') . $attributes['value'] + ); + } + + /** + * Crée un tableau + * @param array $cols Cols des colonnes (format: [col colonne1, col colonne2, etc]) + * @param array $body Contenu (format: [[contenu1, contenu2, etc], [contenu1, contenu2, etc]]) + * @param array $head Entêtes (format : [[titre colonne1, titre colonne2, etc]) + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function table(array $cols = [], array $body = [], array $head = [], array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'class' => '', + 'classWrapper' => '', + 'id' => '' + ], $attributes); + // Début du wrapper + $html = '
    '; + // Début tableau + $html .= ''; + // Entêtes + if($head) { + // Début des entêtes + $html .= ''; + $html .= ''; + $i = 0; + foreach($head as $th) { + $html .= ''; + } + // Fin des entêtes + $html .= ''; + $html .= ''; + } + // Début contenu + $html .= ''; + foreach($body as $tr) { + $html .= ''; + $i = 0; + foreach($tr as $td) { + $html .= ''; + } + $html .= ''; + } + // Fin contenu + $html .= ''; + // Fin tableau + $html .= '
    ' . $th . '
    ' . $td . '
    '; + // Fin container + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée un champ texte court + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function text($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'autocomplete' => 'on', + 'before' => true, + 'class' => '', + 'classWrapper' => '', + 'noDirty' => false, + 'disabled' => false, + 'help' => '', + 'id' => $nameId, + 'label' => '', + 'maxlength' => '500', + 'name' => $nameId, + 'placeholder' => '', + 'readonly' => false, + 'value' => '' + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['value'] = common::$inputBefore[$attributes['id']]; + } + // Début du wrapper + $html = '
    '; + // Label + if($attributes['label']) { + $html .= self::label($attributes['id'], $attributes['label'], [ + 'help' => $attributes['help'] + ]); + } + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Texte + $html .= sprintf( + '', + helper::sprintAttributes($attributes) + ); + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + + /** + * Crée un champ texte long + * @param string $nameId Nom et id du champ + * @param array $attributes Attributs ($key => $value) + * @return string + */ + public static function textarea($nameId, array $attributes = []) { + // Attributs par défaut + $attributes = array_merge([ + 'before' => true, + 'class' => '', // editorWysiwyg et editorCss possible pour utiliser le éditeurs (il faut également instancier les librairies) + 'classWrapper' => '', + 'disabled' => false, + 'noDirty' => false, + 'help' => '', + 'id' => $nameId, + 'label' => '', + 'maxlength' => '500000', + 'name' => $nameId, + 'readonly' => false, + 'value' => '' + ], $attributes); + // Sauvegarde des données en cas d'erreur + if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) { + $attributes['value'] = common::$inputBefore[$attributes['id']]; + } + // Début du wrapper + $html = '
    '; + // Label + if($attributes['label']) { + $html .= self::label($attributes['id'], $attributes['label'], [ + 'help' => $attributes['help'] + ]); + } + // Notice + $notice = ''; + if(array_key_exists($attributes['id'], common::$inputNotices)) { + $notice = common::$inputNotices[$attributes['id']]; + $attributes['class'] .= ' notice'; + } + $html .= self::notice($attributes['id'], $notice); + // Texte long + $html .= sprintf( + '', + helper::sprintAttributes($attributes, ['value']), + $attributes['value'] + ); + // Fin du wrapper + $html .= '
    '; + // Retourne le html + return $html; + } + +} diff --git a/core/layout/blank.css b/core/layout/blank.css new file mode 100755 index 00000000..1f211778 --- /dev/null +++ b/core/layout/blank.css @@ -0,0 +1,19 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +/** + * Éléments génériques + */ + +body { + background : #FFF !important; +} \ No newline at end of file diff --git a/core/layout/blank.php b/core/layout/blank.php new file mode 100755 index 00000000..96285a5a --- /dev/null +++ b/core/layout/blank.php @@ -0,0 +1,20 @@ + + + + + + + showMetaTitle(); ?> + showMetaDescription(); ?> + showFavicon(); ?> + showVendor(); ?> + + + + + +showStyle(); ?> +showContent(); ?> +showScript(); ?> + + \ No newline at end of file diff --git a/core/layout/common.css b/core/layout/common.css new file mode 100755 index 00000000..740ffdf7 --- /dev/null +++ b/core/layout/common.css @@ -0,0 +1,1019 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +/** + * Éléments génériques + */ + +html, +body { + min-height: 100%; +} +body { + margin: 0 10px; +} + +/** + * Éléments spécifiques + */ + +/* Liens */ +a { + text-decoration: none; +} +a:hover { + text-decoration: underline; +} + +/* Titres */ +h1 { + font-size: 1.8em; +} +h2 { + font-size: 1.6em; +} +h3 { + font-size: 1.4em; +} +h4 { + font-size: 1.2em; +} + +/* Listes */ +ul { + list-style: square; +} +li ul { + margin: 0; +} + +/* Séparateur */ +hr { + border: 0; + border-top: 1px solid #C5D1D4; +} + +/* Égalisation des margins */ +h1, +h2, +h3, +h4, +p, +hr, +ul, +ol { + margin: 15px 0; +} + +/* Image */ +img { + max-width: 100%; + height: auto; +} +img[align='left'] { + margin-right: 10px; +} +img[align='right'] { + margin-left: 10px; +} + +/* Tableau */ +:not([class^="col"]) > .tableWrapper { + margin: 10px 0; +} +.table { + width: 100%; + border-spacing: 0; + border-collapse: collapse; +} +.table thead tr { + background: #212223; + color: #FFF; + text-align: left; +} +.table tbody tr { + background: #F6F7F8; + -webkit-transition: background .3s ease-out; + transition: background .3s ease-out; +} +.table tbody tr:nth-child(2n + 2) { + background: #ECEFF1; +} +.table tbody tr:hover { + background: #FCF2E8; +} +.table th { + font-weight: normal; + padding: 15px 10px !important; +} +/* Supprime le padding des cols dans les cellules des tableaux */ +td > .col1, +td > .col2, +td > .col3, +td > .col4, +td > .col5, +td > .col6, +td > .col7, +td > .col8, +td > .col9, +td > .col10, +td > .col11, +td > .col12 { + padding: 0 !important; +} + +/* Notifications */ +#notification { + padding: 14px; + color: #FFF; + position: fixed; + left: 50%; + transform: translateX(-50%); + max-width: 500px; + width: 100%; + z-index: 20; + text-align: center; + animation: notificationBounce .5s; + top: 30px; + border-radius: 2px; +} +#notification.notificationSuccess { + background: #27AE60; +} +#notification.notificationError { + background: #E74C3C; +} +#notification.notificationOther { + background: #F39C12; +} +#notificationClose { + cursor: pointer; + float: right; + opacity: .8; +} +#notificationProgress { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 6px; + border-radius: 2px; +} +#notification.notificationSuccess #notificationProgress { + background: #219251; +} +#notification.notificationError #notificationProgress { + background: #D62C1A; +} +#notification.notificationOther #notificationProgress { + background: #D8890B; +} +#notificationClose:hover { + opacity: 1; +} +@keyframes notificationBounce { + 0% { + transform: translateX(-50%) translateY(-30px); + } + 40% { + transform: translateX(-50%) translateY(10px); + } + 60% { + transform: translateX(-50%) translateY(-10px); + } + 80% { + transform: translateX(-50%) translateY(5px); + } + 100% { + transform: translateX(-50%) translateY(-5px); + } +} + +/* Notice */ +.notice { + display: inline-block; + color: #E74C3C; +} + +/* Container */ +.container { + margin: auto; +} + +/* Barre de membre */ +#bar { + background: #212223; + padding-left: 5px; /* Pour éviter que le select touche le bord lorsque la fenêtre est redimensionnée */ + margin: 0 -10px; + text-align: right; +} +#bar:after { + content: " "; + clear: both; + display: block; +} +#bar ul { + padding: 0; + margin: 0; + list-style: none; + height: 45px; + line-height: 45px; +} +#bar #barLeft { + float: left; +} +#bar #barRight { + float: right; + font-size: .8em; +} +#bar li { + display: inline; +} +#bar a { + display: inline-block; + padding: 0 12px; + color: #FFF; + -webkit-transition: background .3s ease-out; + transition: background .3s ease-out; +} +#bar a:hover { + background: #191A1A; + text-decoration: none; +} +#bar a:active { + background: #111112; +} +#bar select { + width: 250px; + border: 0; +} +@media (max-width: 768px) { + #bar { + text-align: center; + padding: 0; + } + #bar ul { + float: none !important; + height: auto; + } + #bar select { + width: 70%; + } +} + +/* Site */ +#site { + margin: 20px auto; + overflow: hidden; +} + +/* Bannière */ +body > header { + margin: 0 -10px; +} +header { + position: relative; +} +header span { + display: inline-block; + vertical-align: middle; + line-height: 1.2; + margin: 0 10px; +} +header .container { + overflow: hidden; + height: 100%; +} + +/* Menu */ +body > nav { + margin: 0 -10px; +} +nav #toggle { + cursor: pointer; + text-align: right; + display: none; + font-weight: bold; +} +nav #toggle span { + display: block; +} +nav #menu { + display: block; +} +nav ul { + padding: 0; + margin: 0; + list-style: none; +} +nav li { + display: inline-block; + position: relative; +} +nav li ul { + display: block; + position: absolute; + width: 200px; + z-index: -1; + opacity: 0; + -webkit-transition: .3s ease-out; + transition: .3s ease-out; +} +nav li ul li { + display: block; + text-align: left; +} +nav li:hover ul { + z-index: 1; + opacity: 1; +} +nav a { + display: inherit; + -webkit-transition: background .3s ease-out; + transition: background .3s ease-out; +} +nav a:hover { + text-decoration: none; +} +@media (max-width: 768px) { + nav #toggle { + display: block; + } + nav #menu { + display: none; + text-align: left !important; + } + nav li { + display: block; + } + nav li ul { + z-index: 1; + opacity: 1; + position: static; + min-width: inherit; + width: auto; + } + nav a { + padding: 15px !important; + } + nav li ul a { + padding-left: 40px !important; + } +} + +/* Corps */ +section { + padding: 20px; +} +section #sectionTitle { + margin-top: 0; +} +section:after { + content: " "; + display: table; + clear: both; +} + +/* Pied de page */ +body > footer { + margin: 0 -10px; +} +footer { + text-align: center; + font-size: .8em; + padding: 10px 20px; +} +footer #footerSocials { + font-size: 1.6em; +} +footer #footerSocials span { + color: #FFF; + padding: 9px; + margin: 0 5px; + display: inline-block; + border-radius: 2px; + -webkit-transition: background .3s ease-out; + transition: background .3s ease-out; +} +footer #footerSocials .zwiico-facebook { + background: #3B5999; +} +footer #footerSocials .zwiico-facebook:hover { + background: #324B80; +} +footer #footerSocials .zwiico-googleplus { + background: #DD4B39; +} +footer #footerSocials .zwiico-googleplus:hover { + background: #D03724; +} +footer #footerSocials .zwiico-instagram { + background: #E4405F; +} +footer #footerSocials .zwiico-instagram:hover { + background: #E02246; +} +footer #footerSocials .zwiico-pinterest { + background: #BD081C; +} +footer #footerSocials .zwiico-pinterest:hover { + background: #9C0717; +} +footer #footerSocials .zwiico-twitter { + background: #55ACEE; +} +footer #footerSocials .zwiico-twitter:hover { + background: #369DEB; +} +footer #footerSocials .zwiico-youtube { + background: #CD201F; +} +footer #footerSocials .zwiico-youtube:hover { + background: #AF1B1B; +} + +/* Bulle de dialogue */ +.speech { + margin: 16px; + text-align: center; +} +.speechMimi { + display: block; + margin: auto; +} +.speechBubble { + display: block; + padding: 20px; + position: relative; + max-width: 500px; + width: 100%; + margin: 16px auto; + text-align: left; + border-radius: 2px; + -webkit-transition: background .3s ease-out; + transition: background .3s ease-out; +} +.speechBubble:before { + content: " "; + position: absolute; + left: 50%; + margin-left: -20px; + bottom: -30px; + border: 20px solid; +} + +/* Remonter en haut */ +#backToTop { + position: fixed; + z-index: 30; + right: 30px; + bottom: 50px; + padding: 13px 16px 16px; + background: rgba(33, 34, 35, .8); + color: #FFF; + cursor: pointer; + display: none; + border-radius: 50%; + -webkit-transition: background.3s ease-out; + transition: background .3s ease-out; +} +#backToTop:hover { + background: rgba(33, 34, 35, .9); +} +#backToTop:active { + background: rgba(33, 34, 35, 1); +} + +/* Message sur les cookies */ +#cookieConsent { + opacity: .9; + background: #212223; + position: fixed; + right: 0; + bottom: 0; + left: 0; + color: #FFF; + padding: 10px; + z-index: 20; + text-align: center; + font-size: .9em; +} +#cookieConsentConfirm { + cursor: pointer; + margin-left: 10px; + background: #666; + padding: 4px 8px; + display: inline-block; + -webkit-transition: background.3s ease-out; + transition: background .3s ease-out; +} +#cookieConsentConfirm:hover { + background: #777; +} + +/* Bloc */ +.block { + border: 1px solid #D8DFE3; + padding: 20px 20px 10px; + margin: 20px 0; + word-wrap: break-word; + border-radius: 2px; +} +.block:first-of-type { + margin-top: 0; +} +.block:last-of-type { + margin-bottom: 0; +} +.block h4 { + margin: -20px -20px 10px -20px; + padding: 10px; + background: #ECEFF1; +} + +/* Aides */ +.helpButton { + cursor: help; + margin: 0 5px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +/* Lightbox */ +.lightbox { + background: #FFF; + width: 100vw; + max-width: 500px; + padding: 20px; +} +.lightbox .lightboxButtons { + text-align: center; + margin-top: 30px; +} +.lightbox .lightboxButtons .button { + width: 100%; + max-width: 80px; + margin: 0 10px; +} + +/** + * Inputs + */ + +/* Inputs génériques */ +input[type='email'], +input[type='text'], +input[type='password'], +.inputFile, +select, +textarea { + padding: 10px; /* -1px à cause des bordures */ + background: #FFF; + border: 1px solid #D8DFE3; + width: 100%; + border-radius: 2px; + font-family: inherit; + -webkit-transition: border .3s ease-out; + transition: border .3s ease-out; +} +select { + padding: 7px; +} +input[type='email']:hover, +input[type='text']:hover, +input[type='password']:hover, +.inputFile:hover, +select:hover, +textarea:hover { + border: 1px solid; +} +input[type='email'].notice, +input[type='text'].notice, +input[type='password'].notice, +.inputFile.notice, +select.notice, +textarea.notice { + border: 1px solid #E74C3C; + background: #FAD7D3; +} +input[type='email'].notice:hover, +input[type='text'].notice:hover, +input[type='password'].notice:hover, +.inputFile.notice:hover, +select.notice:hover, +textarea.notice:hover { + border: 1px solid #A82315; +} +button:disabled, +input:disabled, +select:disabled, +textarea:disabled { + background: #F6F7F8 !important; + color: #94A5B0 !important; +} +button:disabled .zwiico-spin { + color: #50616C !important /* Icône de soumission unique */ +} +button { + width: 100%; + padding: 11px; + border: 0; + cursor: pointer; + font-family: inherit; + border-radius: 2px; + -webkit-transition: background .3s ease-out; + transition: background .3s ease-out; +} +textarea { + height: 100px; + resize: vertical; +} +label { + display: inline-block; + margin-bottom: 4px; +} +/* Simule le padding des cols pour les inputs en dehors des cols */ +:not([class^="col"]) > .inputWrapper { + padding: 10px 0; +} +/* Supprime le padding d'une row dans un col */ +[class^="col"] > .row { + margin: -10px; +} + +/* Bouton */ +.button { + width: 100%; + display: inline-block; + padding: 11px; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + border-radius: 2px; + -webkit-transition: background .3s ease-out; + transition: background .3s ease-out; +} +.button:hover { + text-decoration: none; +} +.button.disabled { + pointer-events: none; + cursor: default; + background: #F6F7F8 !important; + color: #94A5B0 !important; +} +.button.buttonGrey { + background: #ECEFF1; +} +.button.buttonGrey:hover { + background: #E2E7EA; +} +.button.buttonGrey:active { + background: #D8DFE3; +} +.button.buttonRed { + background: #E74C3C; + color: #FFF; +} +.button.buttonRed:hover { + background: #E53E2D; +} +.button.buttonRed:active { + background: #E3301E; +} + +/* Upload de fichiers */ +.inputFile { + margin: 0; + display: inline-block; + width: 88%; +} +.inputFileDelete { + display: inline-block; + width: 10%; + padding: 10px 0; + background: #F5F5F5; + text-align: center; + float: right; +} +.inputFile:hover { + text-decoration: none; +} + +/* Pagination */ +.pagination { + padding: 10px 0; +} +.pagination a { + display: inline-block; + padding: 10px; + margin: 5px; + text-align: center; +} +.pagination a:hover { + text-decoration: none; +} +.pagination a.disabled { + pointer-events: none; + cursor: default; + background: #F6F7F8 !important; + color: #94A5B0 !important; +} +.pagination a:first-child { + margin-left: 0; +} +.pagination a:last-child { + margin-right: 0; +} + +/* Cases à cocher (pas de display none sinon le hover ne fonctionne pas sous Chrome) */ +input[type='checkbox'] { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + opacity: 0; + height: 0; + width: 0; +} +input[type='checkbox'] + label { + display: inline-block; + margin-right: 10px; + cursor: pointer; +} +input[type='checkbox'] + label span { + vertical-align: middle; +} +input[type='checkbox'] + label:before { + content: '\2713'; + display: inline-block; + text-align: center; + color: transparent; + margin-right: 5px; + width: 20px; + height: 20px; + line-height: 20px; + font-size: 10px; + font-weight: bold; + background: #FDFDFD; + border: 1px solid #D8DFE3; + vertical-align: top; + border-radius: 2px; +} +input[type='checkbox'].notice + label:before { + background: #E74C3C; +} +input[type='checkbox']:hover + label:before, +input[type='checkbox']:checked:active + label:before { + background: #ECEFF1; +} +input[type='checkbox']:disabled + label:before{ + background: #F6F7F8 !important; +} + +/* Sélecteur de date */ +.datepicker { + cursor: text; +} +.pika-select { + padding: 0; /* À cause du padding ajouté aux selects */ +} + +/** + * Grille + */ + +*, +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.row { + margin: 0 -10px; + font-size: 0; /* Hack whitespace */ +} +/* Supprime les margins du premier et du dernier élément d'un col, utile pour les cols générés depuis l'éditeur de texte. (Ne s'applique pas aux rows pour ne pas supprimer les margins négatifs) */ +.row > div > :first-child:not(.row) { + margin-top: 0; +} +.row > div > :last-child:not(.row) { + margin-bottom: 0; +} +.col1, +.col2, +.col3, +.col4, +.col5, +.col6, +.col7, +.col8, +.col9, +.col10, +.col11, +.col12 { + vertical-align: top; + padding: 10px; + width: 100%; + min-height: 1px; + display: inline-block; +} +@media (min-width: 992px) { + .col1 { + width: 8.33333333%; + } + .col2 { + width: 16.66666667%; + } + .col3 { + width: 25%; + } + .col4 { + width: 33.33333333%; + } + .col5 { + width: 41.66666667%; + } + .col6 { + width: 50%; + } + .col7 { + width: 58.33333333%; + } + .col8 { + width: 66.66666667%; + } + .col9 { + width: 75%; + } + .col10 { + width: 83.33333333%; + } + .col11 { + width: 91.66666667%; + } + .col12 { + width: 100%; + } + .offset1 { + margin-left: 8.33333333%; + } + .offset2 { + margin-left: 16.66666667%; + } + .offset3 { + margin-left: 25%; + } + .offset4 { + margin-left: 33.33333333%; + } + .offset5 { + margin-left: 41.66666667%; + } + .offset6 { + margin-left: 50%; + } + .offset7 { + margin-left: 58.33333333%; + } + .offset8 { + margin-left: 66.66666667%; + } + .offset9 { + margin-left: 75%; + } + .offset10 { + margin-left: 83.33333333%; + } + .offset11 { + margin-left: 91.66666667%; + } +} + +/** + * Grille pour tableau + */ + +td.col1, +th.col1, +td.col2, +th.col2, +td.col3, +th.col3, +td.col4, +th.col4, +td.col5, +th.col5, +td.col6, +th.col6, +td.col7, +th.col7, +td.col8, +th.col8, +td.col9, +th.col9, +td.col10, +th.col10, +td.col11, +th.col11, +td.col12, +th.col12 { + vertical-align: inherit; + width: 100%; + min-height: 1px; + display: table-cell; +} +td.col1, +th.col1 { + width: 8.33333333%; +} +td.col2, +th.col2 { + width: 16.66666667%; +} +td.col3, +th.col3 { + width: 25%; +} +td.col4, +th.col4 { + width: 33.33333333%; +} +td.col5, +th.col5 { + width: 41.66666667%; +} +td.col6, +th.col6 { + width: 50%; +} +td.col7, +th.col7 { + width: 58.33333333%; +} +td.col8, +th.col8 { + width: 66.66666667%; +} +td.col9, +th.col9 { + width: 75%; +} +td.col10, +th.col10 { + width: 83.33333333%; +} +td.col11, +th.col11 { + width: 91.66666667%; +} +td.col12, +th.col12 { + width: 100%; +} + +/** + * Classes rapides + */ + +.displayNone { + display: none; +} +.textAlignCenter { + text-align: center; +} +.textAlignRight { + text-align: right; +} +.verticalAlignBottom { + vertical-align: bottom; +} +.verticalAlignMiddle { + vertical-align: middle; +} +.clearBoth { + clear: both; +} +.colorGreen { + color: #27AE60; +} +.colorRed { + color: #E74C3C; +} +.colorOrange { + color: #F39C12; +} \ No newline at end of file diff --git a/core/layout/light.css b/core/layout/light.css new file mode 100755 index 00000000..28d66146 --- /dev/null +++ b/core/layout/light.css @@ -0,0 +1,20 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +/** + * Éléments spécifiques + */ + +/* Site */ +#site { + max-width: 600px !important; +} \ No newline at end of file diff --git a/core/layout/light.php b/core/layout/light.php new file mode 100755 index 00000000..61e6ec39 --- /dev/null +++ b/core/layout/light.php @@ -0,0 +1,24 @@ + + + + + + + showMetaTitle(); ?> + showMetaDescription(); ?> + showFavicon(); ?> + showVendor(); ?> + + + + + + +showStyle(); ?> +showNotification(); ?> +
    +
    showContent(); ?>
    +
    +showScript(); ?> + + \ No newline at end of file diff --git a/core/layout/mail.php b/core/layout/mail.php new file mode 100755 index 00000000..dd17d233 --- /dev/null +++ b/core/layout/mail.php @@ -0,0 +1,127 @@ + + + + + + + + <?php echo $subject; ?> + + + + + +
    +
    + +
    + +
    + + \ No newline at end of file diff --git a/core/layout/main.php b/core/layout/main.php new file mode 100755 index 00000000..c65057b7 --- /dev/null +++ b/core/layout/main.php @@ -0,0 +1,155 @@ + + + + + + + showMetaTitle(); ?> + showMetaDescription(); ?> + showFavicon(); ?> + showVendor(); ?> + + + + + +showStyle(); ?> +showBar(); ?> +showNotification(); ?> +getData(['theme', 'menu', 'position']) === 'body-first'): ?> + + + +getData(['theme', 'header', 'position']) === 'body'): ?> + +
    + getData(['theme', 'header', 'textHide']) === false + // Affiche toujours le titre de la bannière pour l'édition du thème + OR ($this->getUrl(0) === 'theme' AND $this->getUrl(1) === 'header') + ): ?> + + getData(['theme','header','linkHome'])){ + echo "" ;} ?> + + +
    + getData(['config', 'title']); ?> +
    + + getData(['theme','header','linkHome'])){echo "
    ";} + ?> + + + +
    + +getData(['theme', 'menu', 'position']) === 'body-second'): ?> + + + + +
    + getData(['theme', 'menu', 'position']) === 'site-first'): ?> + + + + getData(['theme', 'header', 'position']) === 'site' + // Affiche toujours la bannière pour l'édition du thème + OR ( + $this->getData(['theme', 'header', 'position']) === 'hide' + AND $this->getUrl(0) === 'theme' + ) + ): ?> + +
    getData(['theme', 'header', 'position']) === 'hide'): ?>class="displayNone"> + getData(['theme', 'header', 'textHide']) === false + // Affiche toujours le titre de la bannière pour l'édition du thème + OR ($this->getUrl(0) === 'theme' AND $this->getUrl(1) === 'header') + ): ?> + + getData(['theme','header','linkHome'])){ + echo "" ;} ?> +
    + getData(['config', 'title']); ?> +
    + getData(['theme','header','linkHome'])){echo "
    ";} + ?> + + + +
    + + getData(['theme', 'menu', 'position']) === 'site-second' + // Affiche toujours le menu pour l'édition du thème + OR ( + $this->getData(['theme', 'menu', 'position']) === 'hide' + AND $this->getUrl(0) === 'theme' + ) + ): ?> + + + + +
    showContent(); ?>
    + getData(['theme', 'footer', 'position']) === 'site' + // Affiche toujours le pied de page pour l'édition du thème + OR ( + $this->getData(['theme', 'footer', 'position']) === 'hide' + AND $this->getUrl(0) === 'theme' + ) + ): ?> + +
    getData(['theme', 'footer', 'position']) === 'hide'): ?>class="displayNone"> +
    + showSocials(); ?> + showFooterText(); ?> + showCopyright(); ?> +
    +
    + +
    +getData(['theme', 'footer', 'position']) === 'body'): ?> + +
    +
    + showSocials(); ?> + showFooterText(); ?> + showCopyright(); ?> +
    +
    + + +
    +showAnalytics(); ?> +showScript(); ?> + + \ No newline at end of file diff --git a/core/module/config/config.php b/core/module/config/config.php new file mode 100755 index 00000000..00f2b304 --- /dev/null +++ b/core/module/config/config.php @@ -0,0 +1,265 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +class config extends common { + + public static $actions = [ + 'backup' => self::GROUP_ADMIN, + 'index' => self::GROUP_ADMIN + ]; + + public static $timezones = [ + 'Pacific/Midway' => '(GMT-11:00) Midway Island', + 'US/Samoa' => '(GMT-11:00) Samoa', + 'US/Hawaii' => '(GMT-10:00) Hawaii', + 'US/Alaska' => '(GMT-09:00) Alaska', + 'US/Pacific' => '(GMT-08:00) Pacific Time (US & Canada)', + 'America/Tijuana' => '(GMT-08:00) Tijuana', + 'US/Arizona' => '(GMT-07:00) Arizona', + 'US/Mountain' => '(GMT-07:00) Mountain Time (US & Canada)', + 'America/Chihuahua' => '(GMT-07:00) Chihuahua', + 'America/Mazatlan' => '(GMT-07:00) Mazatlan', + 'America/Mexico_City' => '(GMT-06:00) Mexico City', + 'America/Monterrey' => '(GMT-06:00) Monterrey', + 'Canada/Saskatchewan' => '(GMT-06:00) Saskatchewan', + 'US/Central' => '(GMT-06:00) Central Time (US & Canada)', + 'US/Eastern' => '(GMT-05:00) Eastern Time (US & Canada)', + 'US/East-Indiana' => '(GMT-05:00) Indiana (East)', + 'America/Bogota' => '(GMT-05:00) Bogota', + 'America/Lima' => '(GMT-05:00) Lima', + 'America/Caracas' => '(GMT-04:30) Caracas', + 'Canada/Atlantic' => '(GMT-04:00) Atlantic Time (Canada)', + 'America/La_Paz' => '(GMT-04:00) La Paz', + 'America/Santiago' => '(GMT-04:00) Santiago', + 'Canada/Newfoundland' => '(GMT-03:30) Newfoundland', + 'America/Buenos_Aires' => '(GMT-03:00) Buenos Aires', + 'Greenland' => '(GMT-03:00) Greenland', + 'Atlantic/Stanley' => '(GMT-02:00) Stanley', + 'Atlantic/Azores' => '(GMT-01:00) Azores', + 'Atlantic/Cape_Verde' => '(GMT-01:00) Cape Verde Is.', + 'Africa/Casablanca' => '(GMT) Casablanca', + 'Europe/Dublin' => '(GMT) Dublin', + 'Europe/Lisbon' => '(GMT) Lisbon', + 'Europe/London' => '(GMT) London', + 'Africa/Monrovia' => '(GMT) Monrovia', + 'Europe/Amsterdam' => '(GMT+01:00) Amsterdam', + 'Europe/Belgrade' => '(GMT+01:00) Belgrade', + 'Europe/Berlin' => '(GMT+01:00) Berlin', + 'Europe/Bratislava' => '(GMT+01:00) Bratislava', + 'Europe/Brussels' => '(GMT+01:00) Brussels', + 'Europe/Budapest' => '(GMT+01:00) Budapest', + 'Europe/Copenhagen' => '(GMT+01:00) Copenhagen', + 'Europe/Ljubljana' => '(GMT+01:00) Ljubljana', + 'Europe/Madrid' => '(GMT+01:00) Madrid', + 'Europe/Paris' => '(GMT+01:00) Paris', + 'Europe/Prague' => '(GMT+01:00) Prague', + 'Europe/Rome' => '(GMT+01:00) Rome', + 'Europe/Sarajevo' => '(GMT+01:00) Sarajevo', + 'Europe/Skopje' => '(GMT+01:00) Skopje', + 'Europe/Stockholm' => '(GMT+01:00) Stockholm', + 'Europe/Vienna' => '(GMT+01:00) Vienna', + 'Europe/Warsaw' => '(GMT+01:00) Warsaw', + 'Europe/Zagreb' => '(GMT+01:00) Zagreb', + 'Europe/Athens' => '(GMT+02:00) Athens', + 'Europe/Bucharest' => '(GMT+02:00) Bucharest', + 'Africa/Cairo' => '(GMT+02:00) Cairo', + 'Africa/Harare' => '(GMT+02:00) Harare', + 'Europe/Helsinki' => '(GMT+02:00) Helsinki', + 'Europe/Istanbul' => '(GMT+02:00) Istanbul', + 'Asia/Jerusalem' => '(GMT+02:00) Jerusalem', + 'Europe/Kiev' => '(GMT+02:00) Kyiv', + 'Europe/Minsk' => '(GMT+02:00) Minsk', + 'Europe/Riga' => '(GMT+02:00) Riga', + 'Europe/Sofia' => '(GMT+02:00) Sofia', + 'Europe/Tallinn' => '(GMT+02:00) Tallinn', + 'Europe/Vilnius' => '(GMT+02:00) Vilnius', + 'Asia/Baghdad' => '(GMT+03:00) Baghdad', + 'Asia/Kuwait' => '(GMT+03:00) Kuwait', + 'Europe/Moscow' => '(GMT+03:00) Moscow', + 'Africa/Nairobi' => '(GMT+03:00) Nairobi', + 'Asia/Riyadh' => '(GMT+03:00) Riyadh', + 'Europe/Volgograd' => '(GMT+03:00) Volgograd', + 'Asia/Tehran' => '(GMT+03:30) Tehran', + 'Asia/Baku' => '(GMT+04:00) Baku', + 'Asia/Muscat' => '(GMT+04:00) Muscat', + 'Asia/Tbilisi' => '(GMT+04:00) Tbilisi', + 'Asia/Yerevan' => '(GMT+04:00) Yerevan', + 'Asia/Kabul' => '(GMT+04:30) Kabul', + 'Asia/Yekaterinburg' => '(GMT+05:00) Ekaterinburg', + 'Asia/Karachi' => '(GMT+05:00) Karachi', + 'Asia/Tashkent' => '(GMT+05:00) Tashkent', + 'Asia/Kolkata' => '(GMT+05:30) Kolkata', + 'Asia/Kathmandu' => '(GMT+05:45) Kathmandu', + 'Asia/Almaty' => '(GMT+06:00) Almaty', + 'Asia/Dhaka' => '(GMT+06:00) Dhaka', + 'Asia/Novosibirsk' => '(GMT+06:00) Novosibirsk', + 'Asia/Bangkok' => '(GMT+07:00) Bangkok', + 'Asia/Jakarta' => '(GMT+07:00) Jakarta', + 'Asia/Krasnoyarsk' => '(GMT+07:00) Krasnoyarsk', + 'Asia/Chongqing' => '(GMT+08:00) Chongqing', + 'Asia/Hong_Kong' => '(GMT+08:00) Hong Kong', + 'Asia/Irkutsk' => '(GMT+08:00) Irkutsk', + 'Asia/Kuala_Lumpur' => '(GMT+08:00) Kuala Lumpur', + 'Australia/Perth' => '(GMT+08:00) Perth', + 'Asia/Singapore' => '(GMT+08:00) Singapore', + 'Asia/Taipei' => '(GMT+08:00) Taipei', + 'Asia/Ulaanbaatar' => '(GMT+08:00) Ulaan Bataar', + 'Asia/Urumqi' => '(GMT+08:00) Urumqi', + 'Asia/Seoul' => '(GMT+09:00) Seoul', + 'Asia/Tokyo' => '(GMT+09:00) Tokyo', + 'Asia/Yakutsk' => '(GMT+09:00) Yakutsk', + 'Australia/Adelaide' => '(GMT+09:30) Adelaide', + 'Australia/Darwin' => '(GMT+09:30) Darwin', + 'Australia/Brisbane' => '(GMT+10:00) Brisbane', + 'Australia/Canberra' => '(GMT+10:00) Canberra', + 'Pacific/Guam' => '(GMT+10:00) Guam', + 'Australia/Hobart' => '(GMT+10:00) Hobart', + 'Australia/Melbourne' => '(GMT+10:00) Melbourne', + 'Pacific/Port_Moresby' => '(GMT+10:00) Port Moresby', + 'Australia/Sydney' => '(GMT+10:00) Sydney', + 'Asia/Vladivostok' => '(GMT+10:00) Vladivostok', + 'Asia/Magadan' => '(GMT+11:00) Magadan', + 'Pacific/Auckland' => '(GMT+12:00) Auckland', + 'Pacific/Fiji' => '(GMT+12:00) Fiji', + 'Asia/Kamchatka' => '(GMT+12:00) Kamchatka' + ]; + + /** + * Sauvegarde des données + */ + public function backup() { + // Creation du ZIP + $fileName = date('Y-m-d-h-i-s', time()) . '.zip'; + $zip = new ZipArchive(); + if($zip->open('site/tmp/' . $fileName, ZipArchive::CREATE) === TRUE){ + foreach(configHelper::scanDir('site/') as $file) { + $zip->addFile($file); + } + } + $zip->close(); + // Téléchargement du ZIP + header('Content-Transfer-Encoding: binary'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize('site/tmp/' . $fileName)); + readfile('site/tmp/' . $fileName); + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_RAW + ]); + } + + /** + * Configuration + */ + public function index() { + // Soumission du formulaire + if($this->isPost()) { + $this->setData([ + 'config', + [ + 'analyticsId' => $this->getInput('configAnalyticsId'), + 'autoBackup' => $this->getInput('configAutoBackup', helper::FILTER_BOOLEAN), + 'maintenance' => $this->getInput('configMaintenance', helper::FILTER_BOOLEAN), + 'cookieConsent' => $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN), + 'favicon' => $this->getInput('configFavicon'), + 'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true), + 'metaDescription' => $this->getInput('configMetaDescription', helper::FILTER_STRING_LONG, true), + 'social' => [ + 'facebookId' => $this->getInput('configSocialFacebookId'), + 'googleplusId' => $this->getInput('configSocialGoogleplusId'), + 'instagramId' => $this->getInput('configSocialInstagramId'), + 'pinterestId' => $this->getInput('configSocialPinterestId'), + 'twitterId' => $this->getInput('configSocialTwitterId'), + 'youtubeId' => $this->getInput('configSocialYoutubeId') + ], + 'timezone' => $this->getInput('configTimezone', helper::FILTER_STRING_SHORT, true), + 'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true) + ] + ]); + if(self::$inputNotices === []) { + // Active la réécriture d'URL + $rewrite = $this->getInput('rewrite', helper::FILTER_BOOLEAN); + if( + $rewrite + AND helper::checkRewrite() === false + ) { + // Ajout des lignes dans le .htaccess + file_put_contents( + '.htaccess', + PHP_EOL . + '' . PHP_EOL . + "\tRewriteEngine on" . PHP_EOL . + "\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL . + "\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL . + "\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL . + "\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL . + '', + FILE_APPEND + ); + // Change le statut de la réécriture d'URL (pour le helper::baseUrl() de la redirection) + helper::$rewriteStatus = true; + } + // Désactive la réécriture d'URL + elseif( + $rewrite === false + AND helper::checkRewrite() + ) { + // Suppression des lignes dans le .htaccess + $htaccess = explode('# URL rewriting', file_get_contents('.htaccess')); + file_put_contents('.htaccess', $htaccess[0] . '# URL rewriting'); + // Change le statut de la réécriture d'URL (pour le helper::baseUrl() de la redirection) + helper::$rewriteStatus = false; + } + } + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(), + 'notification' => 'Modifications enregistrées', + 'state' => true + ]); + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration', + 'view' => 'index' + ]); + } + +} + +class configHelper extends helper { + + /** + * Scan le contenu d'un dossier et de ses sous-dossiers + * @param string $dir Dossier à scanner + * @return array + */ + public static function scanDir($dir) { + $dirContent = []; + $iterator = new DirectoryIterator($dir); + foreach($iterator as $fileInfos) { + if(in_array($fileInfos->getFilename(), ['.', '..', 'backup'])) { + continue; + } + elseif($fileInfos->isDir()) { + $dirContent = array_merge($dirContent, self::scanDir($fileInfos->getPathname())); + } + else { + $dirContent[] = $fileInfos->getPathname(); + } + } + return $dirContent; + } + +} \ No newline at end of file diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php new file mode 100755 index 00000000..d25d6640 --- /dev/null +++ b/core/module/config/view/index/index.php @@ -0,0 +1,137 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl(false), + 'ico' => 'home', + 'value' => 'Accueil' + ]); ?> +
    +
    + +
    +
    +
    +
    +
    +

    Informations générales

    + 'Titre du site', + 'value' => $this->getData(['config', 'title']) + ]); ?> + 'Description du site', + 'value' => $this->getData(['config', 'metaDescription']) + ]); ?> + getData(['page']), 'title', 'SORT_ASC'), [ + 'label' => 'Page d\'accueil', + 'selected' => $this->getData(['config', 'homePageId']) + ]); ?> +
    +
    +

    Options avancées

    + 'ico', + 'help' => 'Seule une image de format .ico est acceptée. Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.', + 'label' => 'Favicon', + 'value' => $this->getData(['config', 'favicon']) + ]); ?> + 'Saisissez l\'ID de suivi de votre propriété Google Analytics.', + 'label' => 'Google Analytics', + 'placeholder' => 'UA-XXXXXXXX-X', + 'value' => $this->getData(['config', 'analyticsId']) + ]); ?> + $this->getData(['config', 'cookieConsent']) + ]); ?> + helper::checkRewrite(), + 'help' => 'Afin d\'éviter de bloquer votre site pensez à vérifier que le module de réécriture d\'URL est bien actif sur votre serveur avant d\'activer cette fonctionnalité.' + ]); ?> +
    +
    +
    +
    +

    Réseaux sociaux

    +
    +
    + 'Saisissez votre ID Facebook : https://www.facebook.com/[CETTE PARTIE].', + 'label' => 'Facebook', + 'value' => $this->getData(['config', 'social', 'facebookId']) + ]); ?> +
    +
    + 'Saisissez votre ID Google+ : https://plus.google.com/[CETTE PARTIE].', + 'label' => 'Google+', + 'value' => $this->getData(['config', 'social', 'googleplusId']) + ]); ?> +
    +
    +
    +
    + 'Saisissez votre ID Instagram : https://www.instagram.com/[CETTE PARTIE].', + 'label' => 'Instagram', + 'value' => $this->getData(['config', 'social', 'instagramId']) + ]); ?> +
    +
    + 'Saisissez votre ID Pinterest : https://pinterest.com/[CETTE PARTIE].', + 'label' => 'Pinterest', + 'value' => $this->getData(['config', 'social', 'pinterestId']) + ]); ?> +
    +
    +
    +
    + 'Saisissez votre ID Twitter : https://twitter.com/[CETTE PARTIE].', + 'label' => 'Twitter', + 'value' => $this->getData(['config', 'social', 'twitterId']) + ]); ?> +
    +
    + 'Saisissez votre ID Youtube : https://www.youtube.com/channel/[CETTE PARTIE].', + 'label' => 'Youtube', + 'value' => $this->getData(['config', 'social', 'youtubeId']) + ]); ?> +
    +
    +
    +
    +

    Système

    + 'Version de Zwii', + 'readonly' => true, + 'value' => self::ZWII_VERSION + ]); ?> + 'Fuseau horaire', + 'selected' => $this->getData(['config', 'timezone']) + ]); ?> + $this->getData(['config', 'maintenance']), + 'help' => 'Le site devient inaccessible sauf pour les administrateurs.' + ]); ?> + $this->getData(['config', 'autoBackup']), + 'help' => 'Sauvegarde une fois par jour le fichier de données dans le dossier site/backup/. La sauvegarde est conservée 30 jours.' + ]); ?> +
    +
    + helper::baseUrl() . 'config/backup', + 'value' => 'Exporter les données' + ]); ?> +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/core/module/install/install.php b/core/module/install/install.php new file mode 100755 index 00000000..2039bbb9 --- /dev/null +++ b/core/module/install/install.php @@ -0,0 +1,198 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +class install extends common { + + public static $actions = [ + 'index' => self::GROUP_VISITOR, + 'steps' => self::GROUP_ADMIN, + 'update' => self::GROUP_ADMIN + ]; + + public static $newVersion; + + /** + * Installation + */ + public function index() { + // Accès refusé + if($this->getData(['user']) !== []) { + // Valeurs en sortie + $this->addOutput([ + 'access' => false + ]); + } + // Accès autorisé + else { + // Soumission du formulaire + if($this->isPost()) { + // Double vérification pour le mot de passe + if($this->getInput('installPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('installConfirmPassword', helper::FILTER_STRING_SHORT, true)) { + self::$inputNotices['installConfirmPassword'] = 'Incorrect'; + } + // Crée l'utilisateur + $userFirstname = $this->getInput('installFirstname', helper::FILTER_STRING_SHORT, true); + $userLastname = $this->getInput('installLastname', helper::FILTER_STRING_SHORT, true); + $userMail = $this->getInput('installMail', helper::FILTER_MAIL, true); + $userId = $this->getInput('installId', helper::FILTER_ID, true); + $this->setData([ + 'user', + $userId, + [ + 'firstname' => $userFirstname, + 'forgot' => 0, + 'group' => self::GROUP_ADMIN, + 'lastname' => $userLastname, + 'mail' => $userMail, + 'password' => $this->getInput('installPassword', helper::FILTER_PASSWORD, true) + ] + ]); + // Configure certaines données par défaut + $this->setData(['module', 'blog', 'mon-premier-article', 'userId', $userId]); + $this->setData(['module', 'blog', 'mon-deuxieme-article', 'userId', $userId]); + $this->setData(['module', 'blog', 'mon-troisieme-article', 'userId', $userId]); + // Envoi le mail + $sent = $this->sendMail( + $userMail, + 'Installation de votre site', + 'Bonjour' . ' ' . $userFirstname . ' ' . $userLastname . ',

    ' . + 'Vous trouverez ci-dessous les détails de votre installation.

    ' . + 'URL du site : ' . helper::baseUrl(false) . '
    ' . + 'Identifiant du compte : ' . $this->getInput('installId') . '
    ' . + 'Mot de passe du compte : ' . $this->getInput('installPassword') + ); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl(false), + 'notification' => ($sent === true ? 'Installation terminée' : $sent), + 'state' => ($sent === true ? true : null) + ]); + } + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_LAYOUT_LIGHT, + 'title' => 'Installation', + 'view' => 'index' + ]); + } + } + + /** + * Étapes de mise à jour + */ + public function steps() { + switch($this->getInput('step', helper::FILTER_INT)) { + // Préparation + case 1: + $success = true; + // Copie du fichier de données + copy('site/data/data.json', 'site/backup/' . date('Y-m-d', time()) . '-update.json'); + // Nettoyage des fichiers temporaires + if(file_exists('site/tmp/update.tar.gz')) { + $success = unlink('site/tmp/update.tar.gz'); + } + if(file_exists('site/tmp/update.tar')) { + $success = unlink('site/tmp/update.tar'); + } + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_JSON, + 'content' => [ + 'success' => $success, + 'data' => null + ] + ]); + break; + // Téléchargement + case 2: + // Téléchargement depuis le serveur de Zwii + $success = (file_put_contents('site/tmp/update.tar.gz', file_get_contents('https://zwiicms.com/update.tar.gz')) !== false); + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_JSON, + 'content' => [ + 'success' => $success, + 'data' => null + ] + ]); + break; + // Installation + case 3: + $success = true; + // Check la réécriture d'URL avant d'écraser les fichiers + $rewrite = helper::checkRewrite(); + // Décompression et installation + try { + // Décompression dans le dossier de fichier temporaires + $pharData = new PharData('site/tmp/update.tar.gz'); + $pharData->decompress(); + // Installation + $pharData->extractTo(__DIR__ . '/../../../', null, true); + } catch (Exception $e) { + $success = $e->getMessage(); + } + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_JSON, + 'content' => [ + 'success' => $success, + 'data' => $rewrite + ] + ]); + break; + // Configuration + case 4: + $success = true; + // Réécriture d'URL + if($this->getInput('data', helper::FILTER_BOOLEAN)) { + $success = (file_put_contents( + '.htaccess', + PHP_EOL . + '' . PHP_EOL . + "\tRewriteEngine on" . PHP_EOL . + "\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL . + "\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL . + "\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL . + "\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL . + '', + FILE_APPEND + ) !== false); + } + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_JSON, + 'content' => [ + 'success' => $success, + 'data' => null + ] + ]); + break; + } + } + + /** + * Mise à jour + */ + public function update() { + // Nouvelle version + self::$newVersion = file_get_contents('http://zwiicms.com/version'); + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_LAYOUT_LIGHT, + 'title' => 'Mise à jour', + 'view' => 'update' + ]); + } + +} \ No newline at end of file diff --git a/core/module/install/view/index/index.js.php b/core/module/install/view/index/index.js.php new file mode 100755 index 00000000..7a7d83c5 --- /dev/null +++ b/core/module/install/view/index/index.js.php @@ -0,0 +1,36 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +/** + * Affichage de l'id en simulant FILTER_ID + */ +$("#installId").on("change keydown keyup", function(event) { + var userId = $(this).val(); + if( + event.keyCode !== 8 // BACKSPACE + && event.keyCode !== 37 // LEFT + && event.keyCode !== 39 // RIGHT + && event.keyCode !== 46 // DELETE + && window.getSelection().toString() !== userId // Texte sélectionné + ) { + var searchReplace = { + "á": "a", "à": "a", "â": "a", "ä": "a", "ã": "a", "å": "a", "ç": "c", "é": "e", "è": "e", "ê": "e", "ë": "e", "í": "i", "ì": "i", "î": "i", "ï": "i", "ñ": "n", "ó": "o", "ò": "o", "ô": "o", "ö": "o", "õ": "o", "ú": "u", "ù": "u", "û": "u", "ü": "u", "ý": "y", "ÿ": "y", + "Á": "A", "À": "A", "Â": "A", "Ä": "A", "Ã": "A", "Å": "A", "Ç": "C", "É": "E", "È": "E", "Ê": "E", "Ë": "E", "Í": "I", "Ì": "I", "Î": "I", "Ï": "I", "Ñ": "N", "Ó": "O", "Ò": "O", "Ô": "O", "Ö": "O", "Õ": "O", "Ú": "U", "Ù": "U", "Û": "U", "Ü": "U", "Ý": "Y", "Ÿ": "Y", + "'": "-", "\"": "-", " ": "-" + }; + userId = userId.replace(/[áàâäãåçéèêëíìîïñóòôöõúùûüýÿ'" ]/ig, function(match) { + return searchReplace[match]; + }); + userId = userId.replace(/[^a-z0-9-]/ig, ""); + $(this).val(userId); + } +}); \ No newline at end of file diff --git a/core/module/install/view/index/index.php b/core/module/install/view/index/index.php new file mode 100755 index 00000000..dc30b3a6 --- /dev/null +++ b/core/module/install/view/index/index.php @@ -0,0 +1,46 @@ +

    Veuillez saisir les champs ci-dessous afin de terminer l'installation.

    + + 'off', + 'label' => 'Identifiant' + ]); ?> +
    +
    + 'off', + 'label' => 'Mot de passe' + ]); ?> +
    +
    + 'off', + 'label' => 'Confirmation' + ]); ?> +
    +
    + 'off', + 'label' => 'Adresse mail' + ]); ?> +
    +
    + 'off', + 'label' => 'Prénom' + ]); ?> +
    +
    + 'off', + 'label' => 'Nom' + ]); ?> +
    +
    +
    +
    + 'Installer' + ]); ?> +
    +
    + \ No newline at end of file diff --git a/core/module/install/view/update/update.js.php b/core/module/install/view/update/update.js.php new file mode 100755 index 00000000..8e5c2e9e --- /dev/null +++ b/core/module/install/view/update/update.js.php @@ -0,0 +1,63 @@ +/** + * Exécution des différentes étapes de mise à jour + */ +function step(i, data) { + // Affiche le texte de progression + $(".installUpdateProgressText").hide(); + $(".installUpdateProgressText[data-id=" + i + "]").show(); + // Requête ajax + $.ajax({ + type: "POST", + url: "?install/steps", // Ignore la réécriture d'URL + data: { + step: i, + data: data + }, + // Succès de la requête + success: function(result) { + setTimeout(function() { + // Succès + if(result.success === true) { + // Fin de la mise à jour + if(i === 4) { + // Affiche le message de succès + $("#installUpdateSuccess").show(); + // Déverrouille le bouton "Terminer" + $("#installUpdateEnd").removeClass("disabled"); + // Cache le texte de progression + $("#installUpdateProgress").hide(); + } + // Prochaine étape + else { + step(i + 1, result.data); + } + } + // Échec + else { + // Affiche le message d'erreur + $("#installUpdateErrorStep").text(i); + $("#installUpdateError").show(); + // Déverrouille le bouton "Terminer" + $("#installUpdateEnd").removeClass("disabled"); + // Cache le texte de progression + $("#installUpdateProgress").hide(); + // Affiche le résultat dans la console + console.error(result); + } + }, 2000); + }, + // Échec de la requête + error: function(xhr) { + // Affiche le message d'erreur + $("#installUpdateErrorStep").text(0); + $("#installUpdateError").show(); + // Déverrouille le bouton "Terminer" + $("#installUpdateEnd").removeClass("disabled"); + // Cache le texte de progression + $("#installUpdateProgress").hide(); + // Affiche l'erreur dans la console + console.error(xhr); + } + }); +} +$(window).on("load", step(1, null)); diff --git a/core/module/install/view/update/update.php b/core/module/install/view/update/update.php new file mode 100755 index 00000000..8b0a8d11 --- /dev/null +++ b/core/module/install/view/update/update.php @@ -0,0 +1,29 @@ +

    Mise à jour de Zwii vers Zwii .

    +

    Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.

    +
    +
    +
    + + 1/4 : Préparation... + 2/4 : Téléchargement... + 3/4 : Installation... + 4/4 : Configuration... +
    +
    + + Une erreur est survenue lors de l'étape . +
    +
    + + Mise à jour terminée avec succès. +
    +
    +
    + 'Terminer', + 'href' => helper::baseUrl() . 'config', + 'ico' => 'check', + 'class' => 'disabled' + ]); ?> +
    +
    \ No newline at end of file diff --git a/core/module/maintenance/maintenance.php b/core/module/maintenance/maintenance.php new file mode 100755 index 00000000..b91765c5 --- /dev/null +++ b/core/module/maintenance/maintenance.php @@ -0,0 +1,33 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +class maintenance extends common { + + public static $actions = [ + 'index' => self::GROUP_VISITOR + ]; + + /** + * Maintenance + */ + public function index() { + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_LAYOUT_LIGHT, + 'title' => 'Maintenance en cours...', + 'view' => 'index' + ]); + } + +} \ No newline at end of file diff --git a/core/module/maintenance/view/index/index.php b/core/module/maintenance/view/index/index.php new file mode 100755 index 00000000..52b7ac08 --- /dev/null +++ b/core/module/maintenance/view/index/index.php @@ -0,0 +1,10 @@ +

    Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.

    +
    +
    + 'Administration', + 'href' => helper::baseUrl() . 'user/login', + 'ico' => 'lock' + ]); ?> +
    +
    \ No newline at end of file diff --git a/core/module/page/page.php b/core/module/page/page.php new file mode 100755 index 00000000..1fb35d31 --- /dev/null +++ b/core/module/page/page.php @@ -0,0 +1,239 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +class page extends common { + + public static $actions = [ + 'add' => self::GROUP_MODERATOR, + 'delete' => self::GROUP_MODERATOR, + 'edit' => self::GROUP_MODERATOR + ]; + public static $pagesNoParentId = [ + '' => 'Aucune' + ]; + public static $moduleIds = []; + + // Menu image + public static $typeMenu = [ + 'text' => 'Texte', + 'icon' => 'Icône', + 'icontitle' => 'Icône et bulle', + 'icontext' => 'Icône et texte' + ]; + // menu image + + /** + * Création + */ + public function add() { + $pageTitle = 'Nouvelle page'; + $pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page'])); + $this->setData([ + 'page', + $pageId, + [ + // Menu icon + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + // Menu icon + 'content' => 'Contenu de votre nouvelle page.', + 'hideTitle' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'parentPageId' => '', + 'position' => 0, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => $pageTitle + ] + ]); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $pageId, + 'notification' => 'Nouvelle page créée', + 'state' => true + ]); + } + + /** + * Suppression + */ + public function delete() { + // La page n'existe pas + if($this->getData(['page', $this->getUrl(2)]) === null) { + // Valeurs en sortie + $this->addOutput([ + 'access' => false + ]); + } + // Impossible de supprimer la page d'accueil + elseif($this->getUrl(2) === $this->getData(['config', 'homePageId'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2), + 'notification' => 'Impossible de supprimer la page d\'accueil' + ]); + } + // Impossible de supprimer une page contenant des enfants + elseif($this->getHierarchy($this->getUrl(2))) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2), + 'notification' => 'Impossible de supprimer une page contenant des enfants' + ]); + } + // Suppression + else { + $this->deleteData(['page', $this->getUrl(2)]); + $this->deleteData(['module', $this->getUrl(2)]); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl(false), + 'notification' => 'Page supprimée', + 'state' => true + ]); + } + } + + /** + * Édition + */ + public function edit() { + // La page n'existe pas + if($this->getData(['page', $this->getUrl(2)]) === null) { + // Valeurs en sortie + $this->addOutput([ + 'access' => false + ]); + } + // La page existe + else { + // Soumission du formulaire + if($this->isPost()) { + $pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true); + // Si l'id a changée + if($pageId !== $this->getUrl(2)) { + // Incrémente le nouvel id de la page + $pageId = helper::increment($pageId, $this->getData(['page'])); + $pageId = helper::increment($pageId, self::$coreModuleIds); + $pageId = helper::increment($pageId, self::$moduleIds); + // Met à jour les enfants + foreach($this->getHierarchy($this->getUrl(2)) as $childrenPageId) { + $this->setData(['page', $childrenPageId, 'parentPageId', $pageId]); + } + // Change l'id de page dans les données des modules + $this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]); + $this->deleteData(['module', $this->getUrl(2)]); + // Si la page correspond à la page d'accueil, change l'id dans la configuration du site + if($this->getData(['config', 'homePageId']) === $this->getUrl(2)) { + $this->setData(['config', 'homePageId', $pageId]); + } + } + // Supprime les données du module en cas de changement de module + if($this->getInput('pageEditModuleId') !== $this->getData(['page', $this->getUrl(2), 'moduleId'])) { + $this->deleteData(['module', $pageId]); + } + // Supprime l'ancienne page si l'id a changée + if($pageId !== $this->getUrl(2)) { + $this->deleteData(['page', $this->getUrl(2)]); + } + // Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents + $lastPosition = 1; + $hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy()); + $position = $this->getInput('pageEditPosition', helper::FILTER_INT); + foreach($hierarchy as $hierarchyPageId) { + // Ignore la page en cours de modification + if($hierarchyPageId === $this->getUrl(2)) { + continue; + } + // Incrémente de +1 pour laisser la place à la position de la page en cours de modification + if($lastPosition === $position) { + $lastPosition++; + } + // Change la position + $this->setData(['page', $hierarchyPageId, 'position', $lastPosition]); + // Incrémente pour la prochaine position + $lastPosition++; + } + // Modifie la page ou en crée une nouvelle si l'id à changée + $this->setData([ + 'page', + $pageId, + [ + // Menu image + 'typeMenu' => $this->getinput('pageTypeMenu'), + 'iconUrl' => $this->getinput('pageIconUrl'), + 'disable'=> $this->getinput('pageDisable', helper::FILTER_BOOLEAN), + // Menu image + 'content' => $this->getInput('pageEditContent', null), + 'hideTitle' => $this->getInput('pageEditHideTitle', helper::FILTER_BOOLEAN), + 'metaDescription' => $this->getInput('pageEditMetaDescription', helper::FILTER_STRING_LONG), + 'metaTitle' => $this->getInput('pageEditMetaTitle'), + 'moduleId' => $this->getInput('pageEditModuleId'), + 'parentPageId' => $this->getInput('pageEditParentPageId'), + 'position' => $position, + 'group' => $this->getInput('pageEditGroup', helper::FILTER_INT), + 'targetBlank' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN), + 'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT, true) + ] + ]); + // Redirection vers la configuration + if($this->getInput('pageEditModuleRedirect', helper::FILTER_BOOLEAN)) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $pageId . '/config', + 'state' => true + ]); + } + // Redirection vers la page + else { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . $pageId, + 'notification' => 'Modifications enregistrées', + 'state' => true + ]); + } + } + // Liste des modules + $moduleIds = [ + '' => 'Aucun' + ]; + $iterator = new DirectoryIterator('module/'); + foreach($iterator as $fileInfos) { + if(is_file($fileInfos->getPathname() . '/' . $fileInfos->getFilename() . '.php')) { + $moduleIds[$fileInfos->getBasename()] = ucfirst($fileInfos->getBasename()); + } + } + self::$moduleIds = $moduleIds; + // Pages sans parent + foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) { + if($parentPageId !== $this->getUrl(2)) { + self::$pagesNoParentId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); + } + } + // Valeurs en sortie + $this->addOutput([ + 'title' => $this->getData(['page', $this->getUrl(2), 'title']), + 'vendor' => [ + 'tinymce' + ], + 'view' => 'edit' + ]); + } + } + +} diff --git a/core/module/page/view/edit/edit.js.php b/core/module/page/view/edit/edit.js.php new file mode 100755 index 00000000..d21cf5f7 --- /dev/null +++ b/core/module/page/view/edit/edit.js.php @@ -0,0 +1,102 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Rémi Jean + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +/** + * Confirmation de suppression + */ +$("#pageEditDelete").on("click", function() { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir supprimer cette page ?", function() { + $(location).attr("href", _this.attr("href")); + }); +}); + +/** + * Bloque/Débloque le bouton de configuration au changement de module + */ +var pageEditModuleIdDOM = $("#pageEditModuleId"); +pageEditModuleIdDOM.on("change", function() { + if($(this).val() === "") { + $("#pageEditModuleConfig").addClass("disabled"); + $("#pageEditContentContainer").slideDown(); + } + else { + $("#pageEditModuleConfig").removeClass("disabled"); + $("#pageEditContentContainer").slideUp(); + } +}); + +/** + * Soumission du formulaire pour éditer le module + */ +$("#pageEditModuleConfig").on("click", function() { + $("#pageEditModuleRedirect").val(1); + $("#pageEditForm").trigger("submit"); +}); + +/** + * Affiche les pages en fonction de la page parent dans le choix de la position + */ +var hierarchy = getHierarchy()); ?>; +var pages = getData(['page'])); ?>; +$("#pageEditParentPageId").on("change", function() { + var positionDOM = $("#pageEditPosition"); + positionDOM.empty().append( + $("
    + + + + + + + + + + + + + + + + + diff --git a/core/vendor/filemanager/execute.php b/core/vendor/filemanager/execute.php new file mode 100755 index 00000000..ad284fd1 --- /dev/null +++ b/core/vendor/filemanager/execute.php @@ -0,0 +1,528 @@ +send(); + exit; +} + +if (strpos($_POST['path'],'/')===0 + || strpos($_POST['path'],'../')!==FALSE + || strpos($_POST['path'],'./')===0 + || strpos($_POST['path'],'..\\')!==FALSE + || strpos($_POST['path'],'.\\')===0) +{ + response(trans('wrong path'.AddErrorLocation()))->send(); + exit; +} + +if (isset($_SESSION['RF']['language']) && file_exists('lang/' . basename($_SESSION['RF']['language']) . '.php')) +{ + $languages = include 'lang/languages.php'; + if(array_key_exists($_SESSION['RF']['language'],$languages)){ + include 'lang/' . basename($_SESSION['RF']['language']) . '.php'; + }else{ + response(trans('Lang_Not_Found').AddErrorLocation())->send(); + exit; + } +} +else +{ + response(trans('Lang_Not_Found').AddErrorLocation())->send(); + exit; +} + +$ftp = ftp_con($config); + +$base = $current_path; +$path = $base.$_POST['path']; +$cycle = TRUE; +$max_cycles = 50; +$i = 0; +while($cycle && $i<$max_cycles) +{ + $i++; + if ($path == $base) $cycle=FALSE; + + if (file_exists($path."config.php")) + { + require_once $path."config.php"; + $cycle = FALSE; + } + $path = fix_dirname($path)."/"; +} + +$path = $current_path.$_POST['path']; +$path_thumb = $thumbs_base_path.$_POST['path']; + +if($ftp){ + $path = $ftp_base_folder.$upload_dir.$_POST['path']; + $path_thumb = $ftp_base_folder.$ftp_thumbs_dir.$_POST['path']; +} + +if (isset($_POST['name'])) +{ + $name = fix_filename($_POST['name'],$config); + if (strpos($name,'../') !== FALSE || strpos($name,'..\\') !== FALSE) + { + response(trans('wrong name').AddErrorLocation())->send(); + exit; + } +} + +$info = pathinfo($path); +if (isset($info['extension']) && !(isset($_GET['action']) && $_GET['action']=='delete_folder') && !in_array(strtolower($info['extension']), $ext) && $_GET['action'] != 'create_file') +{ + response(trans('wrong extension').AddErrorLocation())->send(); + exit; +} + +if (isset($_GET['action'])) +{ + switch($_GET['action']) + { + case 'delete_file': + if ($delete_files){ + if($ftp){ + try{ + $ftp->delete("/".$path); + @$ftp->delete("/".$path_thumb); + }catch(FtpClient\FtpException $e){ + return; + } + }else{ + + unlink($path); + if (file_exists($path_thumb)){ + unlink($path_thumb); + } + } + + $info=pathinfo($path); + if (!$ftp && $relative_image_creation){ + foreach($relative_path_from_current_pos as $k=>$path) + { + if ($path!="" && $path[strlen($path)-1]!="/") $path.="/"; + + if (file_exists($info['dirname']."/".$path.$relative_image_creation_name_to_prepend[$k].$info['filename'].$relative_image_creation_name_to_append[$k].".".$info['extension'])) + { + unlink($info['dirname']."/".$path.$relative_image_creation_name_to_prepend[$k].$info['filename'].$relative_image_creation_name_to_append[$k].".".$info['extension']); + } + } + } + + if (!$ftp && $fixed_image_creation) + { + foreach($fixed_path_from_filemanager as $k=>$path) + { + if ($path!="" && $path[strlen($path)-1] != "/") $path.="/"; + + $base_dir=$path.substr_replace($info['dirname']."/", '', 0, strlen($current_path)); + if (file_exists($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'])) + { + unlink($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension']); + } + } + } + } + break; + case 'delete_folder': + if ($delete_folders){ + + if($ftp){ + deleteDir($path,$ftp,$config); + deleteDir($path_thumb,$ftp,$config); + }else{ + if (is_dir($path_thumb)) + { + deleteDir($path_thumb); + } + + if (is_dir($path)) + { + deleteDir($path); + if ($fixed_image_creation) + { + foreach($fixed_path_from_filemanager as $k=>$paths){ + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/"; + + $base_dir=$paths.substr_replace($path, '', 0, strlen($current_path)); + if (is_dir($base_dir)) deleteDir($base_dir); + } + } + } + } + } + break; + case 'create_folder': + if ($create_folders) + { + + $name = fix_filename($_POST['name'],$config); + $path .= $name; + $path_thumb .= $name; + create_folder(fix_path($path,$config),fix_path($path_thumb,$config),$ftp,$config); + } + break; + case 'rename_folder': + if ($rename_folders){ + if(!is_dir($path)) { + response(trans('wrong path'))->send(); + exit; + } + $name=fix_filename($name,$config); + $name=str_replace('.','',$name); + + if (!empty($name)){ + if (!rename_folder($path,$name,$ftp,$config)) + { + response(trans('Rename_existing_folder').AddErrorLocation())->send(); + exit; + } + rename_folder($path_thumb,$name,$ftp,$config); + if (!$ftp && $fixed_image_creation){ + foreach($fixed_path_from_filemanager as $k=>$paths){ + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/"; + + $base_dir=$paths.substr_replace($path, '', 0, strlen($current_path)); + rename_folder($base_dir,$name,$ftp,$config); + } + } + } else { + response(trans('Empty_name').AddErrorLocation())->send(); + exit; + } + } + break; + case 'create_file': + if ($create_text_files === FALSE) { + response(sprintf(trans('File_Open_Edit_Not_Allowed'), strtolower(trans('Edit'))).AddErrorLocation())->send(); + exit; + } + + if (!isset($editable_text_file_exts) || !is_array($editable_text_file_exts)){ + $editable_text_file_exts = array(); + } + + // check if user supplied extension + if (strpos($name, '.') === FALSE){ + response(trans('No_Extension').' '.sprintf(trans('Valid_Extensions'), implode(', ', $editable_text_file_exts)).AddErrorLocation())->send(); + exit; + } + + // correct name + $old_name = $name; + $name=fix_filename($name,$config); + if (empty($name)) + { + response(trans('Empty_name').AddErrorLocation())->send(); + exit; + } + + // check extension + $parts = explode('.', $name); + if (!in_array(end($parts), $editable_text_file_exts)) { + response(trans('Error_extension').' '.sprintf(trans('Valid_Extensions'), implode(', ', $editable_text_file_exts)), 400)->send(); + exit; + } + + $content = $_POST['new_content']; + + if($ftp){ + $temp = tempnam('/tmp','RF'); + file_put_contents($temp, $content); + $ftp->put("/".$path.$name, $temp, FTP_BINARY); + unlink($temp); + response(trans('File_Save_OK'))->send(); + }else{ + if (!checkresultingsize(strlen($content))) { + response(sprintf(trans('max_size_reached'),$MaxSizeTotal).AddErrorLocation())->send(); + exit; + } + // file already exists + if (file_exists($path.$name)) { + response(trans('Rename_existing_file').AddErrorLocation())->send(); + exit; + } + + if (@file_put_contents($path.$name, $content) === FALSE) { + response(trans('File_Save_Error').AddErrorLocation())->send(); + exit; + } else { + if (is_function_callable('chmod') !== FALSE){ + chmod($path.$name, 0644); + } + response(trans('File_Save_OK'))->send(); + exit; + } + } + + break; + case 'rename_file': + if ($rename_files){ + $name=fix_filename($name,$config); + if (!empty($name)) + { + if (!rename_file($path,$name,$ftp,$config)) + { + response(trans('Rename_existing_file').AddErrorLocation())->send(); + exit; + } + + rename_file($path_thumb,$name,$ftp,$config); + + if ($fixed_image_creation) + { + $info=pathinfo($path); + + foreach($fixed_path_from_filemanager as $k=>$paths) + { + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.="/"; + + $base_dir = $paths.substr_replace($info['dirname']."/", '', 0, strlen($current_path)); + if (file_exists($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'])) + { + rename_file($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'],$fixed_image_creation_name_to_prepend[$k].$name.$fixed_image_creation_to_append[$k],$ftp,$config); + } + } + } + } else { + response(trans('Empty_name').AddErrorLocation())->send(); + exit; + } + } + break; + case 'duplicate_file': + if ($duplicate_files) + { + $name=fix_filename($name,$config); + if (!empty($name)) + { + if (!$ftp && !checkresultingsize(filesize($path))) { + response(sprintf(trans('max_size_reached'),$MaxSizeTotal).AddErrorLocation())->send(); + exit; + } + if (!duplicate_file($path,$name,$ftp,$config)) + { + response(trans('Rename_existing_file').AddErrorLocation())->send(); + exit; + } + + duplicate_file($path_thumb,$name,$ftp,$config); + + if (!$ftp && $fixed_image_creation) + { + $info=pathinfo($path); + foreach($fixed_path_from_filemanager as $k=>$paths) + { + if ($paths!="" && $paths[strlen($paths)-1] != "/") $paths.= "/"; + + $base_dir=$paths.substr_replace($info['dirname']."/", '', 0, strlen($current_path)); + + if (file_exists($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'])) + { + duplicate_file($base_dir.$fixed_image_creation_name_to_prepend[$k].$info['filename'].$fixed_image_creation_to_append[$k].".".$info['extension'],$fixed_image_creation_name_to_prepend[$k].$name.$fixed_image_creation_to_append[$k]); + } + } + } + } else { + response(trans('Empty_name').AddErrorLocation())->send(); + exit; + } + } + break; + + case 'paste_clipboard': + if ( ! isset($_SESSION['RF']['clipboard_action'], $_SESSION['RF']['clipboard']['path']) + || $_SESSION['RF']['clipboard_action'] == '' + || $_SESSION['RF']['clipboard']['path'] == '') + { + response()->send(); + exit; + } + + $action = $_SESSION['RF']['clipboard_action']; + $data = $_SESSION['RF']['clipboard']; + + + if($ftp){ + if($_POST['path']!=""){ + $path.=DIRECTORY_SEPARATOR; + $path_thumb.=DIRECTORY_SEPARATOR; + } + $path_thumb .= basename($data['path']); + $path .= basename($data['path']) ; + $data['path_thumb'] = DIRECTORY_SEPARATOR.$config['ftp_base_folder'].$config['ftp_thumbs_dir'].$data['path']; + $data['path'] = DIRECTORY_SEPARATOR.$config['ftp_base_folder'].$config['upload_dir'].$data['path']; + }else{ + $data['path_thumb'] = $thumbs_base_path.$data['path']; + $data['path'] = $current_path.$data['path']; + } + + $pinfo = pathinfo($data['path']); + + // user wants to paste to the same dir. nothing to do here... + if ($pinfo['dirname'] == rtrim($path, DIRECTORY_SEPARATOR)) { + response()->send(); + exit; + } + + // user wants to paste folder to it's own sub folder.. baaaah. + if (is_dir($data['path']) && strpos($path, $data['path']) !== FALSE){ + response()->send(); + exit; + } + + // something terribly gone wrong + if ($action != 'copy' && $action != 'cut'){ + response(trans('wrong action').AddErrorLocation())->send(); + exit; + } + if($ftp){ + if ($action == 'copy') + { + $tmp = time().basename($data['path']); + $ftp->get($tmp, $data['path'], FTP_BINARY); + $ftp->put(DIRECTORY_SEPARATOR.$path, $tmp, FTP_BINARY); + unlink($tmp); + + if(url_exists($data['path_thumb'])){ + $tmp = time().basename($data['path_thumb']); + @$ftp->get($tmp, $data['path_thumb'], FTP_BINARY); + @$ftp->put(DIRECTORY_SEPARATOR.$path_thumb, $tmp, FTP_BINARY); + unlink($tmp); + } + + } elseif ($action == 'cut') { + $ftp->rename($data['path'], DIRECTORY_SEPARATOR.$path); + if(url_exists($data['path_thumb'])){ + @$ftp->rename($data['path_thumb'], DIRECTORY_SEPARATOR.$path_thumb); + } + } + }else{ + // check for writability + if (is_really_writable($path) === FALSE || is_really_writable($path_thumb) === FALSE){ + response(trans('Dir_No_Write').'
    '.str_replace('../','',$path).'
    '.str_replace('../','',$path_thumb).AddErrorLocation())->send(); + exit; + } + + // check if server disables copy or rename + if (is_function_callable(($action == 'copy' ? 'copy' : 'rename')) === FALSE){ + response(sprintf(trans('Function_Disabled'), ($action == 'copy' ? (trans('Copy')) : (trans('Cut')))).AddErrorLocation())->send(); + exit; + } + if ($action == 'copy') + { + list($sizeFolderToCopy,$fileNum,$foldersCount) = folder_info($path,false); + if (!checkresultingsize($sizeFolderToCopy)) { + response(sprintf(trans('max_size_reached'),$MaxSizeTotal).AddErrorLocation())->send(); + exit; + } + rcopy($data['path'], $path); + rcopy($data['path_thumb'], $path_thumb); + } elseif ($action == 'cut') { + rrename($data['path'], $path); + rrename($data['path_thumb'], $path_thumb); + + // cleanup + if (is_dir($data['path']) === TRUE){ + rrename_after_cleaner($data['path']); + rrename_after_cleaner($data['path_thumb']); + } + } + } + + // cleanup + $_SESSION['RF']['clipboard']['path'] = NULL; + $_SESSION['RF']['clipboard_action'] = NULL; + + break; + case 'chmod': + $mode = $_POST['new_mode']; + $rec_option = $_POST['is_recursive']; + $valid_options = array('none', 'files', 'folders', 'both'); + $chmod_perm = ($_POST['folder'] ? $chmod_dirs : $chmod_files); + + // check perm + if ($chmod_perm === FALSE) { + response(sprintf(trans('File_Permission_Not_Allowed'), (is_dir($path) ? (trans('Folders')) : (trans('Files')) )).AddErrorLocation())->send(); + exit; + } + // check mode + if (!preg_match("/^[0-7]{3}$/", $mode)){ + response(trans('File_Permission_Wrong_Mode').AddErrorLocation())->send(); + exit; + } + // check recursive option + if (!in_array($rec_option, $valid_options)){ + response(trans("wrong option").AddErrorLocation())->send(); + exit; + } + // check if server disabled chmod + if (!$ftp && is_function_callable('chmod') === FALSE){ + response(sprintf(trans('Function_Disabled'), 'chmod').AddErrorLocation())->send(); + exit; + } + + $mode = "0".$mode; + $mode = octdec($mode); + if($ftp){ + $ftp->chmod($mode, "/".$path); + }else{ + rchmod($path, $mode, $rec_option); + } + + break; + case 'save_text_file': + $content = $_POST['new_content']; + // $content = htmlspecialchars($content); not needed + // $content = stripslashes($content); + + if($ftp){ + $tmp = time(); + file_put_contents($tmp, $content); + try{ + $ftp->put("/".$path, $tmp, FTP_BINARY); + }catch(FtpClient\FtpException $e){ + echo $e->getMessage(); + } + unlink($tmp); + response(trans('File_Save_OK'))->send(); + }else{ + // no file + if (!file_exists($path)) { + response(trans('File_Not_Found').AddErrorLocation())->send(); + exit; + } + + // not writable or edit not allowed + if (!is_writable($path) || $edit_text_files === FALSE) { + response(sprintf(trans('File_Open_Edit_Not_Allowed'), strtolower(trans('Edit'))).AddErrorLocation())->send(); + exit; + } + + if (!checkresultingsize(strlen($content))) { + response(sprintf(trans('max_size_reached'),$MaxSizeTotal).AddErrorLocation())->send(); + exit; + } + if (@file_put_contents($path, $content) === FALSE) { + response(trans('File_Save_Error').AddErrorLocation())->send(); + exit; + } else { + response(trans('File_Save_OK'))->send(); + exit; + } + } + + break; + default: + response(trans('wrong action').AddErrorLocation())->send(); + exit; + } +} +?> \ No newline at end of file diff --git a/core/vendor/filemanager/force_download.php b/core/vendor/filemanager/force_download.php new file mode 100755 index 00000000..111c53eb --- /dev/null +++ b/core/vendor/filemanager/force_download.php @@ -0,0 +1,151 @@ +send(); + exit; +} + +include 'include/mime_type_lib.php'; + + +if ( + strpos($_POST['path'], '/') === 0 + || strpos($_POST['path'], '../') !== false + || strpos($_POST['path'], './') === 0 + || strpos($_POST['path'], '..\\') !== false + || strpos($_POST['path'], '.\\') === 0 +) +{ + response(trans('wrong path'.AddErrorLocation()), 400)->send(); + exit; +} + + +if (strpos($_POST['name'], '/') !== false) +{ + response(trans('wrong path'.AddErrorLocation()), 400)->send(); + exit; +} +if($ftp){ + $path = $ftp_base_url . $upload_dir . $_POST['path']; +}else{ + $path = $current_path . $_POST['path']; +} + +$name = $_POST['name']; + +$info = pathinfo($name); + +if ( ! in_array(fix_strtolower($info['extension']), $ext)) +{ + response(trans('wrong extension'.AddErrorLocation()), 400)->send(); + exit; +} + + + +$file_name = $info['basename']; +$file_ext = $info['extension']; +$file_path = $path . $name; + +// make sure the file exists +if($ftp){ + $file_url = 'http://www.myremoteserver.com/file.exe'; + header('Content-Type: application/octet-stream'); + header("Content-Transfer-Encoding: Binary"); + header("Content-disposition: attachment; filename=\"" . $file_name . "\""); + readfile($file_path); +}elseif (is_file($file_path) && is_readable($file_path)) +{ + if ( ! file_exists($path . $name)) + { + response(trans('File_Not_Found'.AddErrorLocation()), 404)->send(); + exit; + } + + $size = filesize($file_path); + $file_name = rawurldecode($file_name); + if (function_exists('mime_content_type')){ + $mime_type = mime_content_type($file_path); + }elseif(function_exists('finfo_open')){ + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $mime_type = finfo_file($finfo, $file_path); + }else{ + include 'include/mime_type_lib.php'; + $mime_type = get_file_mime_type($file_path); + } + + @ob_end_clean(); + if(ini_get('zlib.output_compression')){ + ini_set('zlib.output_compression', 'Off'); + } + header('Content-Type: ' . $mime_type); + header('Content-Disposition: attachment; filename="'.$file_name.'"'); + header("Content-Transfer-Encoding: binary"); + header('Accept-Ranges: bytes'); + + if(isset($_SERVER['HTTP_RANGE'])) + { + list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); + list($range) = explode(",",$range,2); + list($range, $range_end) = explode("-", $range); + $range=intval($range); + if(!$range_end) { + $range_end=$size-1; + } else { + $range_end=intval($range_end); + } + + $new_length = $range_end-$range+1; + header("HTTP/1.1 206 Partial Content"); + header("Content-Length: $new_length"); + header("Content-Range: bytes $range-$range_end/$size"); + } else { + $new_length=$size; + header("Content-Length: ".$size); + } + + $chunksize = 1*(1024*1024); + $bytes_send = 0; + if ($file = fopen($file_path, 'r')) + { + if(isset($_SERVER['HTTP_RANGE'])) + fseek($file, $range); + + while(!feof($file) && + (!connection_aborted()) && + ($bytes_send<$new_length) + ) + { + $buffer = fread($file, $chunksize); + echo($buffer); + flush(); + $bytes_send += strlen($buffer); + } + fclose($file); + } else { + die('Error - can not open file.'); + } + + die(); + +} +else +{ + // file does not exist + header("HTTP/1.0 404 Not Found"); + exit; +} + +exit; \ No newline at end of file diff --git a/core/vendor/filemanager/img/clipboard_apply.png b/core/vendor/filemanager/img/clipboard_apply.png new file mode 100755 index 0000000000000000000000000000000000000000..d470c4434ba88711588dbca8762cfc42e1781759 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHV5AX?bRZ~;@|NlRbgn;N1pN{~g zSW1HYf*BZQo@qRE6QnfK)5S5QBF^;WL*51jo|cQs77YuyCm1kzS~py}U9T2><-Pmo zB3I3)5_K}{mQ1zE>t_a-{!ZdmfB3P?#r{dNBlDq+2?8m43{nq1Bp#f!Z-GI;)On_F cYz;0mA2Akl@XGwZ31|s}r>mdKI;Vst00Uz{t^fc4 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/clipboard_clear.png b/core/vendor/filemanager/img/clipboard_clear.png new file mode 100755 index 0000000000000000000000000000000000000000..e7fb9031bbaae2e99b053798a1a674cac64bf0b6 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VW6&4m&Q&ao@|38p~fZcD7 zumELQOM?7@f%MEXAFOs(0vXYsE{-7;alU5{avm_?V7;(r!41Z&ORQWwuQz|c^y1&@ zD=r#;*(*CfaT}X=3TC{!?sEUm`^KeOM~|H=vT*ssc}8c(EIkfRRR$rp1)NV>6fT$l ksbBwU;))x;j~o#Hxm@;>+u}8OKx-I0UHx3vIVCg!0Ckf|LI3~& literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/copy.png b/core/vendor/filemanager/img/copy.png new file mode 100755 index 0000000000000000000000000000000000000000..e1d89116d3fb4a7fb0874d9ab6d5f5b502d44f3b GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDURZ~+lHa7kb0}>Jvl9G}T zQd3h?OH0eh$OxzaC<0O0o?5R3)XQ5EiYG43ltY(aU2^428 z3GxeOn0e-edbJpk>+9*_7*Y|(du$_bgMx_bMQx+R8w2xS*Dn3Pe^z z1Ef+_RTanpiU0wS0n`NnKyg(KRj@FSR0RqG1t3yDE)W2vAc7ECAP>R-3c?v`AVD|+ zYJsqU=0J>sGJxVh7iw#3ZROYc2lTLiNswPK10xd)D;ql}7Z)#|kg$lTgrtmuqLQ+T zimIBrhM|e6rInq%qmyrHc1~_?US57tSwmw}OG{gS|CBlN<}X-!{^G@pmu}v=cmLs| zM=xHz{w*nQ`Uq(B1y2{pkcv3p?(2L_0U|8o(p?2>6}tA8vx>gqU3%mH|Lm6E33E~= zO+G1C(R1A1HcR_)ir(~P?{7wg7T#U`Ebw~&zGb`i9}qNn#b|qBIn}b0!^kX$^H;i)T>p_Li=96;b^Ka$rfhdkWmvn1b8=wf@4peL7Z*4- zeUlTqu6lU8Tl^-EsU905cqRpLMedrh&+5;^1LbkSyCz(`XS(yJ&AmI@6mM^s^g}uG w;XN;HFS~G!C!e||<=x#_X|-McT=8Gl&qtMB9C>mi3zSeiUHx3vIVCg!0Ev;nq5uE@ literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/dimension.png b/core/vendor/filemanager/img/dimension.png new file mode 100755 index 0000000000000000000000000000000000000000..43dcc10155703666c47b845df93feebcf8b7d21d GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfx&WUL*Z=?j1DQhw>^s?#0(7fo zNswPK1EUCwa_H~-z48IayIMMa-ae;rEB4m~Pw69uPd=)>z03OLp0WQ2lkmrvF5Wry zprN%b#9TNk@|aoo>K98yfQD@Jba4!+hzsq%I_anZkMq?fo~O=KOiYyg^xuBl<9mD7 z#OutJ?9I6lap3joO$mQaUA*|H3Gcx%1wQ2QuH%bW2&>r(gcV@;M}nonz|r-6DniZAF9D zTEvunv$(bU^ux1P;?8gX{kLpi(A&=&$~WHcmUollww$-bMz%LTh<~m8|9eOC6aL80 XKF#xG&C|*bP;7a+`njxgN@xNAsIHRv literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/down.png b/core/vendor/filemanager/img/down.png new file mode 100755 index 0000000000000000000000000000000000000000..76511223d957dd488561ac4eefda6f5ef835ba26 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^93afX3?$7I7w-U4asfUeuK)l42QqPiwjPVMKsnBm zAirP+rY>g1X2!~vUXj&uKtXL!7srr_xa0(55x)cmX7#HIqHGIi8jDIwXe~E3kSH)Q hFg7qU;9w9`W@gA?V!2g*uIVJm9#2<4mvv4FO#u5cAhQ4f literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/download.png b/core/vendor/filemanager/img/download.png new file mode 100755 index 0000000000000000000000000000000000000000..76125f22a6e94ecc3c4b53e6b6d009ee4793fb44 GIT binary patch literal 674 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47gs@Y0R@59Nl8foy#SFiGBN_{va+)B z_xHEAw+Gtm=;#P^2GB-i0CXzQVX6<(dw{{0R1)MD%wW!cc_L@c=~rA+_-b1ouddEN z^SE2J_Q{?8rRJJbZ@Bg=?n!3uyW@Z5lQvLu@S#mub?^WrjHws??gV1OwTZ} zE}f;U>FZy*9ljOG>wG<+;qO8DgiiY=-XFWQ8yxiyDr;J|e&~G6qcFW+#JkWsPRs3+ zWy9MI0jnRI#jO`TC*JVSNXmGp`?((1`STc!ZmznOwQjcV)>&s65=8s2hucl9jq_)9 zUXY+sQ(RsCUx1Hw?(&m^S3j3^P6&1*lQb>=It(xb?# zTVA{5J9AqnAHNxz_)cDCQk95(=h2{7KV4Y@%VzH0x083ryJG&9<6nyJRDP_!7gQuw i@&Ci$pTGVcblM-YNUrbm`%77%F!pryb6Mw<&;$T*ORLua literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/file_edit.png b/core/vendor/filemanager/img/file_edit.png new file mode 100755 index 0000000000000000000000000000000000000000..4bcd072e9f7e228d3452973b7c0e9e76a9543a96 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@GT#PZ!4!3&E+A z_j?_25NO~0Gx@dXJPt9ju8yXtj*g{ME8ahteWyAmb9vlT;~O__{bXo*oA_|Cz(HTWyN0mrWR^{QFrF_gkVo!0^< zI|{#HT*AGwX7cl&mLELBZ#WpPjAFkNP@!p-xypwBJj1uy3DxsI&VBxH45svE7W|_kWesGo$TRwW@yq=frGs zNiXHr+VXXl0e^Lx^eo~%eJ1(tHrpVj!>G%r%)HX(!N*-{w;D`i?#LWaweR{P^F1}v kZt|xlHID~Ee|Oa}%-oR7{dOvA5hzJ|y85}Sb4q9e0O7eBumAu6 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/glyphicons-halflings-white.png b/core/vendor/filemanager/img/glyphicons-halflings-white.png new file mode 100755 index 0000000000000000000000000000000000000000..a92969a174c8ed385127cbdf5f836b539cc88170 GIT binary patch literal 8583 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/glyphicons-halflings.png b/core/vendor/filemanager/img/glyphicons-halflings.png new file mode 100755 index 0000000000000000000000000000000000000000..f43139a488fa35166c45f8f760fa6842cc82826c GIT binary patch literal 15602 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/ade.jpg b/core/vendor/filemanager/img/ico/ade.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b653b3d1375113626f327305808833c8cf96fc58 GIT binary patch literal 2290 zcmb7Fc|4Ts9)I3>XR*&>X^e&$lMbRgW5!h|Gs!wR8H6mA-H>IZ#W)>_CgpIAx^XHZ zrMW0{>PlH6MQP!b6Cl_y}x(){GR9c{@&;N{VmU<=vRyYg1fVu zGk_ofAmjpyQNVTDCyWHZ!vmND08{{USP0OFhFAdwc>q9_pq6IDCGe6Ss5B}T0cUe! zvM^34jtHlPrqJ9yom}FC@j@DV_1e`|tF1TD+~SiXlHx;l(wO_K!XucRu+T`wAaDd2 z7)HS`1_h%qh~U(5I2guhsi~=`6SRm#f)*Z6(xK>)w8`3dyq=LBnPNbtQi*y-#zxDH zDa)w_%AY_=Pb^Lohto9B#%mk=-=b&*L=_MS#4uzGP(%nOLW(wEfY3+5$}lYn8UtZ* zFbXkJka@(oWI+^Uh{j+Q13&|rM-gBG62BhYcTXkCkFdN08^K*kA^@An=)m>zqDN^D zyoR`S%|-1acP_mUSD!IF^e8NP!*n52<$6Qb%%6+9o>ho)8_nyJ&AP76ADfAra;n~8 zKBSrfvMc36yE&ImcG#)<&nI+b0fr|B9qVM(J6H81)+~H#(SGxV2G@Q7*&sky5C957 zBRBjFD;fg>2!&-@>k^1MdUUQQ0$By217T2$jg4=&pGx|UXBS=icuSb))b$~2a?35} z(tcIDb-N;3e{J2UKRr?O!}|^PG#lSX<_Ttg5jy2z|D29@*P^nk2i+R@+}w#h6uZy_ z)#j+(F%;+LveC!33leXQJ->V8Z)!V(lB}D#W-x0el4-_>ixD3x6RwGD(hIG^wX38? z^xE97$UPgHim|utJfwc-P{juGzB`MDjjDf;Gpa_NtvUDCJfmGp(7JWm(VI`#{;?Th zXhsAO3}Ml@Zv+u`FcF|h+B7;3!(d6RxFMqS(XlTyk$gHp?|cX2O6&u97mm*iC;$AR zJYx=$4!$W&)r*R=lDz!`qumu7-)UH{4=ci>!y zh-zentiVxb6{$BIM)hkABAfx5h#}FLAy|U8F>6-~!-^;H($VF5hKZ8WrQKh%jCDYL zmV>CgD&m46BUt@*&X#}g{psXv-{oeL;lL|hL*r|!9HWnnUosyXv(uV#ZL_PI&lf|DBBAHrSH=MLScSDOS^xhvyReQ+(V6j^^ zJbcf8r!2VN(BX^sh2EZ_&XxP$U(do^zV)fYjt)pnPZm^3EXIK}C z%~d}QxqGO`9Y0DOjory?*mOI2;xnZ#CZgV>sd#d8%ERvVF$W|+D+x%(As9w4)c^#D zbQVv*6qORBwJjm(T+iumedj=59I_lA&MH7p>OEufO@AC;HQ;E~nbeecy#T`dF=@@6 zRvKw#teOJWukVuTd_-BhOOn|WKKr~%8cQ1MeLuUr;w7`s^zrX@QW(C^{`RCYWBmF0 z;%wqmAMDEVYZ;i*Ovcufo-uwTQ^NB* z*dgHKV($>1MxD)?TD>=*m$W>+Tz(>(!YcQHBSl*mOEiERqgAA!;(8r&ghm?-WdT~(Z^1U?Z;p5I$-O>2aB0ik!@tnKE~RD3z|o{zo#t# zn{$GL?8LVQ^XmjJkE`a#d2DO0u~dopBah~PkZe6#+mp;LyBDDSvFuIwDv|y+mj~`Q zO`|(bS^50K@T_aljTqZ?Q7Nl@rlULbCI=<$;JA<#B7w&a-J9g)iQO9gpX^)Vzf7&? z)4!l|CHG#q3&E}MvJXG4G{ZTxtDe@H`si38%Tbvockli_dWJ#wfh~-Kx`Hkf`nO%2 j>&fMIzK~?woIOmQ4-EEX4<32%-F{!n#~xZ}SN!%L0k>Q) literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/adp.jpg b/core/vendor/filemanager/img/ico/adp.jpg new file mode 100755 index 0000000000000000000000000000000000000000..b653b3d1375113626f327305808833c8cf96fc58 GIT binary patch literal 2290 zcmb7Fc|4Ts9)I3>XR*&>X^e&$lMbRgW5!h|Gs!wR8H6mA-H>IZ#W)>_CgpIAx^XHZ zrMW0{>PlH6MQP!b6Cl_y}x(){GR9c{@&;N{VmU<=vRyYg1fVu zGk_ofAmjpyQNVTDCyWHZ!vmND08{{USP0OFhFAdwc>q9_pq6IDCGe6Ss5B}T0cUe! zvM^34jtHlPrqJ9yom}FC@j@DV_1e`|tF1TD+~SiXlHx;l(wO_K!XucRu+T`wAaDd2 z7)HS`1_h%qh~U(5I2guhsi~=`6SRm#f)*Z6(xK>)w8`3dyq=LBnPNbtQi*y-#zxDH zDa)w_%AY_=Pb^Lohto9B#%mk=-=b&*L=_MS#4uzGP(%nOLW(wEfY3+5$}lYn8UtZ* zFbXkJka@(oWI+^Uh{j+Q13&|rM-gBG62BhYcTXkCkFdN08^K*kA^@An=)m>zqDN^D zyoR`S%|-1acP_mUSD!IF^e8NP!*n52<$6Qb%%6+9o>ho)8_nyJ&AP76ADfAra;n~8 zKBSrfvMc36yE&ImcG#)<&nI+b0fr|B9qVM(J6H81)+~H#(SGxV2G@Q7*&sky5C957 zBRBjFD;fg>2!&-@>k^1MdUUQQ0$By217T2$jg4=&pGx|UXBS=icuSb))b$~2a?35} z(tcIDb-N;3e{J2UKRr?O!}|^PG#lSX<_Ttg5jy2z|D29@*P^nk2i+R@+}w#h6uZy_ z)#j+(F%;+LveC!33leXQJ->V8Z)!V(lB}D#W-x0el4-_>ixD3x6RwGD(hIG^wX38? z^xE97$UPgHim|utJfwc-P{juGzB`MDjjDf;Gpa_NtvUDCJfmGp(7JWm(VI`#{;?Th zXhsAO3}Ml@Zv+u`FcF|h+B7;3!(d6RxFMqS(XlTyk$gHp?|cX2O6&u97mm*iC;$AR zJYx=$4!$W&)r*R=lDz!`qumu7-)UH{4=ci>!y zh-zentiVxb6{$BIM)hkABAfx5h#}FLAy|U8F>6-~!-^;H($VF5hKZ8WrQKh%jCDYL zmV>CgD&m46BUt@*&X#}g{psXv-{oeL;lL|hL*r|!9HWnnUosyXv(uV#ZL_PI&lf|DBBAHrSH=MLScSDOS^xhvyReQ+(V6j^^ zJbcf8r!2VN(BX^sh2EZ_&XxP$U(do^zV)fYjt)pnPZm^3EXIK}C z%~d}QxqGO`9Y0DOjory?*mOI2;xnZ#CZgV>sd#d8%ERvVF$W|+D+x%(As9w4)c^#D zbQVv*6qORBwJjm(T+iumedj=59I_lA&MH7p>OEufO@AC;HQ;E~nbeecy#T`dF=@@6 zRvKw#teOJWukVuTd_-BhOOn|WKKr~%8cQ1MeLuUr;w7`s^zrX@QW(C^{`RCYWBmF0 z;%wqmAMDEVYZ;i*Ovcufo-uwTQ^NB* z*dgHKV($>1MxD)?TD>=*m$W>+Tz(>(!YcQHBSl*mOEiERqgAA!;(8r&ghm?-WdT~(Z^1U?Z;p5I$-O>2aB0ik!@tnKE~RD3z|o{zo#t# zn{$GL?8LVQ^XmjJkE`a#d2DO0u~dopBah~PkZe6#+mp;LyBDDSvFuIwDv|y+mj~`Q zO`|(bS^50K@T_aljTqZ?Q7Nl@rlULbCI=<$;JA<#B7w&a-J9g)iQO9gpX^)Vzf7&? z)4!l|CHG#q3&E}MvJXG4G{ZTxtDe@H`si38%Tbvockli_dWJ#wfh~-Kx`Hkf`nO%2 j>&fMIzK~?woIOmQ4-EEX4<32%-F{!n#~xZ}SN!%L0k>Q) literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/ai.jpg b/core/vendor/filemanager/img/ico/ai.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e469be3df8781b9a24e84ec22c5e6433dfd2feb7 GIT binary patch literal 1776 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/c4d.jpg b/core/vendor/filemanager/img/ico/c4d.jpg new file mode 100755 index 0000000000000000000000000000000000000000..62994da7a372dd446ff991e89eb2b1f38f863865 GIT binary patch literal 6241 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/css.jpg b/core/vendor/filemanager/img/ico/css.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e1673b0743b8c26007a9828f0d61ff3ff8b4e8d1 GIT binary patch literal 1722 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 T4edi=31f=DPE=aUT^Rf?WJ=VB literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/default.jpg b/core/vendor/filemanager/img/ico/default.jpg new file mode 100755 index 0000000000000000000000000000000000000000..94ca6691a6257d6e13d45455484f99d08fb8b88c GIT binary patch literal 1723 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/doc.jpg b/core/vendor/filemanager/img/ico/doc.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c0e14b3f4b883770eb061827cc9eb8497a75805f GIT binary patch literal 2511 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

    ~yju=_>uu*lZ*+Of!ulMa&( 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 I;$e>dH<`FnivR!s literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/dxf.jpg b/core/vendor/filemanager/img/ico/dxf.jpg new file mode 100755 index 0000000000000000000000000000000000000000..7041cbe6f750106d9461dce3648976613f6cef82 GIT binary patch literal 5419 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 R2Z9KsF=E#Y5-ahq@dHtmFyR0I literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/fla.jpg b/core/vendor/filemanager/img/ico/fla.jpg new file mode 100755 index 0000000000000000000000000000000000000000..41bd2ec10832000d145e32e4652a41a932b64cc2 GIT binary patch literal 1859 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/folder_back.png b/core/vendor/filemanager/img/ico/folder_back.png new file mode 100755 index 0000000000000000000000000000000000000000..dc0786ec6cea1394a7bd1c394727ce9604c9141b GIT binary patch literal 1128 zcmeAS@N?(olHy`uVBq!ia0vp^RX`lg!3-q3%M)E07#M2L^NvAv_Sw|~OKsWav-ShQ@-+I8zUZQinN`;MKvcJJMP;NX#? zr_Y={cj5AtYu9hzx&QFV(`PT2FPYU7|t)Hku3cJ}G-&`8KU6hAq87==kjTKgss` z3im7Prq4Y3|MX{@^I+sJ+563aVM>$D(hVQ4ggNY6+j#l@iR@3gyfG@Wm8?>Wc&ze_ zi%Ql!NxjWz#Gk2bl(bYlYRjHQA^OHCo?nusOZqNuiu<>VF{4JNat;cS?{w6kwl+^nZGMyT_}1@~(|4b`Rj$vmG!~4%eUWdGvtt+AyJJr~xZ4FB zH20p+@m5sjlIUFTd;0W=1(s89X;)4)OUn87^~;sbpPn4~@#Dsg7efA7a(8zd7yUhS zbKxSdm1_(8^fcXbj`o(6N#|@X@p0Lv_D48-ZE>Fs&*W1te)Iec*O7NvzUdc_ZnW@K zi*#)nztpWvUTgIJR+@b+w14~dIW4^Kd-mDcpKMT#?^!cAwpZUXC<(25)zVb5ySm9# zJyAio!Oq^ais@}a14BRtdn!Y-+0W_a7ooAaCw|FmjY&OoIxYiKEQ6=3pUXO@geCwO CHQzk| literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/gif.jpg b/core/vendor/filemanager/img/ico/gif.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/gz.jpg b/core/vendor/filemanager/img/ico/gz.jpg new file mode 100755 index 0000000000000000000000000000000000000000..36d159166e47d37b44fd4ed6dd800c2eca16f903 GIT binary patch literal 1718 zcmb7EdpuNG96$Hod3lWH65}z}jFeQXnPG}z8A+&Nrc$J0@-Bvv3aQ3!QlgDYeaPlf z5?fw9cGvcx6urIrc&iqxQh9$$W%gV)yZh&U&*z@cx#xGz{eFM1t87+22Mkvy7bk!q z03dJxP$MFPF2;Ip+TRaPNy@8kHG81 zO*ITtW76m}=KqGW3g9&04Pr6G7@#$i3;`$uW558`CqAma(JCAD43`Eeao)5>W%2iS>b!Ts@wZteVlM_ zj9DQZ(mQ{0q!;_M=QIAto^Q))oAvrg=}w*RqGi3S7w)MYP0qZs-7tvNJowO>UpcG< zK3Bb#VzwZyrmf=%y}8!ui(1AQO9>)+vYuI=?U7`*+eFOY@xZG5}fwnuTW zifL1vjuu=hd1WMm8ccBj=@3L^S_6z3Mj}%fI7gGs$2CthC5H1u4O)>=Lu*J`(^dwAg9 zn`=-a7iNhlDeAOD*ermAGc>h0v$#A6Wy=^F^^kKQUFZ??j$B zD?9haWcHZz!f*6r2jZ*!Gq0E5+hEHtlVi@oy+=1UAF8$s7U}+GDPeo$uVk)uF|er` z75vaJ-$?s?a9fkk?FEA2aWB*RKKhlfPW)(A9E9yn$=of9EBa98e*6Y;aH%zRm>a%W z9%ptUE$-aU%jCC0&2{`Qrwnh-|7G8ZL>(IQ|R9vS7&@~R> z8Wq4c`3eN*00x&Qkq(G`D|5cqo*idIoa^j-RCmShF|=6IIr>Ns&$uY(f;AG3-PH~3 z?@R1sFPjiK(0^AA zVBkECu$0Y}#t%s3sX29%;)$ANbSo0b5J83aTTpR!V#TPR&&iz?O?zHqhZ`Q>G;r+< z-SFNcBiF@YJVFufR?}_omZi4o&F!6#$YiQLNQAg4AOL4@ctVMk&6TGP1dt?EX*!=IdZXNJaxP1_c3b6))-Gab04 zf|IJEwrG3Lz$$Knd7`Tkq@2Y7@E=e4Pf`G6WN_^zQn?s%PN#)2AY)lYj8+|@B*}P literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/html.jpg b/core/vendor/filemanager/img/ico/html.jpg new file mode 100755 index 0000000000000000000000000000000000000000..a1af20d076fc5c79e6db7996e79bfefe2f241a7b GIT binary patch literal 2152 zcmb7_dpK0<9>?Fc)?68yam%GN!xlPdh^?_>u;nf@qlC~5%{ikQxr@Ck_XvqI)seJK zbcS3qDzwEGC6}JLuBk}sq)z9-oHbL~XP^JhZ>{yL_g%mDeV@;cILWB_0agis*aZJ;L)5sb)V@YV2G9E=b!sB@jd z2avBG^o?L(EDpjGWRCy|-35~oG8)0W0&%N6sQ+bJfks|TlcoRw^zL!^wypj5f`^^5 zUa{=#vC4XtFLj02lefI|31S!+Rtx~JZf=n8wO*7|ZgqEESa*0I85jEHEEL0#3?K{) zA=uU9aR>&B2N0~TMc1HiWN}d%0?G3*nIL@=Yg7#9hXOT zFL;WMa@|j8rxl&r_i*P8s-&%Dqu`qz0ey+O>XT~le8Uy3`G0!3l(+Z<)Q9?X^N$!1 ztBcz6ZR5v0LfuWFgl=m=lf6lOU@vX*)A}fjt+vLSo=5!lNCr?sGYWtZ7y~PhzZT-=CL|LjsI36oLm}@pdBEx>lY=XZm!09 zD&e0>UE2k=|2UP|6ZK83$;vD5C&dgQsHosd*S5ACGY&cno$5-?;PbL|pcyqe<{dIiO!%kdzD@JBofP@`ehsa8(x=t2zxl+l@! znzrC49#kNr1l z5@(hIhtq}EF9rHzl#DdH*O2V`bZcmjYg`i5eZBj=e&8Ik?qM8xYApHC@IaJ-)g9oE zT8NBWbQu0kn$Oi6QkH%pUbDu|rv=xUiv+jh9A@lyJN=TqO<4PMcVKCIX;m=e^2_;| z-bRxoBV`XUhE)Jn_B_yU?sd`@5S^AfZj97TJu|oHEk3Z)`%~je{G^byLV3ZT&OW#s zX?{1Ckri*l!+XoX8O(BmYC>+#!G~GDX8sh-43U%;-MfA^Oy7U%+oDVQ&K>+@N!Yyf zX5;D1t#AImq2Xwx)^RoMcz^xoi8Cpu?N{#K@*HJ55A7#d8$2qV;}=g6N7!oL$$-|6 zvwYKQV;(ldch{aaCxmR#Nl(^#hGAFC3`@f4wyv-mG%h;AF*R zCG}*c+-kvhozE4Wx4dn4V#D`Q2doMPSazg|l62nB;WZ(do%mY73UnOb#|*2KSle>< z7792)qUK^s*I3%#p+fwA!{YNpSWGo8g?CSfMm`FO}F^dB-tpnq|pp`lUa5`;lz`s;FtVhLz$ zo>Me6mF_5A?R@gGdtFMBd)w&`ZUy=A-6r+Ho%wp{6C08_6VJ}UbNKzU;faHibUILu zdoDK2e}7BI)#2;{t-mYh%9b@A86O0lpt6&%mPJe$@2c@O%2XAN&Yip<4h$K7{4a$Z zDM$dS;;XW*NRktqM~$XC7Jep?H#qs?wl;!%QQ;?XhBfoH)tmPN}=* z*@jyKJL=;=Hz|Gat%Ai+UN9Jd`(G9^oz3N;6(jvDH|QcJ`E_cR!w-ASj=e6|j)Pnr zh1w?rz4k}l-(TMqT5Xm{x}EpeSW9Kmk@CaV-u^bTDF?eQ3Xi||WKIeh;X1JDCHC90 zr%Me^xyyh literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/iso.jpg b/core/vendor/filemanager/img/ico/iso.jpg new file mode 100755 index 0000000000000000000000000000000000000000..379f50667f68117eeaa2ced50fcc0ace9c45a143 GIT binary patch literal 1496 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 IMcNzx1#lOing9R* literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/jpg.jpg b/core/vendor/filemanager/img/ico/jpg.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/log.jpg b/core/vendor/filemanager/img/ico/log.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ec6d3e3f5f5b5ea808a90bb21ba75007d3802a95 GIT binary patch literal 1765 zcmb7EdpJ~S82`>W=HfEzj7yVC84N|ca+{J%lyNJ=P>B>vshN#RROmu-Yh82MbYX`? zs8FNwL=>XvGL(|gkdlYUsKsNt9|x&p7WjWy?pO^-{1FspZKNt4M5k~JJ|yW z0sz7uAQk`{yD-j90GLdm4*(znD4qkPuo-3rs@Mwv%!R*eBDl!+xwph9o&~0^`$9QE zoQQxORR3`5I+mS75N8jEYGSa;z}SH9Om*558nAzlUm(>mj7~Q(_4D@&5O)Dv07D3j zKroEJ5+FE40=$$o0Y|_S2n0NdBu|!;ktfO$NhHOe6lLWoBo&gpjM}1~Nb+(d5=9aO zTP|5Ciy*QTB8f=(-w@veWFqhe5eTFOU^0Y|A#npx$I3?_2_!Xs1%W7yL!=-)W>xx^ zdd@0-1>_J2z$k)Z)IAxSQ`6dvnf^-5$Qb?UW4~eso>>i#ak*ICe=x%RwrYT!+s}+Q z03hs&L+pf*{DKKA^xtQm_+k;zT`!i}DG zzlsUgSTZ`;52f&s6oSd$Aceyd0E{d!TnV9M1&XE(3(Jm(8eGmIJ>z!3=q+&niBj9~PTHA58?m9z}$Yxt;<@u~F8EN$8fH~+hR zHmu;|d2?*xtzpq~MSs?KK|@ISzysbMX&=)Nwdl>s>i6Gd^*b2d(h1|Yn$;&?DLUhp z$M*8v5zygnUK8UuQdE7A-($fZrKl{t?D>3n=nGjZ^k#7t(#^~hhQ?G0O9o)$b9-<9ET?xD{X+OE$ZZ+!BsDD8Ycti>2;Ihd?Bbaa<)XUb{b z!;XHTDs6?pIU{}dqnk$kw`wb@WLs-m*@oMd9IJM|vv(`?oa|Y)fPPq#d&GL4(h}da z>%om@77dy3S~+Qh+2wEFo;69(9$J02G1=#FnV(|Y^*)A4Vu-cX_+RXf&mxD3lN)1V z-_u(6bq9NRg%1n(%ks{i;})%mUuVB}b3CF!TJq$WwxD2YwBZ+>&1jaME@Rh<-tvgF z%ulsC!s^-HrVnC(ZKp1ZbtsITvG1J>k%610q0yQ#)bBVo@9rmTcji0UT2oXqptO)% zuaM3xpEx-3Qo8*bU)i*SmD995<+klwy)Iw7vixUH)skLlAGs4T;<&|c&mGSz~t+C@%A3y8MOuUXAGQO(0GNoFg5VvC*OLTzw6@8X<-?`t zD^+XUokpK>^-dJY(=~7Dfm(xzqA(4x!7kY! zp9b{5PQzCR3BNGFNdbZ+xC9Vc6QG7hZZ>QD#;B~|yb8YHJHO~uNqox8(WOqqN8nhQ z2(DKhHMJ1G;YRjxl;WX;pb5SznVWvkjt#U8wBEqtTsL=n8O^{Mbvw_BE^{mYSlX9x zF1)E$aEU%dQFc&`*VG&Fs*iW|++anvke=!99ebv#;y%uxT0}7(ExeT5G;s7R>sg0;Tf8-%H+AQ{bIqHKT*OJTGTVly_in$NlplnuaV~1Dof7W5*X6#M Rx=kP#X|PH7&OB1w`8S?lY>xl{ literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/m4a.jpg b/core/vendor/filemanager/img/ico/m4a.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5c6417c870d36a1433acfa810ec20ac75026b1d5 GIT binary patch literal 1529 zcmb7EYg7|Q6rSD9Wf2&$FffA z2jCT+oN7okWW+C`bwALvB7#E_4M_%ig4|cGl24pXhbE=QFHh1gqZR3kwJIN-a`8m# zT`&!x2!>(^iee~h7>=>V2uiw#wW&t3peA;L^Kj*Dv#g&5KBs;y-*arRl zzUp!QLuaWT?tS*UN&b9xk1svyCx_$M@>necbau7)xZO_b-pX0O#L5u+DBH zz#x=SBtW2QoX=Qrgu_KK1;G=ON|m=nt$~nu5HNzH{ZqH#2QD`pD?7eG)zT31Htp!M zZ_Mimy=T8lZF!KB=dP@~dZ#rAtC z&0fX$#Qjl3Y<;K0Us35t%x8J~#@Jo0gd59QNnuiPZ9HJ2asY*k6%q$V85k6qnq6^` zbe*8qXj49l%MC#LWivaSE0skKdAGmwDw8J6jrQY~O7pzd3UhOQ-jtww5T21CdpY_K zO}8W`DYfHTq4(2knj^%tu)mwGoZ0zm-J6_OCX?4!iyl2nW!j5h5Dl*8cIFgvVVQZ4 zU-xL;v@eRkUzSxAv2k;`ZYuqLMfmWIXxmAnxAUl~Z~fw2)SI_5QZ~E$sduN8*m(~|9Y^@IIdw=Mte}dj~Wt`t;HON75+kqhzU=&%( zz{ova5s=-*Pq`Doy!O3$QX~zstF0>QF&kWp^zD6NdSCwbph9M=M@NoF(_Zt1wU0Z) zR$<$S4a~GIZT&MN??2FM;2tSi|0jT$IIHz=9lg1o8oxHL?Xl$IH zEcRw#)k7F;pmqid3zpAdlhnaK1hvrc{dhI&af1zVpee{| z&A`;vwszUFifnC5al2YtCp>D7N#B%R5f`>!`&;pd(^(B8;T{ahRvd(7yFef+g)&f^ z!bC)BvWjfFlJ5dWOeoRxSMSU7ml%6;cZ`z%I4MSQ<97RsEt?MF!!j!cs;J4*;*!8-LF^bJG}R%t(pN%p$4PkX&+`F+~(HBITA4lSLzTC%MfI<(5#%CWWC@ zaw%zAKWdfOunCEVByAR{kV_(dhc3VU_xGH0-p~6v&w1bTJm2U0exHS|g+4&GwX(4S z5Ci~(USQz`U~Luf4gg?h2ebhI1OOf90Sr1ry+9d#0DyDhZ*L-Uk#BRiMd!ji(BF9| zj2Fa<@bgvMe?-mJVXJizFPNvcQO8(EPiNB(HJjitztCXsAJv!weLZ8Qw~wLWLO0+5 z7(!qKf?)(+Gz5z*8V)0a$Kr8#JRV0P$x~#h@&rW!iA0s7Dk>?hT)9$y*(%jlBvo0` zN~Oh3(B+FOi3mbeB9I75|Fdu$oL9)^YH$)4|{)|KnNIm^#~e@xgj7td)MH}%S$^h(}WhtKTYuCcz5VsQ4+ z^9vsS*Fqm!zmqeU3YtF7Er3VvpHh0KNEiFQQ$3C-&YCW58Kl$MH$QM^z(k(=W<$j5 zi|?n+Ch%sh6DcB(`L~zLq^8zMAD6ZS^S@>)JXC2XnjD_B=61QZiwb{JM9O z#>8g*3R6K?nSU#%mYmj^G4p$EO@-65BIi@u2ct8z>;(E{{?#ossd;ck(N)!s3tJ?= zS|WiX_YWFzw{dshFrkWUr=lmr$0`SVG;YQU+Fth%k0`iCMTwM8W*bb|ef}VFki)o4 zPc@>G;k2RPiO6J=XjesRxf++PH%#P3ZkvM}gZ1b52Lmd?`6X|ML=iKs+O7jO;+%Jp zA2OOuLzVZ9E3Vhxkr7jdCcmD7CJ$p_MCNPq5R6~|7DrK_s?qs0hAxY3>FAxFSKGgY z0a||xXllJ*)VaE}I-dfHQ=$7fZjbrFyG7@M5~U7^q_c)|p+ddxD8srbRX53_+ECSk z{OR0%*HzRgxQyhuRAa+n+s8-FPtImgX*2guGYHCOr<%$!4hR zNqJ9LcBsvd#nswk9*4UWHM|)0Mk-zJ^NsNqOp77GrOpCg&|lFUyK9pZhSb2vDx#}rS8Hpf zVEeP((%a6pH^Fi<=FHo z`YZ>Z7hiaWvw#->Q^qz!o?*>X?&(h8Jy4G=oE7TJCKq3s)_Y_}5}Ro)fXa5S!#~Eg zj**sC8p&)3R7NtwHoY(x!JQT9-$sPkNQ zkmD?0wO>72F-9uE+!y_zAjoEHcN>3l-As8RY+Zx6ql)OA)p}N==IODA7yX0pw3V%< zmDYC*c(prQZ#k}BsGG>;*fwnD?DN)APD(#~Ah1xu@@|%vO5$H`+&5Q9e@Ui?(~NyQ zozn;7?}Qv}+!P{Oj=kNXI`cyzFQH|R{j+evhr*wjYs`0LjjVM$o$}s>wyCOtZT9e0 zRnyMvqjSV%lWv&e?S@v*`hEO~zA+^KX^-(p*;m|d$=;Hwpn77-iO!P`lM=PLRS(QA za4QWWxqPpm!?VC!?sU;m=F8v-_d#xN_1LEdlp|}%Xg7c{IQX0JKomgNMakjK7pCW3 z8zr+GYFocbj|F}1{)e0NegjM#E3k_##G8-m7{fgmU$BLUiJ4yr_eGb-cFj5S16G_S zWJRjO-}S5;Ef%7V$y8(IGwge{E>8!;54bovpYnA(M$H`Hmp2!d91~JHz#h!=WhpCM z(m>aH+E4l$nk@yTG^$mF^mW`nhN3;r-OQX4%Wb(Kx6g}>ih62WdkK>9--%c4?{2y6 zPzH#eO)Y_?)btGjr4Ab-@9@ES6A&kh)1e)jVxBg8wz+f+rZ78y zOS70x6}KlQ^wwe7PEjZ81MJ1dgsE2jkth}6i79zfsf?zLq0!Nn-3*qbu}bNORi{n= zX&;F}aaigxXomuT3|^)hy^M7Q7!p1$=wCD!8HLI@_FD&E zVicR{O?Kp`=dpyfFGjC@BNTa(5JK*yS94xALYSNbzN3Lm`M0X@99KCZ<)5gqY_vz3ve#wdsoLZ=k0o&ZdM&8>J&kl$$vuZ z%p4@8;ZJh)+5GQDc}Xr|#f<@V4sneg>k4E)(t}0`!&`MyeKkXR36`}=3d-|{z3>nJ z;dQwr>#V1;vrMQ@tpN1BGI#hh;kf7*(l7n_#8pvJUBan+`Z9wn&7P;9JN;ItaX!CO tbZ_LbX~3NI@X(=tRq#4}*N&R+dPKifSK<>V-deej)I`Q}{EHTz{ulCq_9FlQ literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/mid.jpg b/core/vendor/filemanager/img/ico/mid.jpg new file mode 100755 index 0000000000000000000000000000000000000000..176cd71a923a95c591c6e0c5da3e88377952ed24 GIT binary patch literal 1630 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 Hp3V9%0{PkZ literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/mpeg.jpg b/core/vendor/filemanager/img/ico/mpeg.jpg new file mode 100755 index 0000000000000000000000000000000000000000..50f99ff0a74487f5478ecf274344071a182ac813 GIT binary patch literal 1589 zcmb7DeK=HU6o2o%Gk3-`!@WMr(?&C95zYGWpqM2xRe)@DQ*8=4l$R?0>n?35C_ z;aRFFNs7VRNs(0Bl2E(JN5xYlTRuu{J=N@c$Flz2bD#IQ=f3Bj-}`%i=NwI&<_REH zt#Drf5Ci}OK0wnAM9ULon*dn78dw1Um;l)?12pKtD3}fx0BAlsv6GmOP541nQ1cns zd2fxCMadGw!?>Y4xT_?~-J)dCGVTIvCu>`4drz)=bZq#xXz3QNAR#ndDzFm@9W))l z6`%-)VhD<2C}kKOqYS6fFggQgFc>(FGni}^gE@tX<1Ag)6gHc~;V@Xbdb%7v=&~sg zm`-KFTsoVHGui*!G*GXQM?S*;qd#PQWxqce}P0tbr=i({+HBQnkRjG;mvvj~7d$!OTb zIdqhUV+>eC0YNTw(3gZjPE1&BgpPhZy^`1CpCf+yq9b8en(Dd#Ih`X5cGsuSF2pJG z8#(mrimSN;yHeCP@llNlqC}@}yQ>`s`kPK0?t5xp)^|NYK2*CXe)vlKdGFiPcMioF zhRLVeYHVWEG{O*<^x zr?*8IZI!0BxCpadC}9wc#v;cNsQQqAt`C!ihFmjSv5$0HYzAS(UtqUX;_DX@D*wJz zRoA*V`Pj9Ve>KBh&{022{lU22xt>J_Tz72_Ru%oVIrshNV=*js(($B}gC3I8BM$r# zW#zo8lKS1p>q?8|ip8_bd0vjHWlA&Uisrt?aJGYepniIA3x2#ymt%By`0C{xkD^!7 zsLGND&!$$qSn8U3Haj@^L`+x{f4gPN4(wIb`fj6?^nOB$-F

    eCZ0wrm-f@}a>ynvifXXp@H=;Q@l= z3Pj=p?d_;0CHi%zHaIt@pZIjA)KqvW@>C>R$e0PUO-V|i@&3|cA|zKRCIlj>T$@hy zC(&)O&LoWU<-Ko~HCR>7$~5&5FV3R`=8g&cpT1yBU@@g`#@P9go(u8P!!#o!-^PgV z>VBxYtIuwxVtUwG#yd{?+;lBBjZ92Wb@i}wz5;}9O-KbPgcc` zGP?1zGQ^~1j+etVcIQ*_nGqiMTS%5=_OvHv-Bo|`e^TKfu=}myjf;DDdd0b^7do0Y QFchgdje#Jm3(ETNA2~qyvH$=8 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/mpg.jpg b/core/vendor/filemanager/img/ico/mpg.jpg new file mode 100755 index 0000000000000000000000000000000000000000..daa2bc4633d71a8205d00348edea30d4a8ed9345 GIT binary patch literal 1532 zcmb7Dc~BE)6#sTN7a>b_MUG)m7EnQ@Gzm}yWdJEhFqq(xQaniH7{Vn;Vi9Uk6Q1Xuw8-~c2~1sKqSQD6sO08kw|x00>H=KL*m z&}aaj(sZ>dRh1ndNA1`{h0B6NQ&njy%ER5qUF7a1p~PwG_+4qr6iSfgB@)Fem7-YV zeGmjt1Vb?dMKP2%jET|4Vwka+Y!;i%X5l!W!L!1CgA{dDn^}rss4-?ZI%o>ZsHbYP*14eBT zlg&oxFM={KV;|r_2uffCT&Sdk;Pu*KqwMWg`4M57@9wV7wOBek*9jzHjP~AFGP_j-FDPEiSUrs(O!xWIE28jo`>g=ZQ;ye6xdGdwhv>VC_8*iX- z&zua)FL^91TsNGe)F5}C$WtyDbhitBJPT{0NPu7%a~^S!5E5HJ5tag>D8N(@h9LgP z^f~TCW!Ejg6`y5z%CEVRW;KiqBY+tkNGJ@HJ=YU-kOe4((FpA1jBz@kKv8JQYw(}gZ#p_Q}HQ?_BFV#ogW zHzcwA(SKx1LR%cFe2%t`I46Ez)!h7Y`}^D%XTuHM<0l=9?c@%@Q-;Cy!H0fos`Dys z9vF=1ROZEnY0|Cl+smtqt|W4kv)cpw+*Wm0#4G;ndEGPSUbMg6ZjJn?OaInMnZ)<6 z&DOrjV!znOl~z$NPv?Zb+2t+oJ6fB!*eU;!-n^vj=bNkhR}nK@7nU7Tlq$2U(QE^F_79N1k?hCvfk<%A%UYXP$`Ja(3UpI6zyHJit%@xsguQ7 z`W)t}T|GQ%e^{~f;4o8CqFz@$ZLd8xQ=j3?>rP0s6|@E=$E-={FqBs^@J*|uYr;_f zsL7t@2U(*hh9-v&jk+8zu%8l&hhUQTM_`9!&0)R&{W`nS|MI=43^JW1~Fi8ax zLP3Di)D*2cV(ReIz41>uU&Y=ptORY;ZvDsSo%|u%9*XXNV1SSW1t9pX;)oHx8OPV_ z4&zB!X?~{d!)cS`D4J8oe5{F6r67=slqoXi_#|ekMKddT{RcO`&^LrjqB?SwJ>?Pj z!hO%{)XWoA`QJLZ-quIwW}7L-bmalMwd?IyE$$ViT)iyxtk!(d{3$9k+iLZ>OZ_jM zE?SFwk0}Xf$+&`7Qzpz=bHK5;qh=?!@%1*HbA5w;dcX*_?M&20p0$o`YPoKwh%xs5 E3(f1;z5oCK literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/odb.jpg b/core/vendor/filemanager/img/ico/odb.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/odf.jpg b/core/vendor/filemanager/img/ico/odf.jpg new file mode 100755 index 0000000000000000000000000000000000000000..da290dc7bb3c8b1bcc85a9d1dc48743d221b9517 GIT binary patch literal 1760 zcmb7Ddo+}37=OR-o0~FY#-%YX?F=d`nn7~utYM~U5r#I}!&=w25sJ*ZER~aJw-l1( zQsYt~vB+iH)RJtZGDo{zs9X|TZ4Fi}soD1{)SmropYOcqd(Zp4&-47=-}8Hvca#Hw z?kaK-0R#a6fgex~0{+@~$z}lD-GM0pfC7+o2_V27^a35Y06=Bv!bzeGTiE;IPUTx* z?YTWx5-CXx3uOlEoDLZvYOw<+5Ig97|OB8C_Ml!0IjMA;5>;qxIjoP&8Ik`Mx!f zfe!3rA0R*wWaT}e3Xf4bMu+sBITSDn{~y`ii@i3>O0J2{ORrW=-e{8j@#S#W262nA zz>NR?mTR)TFlX$AuxqlqvVZ3JsQp;8hqKyz~uRI0QpF4i6wG`F$h+ z1R{!&5C-6?vw3_caUcXkfiMvw`c~WZdE+?4v5r)h?5nc(NFRUXhLQ7~xO$Aq%8mUsBB+-_lyB)$VCFrfvt}|nd6@RZKSQ-~`-FtaJ@N zt#awlQ`6bq_FeVDE^C*!d#>uN+kV{B`NA2S7Z|ywugT);6LFVzK%hnp0J}_BfQjo0 z#Rv=y4wt8{Wyu#rr@TW7xpqXJ4gE5)Tp*gwk58`Pl<8YsY9CmcTgbb7;Z$c~Q;1Zb z2((9TFAAS=FA2^XC`gHPgaww(75LB&1jQJT4i48+T~mv}7ER#j|!$ad}h zbt1pH#jb+!+GV*_Z*%mUs_#!u1q_+=yJ?t?v<3ERM?N1dJe4Wqh+>rh*0H7I4?&2k zi?BJ$p?nE|p-$A`7zAk=a(R}{VlVHI=vpl&fp9}$aLkUBV)@`)8%U1mG)qTvdTDfg zDp@PIf04=qTSH&}!okzuI!jYJt{?W09MoxEn>{4mFKnppJ)1mG+FIUV^7oK`LcQ0S z8E2^y*m;|VF$+De^^N!$UnWS;vIkZl@_gl!0SL*$>3}1e#j={!-2J|`iqzNcyn>0b zBs0-Y*H=M_=Q|_?v+EAOsfk%hu5h_Z8}Qii-N@pb`TWpxCB{Rhw_~=_PqyonTM>30UN$<0(4RNv3Z5M`j4VJAImD*53yl5@lF)@4s@6w~6m z2{RV4m}f5E6@Ya*sYL7TZ%Znd!zJ`=)EJ1=Y*cv@=;QsLH+x zC#vUJdo8uny$yx>2&wL+~|2= z$Uoa<(h;J2H`@U3{=df>*qM9JPhn2E>+ZQdd^#J~CPw@qO(=c_ha0Wndj(~+$`^!B zm*e!>^nH?5-GM4>jTC-=nhoXE-%$WA$DYHv36$hq5iT_QNrQkbxwaVWQ5iW7M zJb%*_k0kdo=BCmJvYzJFy(iOl)^evvucVs0j5B`Fym92E`7J!<3S7|$i8QZgd^BNW zxIC|*lwx{xR;^+jc4nb1^x0KU5ATvWkq?qTXR)Ei3_)BbXr z4X;0cpw@wAl^0GQ9Ij8Vj0vc~^p+6{6nz~I5yeGmDE;80T7tjZsnGZ+!ISGphYhuc Z4$#L_PgjO4k@_VX812q>-|4Bm`w!SQM)d#y literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/odg.jpg b/core/vendor/filemanager/img/ico/odg.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/odp.jpg b/core/vendor/filemanager/img/ico/odp.jpg new file mode 100755 index 0000000000000000000000000000000000000000..da290dc7bb3c8b1bcc85a9d1dc48743d221b9517 GIT binary patch literal 1760 zcmb7Ddo+}37=OR-o0~FY#-%YX?F=d`nn7~utYM~U5r#I}!&=w25sJ*ZER~aJw-l1( zQsYt~vB+iH)RJtZGDo{zs9X|TZ4Fi}soD1{)SmropYOcqd(Zp4&-47=-}8Hvca#Hw z?kaK-0R#a6fgex~0{+@~$z}lD-GM0pfC7+o2_V27^a35Y06=Bv!bzeGTiE;IPUTx* z?YTWx5-CXx3uOlEoDLZvYOw<+5Ig97|OB8C_Ml!0IjMA;5>;qxIjoP&8Ik`Mx!f zfe!3rA0R*wWaT}e3Xf4bMu+sBITSDn{~y`ii@i3>O0J2{ORrW=-e{8j@#S#W262nA zz>NR?mTR)TFlX$AuxqlqvVZ3JsQp;8hqKyz~uRI0QpF4i6wG`F$h+ z1R{!&5C-6?vw3_caUcXkfiMvw`c~WZdE+?4v5r)h?5nc(NFRUXhLQ7~xO$Aq%8mUsBB+-_lyB)$VCFrfvt}|nd6@RZKSQ-~`-FtaJ@N zt#awlQ`6bq_FeVDE^C*!d#>uN+kV{B`NA2S7Z|ywugT);6LFVzK%hnp0J}_BfQjo0 z#Rv=y4wt8{Wyu#rr@TW7xpqXJ4gE5)Tp*gwk58`Pl<8YsY9CmcTgbb7;Z$c~Q;1Zb z2((9TFAAS=FA2^XC`gHPgaww(75LB&1jQJT4i48+T~mv}7ER#j|!$ad}h zbt1pH#jb+!+GV*_Z*%mUs_#!u1q_+=yJ?t?v<3ERM?N1dJe4Wqh+>rh*0H7I4?&2k zi?BJ$p?nE|p-$A`7zAk=a(R}{VlVHI=vpl&fp9}$aLkUBV)@`)8%U1mG)qTvdTDfg zDp@PIf04=qTSH&}!okzuI!jYJt{?W09MoxEn>{4mFKnppJ)1mG+FIUV^7oK`LcQ0S z8E2^y*m;|VF$+De^^N!$UnWS;vIkZl@_gl!0SL*$>3}1e#j={!-2J|`iqzNcyn>0b zBs0-Y*H=M_=Q|_?v+EAOsfk%hu5h_Z8}Qii-N@pb`TWpxCB{Rhw_~=_PqyonTM>30UN$<0(4RNv3Z5M`j4VJAImD*53yl5@lF)@4s@6w~6m z2{RV4m}f5E6@Ya*sYL7TZ%Znd!zJ`=)EJ1=Y*cv@=;QsLH+x zC#vUJdo8uny$yx>2&wL+~|2= z$Uoa<(h;J2H`@U3{=df>*qM9JPhn2E>+ZQdd^#J~CPw@qO(=c_ha0Wndj(~+$`^!B zm*e!>^nH?5-GM4>jTC-=nhoXE-%$WA$DYHv36$hq5iT_QNrQkbxwaVWQ5iW7M zJb%*_k0kdo=BCmJvYzJFy(iOl)^evvucVs0j5B`Fym92E`7J!<3S7|$i8QZgd^BNW zxIC|*lwx{xR;^+jc4nb1^x0KU5ATvWkq?qTXR)Ei3_)BbXr z4X;0cpw@wAl^0GQ9Ij8Vj0vc~^p+6{6nz~I5yeGmDE;80T7tjZsnGZ+!ISGphYhuc Z4$#L_PgjO4k@_VX812q>-|4Bm`w!SQM)d#y literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/ods.jpg b/core/vendor/filemanager/img/ico/ods.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/odt.jpg b/core/vendor/filemanager/img/ico/odt.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/ogg.jpg b/core/vendor/filemanager/img/ico/ogg.jpg new file mode 100755 index 0000000000000000000000000000000000000000..e20ab2fcba8688bc85b520c7c8e54c8cb0870f52 GIT binary patch literal 1557 zcmb7EYfuwc7`?lj$0EdJNkUK=yP=|tA|{bXd1yc-0)h<#MFhnpfEalUp%f9Vg<{3l zN~N@lDWVh~o$81+GNK?l7%a6Y4l)6;f)BtNCfWQY>9)WU@DWSA zJbWzo!AgK47>Xe%ilJ0sbc_lH&4x*5GMG#zgT-PKb~D(xEzV+bXL4=r1S~i;V-9;J zi*3hZ38*HpoT{|NFk1o6!Ug|3EDeCbK^(}%5NCiA2u2_lJ(vTxj{%I*U^*B~93t6J zNhlvA{%(@SMCl9+w{!wKScGyg4ivEEN5dF7T|V{Yx~A36b=ZF^wz8`9p;;2?(C;R1 zxdWG`o9jLOdlQakIqVoY^nMXHyW*e%pr+%CgSFi!Hk=-NU4K&7OaJq4gG-zJ{Jb|k znUIQ*0}zY`$yj0ND2;(&OcCx42)P0h!XZ(Fj!rC>CVp%G)O^mUI{>)+jWtVjnfm>z zul0$}cHY_xk+WpYf_rt}4bTi1qQ38KKRc|iEPSscFQ}>L(DTT1UJ9jQ)9-hUU%n_d zhMu3_EQ|g;vGUfhCNJ$xef8G($&q>WQb=b$0qH;jn3WES(dYoN=aPYh&{-t*3|OI= z;soWBBBPlLIn^#$O4QEXt?KoiSCqLSfn+mlI4n$}%Umf~&PVzSo|lBJ%3vJU#1AyZ zZ9lGxpM6;6>1253#al8w_!)$pM*wI6Kx0}V5r_%w>C=!N0aJh|1vruY$KEyWA64u5 zJ|?4M(TssBV^!T%H@8gee6i=#phh|4^xd4`lw!f{)w1hec}c-pyJb6e9EB*0IFwrv zI+H#P15p5tfG|Q)1jkt%nDzO2o?M~)<*nijDLOH?C0SSchCO%CyZPT|!N5q~PjLhl%fj2H0PiBbARksh|i@O^_)@pTEQ%4yUF%(zJm&0ZRb)Au zhkGrar2Cq)heAG4=Mi?0xHJ{;cfxF4M4{l|^2Uv58JuX7Z2qzasr=H@+1l zytL_W-}6PP|j1@i(f0xGP=;=Fvhvw%%Edp!}hrY`L%8+9Bx;^zK%uP&c{F@&qC$+EAPi6!= z9#s6)A?_m_Ug%52TpkwddURN~k>7jS^}wvTH?&)lTo&|%^kog^@vrf2G$nKuE)Ez^ lY%te7Rb@%$qsyo0)s(es`YYfuavE z)~s?}1rP)P1U^8~5BSczq#*#fxd9^p00kfkQb2$sm<0=90|3oK=f1?`VRK`VGO3sX z%iJTjOSed4B%9blyV+|zoL#m^!=-F<6B`pV6N`0h*YNFj6hoDP5iw%F+YIVgFgYuDdr`_;d7;yq6grgrY}>O>TJQL# zib0D{SoP&ec~C>|vU--A-P>A`?FT;->7aFoC~53&h;bJGc2SD|8F_O0<_etx`^|jg zQ`-A<>RWdkw_C@Lsc8n}_Bei9@>R7od}BJKw+IJ-1PCN-mK^L56eHjqF3*gp&eY%w z93y4ZETM`kk&$j|1z5yUbqwf;noM9NihTCPz3dbjSNV>{M?a)DvPUM0&lOawxhEH_ zrW>Zbs%(ZB1~VAs&#EwuK~(3O&DY@Q@%Xb4s1jo0(GsifeCiP!?e^1slJ~`R79Z5V z^WQ#TqdQh9*xMub2+%up*3Xuibz`q($Y2gF@3#_{n0*k&k^!Je5h88gCmCAX;Lkp#xH9Yhe~|*w_a$udve$E_HFvry^@P6VR+VJ>|KZB52X%!Op_I$ zCO4aEWsz~IO7ls-i_89I*X|cdlSUm{67q>)qEAy|YS~cD$rrJ&=}u`A#XeyncJ@0H z-qujUhSfai4H@NqDntc%Y9Mz{44eqn)LHY8m3FG=55ofzFMQ9k_|ikE$Aa!G%sgNj zYmJV#ro3Yg_jvy4{;XWe$hXYZztCxscKU-bpo1qV&Yr(Pa4OOu_t5oU``4zjmK*?G4%Z?a5?C*8ro3ZPggiCk1>`lD# zD9%$Hf*dc9FaKie8DB=(~6BVgEp9^N_SL=86XiWB_u>{ho> zc(Faf3iaXYMVVw}HZ8>e_Q+=EJYFidFl5uFct> z(G|yD!I~c|X=F4t4*9jMEfgU#JHbmQ+Y|3wN`7osy70etBfCjH_fb3Vdxu!n_;>; z3|J8x?$_n*uRB1l9q999vYM_uDR-I3AIUMUO)z0;^{Bt{?)0N-pZB!(Z1}(~w3!?z YzC{g4`O>ny8r+H literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/otp.jpg b/core/vendor/filemanager/img/ico/otp.jpg new file mode 100755 index 0000000000000000000000000000000000000000..802e78ccdd971db4d8429b0bd900befb86351b75 GIT binary patch literal 1870 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/ott.jpg b/core/vendor/filemanager/img/ico/ott.jpg new file mode 100755 index 0000000000000000000000000000000000000000..1a4157e4570faf5b2e20efaff272e816ae735290 GIT binary patch literal 1748 zcmb7EYfw{16yAGpZW8h!2>~OBlAuMzS3*Rwib+6-APAz>QHllvlvqXN9mHCSJQWZX zOMDGMsE=4HXrVz-p^Ohi6tpTbMU*O5r3Mg85l#1kqW#ey{qF4S&Ys=xeCOPA)^yL* z0oXoX-d+Gf06^deOb>z7Gf5QzfS(_50sv3}lBohDxPn$-0|x+TF*>@FT#Svbg9xMP z9hl`G9jDr$N)8X>hpPEL0iN;=swfp-JY((*=NT@(eDA2Z@R+EO^?YHHQZy&jRTS!C zY6BhsMKBaYP!vN6U^qsAOd?Tm3YkKokeN&tl|f@s=~O0@X3nKEcuXdfLNjNXGg%BK zlSh!i>%>huhS7OcCYATUVX6ZhDhL9}7-A1l4uWwIQ#}|5!^aQ^BE%8kWC{sEsnBRm z>|>vp03bmT6w`gcfZHe=W5e|6^4Iji`4jAK?lFPv$ky1V;Ju%p&YRaQnWkFf=l)8| zC?7e6L}&hd)$hgyyTYzuh2AHj?_^c;)_ESQrVplf>aQ@XFOD385+5|Lx1uU*>&DYv7yNmv zYmg_e29(*Ah37KGiDhl{#IKBTK5aoZnh3Y-$J3HF9*n1kpB}%5|NT6M`Ic?A$#c*D z{h;gFV%L>b>dsbI-=Klzwl!J3$&pQdmvY9MT|Zm-#JH8v$RPw`B}>XPmY~ z6I#@CI3?KxAp0Z^K}VvDk^=TSIm1MgKw71ClkiB1n6P1!E~{l+hC`to=Ft-6g2a%D$`|R;hqb;*kxwgPb#LE%(KN*|rF3$gUPUkHcX?wwr6_7le*4T2 zs|MeUy9(M`+HcvX{J)-@Yb9VbE*i4h5Ey)5aR2!lEXV{7S!n_^4F{jA!;CGvN-sIR zogK6FxWl9!er20aR*cDe(`Tc!%3kb$bb?;$7C-Q)Az35!T-#EV{;v9XCud93Wwp#Z zBGy}RaCO96pXHIO=gy2f7hmamM{N46M~IXSzz7J)7bs}&7bu3XHdMhkqMaBfhvPnyo{ z$kC$WG`F-cOZJ|7-JaPAofBW(JIPmaNqM#W;<)Xv`+diz@Ix22=Uvra6qdIL3|W>7 ztr?3V$c~1U3!Xm4w+%U3o^9xJaoW+!8|Ntbs_wKpDdR9hF`?y#{;41d6agbr-@Q~?tH zu|J_c$W$N@ic+=G07H+We1sFeA`pwU^Ky3g3 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/pdf.jpg b/core/vendor/filemanager/img/ico/pdf.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2080921c1ddef54ff2d192666250b86b47707fa4 GIT binary patch literal 2050 zcmb7FdpJ~U7k~HObHmUKMsi9sZXu=_m*VSU-0zo(N)bkeCPTnwV%D8wcquu{r-Nxwbr}E{o-LjaLW9>Aa;8U-ro4FFsWudW;~Mpk_X&E9>R#p}-Ew@Hab`9zhB_Bc4 zC7Eb0mPo)6i2t{Vn*o^syufh;QUfpu~zdX&dGfqo1VqF9O{@(HB8AEr@ih*7dOZzPuQ!* zGva*Gj?`H0HjGvsR4RP{@HMk9tvY`*PG}SxGb;&vtN`B3?$79SIkb8^jH6xJ3pkkl88m0H0C!3Y_H1vr|# zB2|rvH@Dz~D^Ltr>{D4K)ypVR!Ofum?CJ@n@TVrYeY71za+jO826c20DN4Qjo*R#K zjSsHBai_L8cin#W%;_Y|!WAa}>743A|N5}mNGe=xH*N2fW^#8>N4JpPOJ{X|#B8*D zc-he6--RK>GH>suotQ+|ZvS5|)?HkD{6%`u_w+k3bwORUaCr|m*u63(&*cK%?zQ^V zrALBJdxwG0EQVChO^vJW&7~Tx-J>WcH3=sS+HotCfP@pk$WyU2HKsZ%e3=F;p|Nlx z_^_#6!M=vNYLRs8lKcJme8)qAsNB-#*4pTwvt3JE2M>w7=CE4h-2u8+;(`t8gN~v* zn2;o@!8kl3`)v<&N-$V5kXN8Fmg`R*`-UQKSTLtYKfYW!h&BY9f0 zL-(_7!Gf>i8H!Fm=FcsgKb_Nc7&!2t$Uf2A_S0!s?(+jKHz)MUU)|q4kTF}{)*F4z zPHMtBRS+iNu>Bct!}xiR3;QTa9k+X|&y}gSjvonWq_h;Y{9Ldvx%|8QPdynatI_zfHoAekG@{evGS`1S%4pI2)4bNu zkCE*MDLcDzBNAQ?d7)*{BB3*mU?6mkzLfzY0~(WIjy5YNyqe`#($q7vGFfJ{MHP+o z7!tk{(yJ|2-@NJeqO;u{Wse5q3vKoz8uJzXMS9m?8`d^{myQzA(NE*`!>u4DYr#r z%H-XA%9eYpB5%PrOi5PjKi$SBLuOfHcW%AUXy41##=WR$9$~6k{?6<4D}FV3roXYo z_C?&Jnot=dpx-$x%BxfL>`mIZDRn3Y1+qgq&^&s`2PBEty_?-MTND|?`Cepj+OrNInQEV#+=<&QO*PV zNo$SHx)bnxd7shz(UFpE*DOsPmpq)L+BLI%nC8iTGkiv9&H2rKCMF(o^%;6|-d3vA c@aHkR&OiOwlJa4%n;AAy)jzAKAVNIwUy^9o$^ZZW literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/png.jpg b/core/vendor/filemanager/img/ico/png.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/ppt.jpg b/core/vendor/filemanager/img/ico/ppt.jpg new file mode 100755 index 0000000000000000000000000000000000000000..aa13f733428128a02fb020ae18a70c8511142c39 GIT binary patch literal 2386 zcmb7FdpK0<8voW>Gh+ooD}f-nG{Ae9wBn_j`Z8_x4GiNCp7vXwS9> z5Ci~(JwP%DZ0wE&_yVwP8!!d{5CIeu0C3m}(*jNG0|3s2fBcEeMSiS3q)N#GFxwsy z77!c|>2rX}i=aAk?6w34915VWGg)t9YQl7)vJZv%gdXw^qSBA;_x9zn=nMAgtb~0{7kgTJ`4dfPKKz{( zVp}&pg`vOuH4eNNkF;i;Y8q0H5Uh-f&CI|E>7vqP;1GZ;vBlvLm>>fnItx`+U1r0< zh!HWu5FTEr>fF9+N3eVMR9|c%gYNzz(u_3B8A-U-pF#1k-q(F_B*e8jBSs~R)o7yW z?V+E1f^#ML@YX`O*0gbSuf=bo;pTvn*=FM?virJZc2Gh1d8^r!-CHcTYTpQXl^BzG z;&PVr)gg;~PQB%jBS}3}V|L}|Z-y`9&*@K04wxOU3^mQ{eKH>yqglR-d|gAQWw@?m z`oZ=Ec2*v>fPoXL?2+D#^R8>ch zzRrwk>n%(wdo{U87R#?S^eL#8>^yhX&+swVD*dO85v~smwJm$ad0O&ymd`CE;Gf0I z_wGGza;)mO_|=I832^h%FNp8at>M=8+6QUJY72^MmwzDvcZsZ&LpylcapA@8%Pyqu z(IYgrkGZ-e|E}p?)=)?8yS7cY+684BDD$;3%;qS-x*5jFBeLH^jA6zB3Lb+@XAn>o zny#&jcbKrO+>{@x%4FGac>7aC->ZsX4bOYEmX8*Erd~9n=CfJUagB?2&IFsh%#1#w zwadaGY5LB=cLVn9@utX9NVhs)wY`4FAK`my152i75)I~=EGMJ#OQEDq@mpJ;x;Lv` ze&NrW6KC$x5V}Sdva)T@Hil30ozJ|wqnVcDD63JD{k4!aiC_I?x%1Fo+T?FtW1@)p zH>Gd7C#$0M=FYUP)3@;OarW;LUVrW;8@S35Pkr{+>zLzeeO#O34{TLfPjz`-Qp@;{I*?Fx4ffe{7uzv-N?9-MAxGyGoYc=Tj#uQq*dqbh^&~nS#ROVYnpY} z>-96!+^EqX_K$q?=U13FKEKp{^rXOxMT+q8eJ%l+Sk4TkT@T~%Sl=(@i~@8RbXymZ zH(!uchIUR)*>D~#wZ65^e3{U`g{XJZ=8@2Zq42Vcpmo$CGe;Zdbm&}&n(+;J93{HK zKSi~Q-_w5MxNT^m(5d8$N7DqY%GBaff?03Rc`ikrDpoQc9+{jS?0VsB8mBERw3nkf z)C%oJh5~Z3*79T(4xtJcjyN9z%?B*DI(~ z3Jnm$9 zZ7q!mdsIBL(_ApHR5cKRfQ_X8RSiQ2s~T?sYQs+wm32;1zeB(-3~O{)#l?<-!PwAe z+&;Le6TSKALNc{D{9e!a!FX-l@Fi2Ou8QrZBl@;amRNu&3wdj4Tp9G}n zltou^Ns&S#N-Yy8;{@Z5goXjX3x+msK6z7bvz!t{WB#Jo1lKSXm3sLN^0LM0owxil zUi5}G7i$YDV+S+hBO+hHJ+i( z)$t0#t_l8g!}H#sU&CWB*IxE4?;gX6<7V2Q**?3y%iJ@Y{Yk^2YTws@w{VX~4MWoR EU*kK4SO5S3 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/pptx.jpg b/core/vendor/filemanager/img/ico/pptx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..85049696aed2ab58dda7b0adccd5fd70624528f9 GIT binary patch literal 2479 zcmb7FdpuNI8(uSeW{k^Zk4wT-gK<5{U|i>5hQyEuF^C!8dJgOW z8U>*t6dDbo#Rg#^vEeY15?BeGgoFf+K#(QM$jjmt@dSeWDtSdEC1qu0St-@Es)V&N z1Z5?05@fn~rZfaeE8z)vrT^QO?gJtoc!4+wr4GnrGJ17gaT+7f{_Z=o%!pP)6ZK=(^$S8;2UNiHNPF} zKF-+YVRSAvQT3a3*W%m;ug8lSe)YWg;*i+~5#BLW;d49B{+%biZ=EmC>D~f9+=(0a zi5AwxnY~GWs~j93mM|02)>Scgs;Y;_xK{f!)!P1&nANVeqNF3Nu7;z6zKnPE-g}#P zVf^`%_JW^z<~q3&^`}H#jeM?4!oT$=f~%@Ve_cddA_)*;6d0f|C#bh*k2aeyXm?|5D_wN!Us2-&C?eCtu8n*^- zbWT(jU--tMdMbh#dbjxDYL}tjbpe={RooW0FV5c_kLZn-6~1a~tFm0QZnyLGqc0S& zJ(@f|mA<8O~U&$abQ9T5W+gW*DJ_a_!XT~^w!{MTk@r zF(5ZrZmr>2R#tZZDmCN!`?dErLDIHJ0XSUTe{Qf(gVn(XKV9sk@b2 zN}g@r{AG-OEOu9`)2}ya&O>i&NH<{DAe$Ex(4&GD)3b}_K4~2@(FU%s5VSAWK{FGgdTy%XiHxeT}wB z_HFB719#_pN?mqq6Qb!HjsfN1;}C<^{10{WM=O$F9iDB^xR_$ns<$V$liobmrKmBI z)j!RN;f=PR`dvQFSMajj*}8o13%$sV>gw=#8(q3qO&H7LZkaYM%5Zw5J1;pHQ1;g$ zMFg@L(oYZsa5&sD<{yxWa#%I0Au~!|U4zZ3fhk5NzGoE3G={C4`~HY*{(oBxXMtwubP+^oDb`adX3ygLPbGBYEk?!w;d z_s?xgc|&)(II$VTJ|z<0Q47Mp_fisZGl3<$+_));vu%nh7dk9zdYdYavDp+YRQMI3jA_6r-DhFm~O_3SQLVm9s zH)(oV6>QWNP@}SIWN6po^DSXN;W}zbqT7XDN}lmcJt_ThhwFGiI<8x$YauC0b4fV! z^|In{W;efdU=mcRJt%Jo0h*$t_e}Wf`^bA{LW~zHmq6Vmzv$}ldn)cK3Mr21<=|{i zchXzOu#Vu4iU4=3w!WA}-Zz)cV~OzOjw^AKzeT!N<`{VPUro8vsV)rOlY4D| z^`_!$bLpzK?8bNJiQC%Z2E>W8SUYj?sK{GGE~Ng$3xWoXJl}u3Dr$>jA2W{#0~_V% ziupav*&_4_9b1y}mZUT5ybzW@)cuD%!aC&Rcyb~h;AH?Bj~h4zqw#t)2I9-y8$o

    Pt^fOKD(e?!4mursha)Xj-HjME6lG= zhx;#0Mbm$*Z^&kHv&fvn8%g}1`X&|&n48k-Yq%!OVbx5&ITO2{@e#Ga zTnO)SA{hw1iZc56@{L?&){>7^jP17XDYJq6)oyuptaE?GX^l|CK z3{~m(xBun5CS(K#irPG@;4tL|25P=lJhV^LdpG=gTB9kJ_I{nSuQ}m!Z{gcD&FyCe p+N)06^2|@9do&N!oa8e_@A8e}wUV3|JzC%Lx-9 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/psd.jpg b/core/vendor/filemanager/img/ico/psd.jpg new file mode 100755 index 0000000000000000000000000000000000000000..53028c560d07ba15c963e5136a5ca6d4246ff4e6 GIT binary patch literal 2110 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/rtf.jpg b/core/vendor/filemanager/img/ico/rtf.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c0e14b3f4b883770eb061827cc9eb8497a75805f GIT binary patch literal 2511 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/stp.jpg b/core/vendor/filemanager/img/ico/stp.jpg new file mode 100755 index 0000000000000000000000000000000000000000..cab6077ed3a0644c1e190818b2de3a45a662dd23 GIT binary patch literal 5539 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 GBK;R3t(Um~ literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/svg.jpg b/core/vendor/filemanager/img/ico/svg.jpg new file mode 100755 index 0000000000000000000000000000000000000000..8c771ca3c3e3c87d3eb8409538ccc6187ddd717c GIT binary patch literal 1979 zcmb7Ed010d7QgSkY%GEI0*Gvx5D=BNOcIcQm4OI?AdG-4Wvc`T$|^x%6qk|@6gTBQ}GN)XB1Fc$jnocHeg?z`tZzq8%nQ4Op9 z18^^QPj`SI03h%Iswv>I?Lb^C06spz8UR28NKPCe!5!2BW4Hi7tI?H{%xY|9AEs8S zmVn*Pl(e{{xJ*$DE9xN2%XgbcQe1Kz%htxxhG(&w1S1gD4VX9rFhpIZ6(LioBpL>F zCh!=>{bwCULQtqzDS$Qxl{kjO`jz~}U^;8X9DvQr4{T#aLx#g;wN>?TQd_yyZ+d~( zq;oV2Tz=4GpHX%CMC;__=9ct@za4(O)}#IK&F_n(^1JfKkxiP$038gvAiF$NKl_z) z!oH8*OzU);k@>vLHV=qzt$Kv8U1bd`{%BPXHBr* zSoX%l6GpSOMoia@hVT3Wj)gvT+(XVwHypA0Fu3jSBNoG~ri!L^w+X53Gbe-Ga|zQK zi-EI8ilSQ&9h)hy4Y5zgvvNyA`i@p~TU0arYbx$!G>fCO{VmNxUdb=K`!X^L;?+Hw1MG%z0^jPK$HfJlB=dzp$?1nS4$PKTwZfq+fYJ;x0J`2AP z#r+{U{Os%@i@}(q-f4Mm@$9%@rZdF+D*+G`!)RK6f`qr4OfVp1K z3ZwRk;&By#0rJ)TLr_f`iTW-?RNYX5LDn3Rhorg;C$+AmP*_r*c^6VX^Uz)7_aAcv;)*I|?w`BmI&rapy8n}+F; zp^?FLTe349Lwf^CdX)i~B*|pFVcEdL?s$g7w6ZeLlVVy^(B$>P;FsX_p|0Ed+P^op z@p<^EJT>|9iPOdDpV@_<|J?K6Jte8>o}q$kUO%XSD1>A1^K?n>?w(h>VcD(JWk)Fp zd4<{tAk4V}j-OC0e~zqq9&q;i?>x=7&)-3!hS^psW*<&>pB|qO zC5K9s`rbgdXR>fXPHd`~}tVwP*?UKj} zBR18Q?o)xKrS!>xMu)^fn{=aQR3<^my$E9OXKF48XfDy8r_egQ4jikEOh)MKM7^BNzO)QszL-nJP3BZvLf zLP;Gaeo1|lr{C{(@O)!LxlYuq%^B0%_nvVA7^NCdmbqey!+{IQfvosLV9$WS4`*?n z`$h`IlCG7O;R||i&r7|xvhSw(ZPRzr!_kTSc;%@=hm((b+J^0dQa6;Y8K&RgE7qLq z+rjChj}v3-hf<%g z8?8S31scpI-8s7*FW`HkPuh$k(0hJoSmI4719}19bt-y4`PDHLJw}+Dz2_8@u}99A q-P?KT$Db74$!(m0MXjF0?PqdN?AKGi%o@JMxpl>DuG@&L8u>4o$F|J? literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/tar.jpg b/core/vendor/filemanager/img/ico/tar.jpg new file mode 100755 index 0000000000000000000000000000000000000000..665cd0364930df93b3fd32d88df6b235796d26ca GIT binary patch literal 1747 zcmb7EdpJ~S82`>Wb8{JHObDqNvM!++W|WnTT#7DhkSi}v@U`W&Y^yEtqO;f3<3=BAdWW~QtiRHx8L|L{<5FqM9c#WH7deYpP8L0|`9 z2!Rm@h7nk12o{kU4kL%h;&FI99!Df9lNIHa2?_)vk)lLVP*f*s5S8V%w3Ud;ibSHi z>?i1U*-ixnQBWrk3F`mbq^*EV0G=Qkfph>&h7d9&y@@6cEtxFEC4=w;EDnRlv{3aB zS@cr`RS1j2BM?D402C1jz$Ao(>enM2{dr;W8%QrBO_>g$;JUMN@#i{Ao6<&SzweAo zpK8>#e*7Xl$Gq^kgjTSiYnWT-8Arb$XIz$bxZNT)G|av`a?@nllgKw=<4R%qwezAs zqGM|Y=M!%@`MVEpW)zK=SX}NNltkAd_M`vCsonE>=PR1t?q4rigb|*<58(cgh1M{X zwJr%jFb)-KnKcH%0vLyszPUyX$+Pve~|{NuMO01@}uf_7ejG4 z=t)w<4o`XhA*_7EMT4G7y<~;@-V4QiHRDvDW(F;y>e=|H;ABZM&Uvp}s71gLwHOVP zPS&Pu>uO^uKv7LlR15~j%Pr>)P*4aWup0x;EPHsPbz_-ImOn6X>^X4JhspIZdf4KS)=%Tz~7Q`H}ZC|4j4N zpFcl5!Q9nZaja#R>#ifa)l=_o5K1f#hhHi+-pjuJ-3=Zbc+W#mH-bGlmYuQxLuZs5 zN|Y`u5`rOM@Sm8XuKon%lYhMtE{m$DR5umGTuczpOF%mKhQlm6+sZ zH!obd+r)ww)e}@=CahYOzmF&B&s$CFGI}V?Oup_VSX@84D(|HCZ%nP>N@RBw$=iXFZq>|-Tq933`O)U23JND(M#Ej;>ne!-x4h%nT+J0}qx*^A6UAv;;0mFE!#L$(44_iZ;KcXQRfcru) zKxU9=wp1xlnYFFC7BV3y4 cl~nYexN1^UKBZm$LwC;87hgqY#!37C1NakCm;e9( literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/tiff.jpg b/core/vendor/filemanager/img/ico/tiff.jpg new file mode 100755 index 0000000000000000000000000000000000000000..afe2cde90e7aeed960ce94fc279d0e22919144ae GIT binary patch literal 1953 zcmb7EdpMN&9{;`XJGYo&h7l(^`;HAANi&1kRAypEg*A-m(1nr9=pwR+k|;GwE{9d& zK@B_7<}9{2rHsdAg>6N0iA-)?WVKE9Ji?rJEO!4rpZ9s6_xF3h&-eTNe6Olr)i9v$ z=I`PI2m%1Y9-vYH4lh<541k*(Fb4pT0CYhNaM%fxf;HF+09*vG{D~_1vYoDHIA(LrYtWqD`hy z^wmZ%b+x7@f@tcKC?x&=8>$9CBLP1Uhd{;vra=e|QZ)iYb&3#3ou_3G5j=qe!D``> z>@PwXherqyQPmH~2n1j%Ld6o;uiX^MSysoshHm>cy3>c!`SIDGzP4Vc6nr=M#K519 z0uB1i`GnZ&7h}SEeLg2DK5cu`82E7Px1*Af5&P{{+E<_*02I5&yHtLDM~Z&g>vuaO z!)De;X*H_b_kM_?D0^ivm-vStjGY-3KroH~;aBM45IlehM2N13T5o1hbyl+k{uomd z76yce7byAPwA%Aer2Xw@>kzxn{E@{YGbl>(!0lmQ^!1H*0;T0i`TE`trzq zH*{QPw})VH__Cl#bU3H!up3U)|2wnuFTuu0766Bn{j{O_l94uC;%ym$BnU(B25gC(Q{~9||we8P|M) z9(=3<5-cDF4L~>uhvjt{ScVar4$3fQ>oPez7DK^m7fs^`$qar4TDFw{!;m3_knM( z=6a31sn2_CEa3~&`)3ZdT$CxQ&Q)D)P%>stiiBRcr@L=lsf}Lq?+N>sy`Q2TXgx+{ zZDree?}oNCaixrme)ibbx# zlot*NpIdCcb$oS}X!!P)^QBVDHs)t`Lb&+CR%f)}={%!nDtWRdtaO0#LqhdAT&m!# z?3?KCb#A{>r~uQT)HPsbw*Ub%eX~kaQ+Lz4o%%(b`3%pELxvl4i z))m`Uclr2^n4D|2#?hp; zIioc)LdxEEEsc>i+U}xE9<(xlJ9c)hM3ls(R>=zG>J~8lV^FXawA=#_pfNlGrm0L8 zH=;AM7!~--m*>QRF=vq1`Abn*xtniTm-qGRXX~o-|Gr~q%9lphhHE6r6~ku)foSNJ za0ioLyIKo<9;H=3oT0~5S=ww>AbH8jZJA2l4fUR(Uk@1hJaRWZo!}+>lo2`QJrqzg zOXH*(-do#k=A?C;+s*KQ8+C7di#%TW@w=~XN@b#)G-t6vNBK}iR|m-;Mg>&hOx?j> zooqj60X}&9)9gWv;^NW)2o?vncm4vX9vKEe+qJ450NaiBoFx$!{1-HAh#+h+tN;t1 zi?RZ!3?|28F>3WlQI)&yv!??u<8upTT)Pdc3rW?sZI}}is(M$!_&@nVGzMT%xmdNBSfMxq|FbKVqR#(g zD&Yf3eGI zOa-HeBXUvDUdVcCI{Iw9TOm()HwpZ^b5EBzOAPo1#a_$qEe1;}N&@gbKh b9hK$e}}|o`bza literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/txt.jpg b/core/vendor/filemanager/img/ico/txt.jpg new file mode 100755 index 0000000000000000000000000000000000000000..ec6d3e3f5f5b5ea808a90bb21ba75007d3802a95 GIT binary patch literal 1765 zcmb7EdpJ~S82`>W=HfEzj7yVC84N|ca+{J%lyNJ=P>B>vshN#RROmu-Yh82MbYX`? zs8FNwL=>XvGL(|gkdlYUsKsNt9|x&p7WjWy?pO^-{1FspZKNt4M5k~JJ|yW z0sz7uAQk`{yD-j90GLdm4*(znD4qkPuo-3rs@Mwv%!R*eBDl!+xwph9o&~0^`$9QE zoQQxORR3`5I+mS75N8jEYGSa;z}SH9Om*558nAzlUm(>mj7~Q(_4D@&5O)Dv07D3j zKroEJ5+FE40=$$o0Y|_S2n0NdBu|!;ktfO$NhHOe6lLWoBo&gpjM}1~Nb+(d5=9aO zTP|5Ciy*QTB8f=(-w@veWFqhe5eTFOU^0Y|A#npx$I3?_2_!Xs1%W7yL!=-)W>xx^ zdd@0-1>_J2z$k)Z)IAxSQ`6dvnf^-5$Qb?UW4~eso>>i#ak*ICe=x%RwrYT!+s}+Q z03hs&L+pf*{DKKA^xtQm_+k;zT`!i}DG zzlsUgSTZ`;52f&s6oSd$Aceyd0E{d!TnV9M1&XE(3(Jm(8eGmIJ>z!3=q+&niBj9~PTHA58?m9z}$Yxt;<@u~F8EN$8fH~+hR zHmu;|d2?*xtzpq~MSs?KK|@ISzysbMX&=)Nwdl>s>i6Gd^*b2d(h1|Yn$;&?DLUhp z$M*8v5zygnUK8UuQdE7A-($fZrKl{t?D>3n=nGjZ^k#7t(#^~hhQ?G0O9o)$b9-<9ET?xD{X+OE$ZZ+!BsDD8Ycti>2;Ihd?Bbaa<)XUb{b z!;XHTDs6?pIU{}dqnk$kw`wb@WLs-m*@oMd9IJM|vv(`?oa|Y)fPPq#d&GL4(h}da z>%om@77dy3S~+Qh+2wEFo;69(9$J02G1=#FnV(|Y^*)A4Vu-cX_+RXf&mxD3lN)1V z-_u(6bq9NRg%1n(%ks{i;})%mUuVB}b3CF!TJq$WwxD2YwBZ+>&1jaME@Rh<-tvgF z%ulsC!s^-HrVnC(ZKp1ZbtsITvG1J>k%610q0yQ#)bBVo@9rmTcji0UT2oXqptO)% zuaM3xpEx-3Qo8*bU)i*SmD995<+klwy)Iw7vixUH)skLlAGs4T;<&|c&mGSz~t+C@%A3y8MOuUXAGQO(0GNoFg5VvC*OLTzw6@8X<-?`t zD^+XUokpK>^-dJY(=~7Dfm(xzqA(4x!7kY! zp9b{5PQzCR3BNGFNdbZ+xC9Vc6QG7hZZ>QD#;B~|yb8YHJHO~uNqox8(WOqqN8nhQ z2(DKhHMJ1G;YRjxl;WX;pb5SznVWvkjt#U8wBEqtTsL=n8O^{Mbvw_BE^{mYSlX9x zF1)E$aEU%dQFc&`*VG&Fs*iW|++anvke=!99ebv#;y%uxT0}7(ExeT5G;s7R>sg0;Tf8-%H+AQ{bIqHKT*OJTGTVly_in$NlplnuaV~1Dof7W5*X6#M Rx=kP#X|PH7&OB1w`8S?lY>xl{ literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/vwx.jpg b/core/vendor/filemanager/img/ico/vwx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..c56cad7ec6b5fc5ef19911d191292e0b99afe5ec GIT binary patch literal 5463 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/xls.jpg b/core/vendor/filemanager/img/ico/xls.jpg new file mode 100755 index 0000000000000000000000000000000000000000..4f656f73dc2dc53e6ee67b95bf8ef0b08365f3da GIT binary patch literal 2691 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/ico/zip.jpg b/core/vendor/filemanager/img/ico/zip.jpg new file mode 100755 index 0000000000000000000000000000000000000000..36d159166e47d37b44fd4ed6dd800c2eca16f903 GIT binary patch literal 1718 zcmb7EdpuNG96$Hod3lWH65}z}jFeQXnPG}z8A+&Nrc$J0@-Bvv3aQ3!QlgDYeaPlf z5?fw9cGvcx6urIrc&iqxQh9$$W%gV)yZh&U&*z@cx#xGz{eFM1t87+22Mkvy7bk!q z03dJxP$MFPF2;Ip+TRaPNy@8kHG81 zO*ITtW76m}=KqGW3g9&04Pr6G7@#$i3;`$uW558`CqAma(JCAD43`Eeao)5>W%2iS>b!Ts@wZteVlM_ zj9DQZ(mQ{0q!;_M=QIAto^Q))oAvrg=}w*RqGi3S7w)MYP0qZs-7tvNJowO>UpcG< zK3Bb#VzwZyrmf=%y}8!ui(1AQO9>)+vYuI=?U7`*+eFOY@xZG5}fwnuTW zifL1vjuu=hd1WMm8ccBj=@3L^S_6z3Mj}%fI7gGs$2CthC5H1u4O)>=Lu*J`(^dwAg9 zn`=-a7iNhlDeAOD*ermAGc>h0v$#A6Wy=^F^^kKQUFZ??j$B zD?9haWcHZz!f*6r2jZ*!Gq0E5+hEHtlVi@oy+=1UAF8$s7U}+GDPeo$uVk)uF|er` z75vaJ-$?s?a9fkk?FEA2aWB*RKKhlfPW)(A9E9yn$=of9EBa98e*6Y;aH%zRm>a%W z9%ptUE$-aU%jCC0&2{`Qrwnh-|7G8ZL>(IQ|R9vS7&@~R> z8Wq4c`3eN*00x&Qkq(G`D|5cqo*idIoa^j-RCmShF|=6IIr>Ns&$uY(f;AG3-PH~3 z?@R1sFPjiK(0^AA zVBkECu$0Y}#t%s3sX29%;)$ANbSo0b5J83aTTpR!V#TPR&&iz?O?zHqhZ`Q>G;r+< z-SFNcBiF@YJVFufR?}_omZi4o&F!6#$YiQLNQAg4AOL4@ctVMk&6TGP1dt?EX*!=IdZXNJaxP1_c3b6))-Gab04 zf|IJEwrG3Lz$$Knd7`Tkq@2Y7@E=e4Pf`G6WN_^zQn?s%PN#)2AY)lYj8+|@B*}P literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/info.png b/core/vendor/filemanager/img/info.png new file mode 100755 index 0000000000000000000000000000000000000000..6baffc3307de0704eb7a515da29edaeb2285a9aa GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}W`IwK>;M1%flNApZDpIffYvCL z1o;IsFbc9U3w(b6*6+pN=feL!+-2uya=-t^$CZ`k9p6I{4xz{VNA|e^Ro8mDIEGZj z<@Ry%H9K&)9*mqLS-M5(SCp4pC=vRg^dro%TLIC+vyZ=a0{oyPt94M=4aF?JzVB} smLt)m%=R{;CG%Y6IG2Zkj#)pSaF&L#uQ=J&=>-ZMPgg&ebxsLQ0GQ@qmH+?% literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/key.png b/core/vendor/filemanager/img/key.png new file mode 100755 index 0000000000000000000000000000000000000000..463d08262dc74d741461f60e6643339e03b5f6f2 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(aH8wW>|NlRb#00EYOb-B+ zag+r41v4-(GO;&oKBK<4X)jRB)zif>q#`a^poM8q&xQ~;HUWXxFFY8!T}n!}w6?Xe z8KiKOG&oq#xOguxkYO4ZM`~(90#HF}Vp3W{0*5ziW}3<|J%)flF=6i3f;6Ck44$rj JF6*2UngD%zHDUk& literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/label.png b/core/vendor/filemanager/img/label.png new file mode 100755 index 0000000000000000000000000000000000000000..fa65317110b69e3e174d9c885e191cf79aaec208 GIT binary patch literal 479 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

    j18u&F);XYTzQ4ESARIc40xcFMNx;gYyfz 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/processing.gif b/core/vendor/filemanager/img/processing.gif new file mode 100755 index 0000000000000000000000000000000000000000..7c99504e10b085b4d083e7473df26e4e1f4ecf18 GIT binary patch literal 3209 zcmcK6eN4z}Q2rbDSRQTqiegkVMdcOh*)yl$90>MUHO; z$`puTM1;T!MiGo+m3fqAYLQvxXtjzut!L|YXxFvO(^-ylmi4qdoVq8Ac4uw>ME>Hx zocsO!zR&Zxvt0|GTSFoe9Yl!B<~B4nTzL0_!{wN~HyJw=vs$d>FO`q~c|5u=8u&$E z`rp$d!y^Wr0TW~4*6`T%v8gYo7Cpac;**Ks+TexJ3tT?e=kZNFn2Ha@)1OMOsjC_P zXgt;*3#<-Ie=|LDb|lgsxqa*Q!-o&i6ZkVfl;k+`^X!>Ro%83;zjs-6o^)Wvce| zZqW)6eWXI%a||6<_iJLECXwi6I=XNFG6NgG=#Yq4NL#MZ@>*%3MR=0z)YW;K6q>plt6OP!bKnhyus2S=!ILt)->zn-N}q+ zGe8?u0Syen(?A(O@=4I~f4jK7GAmuT%f$-Oix-9rsQwGX^R^x=-(%crz4R;MJ}y>l zKeUvUQop1B#KpJUwuV`6zW6EkX(G#{saf9Gt9M%9;sk*8foPYtGYPQrszc3jFH3UMy z10i6WSr7in#T`kBoH?VJ3qz?W<$=Ls>$@?}akN)(zrWgu+foz7K zr7WgvqXtKoTvk)m*p#MLhg=lWtlPn;D^W`$o82DiDtf~%)*$h2M{{gIrKa7a*sRZy zDG)|DRo2SmF4bF=0*57HW@x?OXh($aAp86WNS>d^rEmD#3i}jf8Y{vot`u=ya!Z*m zqGR-Y;?8o;4Gm{NIg72#eN18d4#n06$She3h!$c74M;9o4H!i*z<>zC1{Me#Vopr8 zD`Nl%sRKoF96}=i6B<P!NEHc7Pi&&J+lLcyZ*v6z(Og_pC1| zn_pPJf?R%h>EGjRsB$~+=_8|?4Q^CF@aBn{ofE9myQg#h@zwPG;5)qMZmrK8MrO6PEVU!6Gi5$LgB2Rt3I@0tB_!$zU!vV!e75p*n_mf zA-hbeyynY%Ja&JW19r>Z$;6oIkHKyM3xI%rz*Y+|VeIen~i2W>60 z+|K$D;&i}^PqD0R9ekZ)o=aI23sNg7k%8u=)n$td8nex$#mtBmip^fLFd%GI1Qd$QM2i&~%O*oUNC zMoth~rXLBn+r^l2_O5lvR3v^)D6cbK3K;FGL60CHIORyetslF$KK4lcPCc3$AYypU zurMHH7)nqE2r)6EWEg~-NE~)RX%I#hJa$D+BOuwEbifLD8Nee#mi~TETclLyNabIlb4}{ZBp$rtyd_QztL)1 zX-XAp#QmX||IonEkbV!^+vaPJoH`TY;be}~${`AP#%0(N(K1ef&Tm}Oi>!8)Ojbqu z)j1SS+v8e0W>i;&))tO1IHH5PmRzT$; zN^!BzRE-24V+F$N@=Pq@O0S92Qq;TOOOg&{PoG()Qpp%4n?2A=u0^Vt@%T_tJogl1 zJkv`YB@X8uxOC+TFXmGa`|_lSzpgEZRm2NOy-Lc^$#DK?Ch^>Ny~bN+eXiclkrJc6 z5c>QoL#Cu$|7wne{r&SWaZAC$1gXN>fSC@XD!DcwcHl^?U^t;Z8i#nH3s4*&fbd~= z0}3F5AoK!?1Eol;7FZ9%BcK4RfC5(mutI}ich7huk}mvs;=G+Ie^%6AmF+7=^_lG} zGq~ialo;-l{WQ1!;L#5^xcQj-Kt?&Md$;N-P^o&s0cyFiqhWpNO-T z@72qM0(>=PT9NU@zwl49tL`UDj%F~VXY=uL%^JyFY2%dra0(CRokd8j$Y92u+< zNF;*1^H;~Njp6JVn^X?lrRe7BHNWx7rR7DGLy3gyt2(Xrue6Hz>?*dl`?_8H%P+5I HqM!T+FLlTe literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/rename.png b/core/vendor/filemanager/img/rename.png new file mode 100755 index 0000000000000000000000000000000000000000..a425ee7529301df781a5c3f21f23263a7c3e3c81 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Uw}`D>wg#!6cmh%j0Exo1O!x6 zRK&!@fb7GE56_u1XZiBw;^N}&?(U+ZqCkecyu6l{mY$xTfq?-~8Bjz?Nl8sjO;uHu zwVY`O&}8wFAirP+77l)K8F^)W69?b$!k!BkuiU(K`@@HKla&jBN&-Ax978JNde2&m zH7E!;UtGY!RVQ%q;NSd^Q$4N6OTI6u_!0F!?%uh;o6mm-)ptEj=w2dmV{2OW6z?DT v^QUgyA}3w_dgI(FS0^Pt&rCR6qGJH{an^LB{Ts5hht&W literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/size.png b/core/vendor/filemanager/img/size.png new file mode 100755 index 0000000000000000000000000000000000000000..fcc302f200c97c361acf473d0d8f9bd4a868b47d GIT binary patch literal 660 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/trans.jpg b/core/vendor/filemanager/img/trans.jpg new file mode 100755 index 0000000000000000000000000000000000000000..147175ee8e65cf8d678b66368995de1b70123c06 GIT binary patch literal 4024 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 aK4MRt&fO?7DRw&0ZU#?RKbLh*2~7aatZW|u literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/url.png b/core/vendor/filemanager/img/url.png new file mode 100755 index 0000000000000000000000000000000000000000..f18499afb62d9ce8961936ccd9a358d2da20362b GIT binary patch literal 593 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMfw*a3I*Z=?j1DW&zy1Kgbu?Wo; zV`F19kuwuz4+Dh)OM?7@8JJlcz|j;hs_CjCY1%U^9+?9iMqY4gVR;b%?h zUT#6H2O4MYU6vCNeZN`l&Lid7&!Y~e@APzW45^6oJ)7Eh*g>G>;-UDf^!NQfYXX&i{{Fe-RU4DBeu=b} z-%d79UEZf0eXj4<%%3nJj6ZhnO|c*$mf`~?*U~sAPT^Udc6`P3?{*5|j?IS;&RG2H z$bS9P@vWBPr$w*N)-9hJ5pv~RW#H;hpI*%}XH}SXdw0_3g9&{7IV{J$k8W7>@#W9f z^&Q@>8Xw>OeJpIny5xcO=`-eabwAl>Hf=ffYrp$xM<R#a>3ve0!aO@p;+@f! RR|cR!^K|udS?83{1OP*>n)?6% literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/img/zip.png b/core/vendor/filemanager/img/zip.png new file mode 100755 index 0000000000000000000000000000000000000000..9ef55c7b72fd530e37881c36f0bfd697250e297a GIT binary patch literal 819 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47<&SILR|m<{|^*F2BD#$wzl>_ z5eSJa1z|flIM~>L6aWDm8yk?cu&}kYwPR&v<>26e=<@aTwXv}SN*NoQ0!g42paMNT zJzHA`AlJ?gXo4LN4-b&d!omX7%*n~gzy!3>PFh+p8)7w3pP896kd%^=1_}b*1|)55?7_C% z0PO;DK_XzIfTX>hqk(}DPz0h9$glw#WCwD&jI1m(Gbreg0mK$pcfz_ z5H&zo0rfgLxwyKz0}Xd{bOxH>;NT1lFpDBTy%fED z3#hrMB*-tAp_1`;MHTZ-rr&in5#Rp&tY-<8ydOBtddsEOPiwfo1%7Yhc_?<|(vL%z zA}6FoP2Bk7QV+L_vn+?*=aX)exBiF~`F1w%pIOM?qG;iUuZ9kP=Y~(M+M?dZRzK7-e%HH|>t5YnpvX}Za!6iO#MbeqG;^}k^F=%Yp0__-wUu-` zl6mX%Pu|dvX*@HcUAa#&yj?ga?!R#DX)}{W9YQL>?`N91e|;YAn=8vHdu27VgNbO= znf@4?r*mcJ#@;+CxCZ3|_WMQ88~L + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @copyright Nicolas Tallefourtane http://nicolab.net + */ +namespace FtpClient; + +use \Countable; + +/** + * The FTP and SSL-FTP client for PHP. + * + * @method bool alloc() alloc(int $filesize, string &$result = null) Allocates space for a file to be uploaded + * @method bool cdup() cdup() Changes to the parent directory + * @method bool chdir() chdir(string $directory) Changes the current directory on a FTP server + * @method int chmod() chmod(int $mode, string $filename) Set permissions on a file via FTP + * @method bool delete() delete(string $path) Deletes a file on the FTP server + * @method bool exec() exec(string $command) Requests execution of a command on the FTP server + * @method bool fget() fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server and saves to an open file + * @method bool fput() fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Uploads from an open file to the FTP server + * @method mixed get_option() get_option(int $option) Retrieves various runtime behaviours of the current FTP stream + * @method bool get() get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server + * @method int mdtm() mdtm(string $remote_file) Returns the last modified time of the given file + * @method int nb_continue() nb_continue() Continues retrieving/sending a file (non-blocking) + * @method int nb_fget() nb_fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to an open file (non-blocking) + * @method int nb_fput() nb_fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Stores a file from an open file to the FTP server (non-blocking) + * @method int nb_get() nb_get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to a local file (non-blocking) + * @method int nb_put() nb_put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Stores a file on the FTP server (non-blocking) + * @method bool pasv() pasv(bool $pasv) Turns passive mode on or off + * @method bool put() put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Uploads a file to the FTP server + * @method string pwd() pwd() Returns the current directory name + * @method bool quit() quit() Closes an FTP connection + * @method array raw() raw(string $command) Sends an arbitrary command to an FTP server + * @method bool rename() rename(string $oldname, string $newname) Renames a file or a directory on the FTP server + * @method bool set_option() set_option(int $option, mixed $value) Set miscellaneous runtime FTP options + * @method bool site() site(string $command) Sends a SITE command to the server + * @method int size() size(string $remote_file) Returns the size of the given file + * @method string systype() systype() Returns the system type identifier of the remote FTP server + * + * @author Nicolas Tallefourtane + */ +class FtpClient implements Countable +{ + /** + * The connection with the server. + * + * @var resource + */ + protected $conn; + + /** + * PHP FTP functions wrapper. + * + * @var FtpWrapper + */ + private $ftp; + + /** + * Constructor. + * + * @param resource|null $connection + * @throws FtpException If FTP extension is not loaded. + */ + public function __construct($connection = null) + { + if (!extension_loaded('ftp')) { + throw new FtpException('FTP extension is not loaded!'); + } + + if ($connection) { + $this->conn = $connection; + } + + $this->setWrapper(new FtpWrapper($this->conn)); + } + + /** + * Close the connection when the object is destroyed. + */ + public function __destruct() + { + if ($this->conn) { + $this->ftp->close(); + } + } + + /** + * Call an internal method or a FTP method handled by the wrapper. + * + * Wrap the FTP PHP functions to call as method of FtpClient object. + * The connection is automaticaly passed to the FTP PHP functions. + * + * @param string $method + * @param array $arguments + * @return mixed + * @throws FtpException When the function is not valid + */ + public function __call($method, array $arguments) + { + return $this->ftp->__call($method, $arguments); + } + + /** + * Overwrites the PHP limit + * + * @param string|null $memory The memory limit, if null is not modified + * @param int $time_limit The max execution time, unlimited by default + * @param bool $ignore_user_abort Ignore user abort, true by default + * @return FtpClient + */ + public function setPhpLimit($memory = null, $time_limit = 0, $ignore_user_abort = true) + { + if (null !== $memory) { + ini_set('memory_limit', $memory); + } + + ignore_user_abort(true); + set_time_limit($time_limit); + + return $this; + } + + /** + * Get the help information of the remote FTP server. + * + * @return array + */ + public function help() + { + return $this->ftp->raw('help'); + } + + /** + * Open a FTP connection. + * + * @param string $host + * @param bool $ssl + * @param int $port + * @param int $timeout + * + * @return FTPClient + * @throws FtpException If unable to connect + */ + public function connect($host, $ssl = false, $port = 21, $timeout = 90) + { + if ($ssl) { + $this->conn = @$this->ftp->ssl_connect($host, $port, $timeout); + } else { + $this->conn = @$this->ftp->connect($host, $port, $timeout); + } + + if (!$this->conn) { + throw new FtpException('Unable to connect'); + } + + return $this; + } + + /** + * Closes the current FTP connection. + * + * @return bool + */ + public function close() + { + if ($this->conn) { + $this->ftp->close(); + $this->conn = null; + } + } + + /** + * Get the connection with the server. + * + * @return resource + */ + public function getConnection() + { + return $this->conn; + } + + /** + * Get the wrapper. + * + * @return FtpWrapper + */ + public function getWrapper() + { + return $this->ftp; + } + + /** + * Logs in to an FTP connection. + * + * @param string $username + * @param string $password + * + * @return FtpClient + * @throws FtpException If the login is incorrect + */ + public function login($username = 'anonymous', $password = '') + { + $result = $this->ftp->login($username, $password); + + if ($result === false) { + throw new FtpException('Login incorrect'); + } + + return $this; + } + + /** + * Returns the last modified time of the given file. + * Return -1 on error + * + * @param string $remoteFile + * @param string|null $format + * + * @return int + */ + public function modifiedTime($remoteFile, $format = null) + { + $time = $this->ftp->mdtm($remoteFile); + + if ($time !== -1 && $format !== null) { + return date($format, $time); + } + + return $time; + } + + /** + * Changes to the parent directory. + * + * @throws FtpException + * @return FtpClient + */ + public function up() + { + $result = @$this->ftp->cdup(); + + if ($result === false) { + throw new FtpException('Unable to get parent folder'); + } + + return $this; + } + + /** + * Returns a list of files in the given directory. + * + * @param string $directory The directory, by default is "." the current directory + * @param bool $recursive + * @param callable $filter A callable to filter the result, by default is asort() PHP function. + * The result is passed in array argument, + * must take the argument by reference ! + * The callable should proceed with the reference array + * because is the behavior of several PHP sorting + * functions (by reference ensure directly the compatibility + * with all PHP sorting functions). + * + * @return array + * @throws FtpException If unable to list the directory + */ + public function nlist($directory = '.', $recursive = false, $filter = 'sort') + { + if (!$this->isDir($directory)) { + throw new FtpException('"'.$directory.'" is not a directory'); + } + + $files = $this->ftp->nlist($directory); + + if ($files === false) { + throw new FtpException('Unable to list directory'); + } + + $result = array(); + $dir_len = strlen($directory); + + // if it's the current + if (false !== ($kdot = array_search('.', $files))) { + unset($files[$kdot]); + } + + // if it's the parent + if(false !== ($kdot = array_search('..', $files))) { + unset($files[$kdot]); + } + + if (!$recursive) { + foreach ($files as $file) { + $result[] = $directory.'/'.$file; + } + + // working with the reference (behavior of several PHP sorting functions) + $filter($result); + + return $result; + } + + // utils for recursion + $flatten = function (array $arr) use (&$flatten) { + + $flat = []; + + foreach ($arr as $k => $v) { + if (is_array($v)) { + $flat = array_merge($flat, $flatten($v)); + } else { + $flat[] = $v; + } + } + + return $flat; + }; + + foreach ($files as $file) { + $file = $directory.'/'.$file; + + // if contains the root path (behavior of the recursivity) + if (0 === strpos($file, $directory, $dir_len)) { + $file = substr($file, $dir_len); + } + + if ($this->isDir($file)) { + $result[] = $file; + $items = $flatten($this->nlist($file, true, $filter)); + + foreach ($items as $item) { + $result[] = $item; + } + + } else { + $result[] = $file; + } + } + + $result = array_unique($result); + + $filter($result); + + return $result; + } + + /** + * Creates a directory. + * + * @see FtpClient::rmdir() + * @see FtpClient::remove() + * @see FtpClient::put() + * @see FtpClient::putAll() + * + * @param string $directory The directory + * @param bool $recursive + * @return array + */ + public function mkdir($directory, $recursive = false) + { + if (!$recursive or $this->isDir($directory)) { + return $this->ftp->mkdir($directory); + } + + $result = false; + $pwd = $this->ftp->pwd(); + $parts = explode('/', $directory); + + foreach ($parts as $part) { + + if (!@$this->ftp->chdir($part)) { + $result = $this->ftp->mkdir($part); + $this->ftp->chdir($part); + } + } + + $this->ftp->chdir($pwd); + + return $result; + } + + /** + * Remove a directory. + * + * @see FtpClient::mkdir() + * @see FtpClient::cleanDir() + * @see FtpClient::remove() + * @see FtpClient::delete() + * @param string $directory + * @param bool $recursive Forces deletion if the directory is not empty + * @return bool + * @throws FtpException If unable to list the directory to remove + */ + public function rmdir($directory, $recursive = true) + { + if ($recursive) { + $files = $this->nlist($directory, false, 'rsort'); + + // remove children + foreach ($files as $file) { + $this->remove($file, true); + } + } + + // remove the directory + return $this->ftp->rmdir($directory); + } + + /** + * Empty directory. + * + * @see FtpClient::remove() + * @see FtpClient::delete() + * @see FtpClient::rmdir() + * + * @param string $directory + * @return bool + */ + public function cleanDir($directory) + { + if(!$files = $this->nlist($directory)) { + return $this->isEmpty($directory); + } + + // remove children + foreach ($files as $file) { + $this->remove($file, true); + } + + return $this->isEmpty($directory); + } + + /** + * Remove a file or a directory. + * + * @see FtpClient::rmdir() + * @see FtpClient::cleanDir() + * @see FtpClient::delete() + * @param string $path The path of the file or directory to remove + * @param bool $recursive Is effective only if $path is a directory, {@see FtpClient::rmdir()} + * @return bool + */ + public function remove($path, $recursive = false) + { + try { + if (@$this->ftp->delete($path) + or ($this->isDir($path) and @$this->rmdir($path, $recursive))) { + return true; + } + + return false; + } catch (\Exception $e) { + return false; + } + } + + /** + * Check if a directory exist. + * + * @param string $directory + * @return bool + * @throws FtpException + */ + public function isDir($directory) + { + $pwd = $this->ftp->pwd(); + + if ($pwd === false) { + throw new FtpException('Unable to resolve the current directory'); + } + + if (@$this->ftp->chdir($directory)) { + $this->ftp->chdir($pwd); + return true; + } + + $this->ftp->chdir($pwd); + + return false; + } + + /** + * Check if a directory is empty. + * + * @param string $directory + * @return bool + */ + public function isEmpty($directory) + { + return $this->count($directory, null, false) === 0 ? true : false; + } + + /** + * Scan a directory and returns the details of each item. + * + * @see FtpClient::nlist() + * @see FtpClient::rawlist() + * @see FtpClient::parseRawList() + * @see FtpClient::dirSize() + * @param string $directory + * @param bool $recursive + * @return array + */ + public function scanDir($directory = '.', $recursive = false) + { + return $this->parseRawList($this->rawlist($directory, $recursive)); + } + + /** + * Returns the total size of the given directory in bytes. + * + * @param string $directory The directory, by default is the current directory. + * @param bool $recursive true by default + * @return int The size in bytes. + */ + public function dirSize($directory = '.', $recursive = true) + { + $items = $this->scanDir($directory, $recursive); + $size = 0; + + foreach ($items as $item) { + $size += (int) $item['size']; + } + + return $size; + } + + /** + * Count the items (file, directory, link, unknown). + * + * @param string $directory The directory, by default is the current directory. + * @param string|null $type The type of item to count (file, directory, link, unknown) + * @param bool $recursive true by default + * @return int + */ + public function count($directory = '.', $type = null, $recursive = true) + { + $items = (null === $type ? $this->nlist($directory, $recursive) + : $this->scanDir($directory, $recursive)); + + $count = 0; + foreach ($items as $item) { + if (null === $type or $item['type'] == $type) { + $count++; + } + } + + return $count; + } + + /** + * Uploads a file to the server from a string. + * + * @param string $remote_file + * @param string $content + * @return FtpClient + * @throws FtpException When the transfer fails + */ + public function putFromString($remote_file, $content) + { + $handle = fopen('php://temp', 'w'); + + fwrite($handle, $content); + rewind($handle); + + if ($this->ftp->fput($remote_file, $handle, FTP_BINARY)) { + return $this; + } + + throw new FtpException('Unable to put the file "'.$remote_file.'"'); + } + + /** + * Uploads a file to the server. + * + * @param string $local_file + * @return FtpClient + * @throws FtpException When the transfer fails + */ + public function putFromPath($local_file) + { + $remote_file = basename($local_file); + $handle = fopen($local_file, 'r'); + + if ($this->ftp->fput($remote_file, $handle, FTP_BINARY)) { + rewind($handle); + return $this; + } + + throw new FtpException( + 'Unable to put the remote file from the local file "'.$local_file.'"' + ); + } + + /** + * Upload files. + * + * @param string $source_directory + * @param string $target_directory + * @param int $mode + * @return FtpClient + */ + public function putAll($source_directory, $target_directory, $mode = FTP_BINARY) + { + $d = dir($source_directory); + + // do this for each file in the directory + while ($file = $d->read()) { + + // to prevent an infinite loop + if ($file != "." && $file != "..") { + + // do the following if it is a directory + if (is_dir($source_directory.'/'.$file)) { + + if (!$this->isDir($target_directory.'/'.$file)) { + + // create directories that do not yet exist + $this->ftp->mkdir($target_directory.'/'.$file); + } + + // recursive part + $this->putAll( + $source_directory.'/'.$file, $target_directory.'/'.$file, + $mode + ); + } else { + + // put the files + $this->ftp->put( + $target_directory.'/'.$file, $source_directory.'/'.$file, + $mode + ); + } + } + } + + return $this; + } + + /** + * Returns a detailed list of files in the given directory. + * + * @see FtpClient::nlist() + * @see FtpClient::scanDir() + * @see FtpClient::dirSize() + * @param string $directory The directory, by default is the current directory + * @param bool $recursive + * @return array + * @throws FtpException + */ + public function rawlist($directory = '.', $recursive = false) + { + if (!$this->isDir($directory)) { + throw new FtpException('"'.$directory.'" is not a directory.'); + } + + $list = $this->ftp->rawlist($directory); + $items = array(); + + if (!$list) { + return $items; + } + + if (false == $recursive) { + + foreach ($list as $path => $item) { + $chunks = preg_split("/\s+/", $item); + + // if not "name" + if (empty($chunks[8]) || $chunks[8] == '.' || $chunks[8] == '..') { + continue; + } + + $path = $directory.'/'.$chunks[8]; + + if (isset($chunks[9])) { + $nbChunks = count($chunks); + + for ($i = 9; $i < $nbChunks; $i++) { + $path .= ' '.$chunks[$i]; + } + } + + + if (substr($path, 0, 2) == './') { + $path = substr($path, 2); + } + + $items[ $this->rawToType($item).'#'.$path ] = $item; + } + + return $items; + } + + $path = ''; + + foreach ($list as $item) { + $len = strlen($item); + + if (!$len + + // "." + || ($item[$len-1] == '.' && $item[$len-2] == ' ' + + // ".." + or $item[$len-1] == '.' && $item[$len-2] == '.' && $item[$len-3] == ' ') + ){ + + continue; + } + + $chunks = preg_split("/\s+/", $item); + + // if not "name" + if (empty($chunks[8]) || $chunks[8] == '.' || $chunks[8] == '..') { + continue; + } + + $path = $directory.'/'.$chunks[8]; + + if (isset($chunks[9])) { + $nbChunks = count($chunks); + + for ($i = 9; $i < $nbChunks; $i++) { + $path .= ' '.$chunks[$i]; + } + } + + if (substr($path, 0, 2) == './') { + $path = substr($path, 2); + } + + $items[$this->rawToType($item).'#'.$path] = $item; + + if ($item[0] == 'd') { + $sublist = $this->rawlist($path, true); + + foreach ($sublist as $subpath => $subitem) { + $items[$subpath] = $subitem; + } + } + } + + return $items; + } + + /** + * Parse raw list. + * + * @see FtpClient::rawlist() + * @see FtpClient::scanDir() + * @see FtpClient::dirSize() + * @param array $rawlist + * @return array + */ + public function parseRawList(array $rawlist) + { + $items = array(); + $path = ''; + + foreach ($rawlist as $key => $child) { + $chunks = preg_split("/\s+/", $child); + + if (isset($chunks[8]) && ($chunks[8] == '.' or $chunks[8] == '..')) { + continue; + } + + if (count($chunks) === 1) { + $len = strlen($chunks[0]); + + if ($len && $chunks[0][$len-1] == ':') { + $path = substr($chunks[0], 0, -1); + } + + continue; + } + + $item = [ + 'permissions' => $chunks[0], + 'number' => $chunks[1], + 'owner' => $chunks[2], + 'group' => $chunks[3], + 'size' => $chunks[4], + 'month' => $chunks[5], + 'day' => $chunks[6], + 'time' => $chunks[7], + 'name' => $chunks[8], + 'type' => $this->rawToType($chunks[0]), + ]; + + unset($chunks[0]); + unset($chunks[1]); + unset($chunks[2]); + unset($chunks[3]); + unset($chunks[4]); + unset($chunks[5]); + unset($chunks[6]); + unset($chunks[7]); + $item['name'] = implode(' ', $chunks); + + if ($item['type'] == 'link') { + $item['target'] = $chunks[10]; // 9 is "->" + } + + // if the key is not the path, behavior of ftp_rawlist() PHP function + if (is_int($key) || false === strpos($key, $item['name'])) { + array_splice($chunks, 0, 8); + + $key = $item['type'].'#' + .($path ? $path.'/' : '') + .implode(" ", $chunks); + + if ($item['type'] == 'link') { + + // get the first part of 'link#the-link.ext -> /path/of/the/source.ext' + $exp = explode(' ->', $key); + $key = rtrim($exp[0]); + } + + $items[$key] = $item; + + } else { + + // the key is the path, behavior of FtpClient::rawlist() method() + $items[$key] = $item; + } + } + + return $items; + } + + /** + * Convert raw info (drwx---r-x ...) to type (file, directory, link, unknown). + * Only the first char is used for resolving. + * + * @param string $permission Example : drwx---r-x + * + * @return string The file type (file, directory, link, unknown) + * @throws FtpException + */ + public function rawToType($permission) + { + if (!is_string($permission)) { + throw new FtpException('The "$permission" argument must be a string, "' + .gettype($permission).'" given.'); + } + + if (empty($permission[0])) { + return 'unknown'; + } + + switch ($permission[0]) { + case '-': + return 'file'; + + case 'd': + return 'directory'; + + case 'l': + return 'link'; + + default: + return 'unknown'; + } + } + + /** + * Set the wrapper which forward the PHP FTP functions to use in FtpClient instance. + * + * @param FtpWrapper $wrapper + * @return FtpClient + */ + protected function setWrapper(FtpWrapper $wrapper) + { + $this->ftp = $wrapper; + + return $this; + } +} diff --git a/core/vendor/filemanager/include/FtpException.php b/core/vendor/filemanager/include/FtpException.php new file mode 100755 index 00000000..f17ed7f8 --- /dev/null +++ b/core/vendor/filemanager/include/FtpException.php @@ -0,0 +1,20 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @copyright Nicolas Tallefourtane http://nicolab.net + */ +namespace FtpClient; + +/** + * The FtpException class. + * Exception thrown if an error on runtime of the FTP client occurs. + * @inheritDoc + * @author Nicolas Tallefourtane + */ +class FtpException extends \Exception {} diff --git a/core/vendor/filemanager/include/FtpWrapper.php b/core/vendor/filemanager/include/FtpWrapper.php new file mode 100755 index 00000000..cd12de03 --- /dev/null +++ b/core/vendor/filemanager/include/FtpWrapper.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + * + * @copyright Nicolas Tallefourtane http://nicolab.net + */ +namespace FtpClient; + +/** + * Wrap the PHP FTP functions + * + * @method bool alloc() alloc(int $filesize, string &$result = null) Allocates space for a file to be uploaded + * @method bool cdup() cdup() Changes to the parent directory + * @method bool chdir() chdir(string $directory) Changes the current directory on a FTP server + * @method int chmod() chmod(int $mode, string $filename) Set permissions on a file via FTP + * @method bool close() close() Closes an FTP connection + * @method bool delete() delete(string $path) Deletes a file on the FTP server + * @method bool exec() exec(string $command) Requests execution of a command on the FTP server + * @method bool fget() fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server and saves to an open file + * @method bool fput() fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Uploads from an open file to the FTP server + * @method mixed get_option() get_option(int $option) Retrieves various runtime behaviours of the current FTP stream + * @method bool get() get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Downloads a file from the FTP server + * @method bool login() login(string $username, string $password) Logs in to an FTP connection + * @method int mdtm() mdtm(string $remote_file) Returns the last modified time of the given file + * @method string mkdir() mkdir(string $directory) Creates a directory + * @method int nb_continue() nb_continue() Continues retrieving/sending a file (non-blocking) + * @method int nb_fget() nb_fget(resource $handle, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to an open file (non-blocking) + * @method int nb_fput() nb_fput(string $remote_file, resource $handle, int $mode, int $startpos = 0) Stores a file from an open file to the FTP server (non-blocking) + * @method int nb_get() nb_get(string $local_file, string $remote_file, int $mode, int $resumepos = 0) Retrieves a file from the FTP server and writes it to a local file (non-blocking) + * @method int nb_put() nb_put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Stores a file on the FTP server (non-blocking) + * @method array nlist() nlist(string $directory) Returns a list of files in the given directory + * @method bool pasv() pasv(bool $pasv) Turns passive mode on or off + * @method bool put() put(string $remote_file, string $local_file, int $mode, int $startpos = 0) Uploads a file to the FTP server + * @method string pwd() pwd() Returns the current directory name + * @method bool quit() quit() Closes an FTP connection + * @method array raw() raw(string $command) Sends an arbitrary command to an FTP server + * @method array rawlist() rawlist(string $directory, bool $recursive = false) Returns a detailed list of files in the given directory + * @method bool rename() rename(string $oldname, string $newname) Renames a file or a directory on the FTP server + * @method bool rmdir() rmdir(string $directory) Removes a directory + * @method bool set_option() set_option(int $option, mixed $value) Set miscellaneous runtime FTP options + * @method bool site() site(string $command) Sends a SITE command to the server + * @method int size() size(string $remote_file) Returns the size of the given file + * @method string systype() systype() Returns the system type identifier of the remote FTP server + * + * @author Nicolas Tallefourtane + */ +class FtpWrapper +{ + /** + * The connection with the server + * + * @var resource + */ + protected $conn; + + /** + * Constructor. + * + * @param resource &$connection The FTP (or SSL-FTP) connection (takes by reference). + */ + public function __construct(&$connection) + { + $this->conn = &$connection; + } + + /** + * Forward the method call to FTP functions + * + * @param string $function + * @param array $arguments + * @return mixed + * @throws FtpException When the function is not valid + */ + public function __call($function, array $arguments) + { + $function = 'ftp_' . $function; + + if (function_exists($function)) { + array_unshift($arguments, $this->conn); + return call_user_func_array($function, $arguments); + } + + throw new FtpException("{$function} is not a valid FTP function"); + } + + /** + * Opens a FTP connection + * + * @param string $host + * @param int $port + * @param int $timeout + * @return resource + */ + public function connect($host, $port = 21, $timeout = 90) + { + return ftp_connect($host, $port, $timeout); + } + + /** + * Opens a Secure SSL-FTP connection + * @param string $host + * @param int $port + * @param int $timeout + * @return resource + */ + public function ssl_connect($host, $port = 21, $timeout = 90) + { + return ftp_ssl_connect($host, $port, $timeout); + } +} diff --git a/core/vendor/filemanager/include/Response.php b/core/vendor/filemanager/include/Response.php new file mode 100755 index 00000000..ae9f10c9 --- /dev/null +++ b/core/vendor/filemanager/include/Response.php @@ -0,0 +1,365 @@ + 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', // RFC2518 + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', // RFC4918 + 208 => 'Already Reported', // RFC5842 + 226 => 'IM Used', // RFC3229 + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => 'Reserved', + 307 => 'Temporary Redirect', + 308 => 'Permanent Redirect', // RFC7238 + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested Range Not Satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', // RFC2324 + 422 => 'Unprocessable Entity', // RFC4918 + 423 => 'Locked', // RFC4918 + 424 => 'Failed Dependency', // RFC4918 + 425 => 'Reserved for WebDAV advanced collections expired proposal', // RFC2817 + 426 => 'Upgrade Required', // RFC2817 + 428 => 'Precondition Required', // RFC6585 + 429 => 'Too Many Requests', // RFC6585 + 431 => 'Request Header Fields Too Large', // RFC6585 + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 506 => 'Variant Also Negotiates (Experimental)', // RFC2295 + 507 => 'Insufficient Storage', // RFC4918 + 508 => 'Loop Detected', // RFC5842 + 510 => 'Not Extended', // RFC2774 + 511 => 'Network Authentication Required', // RFC6585 + ); + + /** + * @var string + */ + protected $content; + + /** + * @var int + */ + protected $statusCode; + + /** + * @var string + */ + protected $statusText; + + /** + * @var array + */ + public $headers; + + /** + * @var string + */ + protected $version; + + /** + * Construct the response + * + * @param mixed $content + * @param int $statusCode + * @param array $headers + */ + public function __construct($content = '', $statusCode = 200, $headers = array()) + { + $this->setContent($content); + $this->setStatusCode($statusCode); + $this->headers = $headers; + $this->version = '1.1'; + } + + /** + * Set the content on the response. + * + * @param mixed $content + * @return $this + */ + public function setContent($content) + { + if ($content instanceof ArrayObject || is_array($content)) + { + $this->headers['Content-Type'] = array('application/json'); + + $content = json_encode($content); + } + + $this->content = $content; + } + + /** + * Returns the Response as an HTTP string. + * + * The string representation of the Response is the same as the + * one that will be sent to the client only if the prepare() method + * has been called before. + * + * @return string The Response as an HTTP string + * + * @see prepare() + */ + public function __toString() + { + return + sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText)."\r\n". + $this->headers."\r\n". + $this->getContent(); + } + + /** + * Sets the response status code. + * + * @param int $code HTTP status code + * @param mixed $text HTTP status text + * + * If the status text is null it will be automatically populated for the known + * status codes and left empty otherwise. + * + * @return Response + * + * @throws \InvalidArgumentException When the HTTP status code is not valid + * + * @api + */ + public function setStatusCode($code, $text = null) + { + $this->statusCode = $code = (int) $code; + if ($this->isInvalid()) { + throw new InvalidArgumentException(sprintf('The HTTP status code "%s" is not valid.', $code)); + } + + if (null === $text) { + $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : ''; + + return $this; + } + + if (false === $text) { + $this->statusText = ''; + + return $this; + } + + $this->statusText = $text; + + return $this; + } + + // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html + /** + * Is response invalid? + * + * @return bool + * + * @api + */ + public function isInvalid() + { + return $this->statusCode < 100 || $this->statusCode >= 600; + } + + /** + * Set a header on the Response. + * + * @param string $key + * @param string $value + * @param bool $replace + * @return $this + */ + public function header($key, $value, $replace = true) + { + if (empty($this->headers[$key])) + { + $this->headers[$key] = array(); + } + if ($replace) + { + $this->headers[$key] = array($value); + } + else + { + $this->headers[$key][] = $value; + } + + return $this; + } + + /** + * Sends HTTP headers and content. + * + * @return Response + * + * @api + */ + public function send() + { + $this->sendHeaders(); + $this->sendContent(); + + if (function_exists('fastcgi_finish_request')) { + fastcgi_finish_request(); + } + + return $this; + } + + /** + * Sends content for the current web response. + * + * @return Response + */ + public function sendContent() + { + echo $this->content; + + return $this; + } + + /** + * Sends HTTP headers. + * + * @return Response + */ + public function sendHeaders() + { + // headers have already been sent by the developer + if (headers_sent()) { + return $this; + } + + // status + header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode); + + // headers + foreach ($this->headers as $name => $values) { + if (is_array($values)) + { + foreach ($values as $value) + { + header($name . ': ' . $value, false, $this->statusCode); + } + } + else + { + header($name . ': ' . $values, false, $this->statusCode); + } + } + + return $this; + } +} \ No newline at end of file diff --git a/core/vendor/filemanager/include/ftp_class.php b/core/vendor/filemanager/include/ftp_class.php new file mode 100755 index 00000000..9c2ae228 --- /dev/null +++ b/core/vendor/filemanager/include/ftp_class.php @@ -0,0 +1,82 @@ +messageArray[] = $message; + } + + public function getMessages() + { + return $this->messageArray; + } + + public function connect ($server, $ftpUser, $ftpPassword, $isPassive = false) + { + + // *** Set up basic connection + $this->connectionId = ftp_connect($server); + + // *** Login with username and password + $loginResult = ftp_login($this->connectionId, $ftpUser, $ftpPassword); + + // *** Sets passive mode on/off (default off) + ftp_pasv($this->connectionId, $isPassive); + + // *** Check connection + if ((!$this->connectionId) || (!$loginResult)) { + $this->logMessage('FTP connection has failed!'); + $this->logMessage('Attempted to connect to ' . $server . ' for user ' . $ftpUser, true); + return false; + } else { + $this->logMessage('Connected to ' . $server . ', for user ' . $ftpUser); + $this->loginOk = true; + return true; + } + } + public function makeDir($directory) + { + // *** If creating a directory is successful... + if (ftp_mkdir($this->connectionId, $directory)) { + + $this->logMessage('Directory "' . $directory . '" created successfully'); + return true; + + } else { + + // *** ...Else, FAIL. + $this->logMessage('Failed creating directory "' . $directory . '"'); + return false; + } + } + + public function changeDir($directory) + { + if (ftp_chdir($this->connectionId, $directory)) { + $this->logMessage('Current directory is now: ' . ftp_pwd($this->connectionId)); + return true; + } else { + $this->logMessage('Couldn\'t change directory'); + return false; + } + } + + public function getDirListing($directory = '.', $parameters = '-la') + { + echo shell_exec('whoami')." is who i am
    "; + echo "Current directory is now: " . ftp_pwd($this->connectionId) . "
    "; + + // get contents of the current directory + $contentsArray = ftp_rawlist($this->connectionId, $parameters . ' ' . $directory); + echo error_get_last(); + return $contentsArray; + } +} \ No newline at end of file diff --git a/core/vendor/filemanager/include/mime_type_lib.php b/core/vendor/filemanager/include/mime_type_lib.php new file mode 100755 index 00000000..8522f0d8 --- /dev/null +++ b/core/vendor/filemanager/include/mime_type_lib.php @@ -0,0 +1,266 @@ + "ps", + "audio/x-aiff" => "aiff", + "text/plain" => "txt", + "video/x-ms-asf" => "asx", + "audio/basic" => "snd", + "video/x-msvideo" => "avi", + "application/x-bcpio" => "bcpio", + "application/octet-stream" => "so", + "image/bmp" => "bmp", + "application/x-bzip2" => "bz2", + "application/x-netcdf" => "nc", + "application/x-kchart" => "chrt", + "application/x-cpio" => "cpio", + "application/mac-compactpro" => "cpt", + "application/x-csh" => "csh", + "text/css" => "css", + "application/x-director" => "dxr", + "image/vnd.djvu" => "djvu", + "application/x-dvi" => "dvi", + "image/vnd.dwg" => "dwg", + "application/epub" => "epub", + "application/epub+zip" => "epub", + "text/x-setext" => "etx", + "application/andrew-inset" => "ez", + "video/x-flv" => "flv", + "image/gif" => "gif", + "application/x-gtar" => "gtar", + "application/x-gzip" => "tgz", + "application/x-hdf" => "hdf", + "application/mac-binhex40" => "hqx", + "text/html" => "html", + "text/htm" => "htm", + "x-conference/x-cooltalk" => "ice", + "image/ief" => "ief", + "model/iges" => "igs", + "text/vnd.sun.j2me.app-descriptor" => "jad", + "application/x-java-archive" => "jar", + "application/x-java-jnlp-file" => "jnlp", + "image/jpeg" => "jpg", + "application/x-javascript" => "js", + "audio/midi" => "midi", + "application/x-killustrator" => "kil", + "application/x-kpresenter" => "kpt", + "application/x-kspread" => "ksp", + "application/x-kword" => "kwt", + "application/vnd.google-earth.kml+xml" => "kml", + "application/vnd.google-earth.kmz" => "kmz", + "application/x-latex" => "latex", + "audio/x-mpegurl" => "m3u", + "application/x-troff-man" => "man", + "application/x-troff-me" => "me", + "model/mesh" => "silo", + "application/vnd.mif" => "mif", + "video/quicktime" => "mov", + "video/x-sgi-movie" => "movie", + "audio/mpeg" => "mp3", + "video/mp4" => "mp4", + "video/mpeg" => "mpeg", + "application/x-troff-ms" => "ms", + "video/vnd.mpegurl" => "mxu", + "application/vnd.oasis.opendocument.database" => "odb", + "application/vnd.oasis.opendocument.chart" => "odc", + "application/vnd.oasis.opendocument.formula" => "odf", + "application/vnd.oasis.opendocument.graphics" => "odg", + "application/vnd.oasis.opendocument.image" => "odi", + "application/vnd.oasis.opendocument.text-master" => "odm", + "application/vnd.oasis.opendocument.presentation" => "odp", + "application/vnd.oasis.opendocument.spreadsheet" => "ods", + "application/vnd.oasis.opendocument.text" => "odt", + "application/ogg" => "ogg", + "video/ogg" => "ogv", + "application/vnd.oasis.opendocument.graphics-template" => "otg", + "application/vnd.oasis.opendocument.text-web" => "oth", + "application/vnd.oasis.opendocument.presentation-template" => "otp", + "application/vnd.oasis.opendocument.spreadsheet-template" => "ots", + "application/vnd.oasis.opendocument.text-template" => "ott", + "image/x-portable-bitmap" => "pbm", + "chemical/x-pdb" => "pdb", + "application/pdf" => "pdf", + "image/x-portable-graymap" => "pgm", + "application/x-chess-pgn" => "pgn", + "text/x-php" => "php", + "image/png" => "png", + "image/x-portable-anymap" => "pnm", + "image/x-portable-pixmap" => "ppm", + "application/vnd.ms-powerpoint" => "ppt", + "audio/x-realaudio" => "ra", + "audio/x-pn-realaudio" => "rm", + "image/x-cmu-raster" => "ras", + "image/x-rgb" => "rgb", + "application/x-troff" => "tr", + "application/x-rpm" => "rpm", + "text/rtf" => "rtf", + "text/richtext" => "rtx", + "text/sgml" => "sgml", + "application/x-sh" => "sh", + "application/x-shar" => "shar", + "application/vnd.symbian.install" => "sis", + "application/x-stuffit" => "sit", + "application/x-koan" => "skt", + "application/smil" => "smil", + "image/svg+xml" => "svg", + "application/x-futuresplash" => "spl", + "application/x-wais-source" => "src", + "application/vnd.sun.xml.calc.template" => "stc", + "application/vnd.sun.xml.draw.template" => "std", + "application/vnd.sun.xml.impress.template" => "sti", + "application/vnd.sun.xml.writer.template" => "stw", + "application/x-sv4cpio" => "sv4cpio", + "application/x-sv4crc" => "sv4crc", + "application/x-shockwave-flash" => "swf", + "application/vnd.sun.xml.calc" => "sxc", + "application/vnd.sun.xml.draw" => "sxd", + "application/vnd.sun.xml.writer.global" => "sxg", + "application/vnd.sun.xml.impress" => "sxi", + "application/vnd.sun.xml.math" => "sxm", + "application/vnd.sun.xml.writer" => "sxw", + "application/x-tar" => "tar", + "application/x-tcl" => "tcl", + "application/x-tex" => "tex", + "application/x-texinfo" => "texinfo", + "image/tiff" => "tiff", + "image/tiff-fx" => "tiff", + "application/x-bittorrent" => "torrent", + "text/tab-separated-values" => "tsv", + "application/x-ustar" => "ustar", + "application/x-cdlink" => "vcd", + "model/vrml" => "wrl", + "audio/x-wav" => "wav", + "audio/x-ms-wax" => "wax", + "image/vnd.wap.wbmp" => "wbmp", + "application/vnd.wap.wbxml" => "wbxml", + "video/x-ms-wm" => "wm", + "audio/x-ms-wma" => "wma", + "text/vnd.wap.wml" => "wml", + "application/vnd.wap.wmlc" => "wmlc", + "text/vnd.wap.wmlscript" => "wmls", + "application/vnd.wap.wmlscriptc" => "wmlsc", + "video/x-ms-wmv" => "wmv", + "video/x-ms-wmx" => "wmx", + "video/x-ms-wvx" => "wvx", + "image/x-xbitmap" => "xbm", + "application/xhtml+xml" => "xhtml", + "application/xml" => "xml", + "image/x-xpixmap" => "xpm", + "text/xsl" => "xsl", + "image/x-xwindowdump" => "xwd", + "chemical/x-xyz" => "xyz", + "application/zip" => "zip", + "application/msword" => "doc", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" => "docx", + "application/vnd.openxmlformats-officedocument.wordprocessingml.template" => "dotx", + "application/vnd.ms-word.document.macroEnabled.12" => "docm", + "application/vnd.ms-excel" => "xls", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" => "xlsx", + "application/vnd.openxmlformats-officedocument.spreadsheetml.template" => "xltx", + "application/vnd.ms-excel.sheet.macroEnabled.12" => "xlsm", + "application/vnd.ms-excel.template.macroEnabled.12" => "xltm", + "application/vnd.ms-excel.addin.macroEnabled.12" => "xlam", + "application/vnd.ms-excel.sheet.binary.macroEnabled.12" => "xlsb", + "application/vnd.openxmlformats-officedocument.presentationml.presentation" => "pptx", + "application/vnd.openxmlformats-officedocument.presentationml.template" => "potx", + "application/vnd.openxmlformats-officedocument.presentationml.slideshow" => "ppsx", + "application/vnd.ms-powerpoint.addin.macroEnabled.12" => "ppam", + "application/vnd.ms-powerpoint.presentation.macroEnabled.12" => "pptm", + "application/vnd.ms-powerpoint.template.macroEnabled.12" => "potm", + "application/vnd.ms-powerpoint.slideshow.macroEnabled.12" => "ppsm", +); + + +if ( ! function_exists('get_extension_from_mime')) +{ + function get_extension_from_mime($mime){ + global $mime_types; + if(strpos($mime, ';')!==FALSE){ + $mime = substr($mime, 0,strpos($mime, ';')); + } + if(isset($mime_types[$mime])){ + return $mime_types[$mime]; + } + return ''; + } +} + +if ( ! function_exists('get_file_mime_type')) +{ + function get_file_mime_type($filename, $debug = false) + { + if (function_exists('finfo_open') && function_exists('finfo_file') && function_exists('finfo_close')) + { + $fileinfo = finfo_open(FILEINFO_MIME_TYPE); + $mime_type = finfo_file($fileinfo, $filename); + finfo_close($fileinfo); + + if ( ! empty($mime_type)) + { + if (true === $debug) + { + return array( 'mime_type' => $mime_type, 'method' => 'fileinfo' ); + } + + return $mime_type; + } + } + + if (function_exists('mime_content_type')) + { + $mime_type = mime_content_type($filename); + + if ( ! empty($mime_type)) + { + if (true === $debug) + { + return array( 'mime_type' => $mime_type, 'method' => 'mime_content_type' ); + } + + return $mime_type; + } + } + + global $mime_types; + $mime_types = array_flip($mime_types); + + $tmp_array = explode('.', $filename); + $ext = strtolower(array_pop($tmp_array)); + + if ( ! empty($mime_types[ $ext ])) + { + if (true === $debug) + { + return array( 'mime_type' => $mime_types[ $ext ], 'method' => 'from_array' ); + } + + return $mime_types[ $ext ]; + } + + if (true === $debug) + { + return array( 'mime_type' => 'application/octet-stream', 'method' => 'last_resort' ); + } + + return 'application/octet-stream'; + } +} + + +/******************** + * The following code can be used to test the function. + * First put a plain text file named "test.txt" and a + * JPEG image file named "image.jpg" in the same folder + * as this file. + * + * Simply remove the "REMOVE ME TO TEST" lines below to have + * the code run when this file runs. + * + * Run the code with this command: + * php mime_type_lib.php + ********************/ + + +/* REMOVE ME TO TEST +echo get_file_mime_type( 'test.txt' ) . "\n"; +echo print_r( get_file_mime_type( 'image.jpg', true ), true ) . "\n"; +REMOVE ME TO TEST */ diff --git a/core/vendor/filemanager/include/php_image_magician.php b/core/vendor/filemanager/include/php_image_magician.php new file mode 100755 index 00000000..8dbc5e77 --- /dev/null +++ b/core/vendor/filemanager/include/php_image_magician.php @@ -0,0 +1,3785 @@ + resizeImage(150, 100, 0); +# $magicianObj -> saveImage('images/car_small.jpg', 100); +# +# - See end of doc for more examples - +# +# Supported file types include: jpg, png, gif, bmp, psd (read) +# +# +# +# The following functions are taken from phpThumb() [available from +# http://phpthumb.sourceforge.net], and are used with written permission +# from James Heinrich. +# - GD2BMPstring +# - GetPixelColor +# - LittleEndian2String +# +# The following functions are from Marc Hibbins and are used with written +# permission (are also under the Attribution-ShareAlike +# [http://creativecommons.org/licenses/by-sa/3.0/] license. +# - +# +# PhpPsdReader is used with written permission from Tim de Koning. +# [http://www.kingsquare.nl/phppsdreader] +# +# +# +# Modificatoin history +# Date Initials Ver Description +# 10-05-11 J.C.O 0.0 Initial build +# 01-06-11 J.C.O 0.1.1 * Added reflections +# * Added Rounded corners +# * You can now use PNG interlacing +# * Added shadow +# * Added caption box +# * Added vintage filter +# * Added dynamic image resizing (resize on the fly) +# * minor bug fixes +# 05-06-11 J.C.O 0.1.1.1 * Fixed undefined variables +# 17-06-11 J.C.O 0.1.2 * Added image_batch_class.php class +# * Minor bug fixes +# 26-07-11 J.C.O 0.1.4 * Added support for external images +# * Can now set the crop poisition +# 03-08-11 J.C.O 0.1.5 * Added reset() method to reset resource to +# original input file. +# * Added method addTextToCaptionBox() to +# simplify adding text to a caption box. +# * Added experimental writeIPTC. (not finished) +# * Added experimental readIPTC. (not finished) +# 11-08-11 J.C.O * Added initial border presets. +# 30-08-11 J.C.O * Added 'auto' crop option to crop portrait +# images near the top. +# 08-09-11 J.C.O * Added cropImage() method to allow standalone +# cropping. +# 17-09-11 J.C.O * Added setCropFromTop() set method - set the +# percentage to crop from the top when using +# crop 'auto' option. +# * Added setTransparency() set method - allows you +# to turn transparency off (like when saving +# as a jpg). +# * Added setFillColor() set method - set the +# background color to use instead of transparency. +# 05-11-11 J.C.O 0.1.5.1 * Fixed interlacing option +# 0-07-12 J.C.O 1.0 +# +# Known issues & Limitations: +# ------------------------------- +# Not so much an issue, the image is destroyed on the deconstruct rather than +# when we have finished with it. The reason for this is that we don't know +# when we're finished with it as you can both save the image and display +# it directly to the screen (imagedestroy($this->imageResized)) +# +# Opening BMP files is slow. A test with 884 bmp files processed in a loop +# takes forever - over 5 min. This test inlcuded opening the file, then +# getting and displaying its width and height. +# +# $forceStretch: +# ------------------------------- +# On by default. +# $forceStretch can be disabled by calling method setForceStretch with false +# parameter. If disabled, if an images original size is smaller than the size +# specified by the user, the original size will be used. This is useful when +# dealing with small images. +# +# If enabled, images smaller than the size specified will be stretched to +# that size. +# +# Tips: +# ------------------------------- +# * If you're resizing a transparent png and saving it as a jpg, set +# $keepTransparency to false with: $magicianObj->setTransparency(false); +# +# FEATURES: +# * EASY TO USE +# * BMP SUPPORT (read & write) +# * PSD (photoshop) support (read) +# * RESIZE IMAGES +# - Preserve transparency (png, gif) +# - Apply sharpening (jpg) (requires PHP >= 5.1.0) +# - Set image quality (jpg, png) +# - Resize modes: +# - exact size +# - resize by width (auto height) +# - resize by height (auto width) +# - auto (automatically determine the best of the above modes to use) +# - crop - resize as best as it can then crop the rest +# - Force stretching of smaller images (upscale) +# * APPLY FILTERS +# - Convert to grey scale +# - Convert to black and white +# - Convert to sepia +# - Convert to negative +# * ROTATE IMAGES +# - Rotate using predefined "left", "right", or "180"; or any custom degree amount +# * EXTRACT EXIF DATA (requires exif module) +# - make +# - model +# - date +# - exposure +# - aperture +# - f-stop +# - iso +# - focal length +# - exposure program +# - metering mode +# - flash status +# - creator +# - copyright +# * ADD WATERMARK +# - Specify exact x, y placement +# - Or, specify using one of the 9 pre-defined placements such as "tl" +# (for top left), "m" (for middle), "br" (for bottom right) +# - also specify padding from edge amount (optional). +# - Set opacity of watermark (png). +# * ADD BORDER +# * USE HEX WHEN SPECIFYING COLORS (eg: #ffffff) +# * SAVE IMAGE OR OUTPUT TO SCREEN +# +# +# ========================================================================# + + +class imageLib { + + private $fileName; + private $image; + protected $imageResized; + private $widthOriginal; # Always be the original width + private $heightOriginal; + private $width; # Current width (width after resize) + private $height; + private $imageSize; + private $fileExtension; + + private $debug = true; + private $errorArray = array(); + + private $forceStretch = true; + private $aggresiveSharpening = false; + + private $transparentArray = array( '.png', '.gif' ); + private $keepTransparency = true; + private $fillColorArray = array( 'r' => 255, 'g' => 255, 'b' => 255 ); + + private $sharpenArray = array( 'jpg' ); + + private $psdReaderPath; + private $filterOverlayPath; + + private $isInterlace; + + private $captionBoxPositionArray = array(); + + private $fontDir = 'fonts'; + + private $cropFromTopPercent = 10; + + +## -------------------------------------------------------- + + function __construct($fileName) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Constructor + # Param in: $fileName: File name and path. + # Param out: n/a + # Reference: + # Notes: + # + { + if ( ! $this->testGDInstalled()) + { + if ($this->debug) + { + throw new Exception('The GD Library is not installed.'); + } + else + { + throw new Exception(); + } + }; + + $this->initialise(); + + // *** Save the image file name. Only store this incase you want to display it + $this->fileName = $fileName; + $this->fileExtension = fix_strtolower(strrchr($fileName, '.')); + + // *** Open up the file + $this->image = $this->openImage($fileName); + + + // *** Assign here so we don't modify the original + $this->imageResized = $this->image; + + // *** If file is an image + if ($this->testIsImage($this->image)) + { + // *** Get width and height + $this->width = imagesx($this->image); + $this->widthOriginal = imagesx($this->image); + $this->height = imagesy($this->image); + $this->heightOriginal = imagesy($this->image); + + + /* Added 15-09-08 + * Get the filesize using this build in method. + * Stores an array of size + * + * $this->imageSize[1] = width + * $this->imageSize[2] = height + * $this->imageSize[3] = width x height + * + */ + $this->imageSize = getimagesize($this->fileName); + + } + else + { + $this->errorArray[] = 'File is not an image'; + } + } + +## -------------------------------------------------------- + + private function initialise() + { + + $this->psdReaderPath = dirname(__FILE__) . '/classPhpPsdReader.php'; + $this->filterOverlayPath = dirname(__FILE__) . '/filters'; + + // *** Set if image should be interlaced or not. + $this->isInterlace = false; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Resize +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + public function resizeImage($newWidth, $newHeight, $option = 0, $sharpen = false, $autoRotate = false) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Resizes the image + # Param in: $newWidth: + # $newHeight: + # $option: 0 / exact = defined size; + # 1 / portrait = keep aspect set height; + # 2 / landscape = keep aspect set width; + # 3 / auto = auto; + # 4 / crop= resize and crop; + # + # $option can also be an array containing options for + # cropping. E.G., array('crop', 'r') + # + # This array only applies to 'crop' and the 'r' refers to + # "crop right". Other value include; tl, t, tr, l, m (default), + # r, bl, b, br, or you can specify your own co-ords (which + # isn't recommended. + # + # $sharpen: true: sharpen (jpg only); + # false: don't sharpen + # Param out: n/a + # Reference: + # Notes: To clarify the $option input: + # 0 = The exact height and width dimensions you set. + # 1 = Whatever height is passed in will be the height that + # is set. The width will be calculated and set automatically + # to a the value that keeps the original aspect ratio. + # 2 = The same but based on the width. We try make the image the + # biggest size we can while stil fitting inside the box size + # 3 = Depending whether the image is landscape or portrait, this + # will automatically determine whether to resize via + # dimension 1,2 or 0 + # 4 = Will resize and then crop the image for best fit + # + # forceStretch can be applied to options 1,2,3 and 4 + # + { + + // *** We can pass in an array of options to change the crop position + $cropPos = 'm'; + if (is_array($option) && fix_strtolower($option[0]) == 'crop') + { + $cropPos = $option[1]; # get the crop option + } + else + { + if (strpos($option, '-') !== false) + { + // *** Or pass in a hyphen seperated option + $optionPiecesArray = explode('-', $option); + $cropPos = end($optionPiecesArray); + } + } + + // *** Check the option is valid + $option = $this->prepOption($option); + + // *** Make sure the file passed in is valid + if ( ! $this->image) + { + if ($this->debug) + { + throw new Exception('file ' . $this->getFileName() . ' is missing or invalid'); + } + else + { + throw new Exception(); + } + }; + + // *** Get optimal width and height - based on $option + $dimensionsArray = $this->getDimensions($newWidth, $newHeight, $option); + + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + + // *** Resample - create image canvas of x, y size + $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); + $this->keepTransparancy($optimalWidth, $optimalHeight, $this->imageResized); + imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); + + + // *** If '4', then crop too + if ($option == 4 || $option == 'crop') + { + + if (($optimalWidth >= $newWidth && $optimalHeight >= $newHeight)) + { + $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos); + } + } + + // *** If Rotate. + if ($autoRotate) + { + + $exifData = $this->getExif(false); + if (count($exifData) > 0) + { + + switch ($exifData['orientation']) + { + case 8: + $this->imageResized = imagerotate($this->imageResized, 90, 0); + break; + case 3: + $this->imageResized = imagerotate($this->imageResized, 180, 0); + break; + case 6: + $this->imageResized = imagerotate($this->imageResized, -90, 0); + break; + } + } + } + + // *** Sharpen image (if jpg and the user wishes to do so) + if ($sharpen && in_array($this->fileExtension, $this->sharpenArray)) + { + + // *** Sharpen + $this->sharpen(); + } + } + +## -------------------------------------------------------- + + public function cropImage($newWidth, $newHeight, $cropPos = 'm') + # Author: Jarrod Oberto + # Date: 08-09-11 + # Purpose: Crops the image + # Param in: $newWidth: crop with + # $newHeight: crop height + # $cropPos: Can be any of the following: + # tl, t, tr, l, m, r, bl, b, br, auto + # Or: + # a custom position such as '30x50' + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Make sure the file passed in is valid + if ( ! $this->image) + { + if ($this->debug) + { + throw new Exception('file ' . $this->getFileName() . ' is missing or invalid'); + } + else + { + throw new Exception(); + } + }; + + $this->imageResized = $this->image; + $this->crop($this->width, $this->height, $newWidth, $newHeight, $cropPos); + + } + +## -------------------------------------------------------- + + private function keepTransparancy($width, $height, $im) + # Author: Jarrod Oberto + # Date: 08-04-11 + # Purpose: Keep transparency for png and gif image + # Param in: + # Param out: n/a + # Reference: + # Notes: + # + { + // *** If PNG, perform some transparency retention actions (gif untested) + if (in_array($this->fileExtension, $this->transparentArray) && $this->keepTransparency) + { + imagealphablending($im, false); + imagesavealpha($im, true); + $transparent = imagecolorallocatealpha($im, 255, 255, 255, 127); + imagefilledrectangle($im, 0, 0, $width, $height, $transparent); + } + else + { + $color = imagecolorallocate($im, $this->fillColorArray['r'], $this->fillColorArray['g'], $this->fillColorArray['b']); + imagefilledrectangle($im, 0, 0, $width, $height, $color); + } + } + +## -------------------------------------------------------- + + private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos) + # Author: Jarrod Oberto + # Date: 15-09-08 + # Purpose: Crops the image + # Param in: $newWidth: + # $newHeight: + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Get cropping co-ordinates + $cropArray = $this->getCropPlacing($optimalWidth, $optimalHeight, $newWidth, $newHeight, $cropPos); + $cropStartX = $cropArray['x']; + $cropStartY = $cropArray['y']; + + // *** Crop this bad boy + $crop = imagecreatetruecolor($newWidth, $newHeight); + $this->keepTransparancy($optimalWidth, $optimalHeight, $crop); + imagecopyresampled($crop, $this->imageResized, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight, $newWidth, $newHeight); + + $this->imageResized = $crop; + + // *** Set new width and height to our variables + $this->width = $newWidth; + $this->height = $newHeight; + + } + +## -------------------------------------------------------- + + private function getCropPlacing($optimalWidth, $optimalHeight, $newWidth, $newHeight, $pos = 'm') + # + # Author: Jarrod Oberto + # Date: July 11 + # Purpose: Set the cropping area. + # Params in: + # Params out: (array) the crop x and y co-ordinates. + # Notes: When specifying the exact pixel crop position (eg 10x15), be + # very careful as it's easy to crop out of the image leaving + # black borders. + # + { + $pos = fix_strtolower($pos); + + // *** If co-ords have been entered + if (strstr($pos, 'x')) + { + $pos = str_replace(' ', '', $pos); + + $xyArray = explode('x', $pos); + list($cropStartX, $cropStartY) = $xyArray; + + } + else + { + + switch ($pos) + { + case 'tl': + $cropStartX = 0; + $cropStartY = 0; + break; + + case 't': + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = 0; + break; + + case 'tr': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = 0; + break; + + case 'l': + $cropStartX = 0; + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + + case 'm': + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + + case 'r': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + + case 'bl': + $cropStartX = 0; + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'b': + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'br': + $cropStartX = $optimalWidth - $newWidth; + $cropStartY = $optimalHeight - $newHeight; + break; + + case 'auto': + // *** If image is a portrait crop from top, not center. v1.5 + if ($optimalHeight > $optimalWidth) + { + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($this->cropFromTopPercent / 100) * $optimalHeight; + } + else + { + + // *** Else crop from the center + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + } + break; + + default: + // *** Default to center + $cropStartX = ($optimalWidth / 2) - ($newWidth / 2); + $cropStartY = ($optimalHeight / 2) - ($newHeight / 2); + break; + } + } + + return array( 'x' => $cropStartX, 'y' => $cropStartY ); + } + +## -------------------------------------------------------- + + private function getDimensions($newWidth, $newHeight, $option) + # Author: Jarrod Oberto + # Date: 17-11-09 + # Purpose: Get new image dimensions based on user specificaions + # Param in: $newWidth: + # $newHeight: + # Param out: Array of new width and height values + # Reference: + # Notes: If $option = 3 then this function is call recursivly + # + # To clarify the $option input: + # 0 = The exact height and width dimensions you set. + # 1 = Whatever height is passed in will be the height that + # is set. The width will be calculated and set automatically + # to a the value that keeps the original aspect ratio. + # 2 = The same but based on the width. + # 3 = Depending whether the image is landscape or portrait, this + # will automatically determine whether to resize via + # dimension 1,2 or 0. + # 4 = Resize the image as much as possible, then crop the + # remainder. + { + + switch (strval($option)) + { + case '0': + case 'exact': + $optimalWidth = $newWidth; + $optimalHeight = $newHeight; + break; + case '1': + case 'portrait': + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '2': + case 'landscape': + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '3': + case 'auto': + $dimensionsArray = $this->getSizeByAuto($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + case '4': + case 'crop': + $dimensionsArray = $this->getOptimalCrop($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + break; + } + + return array( 'optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight ); + } + +## -------------------------------------------------------- + + private function getSizeByFixedHeight($newWidth, $newHeight) + { + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual height is less than target height + if ($this->height < $newHeight) + { + return array( 'optimalWidth' => $this->width, 'optimalHeight' => $this->height ); + } + } + + $ratio = $this->width / $this->height; + + $newWidth = $newHeight * $ratio; + + //return $newWidth; + return array( 'optimalWidth' => $newWidth, 'optimalHeight' => $newHeight ); + } + +## -------------------------------------------------------- + + private function getSizeByFixedWidth($newWidth, $newHeight) + { + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual width is less than target width + if ($this->width < $newWidth) + { + return array( 'optimalWidth' => $this->width, 'optimalHeight' => $this->height ); + } + } + + $ratio = $this->height / $this->width; + + $newHeight = $newWidth * $ratio; + + //return $newHeight; + return array( 'optimalWidth' => $newWidth, 'optimalHeight' => $newHeight ); + } + +## -------------------------------------------------------- + + private function getSizeByAuto($newWidth, $newHeight) + # Author: Jarrod Oberto + # Date: 19-08-08 + # Purpose: Depending on the height, choose to resize by 0, 1, or 2 + # Param in: The new height and new width + # Notes: + # + { + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual size is less than target size + if ($this->width < $newWidth && $this->height < $newHeight) + { + return array( 'optimalWidth' => $this->width, 'optimalHeight' => $this->height ); + } + } + + if ($this->height < $this->width) + // *** Image to be resized is wider (landscape) + { + //$optimalWidth = $newWidth; + //$optimalHeight= $this->getSizeByFixedWidth($newWidth); + + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + elseif ($this->height > $this->width) + // *** Image to be resized is taller (portrait) + { + //$optimalWidth = $this->getSizeByFixedHeight($newHeight); + //$optimalHeight= $newHeight; + + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + else + // *** Image to be resizerd is a square + { + + if ($newHeight < $newWidth) + { + //$optimalWidth = $newWidth; + //$optimalHeight= $this->getSizeByFixedWidth($newWidth); + $dimensionsArray = $this->getSizeByFixedWidth($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + else + { + if ($newHeight > $newWidth) + { + //$optimalWidth = $this->getSizeByFixedHeight($newHeight); + //$optimalHeight= $newHeight; + $dimensionsArray = $this->getSizeByFixedHeight($newWidth, $newHeight); + $optimalWidth = $dimensionsArray['optimalWidth']; + $optimalHeight = $dimensionsArray['optimalHeight']; + } + else + { + // *** Sqaure being resized to a square + $optimalWidth = $newWidth; + $optimalHeight = $newHeight; + } + } + } + + return array( 'optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight ); + } + +## -------------------------------------------------------- + + private function getOptimalCrop($newWidth, $newHeight) + # Author: Jarrod Oberto + # Date: 17-11-09 + # Purpose: Get optimal crop dimensions + # Param in: width and height as requested by user (fig 3) + # Param out: Array of optimal width and height (fig 2) + # Reference: + # Notes: The optimal width and height return are not the same as the + # same as the width and height passed in. For example: + # + # + # |-----------------| |------------| |-------| + # | | => |**| |**| => | | + # | | |**| |**| | | + # | | |------------| |-------| + # |-----------------| + # original optimal crop + # size size size + # Fig 1 2 3 + # + # 300 x 250 150 x 125 150 x 100 + # + # The optimal size is the smallest size (that is closest to the crop size) + # while retaining proportion/ratio. + # + # The crop size is the optimal size that has been cropped on one axis to + # make the image the exact size specified by the user. + # + # * represent cropped area + # + { + + // *** If forcing is off... + if ( ! $this->forceStretch) + { + + // *** ...check if actual size is less than target size + if ($this->width < $newWidth && $this->height < $newHeight) + { + return array( 'optimalWidth' => $this->width, 'optimalHeight' => $this->height ); + } + } + + $heightRatio = $this->height / $newHeight; + $widthRatio = $this->width / $newWidth; + + if ($heightRatio < $widthRatio) + { + $optimalRatio = $heightRatio; + } + else + { + $optimalRatio = $widthRatio; + } + + $optimalHeight = round($this->height / $optimalRatio); + $optimalWidth = round($this->width / $optimalRatio); + + return array( 'optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight ); + } + +## -------------------------------------------------------- + + private function sharpen() + # Author: Jarrod Oberto + # Date: 08 04 2011 + # Purpose: Sharpen image + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # Credit: Incorporates Joe Lencioni (August 6, 2008) code + { + + if (version_compare(PHP_VERSION, '5.1.0') >= 0) + { + + // *** + if ($this->aggresiveSharpening) + { # A more aggressive sharpening solution + + $sharpenMatrix = array( array( -1, -1, -1 ), + array( -1, 16, -1 ), + array( -1, -1, -1 ) ); + $divisor = 8; + $offset = 0; + + imageconvolution($this->imageResized, $sharpenMatrix, $divisor, $offset); + } + else # More subtle and personally more desirable + { + $sharpness = $this->findSharp($this->widthOriginal, $this->width); + + $sharpenMatrix = array( + array( -1, -2, -1 ), + array( -2, $sharpness + 12, -2 ), //Lessen the effect of a filter by increasing the value in the center cell + array( -1, -2, -1 ) + ); + $divisor = $sharpness; // adjusts brightness + $offset = 0; + imageconvolution($this->imageResized, $sharpenMatrix, $divisor, $offset); + } + } + else + { + if ($this->debug) + { + throw new Exception('Sharpening required PHP 5.1.0 or greater.'); + } + } + } + + ## -------------------------------------------------------- + + private function sharpen2($level) + { + $sharpenMatrix = array( + array( $level, $level, $level ), + array( $level, (8 * $level) + 1, $level ), //Lessen the effect of a filter by increasing the value in the center cell + array( $level, $level, $level ) + ); + + } + +## -------------------------------------------------------- + + private function findSharp($orig, $final) + # Author: Ryan Rud (http://adryrun.com) + # Purpose: Find optimal sharpness + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + $final = $final * (750.0 / $orig); + $a = 52; + $b = -0.27810650887573124; + $c = .00047337278106508946; + + $result = $a + $b * $final + $c * $final * $final; + + return max(round($result), 0); + } + +## -------------------------------------------------------- + + private function prepOption($option) + # Author: Jarrod Oberto + # Purpose: Prep option like change the passed in option to lowercase + # Param in: (str/int) $option: eg. 'exact', 'crop'. 0, 4 + # Param out: lowercase string + # Reference: + # Notes: + # + { + if (is_array($option)) + { + if (fix_strtolower($option[0]) == 'crop' && count($option) == 2) + { + return 'crop'; + } + else + { + throw new Exception('Crop resize option array is badly formatted.'); + } + } + else + { + if (strpos($option, 'crop') !== false) + { + return 'crop'; + } + } + + if (is_string($option)) + { + return fix_strtolower($option); + } + + return $option; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Presets +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + +# +# Preset are pre-defined templates you can apply to your image. +# +# These are inteded to be applied to thumbnail images. +# + + + public function borderPreset($preset) + { + switch ($preset) + { + + case 'simple': + $this->addBorder(7, '#fff'); + $this->addBorder(6, '#f2f1f0'); + $this->addBorder(2, '#fff'); + $this->addBorder(1, '#ccc'); + break; + default: + break; + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Draw border +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addBorder($thickness = 1, $rgbArray = array( 255, 255, 255 )) + # Author: Jarrod Oberto + # Date: 05-05-11 + # Purpose: Add a border to the image + # Param in: + # Param out: + # Reference: + # Notes: This border is added to the INSIDE of the image + # + { + if ($this->imageResized) + { + + $rgbArray = $this->formatColor($rgbArray); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + + $x1 = 0; + $y1 = 0; + $x2 = ImageSX($this->imageResized) - 1; + $y2 = ImageSY($this->imageResized) - 1; + + $rgbArray = ImageColorAllocate($this->imageResized, $r, $g, $b); + + + for ($i = 0; $i < $thickness; $i++) + { + ImageRectangle($this->imageResized, $x1++, $y1++, $x2--, $y2--, $rgbArray); + } + } + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Gray Scale +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function greyScale() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image greyscale + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + } + + } + + ## -------------------------------------------------------- + + public function greyScaleEnhanced() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image greyscale + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -15); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, 2); + $this->sharpen($this->width); + } + } + + ## -------------------------------------------------------- + + public function greyScaleDramatic() + # Alias of gd_filter_monopin + { + $this->gd_filter_monopin(); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Black 'n White +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function blackAndWhite() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image black and white + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -1000); + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Negative +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function negative() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image negative + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + + imagefilter($this->imageResized, IMG_FILTER_NEGATE); + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Sepia +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function sepia() + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Make image sepia + # Param in: n/a + # Param out: + # Reference: + # Notes: + # + { + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, -10); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -20); + imagefilter($this->imageResized, IMG_FILTER_COLORIZE, 60, 30, -15); + } + } + + ## -------------------------------------------------------- + + public function sepia2() + + { + if ($this->imageResized) + { + + $total = imagecolorstotal($this->imageResized); + for ($i = 0; $i < $total; $i++) + { + $index = imagecolorsforindex($this->imageResized, $i); + $red = ($index["red"] * 0.393 + $index["green"] * 0.769 + $index["blue"] * 0.189) / 1.351; + $green = ($index["red"] * 0.349 + $index["green"] * 0.686 + $index["blue"] * 0.168) / 1.203; + $blue = ($index["red"] * 0.272 + $index["green"] * 0.534 + $index["blue"] * 0.131) / 2.140; + imagecolorset($this->imageResized, $i, $red, $green, $blue); + } + + + } + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Vintage +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function vintage() + # Alias of gd_filter_monopin + { + $this->gd_filter_vintage(); + } + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Presets By Marc Hibbins +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + /** Apply 'Monopin' preset */ + public function gd_filter_monopin() + { + + if ($this->imageResized) + { + imagefilter($this->imageResized, IMG_FILTER_GRAYSCALE); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, -15); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -15); + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'vignette', 100); + } + } + + ## -------------------------------------------------------- + + public function gd_filter_vintage() + { + if ($this->imageResized) + { + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'vignette', 45); + imagefilter($this->imageResized, IMG_FILTER_BRIGHTNESS, 20); + imagefilter($this->imageResized, IMG_FILTER_CONTRAST, -35); + imagefilter($this->imageResized, IMG_FILTER_COLORIZE, 60, -10, 35); + imagefilter($this->imageResized, IMG_FILTER_SMOOTH, 7); + $this->imageResized = $this->gd_apply_overlay($this->imageResized, 'scratch', 10); + } + } + + ## -------------------------------------------------------- + + /** Apply a PNG overlay */ + private function gd_apply_overlay($im, $type, $amount) + # + # Original Author: Marc Hibbins + # License: Attribution-ShareAlike 3.0 + # Purpose: + # Params in: + # Params out: + # Notes: + # + { + $width = imagesx($im); + $height = imagesy($im); + $filter = imagecreatetruecolor($width, $height); + + imagealphablending($filter, false); + imagesavealpha($filter, true); + + $transparent = imagecolorallocatealpha($filter, 255, 255, 255, 127); + imagefilledrectangle($filter, 0, 0, $width, $height, $transparent); + + // *** Resize overlay + $overlay = $this->filterOverlayPath . '/' . $type . '.png'; + $png = imagecreatefrompng($overlay); + imagecopyresampled($filter, $png, 0, 0, 0, 0, $width, $height, imagesx($png), imagesy($png)); + + $comp = imagecreatetruecolor($width, $height); + imagecopy($comp, $im, 0, 0, 0, 0, $width, $height); + imagecopy($comp, $filter, 0, 0, 0, 0, $width, $height); + imagecopymerge($im, $comp, 0, 0, 0, 0, $width, $height, $amount); + + imagedestroy($comp); + + return $im; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Colorise +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function image_colorize($rgb) + { + imageTrueColorToPalette($this->imageResized, true, 256); + $numColors = imageColorsTotal($this->imageResized); + + for ($x = 0; $x < $numColors; $x++) + { + list($r, $g, $b) = array_values(imageColorsForIndex($this->imageResized, $x)); + + // calculate grayscale in percent + $grayscale = ($r + $g + $b) / 3 / 0xff; + + imageColorSet($this->imageResized, $x, + $grayscale * $rgb[0], + $grayscale * $rgb[1], + $grayscale * $rgb[2] + ); + + } + + return true; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Reflection +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addReflection($reflectionHeight = 50, $startingTransparency = 30, $inside = false, $bgColor = '#fff', $stretch = false, $divider = 0) + { + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + $im = $this->imageResized; + $li = imagecreatetruecolor($this->width, 1); + + $bgc = imagecolorallocate($li, $r, $g, $b); + imagefilledrectangle($li, 0, 0, $this->width, 1, $bgc); + + $bg = imagecreatetruecolor($this->width, $reflectionHeight); + $wh = imagecolorallocate($im, 255, 255, 255); + + $im = imagerotate($im, -180, $wh); + imagecopyresampled($bg, $im, 0, 0, 0, 0, $this->width, $this->height, $this->width, $this->height); + + $im = $bg; + + $bg = imagecreatetruecolor($this->width, $reflectionHeight); + + for ($x = 0; $x < $this->width; $x++) + { + imagecopy($bg, $im, $x, 0, $this->width - $x - 1, 0, 1, $reflectionHeight); + } + $im = $bg; + + $transaprencyAmount = $this->invertTransparency($startingTransparency, 100); + + + // *** Fade + if ($stretch) + { + $step = 100 / ($reflectionHeight + $startingTransparency); + } + else + { + $step = 100 / $reflectionHeight; + } + for ($i = 0; $i <= $reflectionHeight; $i++) + { + + if ($startingTransparency > 100) + { + $startingTransparency = 100; + } + if ($startingTransparency < 1) + { + $startingTransparency = 1; + } + imagecopymerge($bg, $li, 0, $i, 0, 0, $this->width, 1, $startingTransparency); + $startingTransparency += $step; + } + + // *** Apply fade + imagecopymerge($im, $li, 0, 0, 0, 0, $this->width, $divider, 100); // Divider + + + // *** width, height of reflection. + $x = imagesx($im); + $y = imagesy($im); + + + // *** Determines if the reflection should be displayed inside or outside the image + if ($inside) + { + + // Create new blank image with sizes. + $final = imagecreatetruecolor($this->width, $this->height); + + imagecopymerge($final, $this->imageResized, 0, 0, 0, $reflectionHeight, $this->width, $this->height - $reflectionHeight, 100); + imagecopymerge($final, $im, 0, $this->height - $reflectionHeight, 0, 0, $x, $y, 100); + + } + else + { + + // Create new blank image with sizes. + $final = imagecreatetruecolor($this->width, $this->height + $y); + + imagecopymerge($final, $this->imageResized, 0, 0, 0, 0, $this->width, $this->height, 100); + imagecopymerge($final, $im, 0, $this->height, 0, 0, $x, $y, 100); + } + + $this->imageResized = $final; + + imagedestroy($li); + imagedestroy($im); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Rotate +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function rotate($value = 90, $bgColor = 'transparent') + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Rotate image + # Param in: (mixed) $degrees: (int) number of degress to rotate image + # (str) param "left": rotate left + # (str) param "right": rotate right + # (str) param "upside": upside-down image + # Param out: + # Reference: + # Notes: The default direction of imageRotate() is counter clockwise. + # + { + if ($this->imageResized) + { + + if (is_integer($value)) + { + $degrees = $value; + } + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + if (isset($rgbArray['a'])) + { + $a = $rgbArray['a']; + } + + if (is_string($value)) + { + + $value = fix_strtolower($value); + + switch ($value) + { + case 'left': + $degrees = 90; + break; + case 'right': + $degrees = 270; + break; + case 'upside': + $degrees = 180; + break; + default: + break; + } + + } + + // *** The default direction of imageRotate() is counter clockwise + // * This makes it clockwise + $degrees = 360 - $degrees; + + // *** Create background color + $bg = ImageColorAllocateAlpha($this->imageResized, $r, $g, $b, $a); + + // *** Fill with background + ImageFill($this->imageResized, 0, 0, $bg); + + // *** Rotate + $this->imageResized = imagerotate($this->imageResized, $degrees, $bg); // Rotate 45 degrees and allocated the transparent colour as the one to make transparent (obviously) + + // Ensure alpha transparency + ImageSaveAlpha($this->imageResized, true); + + } + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Round corners +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function roundCorners($radius = 5, $bgColor = 'transparent') + # Author: Jarrod Oberto + # Date: 19-05-2011 + # Purpose: Create rounded corners on your image + # Param in: (int) radius = the amount of curvature + # (mixed) $bgColor = the corner background color + # Param out: n/a + # Reference: + # Notes: + # + { + + // *** Check if the user wants transparency + $isTransparent = false; + if ( ! is_array($bgColor)) + { + if (fix_strtolower($bgColor) == 'transparent') + { + $isTransparent = true; + } + } + + + // *** If we use transparency, we need to color our curved mask with a unique color + if ($isTransparent) + { + $bgColor = $this->findUnusedGreen(); + } + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + if (isset($rgbArray['a'])) + { + $a = $rgbArray['a']; + } + + + // *** Create top-left corner mask (square) + $cornerImg = imagecreatetruecolor($radius, $radius); + //$cornerImg = imagecreate($radius, $radius); + + //imagealphablending($cornerImg, true); + //imagesavealpha($cornerImg, true); + + //imagealphablending($this->imageResized, false); + //imagesavealpha($this->imageResized, true); + + // *** Give it a color + $maskColor = imagecolorallocate($cornerImg, 0, 0, 0); + + + // *** Replace the mask color (black) to transparent + imagecolortransparent($cornerImg, $maskColor); + + + // *** Create the image background color + $imagebgColor = imagecolorallocate($cornerImg, $r, $g, $b); + + + // *** Fill the corner area to the user defined color + imagefill($cornerImg, 0, 0, $imagebgColor); + + + imagefilledellipse($cornerImg, $radius, $radius, $radius * 2, $radius * 2, $maskColor); + + + // *** Map to top left corner + imagecopymerge($this->imageResized, $cornerImg, 0, 0, 0, 0, $radius, $radius, 100); #tl + + // *** Map rounded corner to other corners by rotating and applying the mask + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, 0, $this->height - $radius, 0, 0, $radius, $radius, 100); #bl + + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, $this->width - $radius, $this->height - $radius, 0, 0, $radius, $radius, 100); #br + + $cornerImg = imagerotate($cornerImg, 90, 0); + imagecopymerge($this->imageResized, $cornerImg, $this->width - $radius, 0, 0, 0, $radius, $radius, 100); #tr + + + // *** If corners are to be transparent, we fill our chromakey color as transparent. + if ($isTransparent) + { + //imagecolortransparent($this->imageResized, $imagebgColor); + $this->imageResized = $this->transparentImage($this->imageResized); + imagesavealpha($this->imageResized, true); + } + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Shadow +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addShadow($shadowAngle = 45, $blur = 15, $bgColor = 'transparent') + # + # Author: Jarrod Oberto (Adapted from Pascal Naidon) + # Ref: http://www.les-stooges.org/pascal/webdesign/vignettes/index.php?la=en + # Purpose: Add a drop shadow to your image + # Params in: (int) $angle: the angle of the shadow + # (int) $blur: the blur distance + # (mixed) $bgColor: the color of the background + # Params out: + # Notes: + # + { + // *** A higher number results in a smoother shadow + define('STEPS', $blur * 2); + + // *** Set the shadow distance + $shadowDistance = $blur * 0.25; + + // *** Set blur width and height + $blurWidth = $blurHeight = $blur; + + + if ($shadowAngle == 0) + { + $distWidth = 0; + $distHeight = 0; + } + else + { + $distWidth = $shadowDistance * cos(deg2rad($shadowAngle)); + $distHeight = $shadowDistance * sin(deg2rad($shadowAngle)); + } + + + // *** Convert color + if (fix_strtolower($bgColor) != 'transparent') + { + $rgbArray = $this->formatColor($bgColor); + $r0 = $rgbArray['r']; + $g0 = $rgbArray['g']; + $b0 = $rgbArray['b']; + } + + + $image = $this->imageResized; + $width = $this->width; + $height = $this->height; + + + $newImage = imagecreatetruecolor($width, $height); + imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, $width, $height); + + + // *** RGB + $rgb = imagecreatetruecolor($width + $blurWidth, $height + $blurHeight); + $colour = imagecolorallocate($rgb, 0, 0, 0); + imagefilledrectangle($rgb, 0, 0, $width + $blurWidth, $height + $blurHeight, $colour); + $colour = imagecolorallocate($rgb, 255, 255, 255); + //imagefilledrectangle($rgb, $blurWidth*0.5-$distWidth, $blurHeight*0.5-$distHeight, $width+$blurWidth*0.5-$distWidth, $height+$blurWidth*0.5-$distHeight, $colour); + imagefilledrectangle($rgb, $blurWidth * 0.5 - $distWidth, $blurHeight * 0.5 - $distHeight, $width + $blurWidth * 0.5 - $distWidth, $height + $blurWidth * 0.5 - $distHeight, $colour); + //imagecopymerge($rgb, $newImage, 1+$blurWidth*0.5-$distWidth, 1+$blurHeight*0.5-$distHeight, 0,0, $width, $height, 100); + imagecopymerge($rgb, $newImage, $blurWidth * 0.5 - $distWidth, $blurHeight * 0.5 - $distHeight, 0, 0, $width + $blurWidth, $height + $blurHeight, 100); + + + // *** Shadow (alpha) + $shadow = imagecreatetruecolor($width + $blurWidth, $height + $blurHeight); + imagealphablending($shadow, false); + $colour = imagecolorallocate($shadow, 0, 0, 0); + imagefilledrectangle($shadow, 0, 0, $width + $blurWidth, $height + $blurHeight, $colour); + + + for ($i = 0; $i <= STEPS; $i++) + { + + $t = ((1.0 * $i) / STEPS); + $intensity = 255 * $t * $t; + + $colour = imagecolorallocate($shadow, $intensity, $intensity, $intensity); + $points = array( + $blurWidth * $t, $blurHeight, // Point 1 (x, y) + $blurWidth, $blurHeight * $t, // Point 2 (x, y) + $width, $blurHeight * $t, // Point 3 (x, y) + $width + $blurWidth * (1 - $t), $blurHeight, // Point 4 (x, y) + $width + $blurWidth * (1 - $t), $height, // Point 5 (x, y) + $width, $height + $blurHeight * (1 - $t), // Point 6 (x, y) + $blurWidth, $height + $blurHeight * (1 - $t), // Point 7 (x, y) + $blurWidth * $t, $height // Point 8 (x, y) + ); + imagepolygon($shadow, $points, 8, $colour); + } + + for ($i = 0; $i <= STEPS; $i++) + { + + $t = ((1.0 * $i) / STEPS); + $intensity = 255 * $t * $t; + + $colour = imagecolorallocate($shadow, $intensity, $intensity, $intensity); + imagefilledarc($shadow, $blurWidth - 1, $blurHeight - 1, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 180, 268, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $width, $blurHeight - 1, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 270, 358, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $width, $height, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 0, 90, $colour, IMG_ARC_PIE); + imagefilledarc($shadow, $blurWidth - 1, $height, 2 * (1 - $t) * $blurWidth, 2 * (1 - $t) * $blurHeight, 90, 180, $colour, IMG_ARC_PIE); + } + + + $colour = imagecolorallocate($shadow, 255, 255, 255); + imagefilledrectangle($shadow, $blurWidth, $blurHeight, $width, $height, $colour); + imagefilledrectangle($shadow, $blurWidth * 0.5 - $distWidth, $blurHeight * 0.5 - $distHeight, $width + $blurWidth * 0.5 - 1 - $distWidth, $height + $blurHeight * 0.5 - 1 - $distHeight, $colour); + + + // *** The magic + imagealphablending($rgb, false); + + for ($theX = 0; $theX < imagesx($rgb); $theX++) + { + for ($theY = 0; $theY < imagesy($rgb); $theY++) + { + + // *** Get the RGB values for every pixel of the RGB image + $colArray = imagecolorat($rgb, $theX, $theY); + $r = ($colArray >> 16) & 0xFF; + $g = ($colArray >> 8) & 0xFF; + $b = $colArray & 0xFF; + + // *** Get the alpha value for every pixel of the shadow image + $colArray = imagecolorat($shadow, $theX, $theY); + $a = $colArray & 0xFF; + $a = 127 - floor($a / 2); + $t = $a / 128.0; + + // *** Create color + if (fix_strtolower($bgColor) == 'transparent') + { + $myColour = imagecolorallocatealpha($rgb, $r, $g, $b, $a); + } + else + { + $myColour = imagecolorallocate($rgb, $r * (1.0 - $t) + $r0 * $t, $g * (1.0 - $t) + $g0 * $t, $b * (1.0 - $t) + $b0 * $t); + } + + // *** Add color to new rgb image + imagesetpixel($rgb, $theX, $theY, $myColour); + } + } + + imagealphablending($rgb, true); + imagesavealpha($rgb, true); + + $this->imageResized = $rgb; + + imagedestroy($image); + imagedestroy($newImage); + imagedestroy($shadow); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Caption Box +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addCaptionBox($side = 'b', $thickness = 50, $padding = 0, $bgColor = '#000', $transaprencyAmount = 30) + # + # Author: Jarrod Oberto + # Date: 26 May 2011 + # Purpose: Add a caption box + # Params in: (str) $side: the side to add the caption box (t, r, b, or l). + # (int) $thickness: how thick you want the caption box to be. + # (mixed) $bgColor: The color of the caption box. + # (int) $transaprencyAmount: The amount of transparency to be + # applied. + # Params out: n/a + # Notes: + # + { + $side = fix_strtolower($side); + + // *** Convert color + $rgbArray = $this->formatColor($bgColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + $positionArray = $this->calculateCaptionBoxPosition($side, $thickness, $padding); + + // *** Store incase we want to use method addTextToCaptionBox() + $this->captionBoxPositionArray = $positionArray; + + + $transaprencyAmount = $this->invertTransparency($transaprencyAmount, 127, false); + $transparent = imagecolorallocatealpha($this->imageResized, $r, $g, $b, $transaprencyAmount); + imagefilledrectangle($this->imageResized, $positionArray['x1'], $positionArray['y1'], $positionArray['x2'], $positionArray['y2'], $transparent); + } + + ## -------------------------------------------------------- + + public function addTextToCaptionBox($text, $fontColor = '#fff', $fontSize = 12, $angle = 0, $font = null) + # + # Author: Jarrod Oberto + # Date: 03 Aug 11 + # Purpose: Simplify adding text to a caption box by automatically + # locating the center of the caption box + # Params in: The usually text paams (less a couple) + # Params out: n/a + # Notes: + # + { + + // *** Get the caption box measurements + if (count($this->captionBoxPositionArray) == 4) + { + $x1 = $this->captionBoxPositionArray['x1']; + $x2 = $this->captionBoxPositionArray['x2']; + $y1 = $this->captionBoxPositionArray['y1']; + $y2 = $this->captionBoxPositionArray['y2']; + } + else + { + if ($this->debug) + { + throw new Exception('No caption box found.'); + } + else + { + return false; + } + } + + + // *** Get text font + $font = $this->getTextFont($font); + + // *** Get text size + $textSizeArray = $this->getTextSize($fontSize, $angle, $font, $text); + $textWidth = $textSizeArray['width']; + $textHeight = $textSizeArray['height']; + + // *** Find the width/height middle points + $boxXMiddle = (($x2 - $x1) / 2); + $boxYMiddle = (($y2 - $y1) / 2); + + // *** Box middle - half the text width/height + $xPos = ($x1 + $boxXMiddle) - ($textWidth / 2); + $yPos = ($y1 + $boxYMiddle) - ($textHeight / 2); + + $pos = $xPos . 'x' . $yPos; + + $this->addText($text, $pos, $padding = 0, $fontColor, $fontSize, $angle, $font); + + } + + ## -------------------------------------------------------- + + private function calculateCaptionBoxPosition($side, $thickness, $padding) + { + $positionArray = array(); + + switch ($side) + { + case 't': + $positionArray['x1'] = 0; + $positionArray['y1'] = $padding; + $positionArray['x2'] = $this->width; + $positionArray['y2'] = $thickness + $padding; + break; + case 'r': + $positionArray['x1'] = $this->width - $thickness - $padding; + $positionArray['y1'] = 0; + $positionArray['x2'] = $this->width - $padding; + $positionArray['y2'] = $this->height; + break; + case 'b': + $positionArray['x1'] = 0; + $positionArray['y1'] = $this->height - $thickness - $padding; + $positionArray['x2'] = $this->width; + $positionArray['y2'] = $this->height - $padding; + break; + case 'l': + $positionArray['x1'] = $padding; + $positionArray['y1'] = 0; + $positionArray['x2'] = $thickness + $padding; + $positionArray['y2'] = $this->height; + break; + + default: + break; + } + + return $positionArray; + + } + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Get EXIF Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function getExif($debug = false) + # Author: Jarrod Oberto + # Date: 07-05-2011 + # Purpose: Get image EXIF data + # Param in: n/a + # Param out: An associate array of EXIF data + # Reference: + # Notes: + # 23 May 13 : added orientation flag -jco + # + { + + if ( ! $this->debug || ! $debug) + { + $debug = false; + } + + // *** Check all is good - check the EXIF library exists and the file exists, too. + if ( ! $this->testEXIFInstalled()) + { + if ($debug) + { + throw new Exception('The EXIF Library is not installed.'); + } + else + { + return array(); + } + }; + if ( ! file_exists($this->fileName)) + { + if ($debug) + { + throw new Exception('Image not found.'); + } + else + { + return array(); + } + }; + if ($this->fileExtension != '.jpg') + { + if ($debug) + { + throw new Exception('Metadata not supported for this image type.'); + } + else + { + return array(); + } + }; + $exifData = exif_read_data($this->fileName, 'IFD0'); + + // *** Format the apperture value + $ev = $exifData['ApertureValue']; + $apPeicesArray = explode('/', $ev); + if (count($apPeicesArray) == 2) + { + $apertureValue = round($apPeicesArray[0] / $apPeicesArray[1], 2, PHP_ROUND_HALF_DOWN) . ' EV'; + } + else + { + $apertureValue = ''; + } + + // *** Format the focal length + $focalLength = $exifData['FocalLength']; + $flPeicesArray = explode('/', $focalLength); + if (count($flPeicesArray) == 2) + { + $focalLength = $flPeicesArray[0] / $flPeicesArray[1] . '.0 mm'; + } + else + { + $focalLength = ''; + } + + // *** Format fNumber + $fNumber = $exifData['FNumber']; + $fnPeicesArray = explode('/', $fNumber); + if (count($fnPeicesArray) == 2) + { + $fNumber = $fnPeicesArray[0] / $fnPeicesArray[1]; + } + else + { + $fNumber = ''; + } + + // *** Resolve ExposureProgram + if (isset($exifData['ExposureProgram'])) + { + $ep = $exifData['ExposureProgram']; + } + if (isset($ep)) + { + $ep = $this->resolveExposureProgram($ep); + } + + + // *** Resolve MeteringMode + $mm = $exifData['MeteringMode']; + $mm = $this->resolveMeteringMode($mm); + + // *** Resolve Flash + $flash = $exifData['Flash']; + $flash = $this->resolveFlash($flash); + + + if (isset($exifData['Make'])) + { + $exifDataArray['make'] = $exifData['Make']; + } + else + { + $exifDataArray['make'] = ''; + } + + if (isset($exifData['Model'])) + { + $exifDataArray['model'] = $exifData['Model']; + } + else + { + $exifDataArray['model'] = ''; + } + + if (isset($exifData['DateTime'])) + { + $exifDataArray['date'] = $exifData['DateTime']; + } + else + { + $exifDataArray['date'] = ''; + } + + if (isset($exifData['ExposureTime'])) + { + $exifDataArray['exposure time'] = $exifData['ExposureTime'] . ' sec.'; + } + else + { + $exifDataArray['exposure time'] = ''; + } + + if ($apertureValue != '') + { + $exifDataArray['aperture value'] = $apertureValue; + } + else + { + $exifDataArray['aperture value'] = ''; + } + + if (isset($exifData['COMPUTED']['ApertureFNumber'])) + { + $exifDataArray['f-stop'] = $exifData['COMPUTED']['ApertureFNumber']; + } + else + { + $exifDataArray['f-stop'] = ''; + } + + if (isset($exifData['FNumber'])) + { + $exifDataArray['fnumber'] = $exifData['FNumber']; + } + else + { + $exifDataArray['fnumber'] = ''; + } + + if ($fNumber != '') + { + $exifDataArray['fnumber value'] = $fNumber; + } + else + { + $exifDataArray['fnumber value'] = ''; + } + + if (isset($exifData['ISOSpeedRatings'])) + { + $exifDataArray['iso'] = $exifData['ISOSpeedRatings']; + } + else + { + $exifDataArray['iso'] = ''; + } + + if ($focalLength != '') + { + $exifDataArray['focal length'] = $focalLength; + } + else + { + $exifDataArray['focal length'] = ''; + } + + if (isset($ep)) + { + $exifDataArray['exposure program'] = $ep; + } + else + { + $exifDataArray['exposure program'] = ''; + } + + if ($mm != '') + { + $exifDataArray['metering mode'] = $mm; + } + else + { + $exifDataArray['metering mode'] = ''; + } + + if ($flash != '') + { + $exifDataArray['flash status'] = $flash; + } + else + { + $exifDataArray['flash status'] = ''; + } + + if (isset($exifData['Artist'])) + { + $exifDataArray['creator'] = $exifData['Artist']; + } + else + { + $exifDataArray['creator'] = ''; + } + + if (isset($exifData['Copyright'])) + { + $exifDataArray['copyright'] = $exifData['Copyright']; + } + else + { + $exifDataArray['copyright'] = ''; + } + + // *** Orientation + if (isset($exifData['Orientation'])) + { + $exifDataArray['orientation'] = $exifData['Orientation']; + } + else + { + $exifDataArray['orientation'] = ''; + } + + return $exifDataArray; + } + + ## -------------------------------------------------------- + + private function resolveExposureProgram($ep) + { + switch ($ep) + { + case 0: + $ep = ''; + break; + case 1: + $ep = 'manual'; + break; + case 2: + $ep = 'normal program'; + break; + case 3: + $ep = 'aperture priority'; + break; + case 4: + $ep = 'shutter priority'; + break; + case 5: + $ep = 'creative program'; + break; + case 6: + $ep = 'action program'; + break; + case 7: + $ep = 'portrait mode'; + break; + case 8: + $ep = 'landscape mode'; + break; + + default: + break; + } + + return $ep; + } + + ## -------------------------------------------------------- + + private function resolveMeteringMode($mm) + { + switch ($mm) + { + case 0: + $mm = 'unknown'; + break; + case 1: + $mm = 'average'; + break; + case 2: + $mm = 'center weighted average'; + break; + case 3: + $mm = 'spot'; + break; + case 4: + $mm = 'multi spot'; + break; + case 5: + $mm = 'pattern'; + break; + case 6: + $mm = 'partial'; + break; + case 255: + $mm = 'other'; + break; + + default: + break; + } + + return $mm; + } + + ## -------------------------------------------------------- + + private function resolveFlash($flash) + { + switch ($flash) + { + case 0: + $flash = 'flash did not fire'; + break; + case 1: + $flash = 'flash fired'; + break; + case 5: + $flash = 'strobe return light not detected'; + break; + case 7: + $flash = 'strobe return light detected'; + break; + case 9: + $flash = 'flash fired, compulsory flash mode'; + break; + case 13: + $flash = 'flash fired, compulsory flash mode, return light not detected'; + break; + case 15: + $flash = 'flash fired, compulsory flash mode, return light detected'; + break; + case 16: + $flash = 'flash did not fire, compulsory flash mode'; + break; + case 24: + $flash = 'flash did not fire, auto mode'; + break; + case 25: + $flash = 'flash fired, auto mode'; + break; + case 29: + $flash = 'flash fired, auto mode, return light not detected'; + break; + case 31: + $flash = 'flash fired, auto mode, return light detected'; + break; + case 32: + $flash = 'no flash function'; + break; + case 65: + $flash = 'flash fired, red-eye reduction mode'; + break; + case 69: + $flash = 'flash fired, red-eye reduction mode, return light not detected'; + break; + case 71: + $flash = 'flash fired, red-eye reduction mode, return light detected'; + break; + case 73: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode'; + break; + case 77: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode, return light not detected'; + break; + case 79: + $flash = 'flash fired, compulsory flash mode, red-eye reduction mode, return light detected'; + break; + case 89: + $flash = 'flash fired, auto mode, red-eye reduction mode'; + break; + case 93: + $flash = 'flash fired, auto mode, return light not detected, red-eye reduction mode'; + break; + case 95: + $flash = 'flash fired, auto mode, return light detected, red-eye reduction mode'; + break; + + default: + break; + } + + return $flash; + + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Get IPTC Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Write IPTC Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function writeIPTCcaption($value) + # Caption + { + $this->writeIPTC(120, $value); + } + + ## -------------------------------------------------------- + + public function writeIPTCwriter($value) + { + //$this->writeIPTC(65, $value); + } + + ## -------------------------------------------------------- + + private function writeIPTC($dat, $value) + { + + # LIMIT TO JPG + + $caption_block = $this->iptc_maketag(2, $dat, $value); + $image_string = iptcembed($caption_block, $this->fileName); + file_put_contents('iptc.jpg', $image_string); + } + +## -------------------------------------------------------- + + private function iptc_maketag($rec, $dat, $val) + # Author: Thies C. Arntzen + # Purpose: Function to format the new IPTC text + # Param in: $rec: Application record. (We’re working with #2) + # $dat: Index. (120 for caption, 118 for contact. See the IPTC IIM + # specification: + # http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf + # $val: Value/data/text. Make sure this is within the length + # constraints of the IPTC IIM specification + # Ref: http://blog.peterhaza.no/working-with-image-meta-data-in-exif-and-iptc-headers-from-php/ + # http://php.net/manual/en/function.iptcembed.php + # + { + $len = strlen($val); + if ($len < 0x8000) + { + return chr(0x1c) . chr($rec) . chr($dat) . + chr($len >> 8) . + chr($len & 0xff) . + $val; + } + else + { + return chr(0x1c) . chr($rec) . chr($dat) . + chr(0x80) . chr(0x04) . + chr(($len >> 24) & 0xff) . + chr(($len >> 16) & 0xff) . + chr(($len >> 8) & 0xff) . + chr(($len) & 0xff) . + $val; + } + } + + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Write XMP Data +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + //http://xmpphptoolkit.sourceforge.net/ + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Text +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addText($text, $pos = '20x20', $padding = 0, $fontColor = '#fff', $fontSize = 12, $angle = 0, $font = null) + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Add text to an image + # Param in: + # Param out: + # Reference: http://php.net/manual/en/function.imagettftext.php + # Notes: Make sure you supply the font. + # + { + + // *** Convert color + $rgbArray = $this->formatColor($fontColor); + $r = $rgbArray['r']; + $g = $rgbArray['g']; + $b = $rgbArray['b']; + + // *** Get text font + $font = $this->getTextFont($font); + + // *** Get text size + $textSizeArray = $this->getTextSize($fontSize, $angle, $font, $text); + $textWidth = $textSizeArray['width']; + $textHeight = $textSizeArray['height']; + + // *** Find co-ords to place text + $posArray = $this->calculatePosition($pos, $padding, $textWidth, $textHeight, false); + $x = $posArray['width']; + $y = $posArray['height']; + + $fontColor = imagecolorallocate($this->imageResized, $r, $g, $b); + + // *** Add text + imagettftext($this->imageResized, $fontSize, $angle, $x, $y, $fontColor, $font, $text); + } + + ## -------------------------------------------------------- + + private function getTextFont($font) + { + // *** Font path (shou + $fontPath = dirname(__FILE__) . '/' . $this->fontDir; + + + // *** The below is/may be needed depending on your version (see ref) + putenv('GDFONTPATH=' . realpath('.')); + + // *** Check if the passed in font exsits... + if ($font == null || ! file_exists($font)) + { + + // *** ...If not, default to this font. + $font = $fontPath . '/arimo.ttf'; + + // *** Check our default font exists... + if ( ! file_exists($font)) + { + + // *** If not, return false + if ($this->debug) + { + throw new Exception('Font not found'); + } + else + { + return false; + } + } + } + + return $font; + + } + + ## -------------------------------------------------------- + + private function getTextSize($fontSize, $angle, $font, $text) + { + + // *** Define box (so we can get the width) + $box = @imageTTFBbox($fontSize, $angle, $font, $text); + + // *** Get width of text from dimensions + $textWidth = abs($box[4] - $box[0]); + + // *** Get height of text from dimensions (should also be same as $fontSize) + $textHeight = abs($box[5] - $box[1]); + + return array( 'height' => $textHeight, 'width' => $textWidth ); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + Add Watermark +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + public function addWatermark($watermarkImage, $pos, $padding = 0, $opacity = 0) + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Add watermark image + # Param in: (str) $watermark: The watermark image + # (str) $pos: Could be a pre-determined position such as: + # tl = top left, + # t = top (middle), + # tr = top right, + # l = left, + # m = middle, + # r = right, + # bl = bottom left, + # b = bottom (middle), + # br = bottom right + # Or, it could be a co-ordinate position such as: 50x100 + # + # (int) $padding: If using a pre-determined position you can + # adjust the padding from the edges by passing an amount + # in pixels. If using co-ordinates, this value is ignored. + # Param out: + # Reference: http://www.php.net/manual/en/image.examples-watermark.php + # Notes: Based on example in reference. + # + # + { + + // Load the stamp and the photo to apply the watermark to + $stamp = $this->openImage($watermarkImage); # stamp + $im = $this->imageResized; # photo + + // *** Get stamps width and height + $sx = imagesx($stamp); + $sy = imagesy($stamp); + + // *** Find co-ords to place image + $posArray = $this->calculatePosition($pos, $padding, $sx, $sy); + $x = $posArray['width']; + $y = $posArray['height']; + + // *** Set watermark opacity + if (fix_strtolower(strrchr($watermarkImage, '.')) == '.png') + { + + $opacity = $this->invertTransparency($opacity, 100); + $this->filterOpacity($stamp, $opacity); + } + + // Copy the watermark image onto our photo + imagecopy($im, $stamp, $x, $y, 0, 0, imagesx($stamp), imagesy($stamp)); + + } + + ## -------------------------------------------------------- + + private function calculatePosition($pos, $padding, $assetWidth, $assetHeight, $upperLeft = true) + # + # Author: Jarrod Oberto + # Date: 08-05-11 + # Purpose: Calculate the x, y pixel cordinates of the asset to place + # Params in: (str) $pos: Either something like: "tl", "l", "br" or an + # exact position like: "100x50" + # (int) $padding: The amount of padding from the edge. Only + # used for the predefined $pos. + # (int) $assetWidth: The width of the asset to add to the image + # (int) $assetHeight: The height of the asset to add to the image + # (bol) $upperLeft: if true, the asset will be positioned based + # on the upper left x, y coords. If false, it means you're + # using the lower left as the basepoint and this will + # convert it to the upper left position + # Params out: + # NOTE: this is done from the UPPER left corner!! But will convert lower + # left basepoints to upper left if $upperleft is set to false + # + # + { + $pos = fix_strtolower($pos); + + // *** If co-ords have been entered + if (strstr($pos, 'x')) + { + $pos = str_replace(' ', '', $pos); + + $xyArray = explode('x', $pos); + list($width, $height) = $xyArray; + + } + else + { + + switch ($pos) + { + case 'tl': + $width = 0 + $padding; + $height = 0 + $padding; + break; + + case 't': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = 0 + $padding; + break; + + case 'tr': + $width = $this->width - $assetWidth - $padding; + $height = 0 + $padding;; + break; + + case 'l': + $width = 0 + $padding; + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'm': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'r': + $width = $this->width - $assetWidth - $padding; + $height = ($this->height / 2) - ($assetHeight / 2); + break; + + case 'bl': + $width = 0 + $padding; + $height = $this->height - $assetHeight - $padding; + break; + + case 'b': + $width = ($this->width / 2) - ($assetWidth / 2); + $height = $this->height - $assetHeight - $padding; + break; + + case 'br': + $width = $this->width - $assetWidth - $padding; + $height = $this->height - $assetHeight - $padding; + break; + + default: + $width = 0; + $height = 0; + break; + } + } + + if ( ! $upperLeft) + { + $height = $height + $assetHeight; + } + + return array( 'width' => $width, 'height' => $height ); + } + + + ## -------------------------------------------------------- + + private function filterOpacity(&$img, $opacity = 75) + # + # Author: aiden dot mail at freemail dot hu + # Author date: 29-03-08 08:16 + # Date added: 08-05-11 + # Purpose: Change opacity of image + # Params in: $img: Image resource id + # (int) $opacity: the opacity amount: 0-100, 100 being not opaque. + # Params out: (bool) true on success, else false + # Ref: http://www.php.net/manual/en/function.imagefilter.php#82162 + # Notes: png only + # + { + + if ( ! isset($opacity)) + { + return false; + } + + if ($opacity == 100) + { + return true; + } + + $opacity /= 100; + + //get image width and height + $w = imagesx($img); + $h = imagesy($img); + + //turn alpha blending off + imagealphablending($img, false); + + //find the most opaque pixel in the image (the one with the smallest alpha value) + $minalpha = 127; + for ($x = 0; $x < $w; $x++) + { + for ($y = 0; $y < $h; $y++) + { + $alpha = (imagecolorat($img, $x, $y) >> 24) & 0xFF; + if ($alpha < $minalpha) + { + $minalpha = $alpha; + } + } + } + + //loop through image pixels and modify alpha for each + for ($x = 0; $x < $w; $x++) + { + for ($y = 0; $y < $h; $y++) + { + //get current alpha value (represents the TANSPARENCY!) + $colorxy = imagecolorat($img, $x, $y); + $alpha = ($colorxy >> 24) & 0xFF; + //calculate new alpha + if ($minalpha !== 127) + { + $alpha = 127 + 127 * $opacity * ($alpha - 127) / (127 - $minalpha); + } + else + { + $alpha += 127 * $opacity; + } + //get the color index with new alpha + $alphacolorxy = imagecolorallocatealpha($img, ($colorxy >> 16) & 0xFF, ($colorxy >> 8) & 0xFF, $colorxy & 0xFF, $alpha); + //set pixel with the new color + opacity + if ( ! imagesetpixel($img, $x, $y, $alphacolorxy)) + { + + return false; + } + } + } + + return true; + } + +## -------------------------------------------------------- + + private function openImage($file) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: + # Param in: + # Param out: n/a + # Reference: + # Notes: + # + { + + if ( ! file_exists($file) && ! $this->checkStringStartsWith('http://', $file) && ! $this->checkStringStartsWith('https://', $file) ) + { + if ($this->debug) + { + throw new Exception('Image not found.'); + } + else + { + throw new Exception(); + } + }; + + // *** Get extension / image type + $extension = mime_content_type($file); + $extension = fix_strtolower($extension); + $extension = str_replace('image/', '', $extension); + switch ($extension) + { + case 'jpg': + case 'jpeg': + $img = @imagecreatefromjpeg($file); + break; + case 'gif': + $img = @imagecreatefromgif($file); + break; + case 'png': + $img = @imagecreatefrompng($file); + break; + case 'bmp': + $img = @$this->imagecreatefrombmp($file); + break; + case 'psd': + case 'vnd.adobe.photoshop': + $img = @$this->imagecreatefrompsd($file); + break; + + + // ... etc + + default: + $img = false; + break; + } + + return $img; + } + +## -------------------------------------------------------- + + public function reset() + # + # Author: Jarrod Oberto + # Date: 30-08-11 + # Purpose: Reset the resource (allow further editing) + # Params in: + # Params out: + # Notes: + # + { + $this->__construct($this->fileName); + } + +## -------------------------------------------------------- + + public function saveImage($savePath, $imageQuality = "100") + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Saves the image + # Param in: $savePath: Where to save the image including filename: + # $imageQuality: image quality you want the image saved at 0-100 + # Param out: n/a + # Reference: + # Notes: * gif doesn't have a quality parameter + # * jpg has a quality setting 0-100 (100 being the best) + # * png has a quality setting 0-9 (0 being the best) + # + # * bmp files have no native support for bmp files. We use a + # third party class to save as bmp. + { + + // *** Perform a check or two. + if ( ! is_resource($this->imageResized)) + { + if ($this->debug) + { + throw new Exception('saveImage: This is not a resource.'); + } + else + { + throw new Exception(); + } + } + $fileInfoArray = pathInfo($savePath); + clearstatcache(); + if ( ! is_writable($fileInfoArray['dirname'])) + { + if ($this->debug) + { + throw new Exception('The path is not writable. Please check your permissions.'); + } + else + { + throw new Exception(); + } + } + + // *** Get extension + $extension = strrchr($savePath, '.'); + $extension = fix_strtolower($extension); + + $error = ''; + + switch ($extension) + { + case '.jpg': + case '.jpeg': + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_JPG) + { + imagejpeg($this->imageResized, $savePath, $imageQuality); + } + else + { + $error = 'jpg'; + } + break; + + case '.gif': + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_GIF) + { + imagegif($this->imageResized, $savePath); + } + else + { + $error = 'gif'; + } + break; + + case '.png': + // *** Scale quality from 0-100 to 0-9 + $scaleQuality = round(($imageQuality / 100) * 9); + + // *** Invert qualit setting as 0 is best, not 9 + $invertScaleQuality = 9 - $scaleQuality; + + $this->checkInterlaceImage($this->isInterlace); + if (imagetypes() & IMG_PNG) + { + imagepng($this->imageResized, $savePath, $invertScaleQuality); + } + else + { + $error = 'png'; + } + break; + + case '.bmp': + file_put_contents($savePath, $this->GD2BMPstring($this->imageResized)); + break; + + + // ... etc + + default: + // *** No extension - No save. + $this->errorArray[] = 'This file type (' . $extension . ') is not supported. File not saved.'; + break; + } + + //imagedestroy($this->imageResized); + + // *** Display error if a file type is not supported. + if ($error != '') + { + $this->errorArray[] = $error . ' support is NOT enabled. File not saved.'; + } + } + +## -------------------------------------------------------- + + public function displayImage($fileType = 'jpg', $imageQuality = "100") + # Author: Jarrod Oberto + # Date: 18-11-09 + # Purpose: Display images directly to the browser + # Param in: The image type you want to display + # Param out: + # Reference: + # Notes: + # + { + + if ( ! is_resource($this->imageResized)) + { + if ($this->debug) + { + throw new Exception('saveImage: This is not a resource.'); + } + else + { + throw new Exception(); + } + } + + switch ($fileType) + { + case 'jpg': + case 'jpeg': + header('Content-type: image/jpeg'); + imagejpeg($this->imageResized, '', $imageQuality); + break; + case 'gif': + header('Content-type: image/gif'); + imagegif($this->imageResized); + break; + case 'png': + header('Content-type: image/png'); + + // *** Scale quality from 0-100 to 0-9 + $scaleQuality = round(($imageQuality / 100) * 9); + + // *** Invert qualit setting as 0 is best, not 9 + $invertScaleQuality = 9 - $scaleQuality; + + imagepng($this->imageResized, '', $invertScaleQuality); + break; + case 'bmp': + echo 'bmp file format is not supported.'; + break; + + // ... etc + + default: + // *** No extension - No save. + break; + } + + + //imagedestroy($this->imageResized); + } + +## -------------------------------------------------------- + + public function setTransparency($bool) + # Sep 2011 + { + $this->keepTransparency = $bool; + } + +## -------------------------------------------------------- + + public function setFillColor($value) + # Sep 2011 + # Param in: (mixed) $value: (array) Could be an array of RGB + # (str) Could be hex #ffffff or #fff, fff, ffffff + # + # If the keepTransparency is set to false, then no transparency is to be used. + # This is ideal when you want to save as jpg. + # + # this method allows you to set the background color to use instead of + # transparency. + # + { + $colorArray = $this->formatColor($value); + $this->fillColorArray = $colorArray; + } + +## -------------------------------------------------------- + + public function setCropFromTop($value) + # Sep 2011 + { + $this->cropFromTopPercent = $value; + } + +## -------------------------------------------------------- + + public function testGDInstalled() + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test to see if GD is installed + # Param in: n/a + # Param out: (bool) True is gd extension loaded otherwise false + # Reference: + # Notes: + # + { + if (extension_loaded('gd') && function_exists('gd_info')) + { + $gdInstalled = true; + } + else + { + $gdInstalled = false; + } + + return $gdInstalled; + } + +## -------------------------------------------------------- + + public function testEXIFInstalled() + # Author: Jarrod Oberto + # Date: 08-05-11 + # Purpose: Test to see if EXIF is installed + # Param in: n/a + # Param out: (bool) True is exif extension loaded otherwise false + # Reference: + # Notes: + # + { + if (extension_loaded('exif')) + { + $exifInstalled = true; + } + else + { + $exifInstalled = false; + } + + return $exifInstalled; + } + +## -------------------------------------------------------- + + public function testIsImage($image) + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test if file is an image + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + if ($image) + { + $fileIsImage = true; + } + else + { + $fileIsImage = false; + } + + return $fileIsImage; + } + +## -------------------------------------------------------- + + public function testFunct() + # Author: Jarrod Oberto + # Date: 27-02-08 + # Purpose: Test Function + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + echo $this->height; + } + +## -------------------------------------------------------- + + public function setForceStretch($value) + # Author: Jarrod Oberto + # Date: 23-12-10 + # Purpose: + # Param in: (bool) $value + # Param out: n/a + # Reference: + # Notes: + # + { + $this->forceStretch = $value; + } + +## -------------------------------------------------------- + + public function setFile($fileName) + # Author: Jarrod Oberto + # Date: 28-02-08 + # Purpose: + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + self::__construct($fileName); + } + +## -------------------------------------------------------- + + public function getFileName() + # Author: Jarrod Oberto + # Date: 10-09-08 + # Purpose: + # Param in: n/a + # Param out: n/a + # Reference: + # Notes: + # + { + return $this->fileName; + } + +## -------------------------------------------------------- + + public function getHeight() + { + return $this->height; + } + +## -------------------------------------------------------- + + public function getWidth() + { + return $this->width; + } + +## -------------------------------------------------------- + + public function getOriginalHeight() + { + return $this->heightOriginal; + } + +## -------------------------------------------------------- + + public function getOriginalWidth() + { + return $this->widthOriginal; + } + +## -------------------------------------------------------- + + public function getErrors() + # Author: Jarrod Oberto + # Date: 19-11-09 + # Purpose: Returns the error array + # Param in: n/a + # Param out: Array of errors + # Reference: + # Notes: + # + { + return $this->errorArray; + } + +## -------------------------------------------------------- + + private function checkInterlaceImage($isEnabled) + # jpg will use progressive (they don't use interace) + { + if ($isEnabled) + { + imageinterlace($this->imageResized, $isEnabled); + } + } + +## -------------------------------------------------------- + + protected function formatColor($value) + # Author: Jarrod Oberto + # Date: 09-05-11 + # Purpose: Determine color method passed in and return color as RGB + # Param in: (mixed) $value: (array) Could be an array of RGB + # (str) Could be hex #ffffff or #fff, fff, ffffff + # Param out: + # Reference: + # Notes: + # + { + $rgbArray = array(); + + // *** If it's an array it should be R, G, B + if (is_array($value)) + { + + if (key($value) == 0 && count($value) == 3) + { + + $rgbArray['r'] = $value[0]; + $rgbArray['g'] = $value[1]; + $rgbArray['b'] = $value[2]; + + } + else + { + $rgbArray = $value; + } + } + else + { + if (fix_strtolower($value) == 'transparent') + { + + $rgbArray = array( + 'r' => 255, + 'g' => 255, + 'b' => 255, + 'a' => 127 + ); + + } + else + { + + // *** ...Else it should be hex. Let's make it RGB + $rgbArray = $this->hex2dec($value); + } + } + + return $rgbArray; + } + + ## -------------------------------------------------------- + + function hex2dec($hex) + # Purpose: Convert #hex color to RGB + { + $color = str_replace('#', '', $hex); + + if (strlen($color) == 3) + { + $color = $color . $color; + } + + $rgb = array( + 'r' => hexdec(substr($color, 0, 2)), + 'g' => hexdec(substr($color, 2, 2)), + 'b' => hexdec(substr($color, 4, 2)), + 'a' => 0 + ); + + return $rgb; + } + + ## -------------------------------------------------------- + + private function createImageColor($colorArray) + { + $r = $colorArray['r']; + $g = $colorArray['g']; + $b = $colorArray['b']; + + return imagecolorallocate($this->imageResized, $r, $g, $b); + } + + ## -------------------------------------------------------- + + private function testColorExists($colorArray) + { + $r = $colorArray['r']; + $g = $colorArray['g']; + $b = $colorArray['b']; + + if (imagecolorexact($this->imageResized, $r, $g, $b) == -1) + { + return false; + } + else + { + return true; + } + } + + ## -------------------------------------------------------- + + private function findUnusedGreen() + # Purpose: We find a green color suitable to use like green-screen effect. + # Therefore, the color must not exist in the image. + { + $green = 255; + + do + { + + $greenChroma = array( 0, $green, 0 ); + $colorArray = $this->formatColor($greenChroma); + $match = $this->testColorExists($colorArray); + $green--; + + } while ($match == false && $green > 0); + + // *** If no match, just bite the bullet and use green value of 255 + if ( ! $match) + { + $greenChroma = array( 0, $green, 0 ); + } + + return $greenChroma; + } + + ## -------------------------------------------------------- + + private function findUnusedBlue() + # Purpose: We find a green color suitable to use like green-screen effect. + # Therefore, the color must not exist in the image. + { + $blue = 255; + + do + { + + $blueChroma = array( 0, 0, $blue ); + $colorArray = $this->formatColor($blueChroma); + $match = $this->testColorExists($colorArray); + $blue--; + + } while ($match == false && $blue > 0); + + // *** If no match, just bite the bullet and use blue value of 255 + if ( ! $match) + { + $blueChroma = array( 0, 0, $blue ); + } + + return $blueChroma; + } + + ## -------------------------------------------------------- + + private function invertTransparency($value, $originalMax, $invert = true) + # Purpose: This does two things: + # 1) Convert the range from 0-127 to 0-100 + # 2) Inverts value to 100 is not transparent while 0 is fully + # transparent (like Photoshop) + { + // *** Test max range + if ($value > $originalMax) + { + $value = $originalMax; + } + + // *** Test min range + if ($value < 0) + { + $value = 0; + } + + if ($invert) + { + return $originalMax - (($value / 100) * $originalMax); + } + else + { + return ($value / 100) * $originalMax; + } + } + + ## -------------------------------------------------------- + + private function transparentImage($src) + { + // *** making images with white bg transparent + $r1 = 0; + $g1 = 255; + $b1 = 0; + for ($x = 0; $x < imagesx($src); ++$x) + { + for ($y = 0; $y < imagesy($src); ++$y) + { + $color = imagecolorat($src, $x, $y); + $r = ($color >> 16) & 0xFF; + $g = ($color >> 8) & 0xFF; + $b = $color & 0xFF; + for ($i = 0; $i < 270; $i++) + { + //if ($r . $g . $b == ($r1 + $i) . ($g1 + $i) . ($b1 + $i)) { + if ($r == 0 && $g == 255 && $b == 0) + { + //if ($g == 255) { + $trans_colour = imagecolorallocatealpha($src, 0, 0, 0, 127); + imagefill($src, $x, $y, $trans_colour); + } + } + } + } + + return $src; + } + + ## -------------------------------------------------------- + + function checkStringStartsWith($needle, $haystack) + # Check if a string starts with a specific pattern + { + return (substr($haystack, 0, strlen($needle)) == $needle); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + BMP SUPPORT (SAVING) - James Heinrich +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function GD2BMPstring(&$gd_image) + # Author: James Heinrich + # Purpose: Save file as type bmp + # Param in: The image canvas (passed as ref) + # Param out: + # Reference: + # Notes: This code was stripped out of two external files + # (phpthumb.bmp.php,phpthumb.functions.php) and added below to + # avoid dependancies. + # + { + $imageX = ImageSX($gd_image); + $imageY = ImageSY($gd_image); + + $BMP = ''; + for ($y = ($imageY - 1); $y >= 0; $y--) + { + $thisline = ''; + for ($x = 0; $x < $imageX; $x++) + { + $argb = $this->GetPixelColor($gd_image, $x, $y); + $thisline .= chr($argb['blue']) . chr($argb['green']) . chr($argb['red']); + } + while (strlen($thisline) % 4) + { + $thisline .= "\x00"; + } + $BMP .= $thisline; + } + + $bmpSize = strlen($BMP) + 14 + 40; + // BITMAPFILEHEADER [14 bytes] - http://msdn.microsoft.com/library/en-us/gdi/bitmaps_62uq.asp + $BITMAPFILEHEADER = 'BM'; // WORD bfType; + $BITMAPFILEHEADER .= $this->LittleEndian2String($bmpSize, 4); // DWORD bfSize; + $BITMAPFILEHEADER .= $this->LittleEndian2String(0, 2); // WORD bfReserved1; + $BITMAPFILEHEADER .= $this->LittleEndian2String(0, 2); // WORD bfReserved2; + $BITMAPFILEHEADER .= $this->LittleEndian2String(54, 4); // DWORD bfOffBits; + + // BITMAPINFOHEADER - [40 bytes] http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1rw2.asp + $BITMAPINFOHEADER = $this->LittleEndian2String(40, 4); // DWORD biSize; + $BITMAPINFOHEADER .= $this->LittleEndian2String($imageX, 4); // LONG biWidth; + $BITMAPINFOHEADER .= $this->LittleEndian2String($imageY, 4); // LONG biHeight; + $BITMAPINFOHEADER .= $this->LittleEndian2String(1, 2); // WORD biPlanes; + $BITMAPINFOHEADER .= $this->LittleEndian2String(24, 2); // WORD biBitCount; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biCompression; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biSizeImage; + $BITMAPINFOHEADER .= $this->LittleEndian2String(2835, 4); // LONG biXPelsPerMeter; + $BITMAPINFOHEADER .= $this->LittleEndian2String(2835, 4); // LONG biYPelsPerMeter; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biClrUsed; + $BITMAPINFOHEADER .= $this->LittleEndian2String(0, 4); // DWORD biClrImportant; + + return $BITMAPFILEHEADER . $BITMAPINFOHEADER . $BMP; + } + +## -------------------------------------------------------- + + private function GetPixelColor(&$img, $x, $y) + # Author: James Heinrich + # Purpose: + # Param in: + # Param out: + # Reference: + # Notes: + # + { + if ( ! is_resource($img)) + { + return false; + } + + return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y)); + } + +## -------------------------------------------------------- + + private function LittleEndian2String($number, $minbytes = 1) + # Author: James Heinrich + # Purpose: BMP SUPPORT (SAVING) + # Param in: + # Param out: + # Reference: + # Notes: + # + { + $intstring = ''; + while ($number > 0) + { + $intstring = $intstring . chr($number & 255); + $number >>= 8; + } + + return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + BMP SUPPORT (READING) +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function ImageCreateFromBMP($filename) + # Author: DHKold + # Date: The 15th of June 2005 + # Version: 2.0B + # Purpose: To create an image from a BMP file. + # Param in: BMP file to open. + # Param out: Return a resource like the other ImageCreateFrom functions + # Reference: http://us3.php.net/manual/en/function.imagecreate.php#53879 + # Bug fix: Author: domelca at terra dot es + # Date: 06 March 2008 + # Fix: Correct 16bit BMP support + # Notes: + # + { + + //Ouverture du fichier en mode binaire + if ( ! $f1 = fopen($filename, "rb")) + { + return false; + } + + //1 : Chargement des ent�tes FICHIER + $FILE = unpack("vfile_type/Vfile_size/Vreserved/Vbitmap_offset", fread($f1, 14)); + if ($FILE['file_type'] != 19778) + { + return false; + } + + //2 : Chargement des ent�tes BMP + $BMP = unpack('Vheader_size/Vwidth/Vheight/vplanes/vbits_per_pixel' . + '/Vcompression/Vsize_bitmap/Vhoriz_resolution' . + '/Vvert_resolution/Vcolors_used/Vcolors_important', fread($f1, 40)); + $BMP['colors'] = pow(2, $BMP['bits_per_pixel']); + + if ($BMP['size_bitmap'] == 0) + { + $BMP['size_bitmap'] = $FILE['file_size'] - $FILE['bitmap_offset']; + } + + $BMP['bytes_per_pixel'] = $BMP['bits_per_pixel'] / 8; + $BMP['bytes_per_pixel2'] = ceil($BMP['bytes_per_pixel']); + $BMP['decal'] = ($BMP['width'] * $BMP['bytes_per_pixel'] / 4); + $BMP['decal'] -= floor($BMP['width'] * $BMP['bytes_per_pixel'] / 4); + $BMP['decal'] = 4 - (4 * $BMP['decal']); + + if ($BMP['decal'] == 4) + { + $BMP['decal'] = 0; + } + + //3 : Chargement des couleurs de la palette + $PALETTE = array(); + if ($BMP['colors'] < 16777216) + { + $PALETTE = unpack('V' . $BMP['colors'], fread($f1, $BMP['colors'] * 4)); + } + + //4 : Cr�ation de l'image + $IMG = fread($f1, $BMP['size_bitmap']); + $VIDE = chr(0); + + $res = imagecreatetruecolor($BMP['width'], $BMP['height']); + $P = 0; + $Y = $BMP['height'] - 1; + while ($Y >= 0) + { + $X = 0; + while ($X < $BMP['width']) + { + if ($BMP['bits_per_pixel'] == 24) + { + $COLOR = unpack("V", substr($IMG, $P, 3) . $VIDE); + } + elseif ($BMP['bits_per_pixel'] == 16) + { + + /* + * BMP 16bit fix + * ================= + * + * Ref: http://us3.php.net/manual/en/function.imagecreate.php#81604 + * + * Notes: + * "don't work with bmp 16 bits_per_pixel. change pixel + * generator for this." + * + */ + + // *** Original code (don't work) + //$COLOR = unpack("n",substr($IMG,$P,2)); + //$COLOR[1] = $PALETTE[$COLOR[1]+1]; + + $COLOR = unpack("v", substr($IMG, $P, 2)); + $blue = ($COLOR[1] & 0x001f) << 3; + $green = ($COLOR[1] & 0x07e0) >> 3; + $red = ($COLOR[1] & 0xf800) >> 8; + $COLOR[1] = $red * 65536 + $green * 256 + $blue; + + } + elseif ($BMP['bits_per_pixel'] == 8) + { + $COLOR = unpack("n", $VIDE . substr($IMG, $P, 1)); + $COLOR[1] = $PALETTE[ $COLOR[1] + 1 ]; + } + elseif ($BMP['bits_per_pixel'] == 4) + { + $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1)); + if (($P * 2) % 2 == 0) + { + $COLOR[1] = ($COLOR[1] >> 4); + } + else + { + $COLOR[1] = ($COLOR[1] & 0x0F); + } + $COLOR[1] = $PALETTE[ $COLOR[1] + 1 ]; + } + elseif ($BMP['bits_per_pixel'] == 1) + { + $COLOR = unpack("n", $VIDE . substr($IMG, floor($P), 1)); + if (($P * 8) % 8 == 0) + { + $COLOR[1] = $COLOR[1] >> 7; + } + elseif (($P * 8) % 8 == 1) + { + $COLOR[1] = ($COLOR[1] & 0x40) >> 6; + } + elseif (($P * 8) % 8 == 2) + { + $COLOR[1] = ($COLOR[1] & 0x20) >> 5; + } + elseif (($P * 8) % 8 == 3) + { + $COLOR[1] = ($COLOR[1] & 0x10) >> 4; + } + elseif (($P * 8) % 8 == 4) + { + $COLOR[1] = ($COLOR[1] & 0x8) >> 3; + } + elseif (($P * 8) % 8 == 5) + { + $COLOR[1] = ($COLOR[1] & 0x4) >> 2; + } + elseif (($P * 8) % 8 == 6) + { + $COLOR[1] = ($COLOR[1] & 0x2) >> 1; + } + elseif (($P * 8) % 8 == 7) + { + $COLOR[1] = ($COLOR[1] & 0x1); + } + $COLOR[1] = $PALETTE[ $COLOR[1] + 1 ]; + } + else + { + return false; + } + + imagesetpixel($res, $X, $Y, $COLOR[1]); + $X++; + $P += $BMP['bytes_per_pixel']; + } + + $Y--; + $P += $BMP['decal']; + } + //Fermeture du fichier + fclose($f1); + + return $res; + } + + + /*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*- + PSD SUPPORT (READING) +*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*/ + + private function imagecreatefrompsd($fileName) + # Author: Tim de Koning + # Version: 1.3 + # Purpose: To create an image from a PSD file. + # Param in: PSD file to open. + # Param out: Return a resource like the other ImageCreateFrom functions + # Reference: http://www.kingsquare.nl/phppsdreader + # Notes: + # + { + if (file_exists($this->psdReaderPath)) + { + + + include_once($this->psdReaderPath); + + $psdReader = new PhpPsdReader($fileName); + + if (isset($psdReader->infoArray['error'])) + { + return ''; + } + else + { + return $psdReader->getImage(); + } + } + else + { + return false; + } + } + +## -------------------------------------------------------- + + public function __destruct() + { + if (is_resource($this->imageResized)) + { + imagedestroy($this->imageResized); + } + } + +## -------------------------------------------------------- + +} + + +/* + * Example with some API calls (outdated): + * + * + * =============================== + * Compulsary + * =============================== + * + * include("classes/resize_class.php"); + * + * // *** Initialise object + * $magicianObj = new resize('images/cars/large/a.jpg'); + * + * // *** Turn off stretching (optional) + * $magicianObj -> setForceStretch(false); + * + * // *** Resize object + * $magicianObj -> resizeImage(150, 100, 0); + * + * =============================== + * Image options - can run none, one, or all. + * =============================== + * + * // *** Add watermark + * $magicianObj -> addWatermark('stamp.png'); + * + * // *** Add text + * $magicianObj -> addText('testing...'); + * + * =============================== + * Output options - can run one, or the other, or both. + * =============================== + * + * // *** Save image to disk + * $magicianObj -> saveImage('images/cars/large/b.jpg', 100); + * + * // *** Or output to screen (params in can be jpg, gif, png) + * $magicianObj -> displayImage('png'); + * + * =============================== + * Return options - return errors. nice for debuggin. + * =============================== + * + * // *** Return error array + * $errorArray = $magicianObj -> getErrors(); + * + * + * =============================== + * Cleanup options - not really neccessary, but good practice + * =============================== + * + * // *** Free used memory + * $magicianObj -> __destruct(); + */ diff --git a/core/vendor/filemanager/include/utils.php b/core/vendor/filemanager/include/utils.php new file mode 100755 index 00000000..ce399b94 --- /dev/null +++ b/core/vendor/filemanager/include/utils.php @@ -0,0 +1,1168 @@ +send(); + exit; + } + + } + if(file_exists('lang/' . $lang . '.php')){ + $lang_vars = include 'lang/' . $lang . '.php'; + }else{ + $lang_vars = include '../lang/' . $lang . '.php'; + } + + if ( ! is_array($lang_vars)) + { + $lang_vars = array(); + } +} + +/** +* Delete directory +* +* @param string $dir +* +* @return bool +*/ +function deleteDir($dir,$ftp = null, $config = null) +{ + if($ftp){ + + try{ + $ftp->rmdir($dir); + return true; + + }catch(FtpClient\FtpException $e){ + return null; + } + + }else{ + if ( ! file_exists($dir)) + { + return false; + } + if ( ! is_dir($dir)) + { + return unlink($dir); + } + foreach (scandir($dir) as $item) + { + if ($item == '.' || $item == '..') + { + continue; + } + if ( ! deleteDir($dir . DIRECTORY_SEPARATOR . $item)) + { + return false; + } + } + } + + return rmdir($dir); +} + +/** +* Make a file copy +* +* @param string $old_path +* @param string $name New file name without extension +* +* @return bool +*/ +function duplicate_file( $old_path, $name, $ftp = null, $config = null ) +{ + $info = pathinfo($old_path); + $new_path = $info['dirname'] . "/" . $name . "." . $info['extension']; + if($ftp){ + try{ + $tmp = time().$name . "." . $info['extension']; + $ftp->get($tmp, "/".$old_path, FTP_BINARY); + $ftp->put("/".$new_path, $tmp, FTP_BINARY); + unlink($tmp); + return true; + + }catch(FtpClient\FtpException $e){ + return null; + } + }else{ + if (file_exists($old_path)) + { + if (file_exists($new_path) && $old_path == $new_path) + { + return false; + } + + return copy($old_path, $new_path); + } + } +} + + +/** +* Rename file +* +* @param string $old_path File to rename +* @param string $name New file name without extension +* @param bool $transliteration +* +* @return bool +*/ +function rename_file($old_path, $name, $ftp = null, $config = null) +{ + $name = fix_filename($name, $config); + $info = pathinfo($old_path); + $new_path = $info['dirname'] . "/" . $name . "." . $info['extension']; + if($ftp){ + try{ + return $ftp->rename("/".$old_path, "/".$new_path); + }catch(FtpClient\FtpException $e){ + return false; + } + }else{ + if (file_exists($old_path)) + { + $new_path = $info['dirname'] . "/" . $name . "." . $info['extension']; + if (file_exists($new_path) && $old_path == $new_path) + { + return false; + } + + return rename($old_path, $new_path); + } + } +} + + +function url_exists($url){ + if (!$fp = curl_init($url)) return false; + return true; +} + + +function tempdir() { + $tempfile=tempnam(sys_get_temp_dir(),''); + if (file_exists($tempfile)) { unlink($tempfile); } + mkdir($tempfile); + if (is_dir($tempfile)) { return $tempfile; } +} + + +/** +* Rename directory +* +* @param string $old_path Directory to rename +* @param string $name New directory name +* @param bool $transliteration +* +* @return bool +*/ +function rename_folder($old_path, $name, $ftp = null, $config = null) +{ + $name = fix_filename($name, $config, true); + $new_path = fix_dirname($old_path) . "/" . $name; + if($ftp){ + if($ftp->chdir("/".$old_path)){ + if(@$ftp->chdir($new_path)){ + return false; + } + return $ftp->rename("/".$old_path, "/".$new_path); + } + }else{ + if (file_exists($old_path)) + { + if (file_exists($new_path) && $old_path == $new_path) + { + return false; + } + + return rename($old_path, $new_path); + } + } +} + +function ftp_con($config){ + if(isset($config['ftp_host']) && $config['ftp_host']){ + // *** Include the class + include('include/FtpClient.php'); + include('include/FtpException.php'); + include('include/FtpWrapper.php'); + + $ftp = new \FtpClient\FtpClient(); + try{ + $ftp->connect($config['ftp_host'],$config['ftp_ssl'],$config['ftp_port']); + $ftp->login($config['ftp_user'], $config['ftp_pass']); + $ftp->pasv(true); + return $ftp; + }catch(FtpClient\FtpException $e){ + echo "Error: "; + echo $e->getMessage(); + echo " to server "; + $tmp = $e->getTrace(); + echo $tmp[0]['args'][0]; + echo "
    Please check configurations"; + die(); + } + }else{ + return false; + } +} + +/** +* Create new image from existing file +* +* @param string $imgfile Source image file name +* @param string $imgthumb Thumbnail file name +* @param int $newwidth Thumbnail width +* @param int $newheight Optional thumbnail height +* @param string $option Type of resize +* +* @return bool +* @throws \Exception +*/ +function create_img($imgfile, $imgthumb, $newwidth, $newheight = null, $option = "crop",$config = array()) +{ + $result = false; + if(isset($config['ftp_host']) && $config['ftp_host']){ + if(url_exists($imgfile)){ + $temp = tempnam('/tmp','RF'); + unlink($temp); + $temp .=".".substr(strrchr($imgfile,'.'),1); + $handle = fopen($temp, "w"); + fwrite($handle, file_get_contents($imgfile)); + fclose($handle); + $imgfile= $temp; + $save_ftp = $imgthumb; + $imgthumb = $temp; + } + } + if(file_exists($imgfile) || strpos($imgfile,'http')===0){ + if (strpos($imgfile,'http')===0 || image_check_memory_usage($imgfile, $newwidth, $newheight)) + { + require_once('php_image_magician.php'); + try{ + $magicianObj = new imageLib($imgfile); + $magicianObj->resizeImage($newwidth, $newheight, $option); + $magicianObj->saveImage($imgthumb, 80); + }catch (Exception $e){ + return $e->getMessage(); + } + $result = true; + } + } + if($result && isset($config['ftp_host']) && $config['ftp_host'] ){ + $ftp->put($save_ftp, $imgthumb, FTP_BINARY); + unlink($imgthumb); + } + + return $result; +} + +/** +* Convert convert size in bytes to human readable +* +* @param int $size +* +* @return string +*/ +function makeSize($size) +{ + $units = array( 'B', 'KB', 'MB', 'GB', 'TB' ); + $u = 0; + while ((round($size / 1024) > 0) && ($u < 4)) + { + $size = $size / 1024; + $u++; + } + + return (number_format($size, 0) . " " . trans($units[ $u ])); +} + +/** +* Determine directory size +* +* @param string $path +* +* @return int +*/ +function folder_info($path,$count_hidden=true) +{ + global $hidden_folders,$hidden_files; + $total_size = 0; + $files = scandir($path); + $cleanPath = rtrim($path, '/') . '/'; + $files_count = 0; + $folders_count = 0; + foreach ($files as $t) + { + if ($t != "." && $t != "..") + { + if ($count_hidden or !(in_array($t,$hidden_folders) or in_array($t,$hidden_files))) + { + $currentFile = $cleanPath . $t; + if (is_dir($currentFile)) + { + list($size,$tmp,$tmp1) = folder_info($currentFile); + $total_size += $size; + $folders_count ++; + } + else + { + $size = filesize($currentFile); + $total_size += $size; + $files_count++; + } + } + } + } + + return array($total_size,$files_count,$folders_count); +} +/** +* Get number of files in a directory +* +* @param string $path +* +* @return int +*/ +function filescount($path,$count_hidden=true) +{ + global $hidden_folders,$hidden_files; + $total_count = 0; + $files = scandir($path); + $cleanPath = rtrim($path, '/') . '/'; + + foreach ($files as $t) + { + if ($t != "." && $t != "..") + { + if ($count_hidden or !(in_array($t,$hidden_folders) or in_array($t,$hidden_files))) + { + $currentFile = $cleanPath . $t; + if (is_dir($currentFile)) + { + $size = filescount($currentFile); + $total_count += $size; + } + else + { + $total_count += 1; + } + } + } + } + + return $total_count; +} +/** +* check if the current folder size plus the added size is over the overall size limite +* +* @param int $sizeAdded +* +* @return bool +*/ +function checkresultingsize($sizeAdded) +{ + global $MaxSizeTotal,$current_path; + if ($MaxSizeTotal !== false && is_int($MaxSizeTotal)) { + list($sizeCurrentFolder,$fileCurrentNum,$foldersCurrentCount) = folder_info($current_path,false); + // overall size over limit + if (($MaxSizeTotal * 1024 * 1024) < ($sizeCurrentFolder + $sizeAdded)) { + return false; + } + } + return true; +} + +/** +* Create directory for images and/or thumbnails +* +* @param string $path +* @param string $path_thumbs +*/ +function create_folder($path = null, $path_thumbs = null,$ftp = null,$config = null) +{ + if($ftp){ + $ftp->mkdir($path); + $ftp->mkdir($path_thumbs); + }else{ + $oldumask = umask(0); + if ($path && ! file_exists($path)) + { + $permission = 0755; + if(isset($config['folderPermission'])){ + $permission = $config['folderPermission']; + } + mkdir($path, $permission, true); + } // or even 01777 so you get the sticky bit set + if ($path_thumbs && ! file_exists($path_thumbs)) + { + mkdir($path_thumbs, 0755, true) or die("$path_thumbs cannot be found"); + } // or even 01777 so you get the sticky bit set + umask($oldumask); + } +} + +/** +* Get file extension present in directory +* +* @param string $path +* @param string $ext +*/ +function check_files_extensions_on_path($path, $ext) +{ + if ( ! is_dir($path)) + { + $fileinfo = pathinfo($path); + if ( ! in_array(mb_strtolower($fileinfo['extension']), $ext)) + { + unlink($path); + } + } + else + { + $files = scandir($path); + foreach ($files as $file) + { + check_files_extensions_on_path(trim($path, '/') . "/" . $file, $ext); + } + } +} + +/** +* Get file extension present in PHAR file +* +* @param string $phar +* @param array $files +* @param string $basepath +* @param string $ext +*/ +function check_files_extensions_on_phar($phar, &$files, $basepath, $ext) +{ + foreach ($phar as $file) + { + if ($file->isFile()) + { + if (in_array(mb_strtolower($file->getExtension()), $ext)) + { + $files[] = $basepath . $file->getFileName(); + } + } + else + { + if ($file->isDir()) + { + $iterator = new DirectoryIterator($file); + check_files_extensions_on_phar($iterator, $files, $basepath . $file->getFileName() . '/', $ext); + } + } + } +} + +/** +* Cleanup input +* +* @param string $str +* +* @return string +*/ +function fix_get_params($str) +{ + return strip_tags(preg_replace("/[^a-zA-Z0-9\.\[\]_| -]/", '', $str)); +} + +/** +* Cleanup filename +* +* @param string $str +* @param bool $transliteration +* @param bool $convert_spaces +* @param string $replace_with +* @param bool $is_folder +* +* @return string +*/ +function fix_filename($str, $config, $is_folder = false) +{ + if ($config['convert_spaces']) + { + $str = str_replace(' ', $config['replace_with'], $str); + } + + if ($config['transliteration']) + { + if (!mb_detect_encoding($str, 'UTF-8', true)) + { + $str = utf8_encode($str); + } + if (function_exists('transliterator_transliterate')) + { + $str = transliterator_transliterate('Any-Latin; Latin-ASCII', $str); + } + else + { + $str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); + } + + $str = preg_replace("/[^a-zA-Z0-9\.\[\]_| -]/", '', $str); + } + + $str = str_replace(array( '"', "'", "/", "\\" ), "", $str); + $str = strip_tags($str); + + // Empty or incorrectly transliterated filename. + // Here is a point: a good file UNKNOWN_LANGUAGE.jpg could become .jpg in previous code. + // So we add that default 'file' name to fix that issue. + if (strpos($str, '.') === 0 && $is_folder === false) + { + $str = 'file' . $str; + } + + return trim($str); +} + +/** +* Cleanup directory name +* +* @param string $str +* +* @return string +*/ +function fix_dirname($str) +{ + return str_replace('~', ' ', dirname(str_replace(' ', '~', $str))); +} + +/** +* Correct strtoupper handling +* +* @param string $str +* +* @return string +*/ +function fix_strtoupper($str) +{ + if (function_exists('mb_strtoupper')) + { + return mb_strtoupper($str); + } + else + { + return strtoupper($str); + } +} + +/** +* Correct strtolower handling +* +* @param string $str +* +* @return string +*/ +function fix_strtolower($str) +{ + if (function_exists('mb_strtoupper')) + { + return mb_strtolower($str); + } + else + { + return strtolower($str); + } +} + +function fix_path($path, $config) +{ + $info = pathinfo($path); + $tmp_path = $info['dirname']; + $str = fix_filename($info['filename'], $config); + if ($tmp_path != "") + { + return $tmp_path . DIRECTORY_SEPARATOR . $str; + } + else + { + return $str; + } +} + +/** +* @param $current_path +* @param $fld +* +* @return bool +*/ +function config_loading($current_path, $fld) +{ + if (file_exists($current_path . $fld . ".config")) + { + require_once($current_path . $fld . ".config"); + + return true; + } + echo "!!!!" . $parent = fix_dirname($fld); + if ($parent != "." && ! empty($parent)) + { + config_loading($current_path, $parent); + } + + return false; +} + +/** +* Check if memory is enough to process image +* +* @param string $img +* @param int $max_breedte +* @param int $max_hoogte +* +* @return bool +*/ +function image_check_memory_usage($img, $max_breedte, $max_hoogte) +{ + if (file_exists($img)) + { + $K64 = 65536; // number of bytes in 64K + $memory_usage = memory_get_usage(); + if(ini_get('memory_limit') > 0 ){ + $memory_limit = abs(intval(str_replace('M', '', ini_get('memory_limit')) * 1024 * 1024)); + $image_properties = getimagesize($img); + $image_width = $image_properties[0]; + $image_height = $image_properties[1]; + if (isset($image_properties['bits'])) + $image_bits = $image_properties['bits']; + else + $image_bits = 0; + $image_memory_usage = $K64 + ($image_width * $image_height * ($image_bits >> 3) * 2); + $thumb_memory_usage = $K64 + ($max_breedte * $max_hoogte * ($image_bits >> 3) * 2); + $memory_needed = abs(intval($memory_usage + $image_memory_usage + $thumb_memory_usage)); + + if ($memory_needed > $memory_limit) + { + return false; + } + } + return true; + } + return false; +} + +/** +* Check is string is ended with needle +* +* @param string $haystack +* @param string $needle +* +* @return bool +*/ +function endsWith($haystack, $needle) +{ + return $needle === "" || substr($haystack, -strlen($needle)) === $needle; +} + +/** +* TODO REFACTOR THIS! +* +* @param $targetPath +* @param $targetFile +* @param $name +* @param $current_path +* @param $config +* relative_image_creation +* relative_path_from_current_pos +* relative_image_creation_name_to_prepend +* relative_image_creation_name_to_append +* relative_image_creation_width +* relative_image_creation_height +* relative_image_creation_option +* fixed_image_creation +* fixed_path_from_filemanager +* fixed_image_creation_name_to_prepend +* fixed_image_creation_to_append +* fixed_image_creation_width +* fixed_image_creation_height +* fixed_image_creation_option +* +* @return bool +*/ +function new_thumbnails_creation($targetPath, $targetFile, $name, $current_path, $config) +{ + //create relative thumbs + $all_ok = true; + + $info = pathinfo($name); + $info['filename'] = fix_filename($info['filename'],$config); + if ($config['relative_image_creation']) + { + foreach ($config['relative_path_from_current_pos'] as $k => $path) + { + if ($path != "" && $path[ strlen($path) - 1 ] != "/") + { + $path .= "/"; + } + if ( ! file_exists($targetPath . $path)) + { + create_folder($targetPath . $path, false); + } + if ( ! endsWith($targetPath, $path)) + { + if ( ! create_img($targetFile, $targetPath . $path . $config['relative_image_creation_name_to_prepend'][ $k ] . $info['filename'] . $config['relative_image_creation_name_to_append'][ $k ] . "." . $info['extension'], $config['relative_image_creation_width'][ $k ], $config['relative_image_creation_height'][ $k ], $config['relative_image_creation_option'][ $k ])) + { + $all_ok = false; + } + } + } + } + + //create fixed thumbs + if ($config['fixed_image_creation']) + { + foreach ($config['fixed_path_from_filemanager'] as $k => $path) + { + if ($path != "" && $path[ strlen($path) - 1 ] != "/") + { + $path .= "/"; + } + $base_dir = $path . substr_replace($targetPath, '', 0, strlen($current_path)); + if ( ! file_exists($base_dir)) + { + create_folder($base_dir, false); + } + if ( ! create_img($targetFile, $base_dir . $config['fixed_image_creation_name_to_prepend'][ $k ] . $info['filename'] . $config['fixed_image_creation_to_append'][ $k ] . "." . $info['extension'], $config['fixed_image_creation_width'][ $k ], $config['fixed_image_creation_height'][ $k ], $config['fixed_image_creation_option'][ $k ])) + { + $all_ok = false; + } + } + } + + return $all_ok; +} + + +/** +* Get a remote file, using whichever mechanism is enabled +* +* @param string $url +* +* @return bool|mixed|string +*/ +function get_file_by_url($url) +{ + if (ini_get('allow_url_fopen')) + { + $arrContextOptions=array( + "ssl"=>array( + "verify_peer"=>false, + "verify_peer_name"=>false, + ), + ); + return file_get_contents($url, false, stream_context_create($arrContextOptions)); + } + if ( ! function_exists('curl_version')) + { + return false; + } + + $ch = curl_init(); + + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_URL, $url); + + $data = curl_exec($ch); + curl_close($ch); + + return $data; +} + +/** +* test for dir/file writability properly +* +* @param string $dir +* +* @return bool +*/ +function is_really_writable($dir) +{ + $dir = rtrim($dir, '/'); + // linux, safe off + if (DIRECTORY_SEPARATOR == '/' && @ini_get("safe_mode") == false) + { + return is_writable($dir); + } + + // Windows, safe ON. (have to write a file :S) + if (is_dir($dir)) + { + $dir = $dir . '/' . md5(mt_rand(1, 1000) . mt_rand(1, 1000)); + + if (($fp = @fopen($dir, 'ab')) === false) + { + return false; + } + + fclose($fp); + @chmod($dir, 0755); + @unlink($dir); + + return true; + } + elseif ( ! is_file($dir) || ($fp = @fopen($dir, 'ab')) === false) + { + return false; + } + + fclose($fp); + + return true; +} + +/** +* Check if a function is callable. +* Some servers disable copy,rename etc. +* +* @parm string $name +* +* @return bool +*/ +function is_function_callable($name) +{ + if (function_exists($name) === false) + { + return false; + } + $disabled = explode(',', ini_get('disable_functions')); + + return ! in_array($name, $disabled); +} + +/** +* recursivly copies everything +* +* @param string $source +* @param string $destination +* @param bool $is_rec +*/ +function rcopy($source, $destination, $is_rec = false) +{ + if (is_dir($source)) + { + if ($is_rec === false) + { + $pinfo = pathinfo($source); + $destination = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } + if (is_dir($destination) === false) + { + mkdir($destination, 0755, true); + } + + $files = scandir($source); + foreach ($files as $file) + { + if ($file != "." && $file != "..") + { + rcopy($source . DIRECTORY_SEPARATOR . $file, rtrim($destination, '/') . DIRECTORY_SEPARATOR . $file, true); + } + } + } + else + { + if (file_exists($source)) + { + if (is_dir($destination) === true) + { + $pinfo = pathinfo($source); + $dest2 = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } + else + { + $dest2 = $destination; + } + + copy($source, $dest2); + } + } +} + + + + +/** +* recursivly renames everything +* +* I know copy and rename could be done with just one function +* but i split the 2 because sometimes rename fails on windows +* Need more feedback from users and refactor if needed +* +* @param string $source +* @param string $destination +* @param bool $is_rec +*/ +function rrename($source, $destination, $is_rec = false) +{ + if (is_dir($source)) + { + if ($is_rec === false) + { + $pinfo = pathinfo($source); + $destination = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } + if (is_dir($destination) === false) + { + mkdir($destination, 0755, true); + } + + $files = scandir($source); + foreach ($files as $file) + { + if ($file != "." && $file != "..") + { + rrename($source . DIRECTORY_SEPARATOR . $file, rtrim($destination, '/') . DIRECTORY_SEPARATOR . $file, true); + } + } + } + else + { + if (file_exists($source)) + { + if (is_dir($destination) === true) + { + $pinfo = pathinfo($source); + $dest2 = rtrim($destination, '/') . DIRECTORY_SEPARATOR . $pinfo['basename']; + } + else + { + $dest2 = $destination; + } + + rename($source, $dest2); + } + } +} + +// On windows rename leaves folders sometime +// This will clear leftover folders +// After more feedback will merge it with rrename +function rrename_after_cleaner($source) +{ + $files = scandir($source); + + foreach ($files as $file) + { + if ($file != "." && $file != "..") + { + if (is_dir($source . DIRECTORY_SEPARATOR . $file)) + { + rrename_after_cleaner($source . DIRECTORY_SEPARATOR . $file); + } + else + { + unlink($source . DIRECTORY_SEPARATOR . $file); + } + } + } + + return rmdir($source); +} + +/** +* Recursive chmod +* @param string $source +* @param int $mode +* @param string $rec_option +* @param bool $is_rec +*/ +function rchmod($source, $mode, $rec_option = "none", $is_rec = false) +{ + if ($rec_option == "none") + { + chmod($source, $mode); + } + else + { + if ($is_rec === false) + { + chmod($source, $mode); + } + + $files = scandir($source); + + foreach ($files as $file) + { + if ($file != "." && $file != "..") + { + if (is_dir($source . DIRECTORY_SEPARATOR . $file)) + { + if ($rec_option == "folders" || $rec_option == "both") + { + chmod($source . DIRECTORY_SEPARATOR . $file, $mode); + } + rchmod($source . DIRECTORY_SEPARATOR . $file, $mode, $rec_option, true); + } + else + { + if ($rec_option == "files" || $rec_option == "both") + { + chmod($source . DIRECTORY_SEPARATOR . $file, $mode); + } + } + } + } + } +} + +/** +* @param string $input +* @param bool $trace +* @param bool $halt +*/ +function debugger($input, $trace = false, $halt = false) +{ + ob_start(); + + echo "
    ----- DEBUG DUMP -----"; + echo "

    ";
    +	var_dump($input);
    +	echo "
    "; + + if ($trace) + { + if (is_php('5.3.6')) + { + $debug = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + } + else + { + $debug = debug_backtrace(false); + } + + echo "
    -----STACK TRACE-----"; + echo "
    ";
    +		var_dump($debug);
    +		echo "
    "; + } + + echo ""; + echo "---------------------------
    "; + + $ret = ob_get_contents(); + ob_end_clean(); + + echo $ret; + + if ($halt == true) + { + exit(); + } +} + +/** +* @param string $version +* +* @return bool +*/ +function is_php($version = '5.0.0') +{ + static $phpVer; + $version = (string) $version; + + if ( ! isset($phpVer[ $version ])) + { + $phpVer[ $version ] = (version_compare(PHP_VERSION, $version) < 0) ? false : true; + } + + return $phpVer[ $version ]; +} + +/** +* Return the caller location if set in config.php +* @param string $version +* +* @return bool +*/ +function AddErrorLocation() +{ + if (defined('DEBUG_ERROR_MESSAGE') and DEBUG_ERROR_MESSAGE) { + $pile=debug_backtrace(); + return " (@".$pile[0]["file"]."#".$pile[0]["line"].")"; + } + return ""; +} +?> diff --git a/core/vendor/filemanager/js/cors/jquery.postmessage-transport.js b/core/vendor/filemanager/js/cors/jquery.postmessage-transport.js new file mode 100755 index 00000000..2a0c38cb --- /dev/null +++ b/core/vendor/filemanager/js/cors/jquery.postmessage-transport.js @@ -0,0 +1,126 @@ +/* + * jQuery postMessage Transport Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + var counter = 0, + names = [ + 'accepts', + 'cache', + 'contents', + 'contentType', + 'crossDomain', + 'data', + 'dataType', + 'headers', + 'ifModified', + 'mimeType', + 'password', + 'processData', + 'timeout', + 'traditional', + 'type', + 'url', + 'username' + ], + convert = function (p) { + return p; + }; + + $.ajaxSetup({ + converters: { + 'postmessage text': convert, + 'postmessage json': convert, + 'postmessage html': convert + } + }); + + $.ajaxTransport('postmessage', function (options) { + if (options.postMessage && window.postMessage) { + var iframe, + loc = $('').prop('href', options.postMessage)[0], + target = loc.protocol + '//' + loc.host, + xhrUpload = options.xhr().upload; + // IE always includes the port for the host property of a link + // element, but not in the location.host or origin property for the + // default http port 80 and https port 443, so we strip it: + if (/^(http:\/\/.+:80)|(https:\/\/.+:443)$/.test(target)) { + target = target.replace(/:(80|443)$/, ''); + } + return { + send: function (_, completeCallback) { + counter += 1; + var message = { + id: 'postmessage-transport-' + counter + }, + eventName = 'message.' + message.id; + iframe = $( + '' + ).bind('load', function () { + $.each(names, function (i, name) { + message[name] = options[name]; + }); + message.dataType = message.dataType.replace('postmessage ', ''); + $(window).bind(eventName, function (e) { + e = e.originalEvent; + var data = e.data, + ev; + if (e.origin === target && data.id === message.id) { + if (data.type === 'progress') { + ev = document.createEvent('Event'); + ev.initEvent(data.type, false, true); + $.extend(ev, data); + xhrUpload.dispatchEvent(ev); + } else { + completeCallback( + data.status, + data.statusText, + {postmessage: data.result}, + data.headers + ); + iframe.remove(); + $(window).unbind(eventName); + } + } + }); + iframe[0].contentWindow.postMessage( + message, + target + ); + }).appendTo(document.body); + }, + abort: function () { + if (iframe) { + iframe.remove(); + } + } + }; + } + }); + +})); diff --git a/core/vendor/filemanager/js/cors/jquery.xdr-transport.js b/core/vendor/filemanager/js/cors/jquery.xdr-transport.js new file mode 100755 index 00000000..a4e2699c --- /dev/null +++ b/core/vendor/filemanager/js/cors/jquery.xdr-transport.js @@ -0,0 +1,89 @@ +/* + * jQuery XDomainRequest Transport Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on Julian Aubourg's ajaxHooks xdr.js: + * https://github.com/jaubourg/ajaxHooks/ + */ + +/* global define, require, window, XDomainRequest */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + if (window.XDomainRequest && !$.support.cors) { + $.ajaxTransport(function (s) { + if (s.crossDomain && s.async) { + if (s.timeout) { + s.xdrTimeout = s.timeout; + delete s.timeout; + } + var xdr; + return { + send: function (headers, completeCallback) { + var addParamChar = /\?/.test(s.url) ? '&' : '?'; + function callback(status, statusText, responses, responseHeaders) { + xdr.onload = xdr.onerror = xdr.ontimeout = $.noop; + xdr = null; + completeCallback(status, statusText, responses, responseHeaders); + } + xdr = new XDomainRequest(); + // XDomainRequest only supports GET and POST: + if (s.type === 'DELETE') { + s.url = s.url + addParamChar + '_method=DELETE'; + s.type = 'POST'; + } else if (s.type === 'PUT') { + s.url = s.url + addParamChar + '_method=PUT'; + s.type = 'POST'; + } else if (s.type === 'PATCH') { + s.url = s.url + addParamChar + '_method=PATCH'; + s.type = 'POST'; + } + xdr.open(s.type, s.url); + xdr.onload = function () { + callback( + 200, + 'OK', + {text: xdr.responseText}, + 'Content-Type: ' + xdr.contentType + ); + }; + xdr.onerror = function () { + callback(404, 'Not Found'); + }; + if (s.xdrTimeout) { + xdr.ontimeout = function () { + callback(0, 'timeout'); + }; + xdr.timeout = s.xdrTimeout; + } + xdr.send((s.hasContent && s.data) || null); + }, + abort: function () { + if (xdr) { + xdr.onerror = $.noop(); + xdr.abort(); + } + } + }; + } + }); + } +})); diff --git a/core/vendor/filemanager/js/include.commercial.js b/core/vendor/filemanager/js/include.commercial.js new file mode 100755 index 00000000..ea6d2d51 --- /dev/null +++ b/core/vendor/filemanager/js/include.commercial.js @@ -0,0 +1,2 @@ +var encodeURL,show_animation,hide_animation,apply,apply_none,apply_img,apply_any,apply_video,apply_link,apply_file_rename,apply_file_duplicate,apply_folder_rename;!function(e,a,r){"use strict";function t(e){show_animation();var a=new Image;a.src=e,jQuery(a).on("load",function(){hide_animation()})}function n(){jQuery("#textfile_create_area").parent().parent().remove(),e.ajax({type:"GET",url:"ajax_calls.php?action=new_file_form"}).done(function(a){bootbox.dialog(a,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a=jQuery("#create_text_file_name").val()+jQuery("#create_text_file_extension").val(),r=jQuery("#textfile_create_area").val();if(null!==a){a=_(a);var t=jQuery("#sub_folder").val()+jQuery("#fldr_value").val();e.ajax({type:"POST",url:"execute.php?action=create_file",data:{path:t,name:a,new_content:r}}).done(function(e){""!=e&&bootbox.alert(e,function(){setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},500)})})}}}],{header:jQuery("#lang_new_file").val()})})}function i(a){jQuery("#textfile_edit_area").parent().parent().remove();var r=a.find(".rename-file-paths").attr("data-path");e.ajax({type:"POST",url:"ajax_calls.php?action=get_file&sub_action=edit&preview_mode=text",data:{path:r}}).done(function(t){bootbox.dialog(t,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a=jQuery("#textfile_edit_area").val();e.ajax({type:"POST",url:"execute.php?action=save_text_file",data:{path:r,new_content:a}}).done(function(e){""!=e&&bootbox.alert(e)})}}],{header:a.find(".name_download").val()})})}function l(){e.ajax({type:"POST",url:"ajax_calls.php?action=get_lang",data:{}}).done(function(a){bootbox.dialog(a,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a=jQuery("#new_lang_select").val();e.ajax({type:"POST",url:"ajax_calls.php?action=change_lang",data:{choosen_lang:a}}).done(function(e){""!=e?bootbox.alert(e):setTimeout(function(){window.location.href=jQuery("#refresh").attr("href").replace(/lang=[\w]*&/i,"lang="+a+"&")+"&"+(new Date).getTime()},100)})}}],{header:jQuery("#lang_lang_change").val()})})}function o(a){jQuery("#files_permission_start").parent().parent().remove();var r=a.find(".rename-file-paths"),t=r.attr("data-path"),n=r.attr("data-permissions"),i=r.attr("data-folder");e.ajax({type:"POST",url:"ajax_calls.php?action=chmod",data:{path:t,permissions:n,folder:i}}).done(function(a){bootbox.dialog(a,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a="-";a+=jQuery("#u_4").is(":checked")?"r":"-",a+=jQuery("#u_2").is(":checked")?"w":"-",a+=jQuery("#u_1").is(":checked")?"x":"-",a+=jQuery("#g_4").is(":checked")?"r":"-",a+=jQuery("#g_2").is(":checked")?"w":"-",a+=jQuery("#g_1").is(":checked")?"x":"-",a+=jQuery("#a_4").is(":checked")?"r":"-",a+=jQuery("#a_2").is(":checked")?"w":"-",a+=jQuery("#a_1").is(":checked")?"x":"-";var n=jQuery("#chmod_form #chmod_value").val();if(""!=n&&"undefined"!=typeof n){var l=jQuery("#chmod_form input[name=apply_recursive]:checked").val();""!=l&&"undefined"!=typeof l||(l="none"),e.ajax({type:"POST",url:"execute.php?action=chmod",data:{path:t,new_mode:n,is_recursive:l,folder:i}}).done(function(e){""!=e?bootbox.alert(e):r.attr("data-permissions",a)})}}}],{header:jQuery("#lang_file_permission").val()}),setTimeout(function(){u(!1)},100)})}function u(a){var r=[];if(r.user=0,r.group=0,r.all=0,"undefined"!=typeof a&&1==a){var t=jQuery("#chmod_form #chmod_value").val();r.user=t.substr(0,1),r.group=t.substr(1,1),r.all=t.substr(2,1),e.each(r,function(a){(""==r[a]||0==e.isNumeric(r[a])||parseInt(r[a])<0||parseInt(r[a])>7)&&(r[a]="0")}),jQuery("#chmod_form input:checkbox").each(function(){var e=jQuery(this).attr("data-group"),a=jQuery(this).attr("data-value");c(r[e],a)?jQuery(this).prop("checked",!0):jQuery(this).prop("checked",!1)})}else jQuery("#chmod_form input:checkbox:checked").each(function(){var e=jQuery(this).attr("data-group"),a=jQuery(this).attr("data-value");r[e]=parseInt(r[e])+parseInt(a)}),jQuery("#chmod_form #chmod_value").val(r.user.toString()+r.group.toString()+r.all.toString())}function c(a,r){var t=[];return t[1]=[1,3,5,7],t[2]=[2,3,6,7],t[4]=[4,5,6,7],a=parseInt(a),r=parseInt(r),e.inArray(a,t[r])!=-1}function d(){bootbox.confirm(jQuery("#lang_clear_clipboard_confirm").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){1==a&&e.ajax({type:"POST",url:"ajax_calls.php?action=clear_clipboard",data:{}}).done(function(e){""!=e?bootbox.alert(e):jQuery("#clipboard").val("0"),y(!1)})})}function s(a,r){if("copy"==r||"cut"==r){var t;t=a.hasClass("directory")?a.find(".rename-file-paths").attr("data-path"):a.find(".rename-file-paths").attr("data-path"),e.ajax({type:"POST",url:"ajax_calls.php?action=copy_cut",data:{path:t,sub_action:r}}).done(function(e){""!=e?bootbox.alert(e):(jQuery("#clipboard").val("1"),y(!0))})}}function f(a){bootbox.confirm(jQuery("#lang_paste_confirm").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(r){if(1==r){var t;t="undefined"!=typeof a?a.find(".rename-folder").attr("data-path"):jQuery("#sub_folder").val()+jQuery("#fldr_value").val(),e.ajax({type:"POST",url:"execute.php?action=paste_clipboard",data:{path:t}}).done(function(e){""!=e?bootbox.alert(e):(jQuery("#clipboard").val("0"),y(!1),setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},300))})}})}function p(a,r){var t;t=a.hasClass("directory")?a.find(".rename-folder"):a.find(".rename-file");var n=t.attr("data-path");a.parent().hide(100),e.ajax({type:"POST",url:"ajax_calls.php?action=copy_cut",data:{path:n,sub_action:"cut"}}).done(function(t){if(""!=t)bootbox.alert(t);else{var n;n="undefined"!=typeof r?r.hasClass("back-directory")?r.find(".path").val():r.find(".rename-folder").attr("data-path"):jQuery("#sub_folder").val()+jQuery("#fldr_value").val(),e.ajax({type:"POST",url:"execute.php?action=paste_clipboard",data:{path:n}}).done(function(e){""!=e?(bootbox.alert(e),a.parent().show(100)):(jQuery("#clipboard").val("0"),y(!1),a.parent().remove())})}}).error(function(){a.parent().show(100)})}function y(e){1==e?jQuery(".paste-here-btn, .clear-clipboard-btn").removeClass("disabled"):jQuery(".paste-here-btn, .clear-clipboard-btn").addClass("disabled")}function v(e){var r=jQuery(".breadcrumb").width()+e,t=jQuery("#view"),n=jQuery("#help");if(t.val()>0){if(1==t.val())jQuery("ul.grid li, ul.grid figure").css("width","100%");else{var i=Math.floor(r/380);0==i&&(i=1,jQuery("h4").css("font-size",12)),r=Math.floor(r/i-3),jQuery("ul.grid li, ul.grid figure").css("width",r)}n.hide()}else a.touch&&n.show()}function j(){var e=jQuery(this);0==jQuery("#view").val()&&(1==e.attr("toggle")?(e.attr("toggle",0),e.animate({top:"0px"},{queue:!1,duration:300})):(e.attr("toggle",1),e.animate({top:"-30px"},{queue:!1,duration:300})))}function m(e){var a=new RegExp("(?:[?&]|&)"+e+"=([^&]+)","i"),r=window.location.search.match(a);return r&&r.length>1?r[1]:null}function Q(){1==jQuery("#popup").val()?window.close():("function"==typeof parent.jQuery(".modal:has(iframe)").modal&&parent.jQuery(".modal:has(iframe)").modal("hide"),"undefined"!=typeof parent.jQuery&&parent.jQuery?"object"==typeof parent.jQuery.fancybox?parent.jQuery.fancybox.getInstance().close():"function"==typeof parent.jQuery.fancybox&&parent.jQuery.fancybox.close():"function"==typeof parent.$.fancybox&&parent.$.fancybox.close())}function h(e){for(var e,a=[/[\300-\306]/g,/[\340-\346]/g,/[\310-\313]/g,/[\350-\353]/g,/[\314-\317]/g,/[\354-\357]/g,/[\322-\330]/g,/[\362-\370]/g,/[\331-\334]/g,/[\371-\374]/g,/[\321]/g,/[\361]/g,/[\307]/g,/[\347]/g],r=["A","a","E","e","I","i","O","o","U","u","N","n","C","c"],t=0;t]+(>|$)/g,""),e.trim(a)):null}function g(a,r,t,n,i){null!==t&&(t=_(t),e.ajax({type:"POST",url:"execute.php?action="+a,data:{path:r,name:t.replace("/","")}}).done(function(e){return""!=e?(bootbox.alert(e),!1):(""!=i&&window[i](n,t),!0)}))}function b(a,r){var t=jQuery("li.dir","ul.grid").filter(":visible"),n=jQuery("li.file","ul.grid").filter(":visible"),i=[],l=[],o=[],u=[];t.each(function(){var a=jQuery(this),t=a.find(r).val();if(e.isNumeric(t))for(t=parseFloat(t);"undefined"!=typeof i[t]&&i[t];)t=parseFloat(parseFloat(t)+parseFloat(.001));else t=t+"a"+a.find("h4 a").attr("data-file");i[t]=a.html(),l.push(t)}),n.each(function(){var a=jQuery(this),t=a.find(r).val();if(e.isNumeric(t))for(t=parseFloat(t);"undefined"!=typeof o[t]&&o[t];)t=parseFloat(parseFloat(t)+parseFloat(.001));else t=t+"a"+a.find("h4 a").attr("data-file");o[t]=a.html(),u.push(t)}),e.isNumeric(l[0])?l.sort(function(e,a){return parseFloat(e)-parseFloat(a)}):l.sort(),e.isNumeric(u[0])?u.sort(function(e,a){return parseFloat(e)-parseFloat(a)}):u.sort(),a&&(l.reverse(),u.reverse()),t.each(function(e){var a=jQuery(this);a.html(i[l[e]])}),n.each(function(e){var a=jQuery(this);a.html(o[u[e]])})}function w(e,a){return featherEditor.launch({image:e,url:a}),!1}function x(){T.update()}var k="9.12.2",C=!0,T=null,I=null,S=function(){var e=0;return function(a,r){clearTimeout(e),e=setTimeout(a,r)}}(),U=function(e){if(1==jQuery("#ftp").val())var a=jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val();else var a=jQuery("#base_url").val()+jQuery("#cur_dir").val();var r=e.find("a.link").attr("data-file");return""!=r&&null!=r&&(a+=r),r=e.find("h4 a.folder-link").attr("data-file"),""!=r&&null!=r&&(a+=r),a},R={contextActions:{copy_url:function(e){var a=U(e);bootbox.alert('URL:
    ")},unzip:function(a){var r=jQuery("#sub_folder").val()+jQuery("#fldr_value").val()+a.find("a.link").attr("data-file");show_animation(),e.ajax({type:"POST",url:"ajax_calls.php?action=extract",data:{path:r}}).done(function(e){hide_animation(),""!=e?bootbox.alert(e):window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()})},edit_img:function(e){var a=e.attr("data-name");if(1==jQuery("#ftp").val())var r=jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+a;else var r=jQuery("#base_url").val()+jQuery("#cur_dir").val()+a;var t=jQuery("#aviary_img");t.attr("data-name",a),show_animation(),t.attr("src",r).load(w(t.attr("id"),r))},duplicate:function(e){var a=e.find("h4").text().trim();bootbox.prompt(jQuery("#lang_duplicate").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(r){if(null!==r&&(r=_(r),r!=a)){var t=e.find(".rename-file");g("duplicate_file",t.attr("data-path"),r,t,"apply_file_duplicate")}},a)},select:function(e){var a,r=U(e),t=jQuery("#field_id").val(),n=jQuery("#return_relative_url").val();if(1==n&&(r=r.replace(jQuery("#base_url").val(),""),r=r.replace(jQuery("#cur_dir").val(),"")),a=1==jQuery("#popup").val()?window.opener:window.parent,""!=t)if(1==jQuery("#crossdomain").val())a.postMessage({sender:"responsivefilemanager",url:r,field_id:t},"*");else{var i=jQuery("#"+t,a.document);i.val(r).trigger("change"),"function"==typeof a.responsive_filemanager_callback&&a.responsive_filemanager_callback(t),Q()}else apply_any(r)},copy:function(e){s(e,"copy")},cut:function(e){s(e,"cut")},paste:function(){f()},chmod:function(e){o(e)},edit_text_file:function(e){i(e)}},makeContextMenu:function(){var a=this;e.contextMenu({selector:"figure:not(.back-directory), .list-view2 figure:not(.back-directory)",autoHide:!0,build:function(e){e.addClass("selected");var t={callback:function(r,t){a.contextActions[r](e)},items:{}};return(e.find(".img-precontainer-mini .filetype").hasClass("png")||e.find(".img-precontainer-mini .filetype").hasClass("jpg")||e.find(".img-precontainer-mini .filetype").hasClass("jpeg"))&&r&&(t.items.edit_img={name:jQuery("#lang_edit_image").val(),icon:"edit_img",disabled:!1}),e.hasClass("directory")&&0!=jQuery("#type_param").val()&&(t.items.select={name:jQuery("#lang_select").val(),icon:"",disabled:!1}),t.items.copy_url={name:jQuery("#lang_show_url").val(),icon:"url",disabled:!1},(e.find(".img-precontainer-mini .filetype").hasClass("zip")||e.find(".img-precontainer-mini .filetype").hasClass("tar")||e.find(".img-precontainer-mini .filetype").hasClass("gz"))&&(t.items.unzip={name:jQuery("#lang_extract").val(),icon:"extract",disabled:!1}),e.find(".img-precontainer-mini .filetype").hasClass("edit-text-file-allowed")&&(t.items.edit_text_file={name:jQuery("#lang_edit_file").val(),icon:"edit",disabled:!1}),e.hasClass("directory")||1!=jQuery("#duplicate").val()||(t.items.duplicate={name:jQuery("#lang_duplicate").val(),icon:"duplicate",disabled:!1}),e.hasClass("directory")||1!=jQuery("#copy_cut_files_allowed").val()?e.hasClass("directory")&&1==jQuery("#copy_cut_dirs_allowed").val()&&(t.items.copy={name:jQuery("#lang_copy").val(),icon:"copy",disabled:!1},t.items.cut={name:jQuery("#lang_cut").val(),icon:"cut",disabled:!1}):(t.items.copy={name:jQuery("#lang_copy").val(),icon:"copy",disabled:!1},t.items.cut={name:jQuery("#lang_cut").val(),icon:"cut",disabled:!1}),0==jQuery("#clipboard").val()||e.hasClass("directory")||(t.items.paste={name:jQuery("#lang_paste_here").val(),icon:"clipboard-apply",disabled:!1}),e.hasClass("directory")||1!=jQuery("#chmod_files_allowed").val()?e.hasClass("directory")&&1==jQuery("#chmod_dirs_allowed").val()&&(t.items.chmod={name:jQuery("#lang_file_permission").val(),icon:"key",disabled:!1}):t.items.chmod={name:jQuery("#lang_file_permission").val(),icon:"key",disabled:!1},t.items.sep="----",t.items.info={name:""+jQuery("#lang_file_info").val()+"",disabled:!0},t.items.name={name:e.attr("data-name"),icon:"label",disabled:!0},"img"==e.attr("data-type")&&(t.items.dimension={name:e.find(".img-dimension").html(),icon:"dimension",disabled:!0}),"true"!==jQuery("#show_folder_size").val()&&"true"!==jQuery("#show_folder_size").val()||(e.hasClass("directory")?t.items.size={name:e.find(".file-size").html()+" - "+e.find(".nfiles").val()+" "+jQuery("#lang_files").val()+" - "+e.find(".nfolders").val()+" "+jQuery("#lang_folders").val(),icon:"size",disabled:!0}:t.items.size={name:e.find(".file-size").html(),icon:"size",disabled:!0}),t.items.date={name:e.find(".file-date").html(),icon:"date",disabled:!0},t},events:{hide:function(){jQuery("figure").removeClass("selected")}}}),jQuery(document).on("contextmenu",function(e){if(!jQuery(e.target).is("figure"))return!1})},bindGridEvents:function(){function a(e){window[e.attr("data-function")](e.attr("data-file"),jQuery("#field_id").val())}var r=jQuery("ul.grid");r.on("click",".modalAV",function(a){var r=jQuery(this);a.preventDefault();var t=jQuery("#previewAV"),n=jQuery(".body-preview");t.removeData("modal"),t.modal({backdrop:"static",keyboard:!1}),r.hasClass("audio")?n.css("height","80px"):n.css("height","345px"),e.ajax({url:r.attr("data-url"),success:function(e){n.html(e)}})}),r.on("click",".file-preview-btn",function(a){var r=jQuery(this);a.preventDefault(),e.ajax({url:r.attr("data-url"),success:function(e){bootbox.modal(e," "+r.parent().parent().parent().find(".name").val())}})}),r.on("click",".preview",function(){var e=jQuery(this);return 0==e.hasClass("disabled")&&jQuery("#full-img").attr("src",decodeURIComponent(e.attr("data-url"))),!0}),r.on("click",".rename-file",function(){var a=jQuery(this),r=a.parent().parent().parent(),t=r.find("h4"),n=e.trim(t.text());bootbox.prompt(jQuery("#rename").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){null!==e&&(e=_(e),e!=n&&g("rename_file",a.attr("data-path"),e,r,"apply_file_rename"))},n)}),r.on("click",".rename-folder",function(){var a=jQuery(this),r=a.parent().parent().parent(),t=r.find("h4"),n=e.trim(t.text());bootbox.prompt(jQuery("#rename").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){null!==e&&(e=_(e).replace(".",""),e!=n&&g("rename_folder",a.attr("data-path"),e,r,"apply_folder_rename"))},n)}),r.on("click",".delete-file",function(){var e=jQuery(this);bootbox.confirm(e.attr("data-confirm"),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){if(1==a){g("delete_file",e.attr("data-path"),"","","");var r=jQuery("#files_number");r.text(parseInt(r.text())-1),e.parent().parent().parent().parent().remove()}})}),r.on("click",".delete-folder",function(){var e=jQuery(this);bootbox.confirm(e.attr("data-confirm"),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){if(1==a){g("delete_folder",e.attr("data-path"),"","","");var r=jQuery("#folders_number");r.text(parseInt(r.text())-1),e.parent().parent().parent().remove()}})}),jQuery("ul.grid").on("click",".link",function(){a(jQuery(this))}),jQuery("ul.grid").on("click","div.box",function(e){var r=jQuery(this).find(".link");if(0!==r.length)a(r);else{var t=jQuery(this).find(".folder-link");0!==t.length&&(document.location=jQuery(t).prop("href"))}})},makeFilters:function(a){jQuery("#filter-input").on("keyup",function(){jQuery(".filters label").removeClass("btn-inverse"),jQuery(".filters label").find("i").removeClass("icon-white"),jQuery("#ff-item-type-all").addClass("btn-inverse"),jQuery("#ff-item-type-all").find("i").addClass("icon-white");var r=_(jQuery(this).val()).toLowerCase();jQuery(this).val(r),a&&S(function(){jQuery("li","ul.grid ").each(function(){var e=jQuery(this);""!=r&&e.attr("data-name").toLowerCase().indexOf(r)==-1?e.hide(100):e.show(100)}),e.ajax({url:"ajax_calls.php?action=filter&type="+r}).done(function(e){""!=e&&bootbox.alert(e)}),S(function(){var e=0!=jQuery("#descending").val();b(e,"."+jQuery("#sort_by").val()),x()},500)},300)}).keypress(function(e){13==e.which&&jQuery("#filter").trigger("click")}),jQuery("#filter").on("click",function(){var e=_(jQuery("#filter-input").val()),a=jQuery("#current_url").val();a+=a.indexOf("?")>=0?"&":"?",window.location.href=a+"filter="+e})},makeUploader:function(){jQuery("#fileupload").fileupload({url:"upload.php",maxChunkSize:2097152}),jQuery("#fileupload").bind("fileuploaddrop",function(e,a){jQuery(".uploader").show(200)}),jQuery("#fileupload").bind("fileuploadsubmit",function(e,a){a.formData={fldr:jQuery("#sub_folder").val()+jQuery("#fldr_value").val()+a.files[0].relativePath}}),jQuery("#fileupload").addClass("fileupload-processing"),e.ajax({url:jQuery("#fileupload").fileupload("option","url"),dataType:"json",context:jQuery("#fileupload")[0]}).always(function(){jQuery(this).removeClass("fileupload-processing")}),jQuery(".upload-btn").on("click",function(){jQuery(".uploader").show(200)}),jQuery(".close-uploader").on("click",function(){jQuery(".uploader").hide(200),setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},420)})},uploadURL:function(){jQuery("#uploadURL").on("click",function(a){a.preventDefault();var r=jQuery("#url").val(),t=jQuery("#fldr_value").val();show_animation(),e.ajax({type:"POST",url:"upload.php",data:{fldr:t,url:r}}).done(function(e){hide_animation(),jQuery("#url").val("")}).fail(function(e){bootbox.alert(jQuery("#lang_error_upload").val()),hide_animation(),jQuery("#url").val("")})})},makeSort:function(a){jQuery("input[name=radio-sort]").on("click",function(){var e=jQuery(this).attr("data-item"),t=jQuery("#"+e),n=jQuery(".filters label");n.removeClass("btn-inverse"),n.find("i").removeClass("icon-white"),jQuery("#filter-input").val(""),t.addClass("btn-inverse"),t.find("i").addClass("icon-white"),"ff-item-type-all"==e?(a?jQuery(".grid li").show(300):window.location.href=jQuery("#current_url").val()+"&sort_by="+jQuery("#sort_by").val()+"&descending="+(r?1:0),"undefined"!=typeof Storage&&localStorage.setItem("sort","")):jQuery(this).is(":checked")&&(jQuery(".grid li").not("."+e).hide(300),jQuery(".grid li."+e).show(300),"undefined"!=typeof Storage&&localStorage.setItem("sort",e)),x()});var r=jQuery("#descending").val();jQuery(".sorter").on("click",function(){var t=jQuery(this);r=jQuery("#sort_by").val()!==t.attr("data-sort")||0==r,a?(e.ajax({url:"ajax_calls.php?action=sort&sort_by="+t.attr("data-sort")+"&descending="+(r?1:0)}),b(r,"."+t.attr("data-sort")),jQuery(" a.sorter").removeClass("descending").removeClass("ascending"),r?jQuery(".sort-"+t.attr("data-sort")).addClass("descending"):jQuery(".sort-"+t.attr("data-sort")).addClass("ascending"),jQuery("#sort_by").val(t.attr("data-sort")),jQuery("#descending").val(r?1:0),x()):window.location.href=jQuery("#current_url").val()+"&sort_by="+t.attr("data-sort")+"&descending="+(r?1:0)})}};jQuery(document).ready(function(){if(C&&R.makeContextMenu(),"undefined"!=typeof Storage&&1!=jQuery("#type_param").val()&&3!=jQuery("#type_param").val()){var r=localStorage.getItem("sort");if(r){var i=jQuery("#"+r);i.addClass("btn-inverse"),i.find("i").addClass("icon-white"),jQuery(".grid li").not("."+r).hide(300),jQuery(".grid li."+r).show(300)}}if(jQuery("#full-img").on("click",function(){jQuery("#previewLightbox").lightbox("hide")}),jQuery("body").on("click",function(){jQuery(".tip-right").tooltip("hide")}),R.bindGridEvents(),parseInt(jQuery("#file_number").val())>parseInt(jQuery("#file_number_limit_js").val()))var o=!1;else var o=!0;if(R.makeSort(o),R.makeFilters(o),R.uploadURL(),jQuery("#info").on("click",function(){bootbox.alert('

    responsive filemanager

    RESPONSIVE filemanager v.'+k+'
    responsivefilemanager.com


    Copyright © Tecrail - Alberto Peripolli. All rights reserved.


    Commercial License

    ')}),jQuery("#change_lang_btn").on("click",function(){l()}),R.makeUploader(),jQuery("body").on("keypress",function(e){var a=String.fromCharCode(e.which);if("'"==a||'"'==a||"\\"==a||"/"==a)return!1}),jQuery("ul.grid li figcaption").on("click",'a[data-toggle="lightbox"]',function(){t(decodeURIComponent(jQuery(this).attr("data-url")))}),jQuery(".create-file-btn").on("click",function(){n()}),jQuery(".new-folder").on("click",function(){bootbox.prompt(jQuery("#insert_folder_name").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){if(null!==a){a=_(a).replace(".","");var r=jQuery("#sub_folder").val()+jQuery("#fldr_value").val();e.ajax({type:"POST",url:"execute.php?action=create_folder",data:{path:r,name:a}}).done(function(e){setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},300)})}})}),jQuery(".view-controller button").on("click",function(){var a=jQuery(this);jQuery(".view-controller button").removeClass("btn-inverse"),jQuery(".view-controller i").removeClass("icon-white"),a.addClass("btn-inverse"),a.find("i").addClass("icon-white"),e.ajax({url:"ajax_calls.php?action=view&type="+a.attr("data-value")}).done(function(e){""!=e&&bootbox.alert(e)}),"undefined"!=typeof jQuery("ul.grid")[0]&&jQuery("ul.grid")[0]&&(jQuery("ul.grid")[0].className=jQuery("ul.grid")[0].className.replace(/\blist-view.*?\b/g,"")),"undefined"!=typeof jQuery(".sorter-container")[0]&&jQuery(".sorter-container")[0]&&(jQuery(".sorter-container")[0].className=jQuery(".sorter-container")[0].className.replace(/\blist-view.*?\b/g,""));var r=a.attr("data-value");jQuery("#view").val(r),jQuery("ul.grid").addClass("list-view"+r),jQuery(".sorter-container").addClass("list-view"+r),a.attr("data-value")>=1?v(14):(jQuery("ul.grid li").css("width",126),jQuery("ul.grid figure").css("width",122)),x()}),a.touch?(jQuery("#help").show(),jQuery(".box:not(.no-effect)").swipe({swipeLeft:j,swipeRight:j,threshold:30})):(jQuery(".tip").tooltip({placement:"bottom"}),jQuery(".tip-top").tooltip({placement:"top"}),jQuery(".tip-left").tooltip({placement:"left"}),jQuery(".tip-right").tooltip({placement:"right"}),jQuery("body").addClass("no-touch")),jQuery(".paste-here-btn").on("click",function(){0==jQuery(this).hasClass("disabled")&&f()}),jQuery(".clear-clipboard-btn").on("click",function(){0==jQuery(this).hasClass("disabled")&&d()}),!a.csstransforms){var c=jQuery("figure");c.on("mouseover",function(){0==jQuery("#view").val()&&jQuery("#main-item-container").hasClass("no-effect-slide")===!1&&jQuery(this).find(".box:not(.no-effect)").animate({top:"-26px"},{queue:!1,duration:300})}),c.on("mouseout",function(){0==jQuery("#view").val()&&jQuery(this).find(".box:not(.no-effect)").animate({top:"0px"},{queue:!1,duration:300})})}jQuery(window).resize(function(){v(28)}),v(14),y(1==jQuery("#clipboard").val()?!0:!1),jQuery("li.dir, li.file").draggable({distance:20,cursor:"move",helper:function(){jQuery(this).find("figure").find(".box").css("top","0px");var e=jQuery(this).clone().css("z-index",1e3).find(".box").css("box-shadow","none").css("-webkit-box-shadow","none").parent().parent();return jQuery(this).addClass("selected"),e},start:function(e,a){jQuery(a.helper).addClass("ui-draggable-helper"),0==jQuery("#view").val()&&jQuery("#main-item-container").addClass("no-effect-slide")},stop:function(){jQuery(this).removeClass("selected"),0==jQuery("#view").val()&&jQuery("#main-item-container").removeClass("no-effect-slide")}}),jQuery("li.dir,li.back").droppable({accept:"ul.grid li",activeClass:"ui-state-highlight",hoverClass:"ui-state-hover",drop:function(e,a){p(a.draggable.find("figure"),jQuery(this).find("figure"))}}),jQuery(document).on("keyup","#chmod_form #chmod_value",function(){u(!0)}),jQuery(document).on("change","#chmod_form input",function(){u(!1)}),jQuery(document).on("focusout","#chmod_form #chmod_value",function(){var e=jQuery("#chmod_form #chmod_value");null==e.val().match(/^[0-7]{3}$/)&&(e.val(e.attr("data-def-value")),u(!0))}),T=new LazyLoad,I=new Clipboard(".btn")}),encodeURL=function(e){for(var a=e.split("/"),r=3;r-1?(f=f+"?"+(new Date).getTime(),c=''+o+''):e.inArray(u,s)>-1?c='":e.inArray(u,d)>-1?("mp3"==u&&(u="mpeg"),c='"):c=''+o+"",1==jQuery("#crossdomain").val()?t.postMessage({sender:"responsivefilemanager",url:f,field_id:null,html:c},"*"):parent.tinymce.majorVersion<4?(parent.tinymce.activeEditor.execCommand("mceInsertContent",!1,c),parent.tinymce.activeEditor.windowManager.close(parent.tinymce.activeEditor.windowManager.params.mce_window_id)):(parent.tinymce.activeEditor.insertContent(c),parent.tinymce.activeEditor.windowManager.close())},apply_link=function(e,a){if(1==jQuery("#popup").val())var r=window.opener;else var r=window.parent;var t=jQuery("#callback").val(),n=jQuery("#cur_dir").val();n=n.replace("\\","/");var i=jQuery("#subdir").val();i=i.replace("\\","/");var l=jQuery("#base_url").val();if(1==jQuery("#ftp").val())var o=encodeURL(jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+e);else var u=jQuery("#return_relative_url").val(),o=encodeURL((1==u?i:l+n)+e);if(""!=a)if(1==jQuery("#crossdomain").val())r.postMessage({sender:"responsivefilemanager",url:o,field_id:a},"*");else{var c=jQuery("#"+a,r.document);c.val(o).trigger("change"),0==t?"function"==typeof r.responsive_filemanager_callback&&r.responsive_filemanager_callback(a):"function"==typeof r[t]&&r[t](a),Q()}else apply_any(o)},apply_img=function(e,a){var r;r=1==jQuery("#popup").val()?window.opener:window.parent;var t=jQuery("#callback").val(),n=jQuery("#cur_dir").val();n=n.replace("\\","/");var i=jQuery("#subdir").val();i=i.replace("\\","/");var l=jQuery("#base_url").val();if(1==jQuery("#ftp").val())var o=encodeURL(jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+e);else var u=jQuery("#return_relative_url").val(),o=encodeURL((1==u?i:l+n)+e);if(""!=a)if(1==jQuery("#crossdomain").val())r.postMessage({sender:"responsivefilemanager",url:o,field_id:a},"*");else{var c=jQuery("#"+a,r.document);c.val(o).trigger("change"),0==t?"function"==typeof r.responsive_filemanager_callback&&r.responsive_filemanager_callback(a):"function"==typeof r[t]&&r[t](a),Q()}else jQuery("#add_time_to_img").val()&&(o=o+"?"+(new Date).getTime()),apply_any(o)},apply_video=function(e,a){var r;r=1==jQuery("#popup").val()?window.opener:window.parent;var t=jQuery("#callback").val(),n=jQuery("#cur_dir").val();n=n.replace("\\","/");var i=jQuery("#subdir").val();i=i.replace("\\","/");var l=jQuery("#base_url").val();if(1==jQuery("#ftp").val())var o=encodeURL(jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+e);else var u=jQuery("#return_relative_url").val(),o=encodeURL((1==u?i:l+n)+e);if(""!=a)if(1==jQuery("#crossdomain").val())r.postMessage({sender:"responsivefilemanager",url:o,field_id:a},"*");else{var c=jQuery("#"+a,r.document);c.val(o).trigger("change"),0==t?"function"==typeof r.responsive_filemanager_callback&&r.responsive_filemanager_callback(a):"function"==typeof r[t]&&r[t](a),Q()}else apply_any(o)},apply_none=function(e){var a=jQuery("ul.grid").find('li[data-name="'+e+'"] figcaption a');a[1].click(),jQuery(".tip-right").tooltip("hide")},apply_any=function(e){if(1==jQuery("#crossdomain").val())window.parent.postMessage({sender:"responsivefilemanager",url:e,field_id:null},"*");else{var a=jQuery("#editor").val();if("ckeditor"==a){var r=m("CKEditorFuncNum");window.opener.CKEDITOR.tools.callFunction(r,e),window.close()}else parent.tinymce.majorVersion<4?(parent.tinymce.activeEditor.windowManager.params.setUrl(e),parent.tinymce.activeEditor.windowManager.close(parent.tinymce.activeEditor.windowManager.params.mce_window_id)):(parent.tinymce.activeEditor.windowManager.getParams().setUrl(e),parent.tinymce.activeEditor.windowManager.close())}},apply_file_duplicate=function(e,a){var r=e.parent().parent().parent().parent();r.after("
  • "+r.html()+"
  • ");var t=r.next();apply_file_rename(t.find("figure"),a);var n=t.find(".download-form"),i="form"+(new Date).getTime();n.attr("id",i),n.find(".tip-right").attr("onclick","jQuery('#"+i+"').submit();")},apply_file_rename=function(e,a){var r;e.attr("data-name",a),e.parent().attr("data-name",a),e.find("h4").text(a);var t=e.find("a.link");r=t.attr("data-file");var n=r.substring(r.lastIndexOf("/")+1),i=r.substring(r.lastIndexOf(".")+1);t.each(function(){jQuery(this).attr("data-file",encodeURIComponent(a+"."+i))}),e.find("img").each(function(){var e=jQuery(this).attr("src");jQuery(this).attr("src",e.replace(n,a+"."+i)+"?time="+(new Date).getTime()), +jQuery(this).attr("alt",a+" thumbnails")});var l=e.find("a.preview");r=l.attr("data-url"),"undefined"!=typeof r&&r&&l.attr("data-url",r.replace(encodeURIComponent(n),encodeURIComponent(a+"."+i))),e.parent().attr("data-name",a+"."+i),e.attr("data-name",a+"."+i),e.find(".name_download").val(a+"."+i);var o=e.find("a.rename-file"),u=e.find("a.delete-file"),c=o.attr("data-path"),d=c.replace(n,a+"."+i);o.attr("data-path",d),u.attr("data-path",d)},apply_folder_rename=function(e,a){e.attr("data-name",a),e.find("figure").attr("data-name",a);var r=e.find("h4").find("a").text();e.find("h4 > a").text(a);var t=e.find(".folder-link"),n=t.attr("href"),i=jQuery("#fldr_value").val(),l=n.replace("fldr="+i+encodeURIComponent(r),"fldr="+i+encodeURIComponent(a));t.each(function(){jQuery(this).attr("href",l)});var o=e.find("a.delete-folder"),u=e.find("a.rename-folder"),c=u.attr("data-path"),d=c.lastIndexOf("/"),s=c.substr(0,d+1)+a;o.attr("data-path",s),u.attr("data-path",s)},show_animation=function(){jQuery("#loading_container").css("display","block"),jQuery("#loading").css("opacity",".7")},hide_animation=function(){jQuery("#loading_container").fadeOut()}}(jQuery,Modernizr,image_editor),function(){function e(e,a){a=a||{bubbles:!1,cancelable:!1,detail:void 0};var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,a.bubbles,a.cancelable,a.detail),r}return"function"!=typeof window.CustomEvent&&(e.prototype=window.Event.prototype,void(window.CustomEvent=e))}(); \ No newline at end of file diff --git a/core/vendor/filemanager/js/include.js b/core/vendor/filemanager/js/include.js new file mode 100755 index 00000000..706f6908 --- /dev/null +++ b/core/vendor/filemanager/js/include.js @@ -0,0 +1,2 @@ +var encodeURL,show_animation,hide_animation,apply,apply_none,apply_img,apply_any,apply_video,apply_link,apply_file_rename,apply_file_duplicate,apply_folder_rename;!function(e,a,r){"use strict";function t(e){show_animation();var a=new Image;a.src=e,jQuery(a).on("load",function(){hide_animation()})}function n(){jQuery("#textfile_create_area").parent().parent().remove(),e.ajax({type:"GET",url:"ajax_calls.php?action=new_file_form"}).done(function(a){bootbox.dialog(a,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a=jQuery("#create_text_file_name").val()+jQuery("#create_text_file_extension").val(),r=jQuery("#textfile_create_area").val();if(null!==a){a=_(a);var t=jQuery("#sub_folder").val()+jQuery("#fldr_value").val();e.ajax({type:"POST",url:"execute.php?action=create_file",data:{path:t,name:a,new_content:r}}).done(function(e){""!=e&&bootbox.alert(e,function(){setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},500)})})}}}],{header:jQuery("#lang_new_file").val()})})}function i(a){jQuery("#textfile_edit_area").parent().parent().remove();var r=a.find(".rename-file-paths").attr("data-path");e.ajax({type:"POST",url:"ajax_calls.php?action=get_file&sub_action=edit&preview_mode=text",data:{path:r}}).done(function(t){bootbox.dialog(t,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a=jQuery("#textfile_edit_area").val();e.ajax({type:"POST",url:"execute.php?action=save_text_file",data:{path:r,new_content:a}}).done(function(e){""!=e&&bootbox.alert(e)})}}],{header:a.find(".name_download").val()})})}function l(){e.ajax({type:"POST",url:"ajax_calls.php?action=get_lang",data:{}}).done(function(a){bootbox.dialog(a,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a=jQuery("#new_lang_select").val();e.ajax({type:"POST",url:"ajax_calls.php?action=change_lang",data:{choosen_lang:a}}).done(function(e){""!=e?bootbox.alert(e):setTimeout(function(){window.location.href=jQuery("#refresh").attr("href").replace(/lang=[\w]*&/i,"lang="+a+"&")+"&"+(new Date).getTime()},100)})}}],{header:jQuery("#lang_lang_change").val()})})}function o(a){jQuery("#files_permission_start").parent().parent().remove();var r=a.find(".rename-file-paths"),t=r.attr("data-path"),n=r.attr("data-permissions"),i=r.attr("data-folder");e.ajax({type:"POST",url:"ajax_calls.php?action=chmod",data:{path:t,permissions:n,folder:i}}).done(function(a){bootbox.dialog(a,[{label:jQuery("#cancel").val(),"class":"btn"},{label:jQuery("#ok").val(),"class":"btn-inverse",callback:function(){var a="-";a+=jQuery("#u_4").is(":checked")?"r":"-",a+=jQuery("#u_2").is(":checked")?"w":"-",a+=jQuery("#u_1").is(":checked")?"x":"-",a+=jQuery("#g_4").is(":checked")?"r":"-",a+=jQuery("#g_2").is(":checked")?"w":"-",a+=jQuery("#g_1").is(":checked")?"x":"-",a+=jQuery("#a_4").is(":checked")?"r":"-",a+=jQuery("#a_2").is(":checked")?"w":"-",a+=jQuery("#a_1").is(":checked")?"x":"-";var n=jQuery("#chmod_form #chmod_value").val();if(""!=n&&"undefined"!=typeof n){var l=jQuery("#chmod_form input[name=apply_recursive]:checked").val();""!=l&&"undefined"!=typeof l||(l="none"),e.ajax({type:"POST",url:"execute.php?action=chmod",data:{path:t,new_mode:n,is_recursive:l,folder:i}}).done(function(e){""!=e?bootbox.alert(e):r.attr("data-permissions",a)})}}}],{header:jQuery("#lang_file_permission").val()}),setTimeout(function(){u(!1)},100)})}function u(a){var r=[];if(r.user=0,r.group=0,r.all=0,"undefined"!=typeof a&&1==a){var t=jQuery("#chmod_form #chmod_value").val();r.user=t.substr(0,1),r.group=t.substr(1,1),r.all=t.substr(2,1),e.each(r,function(a){(""==r[a]||0==e.isNumeric(r[a])||parseInt(r[a])<0||parseInt(r[a])>7)&&(r[a]="0")}),jQuery("#chmod_form input:checkbox").each(function(){var e=jQuery(this).attr("data-group"),a=jQuery(this).attr("data-value");c(r[e],a)?jQuery(this).prop("checked",!0):jQuery(this).prop("checked",!1)})}else jQuery("#chmod_form input:checkbox:checked").each(function(){var e=jQuery(this).attr("data-group"),a=jQuery(this).attr("data-value");r[e]=parseInt(r[e])+parseInt(a)}),jQuery("#chmod_form #chmod_value").val(r.user.toString()+r.group.toString()+r.all.toString())}function c(a,r){var t=[];return t[1]=[1,3,5,7],t[2]=[2,3,6,7],t[4]=[4,5,6,7],a=parseInt(a),r=parseInt(r),e.inArray(a,t[r])!=-1}function s(){bootbox.confirm(jQuery("#lang_clear_clipboard_confirm").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){1==a&&e.ajax({type:"POST",url:"ajax_calls.php?action=clear_clipboard",data:{}}).done(function(e){""!=e?bootbox.alert(e):jQuery("#clipboard").val("0"),y(!1)})})}function d(a,r){if("copy"==r||"cut"==r){var t;t=a.hasClass("directory")?a.find(".rename-file-paths").attr("data-path"):a.find(".rename-file-paths").attr("data-path"),e.ajax({type:"POST",url:"ajax_calls.php?action=copy_cut",data:{path:t,sub_action:r}}).done(function(e){""!=e?bootbox.alert(e):(jQuery("#clipboard").val("1"),y(!0))})}}function f(a){bootbox.confirm(jQuery("#lang_paste_confirm").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(r){if(1==r){var t;t="undefined"!=typeof a?a.find(".rename-folder").attr("data-path"):jQuery("#sub_folder").val()+jQuery("#fldr_value").val(),e.ajax({type:"POST",url:"execute.php?action=paste_clipboard",data:{path:t}}).done(function(e){""!=e?bootbox.alert(e):(jQuery("#clipboard").val("0"),y(!1),setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},300))})}})}function p(a,r){var t;t=a.hasClass("directory")?a.find(".rename-folder"):a.find(".rename-file");var n=t.attr("data-path");a.parent().hide(100),e.ajax({type:"POST",url:"ajax_calls.php?action=copy_cut",data:{path:n,sub_action:"cut"}}).done(function(t){if(""!=t)bootbox.alert(t);else{var n;n="undefined"!=typeof r?r.hasClass("back-directory")?r.find(".path").val():r.find(".rename-folder").attr("data-path"):jQuery("#sub_folder").val()+jQuery("#fldr_value").val(),e.ajax({type:"POST",url:"execute.php?action=paste_clipboard",data:{path:n}}).done(function(e){""!=e?(bootbox.alert(e),a.parent().show(100)):(jQuery("#clipboard").val("0"),y(!1),a.parent().remove())})}}).error(function(){a.parent().show(100)})}function y(e){1==e?jQuery(".paste-here-btn, .clear-clipboard-btn").removeClass("disabled"):jQuery(".paste-here-btn, .clear-clipboard-btn").addClass("disabled")}function v(e){var r=jQuery(".breadcrumb").width()+e,t=jQuery("#view"),n=jQuery("#help");if(t.val()>0){if(1==t.val())jQuery("ul.grid li, ul.grid figure").css("width","100%");else{var i=Math.floor(r/380);0==i&&(i=1,jQuery("h4").css("font-size",12)),r=Math.floor(r/i-3),jQuery("ul.grid li, ul.grid figure").css("width",r)}n.hide()}else a.touch&&n.show()}function m(){var e=jQuery(this);0==jQuery("#view").val()&&(1==e.attr("toggle")?(e.attr("toggle",0),e.animate({top:"0px"},{queue:!1,duration:300})):(e.attr("toggle",1),e.animate({top:"-30px"},{queue:!1,duration:300})))}function j(e){var a=new RegExp("(?:[?&]|&)"+e+"=([^&]+)","i"),r=window.location.search.match(a);return r&&r.length>1?r[1]:null}function Q(){1==jQuery("#popup").val()?window.close():("function"==typeof parent.jQuery(".modal:has(iframe)").modal&&parent.jQuery(".modal:has(iframe)").modal("hide"),"undefined"!=typeof parent.jQuery&&parent.jQuery?"object"==typeof parent.jQuery.fancybox?parent.jQuery.fancybox.getInstance().close():"function"==typeof parent.jQuery.fancybox&&parent.jQuery.fancybox.close():"function"==typeof parent.$.fancybox&&parent.$.fancybox.close())}function h(e){for(var e,a=[/[\300-\306]/g,/[\340-\346]/g,/[\310-\313]/g,/[\350-\353]/g,/[\314-\317]/g,/[\354-\357]/g,/[\322-\330]/g,/[\362-\370]/g,/[\331-\334]/g,/[\371-\374]/g,/[\321]/g,/[\361]/g,/[\307]/g,/[\347]/g],r=["A","a","E","e","I","i","O","o","U","u","N","n","C","c"],t=0;t]+(>|$)/g,""),e.trim(a)):null}function g(a,r,t,n,i){null!==t&&(t=_(t),e.ajax({type:"POST",url:"execute.php?action="+a,data:{path:r,name:t.replace("/","")}}).done(function(e){return""!=e?(bootbox.alert(e),!1):(""!=i&&window[i](n,t),!0)}))}function b(a,r){var t=jQuery("li.dir","ul.grid").filter(":visible"),n=jQuery("li.file","ul.grid").filter(":visible"),i=[],l=[],o=[],u=[];t.each(function(){var a=jQuery(this),t=a.find(r).val();if(e.isNumeric(t))for(t=parseFloat(t);"undefined"!=typeof i[t]&&i[t];)t=parseFloat(parseFloat(t)+parseFloat(.001));else t=t+"a"+a.find("h4 a").attr("data-file");i[t]=a.html(),l.push(t)}),n.each(function(){var a=jQuery(this),t=a.find(r).val();if(e.isNumeric(t))for(t=parseFloat(t);"undefined"!=typeof o[t]&&o[t];)t=parseFloat(parseFloat(t)+parseFloat(.001));else t=t+"a"+a.find("h4 a").attr("data-file");o[t]=a.html(),u.push(t)}),e.isNumeric(l[0])?l.sort(function(e,a){return parseFloat(e)-parseFloat(a)}):l.sort(),e.isNumeric(u[0])?u.sort(function(e,a){return parseFloat(e)-parseFloat(a)}):u.sort(),a&&(l.reverse(),u.reverse()),t.each(function(e){var a=jQuery(this);a.html(i[l[e]])}),n.each(function(e){var a=jQuery(this);a.html(o[u[e]])})}function w(e,a){return featherEditor.launch({image:e,url:a}),!1}function x(){T.update()}var k="9.12.2",C=!0,T=null,I=null,S=function(){var e=0;return function(a,r){clearTimeout(e),e=setTimeout(a,r)}}(),U=function(e){if(1==jQuery("#ftp").val())var a=jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val();else var a=jQuery("#base_url").val()+jQuery("#cur_dir").val();var r=e.find("a.link").attr("data-file");return""!=r&&null!=r&&(a+=r),r=e.find("h4 a.folder-link").attr("data-file"),""!=r&&null!=r&&(a+=r),a},R={contextActions:{copy_url:function(e){var a=U(e);bootbox.alert('URL:
    ")},unzip:function(a){var r=jQuery("#sub_folder").val()+jQuery("#fldr_value").val()+a.find("a.link").attr("data-file");show_animation(),e.ajax({type:"POST",url:"ajax_calls.php?action=extract",data:{path:r}}).done(function(e){hide_animation(),""!=e?bootbox.alert(e):window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()})},edit_img:function(e){var a=e.attr("data-name");if(1==jQuery("#ftp").val())var r=jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+a;else var r=jQuery("#base_url").val()+jQuery("#cur_dir").val()+a;var t=jQuery("#aviary_img");t.attr("data-name",a),show_animation(),t.attr("src",r).load(w(t.attr("id"),r))},duplicate:function(e){var a=e.find("h4").text().trim();bootbox.prompt(jQuery("#lang_duplicate").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(r){if(null!==r&&(r=_(r),r!=a)){var t=e.find(".rename-file");g("duplicate_file",t.attr("data-path"),r,t,"apply_file_duplicate")}},a)},select:function(e){var a,r=U(e),t=jQuery("#field_id").val(),n=jQuery("#return_relative_url").val();if(1==n&&(r=r.replace(jQuery("#base_url").val(),""),r=r.replace(jQuery("#cur_dir").val(),"")),a=1==jQuery("#popup").val()?window.opener:window.parent,""!=t)if(1==jQuery("#crossdomain").val())a.postMessage({sender:"responsivefilemanager",url:r,field_id:t},"*");else{var i=jQuery("#"+t,a.document);i.val(r).trigger("change"),"function"==typeof a.responsive_filemanager_callback&&a.responsive_filemanager_callback(t),Q()}else apply_any(r)},copy:function(e){d(e,"copy")},cut:function(e){d(e,"cut")},paste:function(){f()},chmod:function(e){o(e)},edit_text_file:function(e){i(e)}},makeContextMenu:function(){var a=this;e.contextMenu({selector:"figure:not(.back-directory), .list-view2 figure:not(.back-directory)",autoHide:!0,build:function(e){e.addClass("selected");var t={callback:function(r,t){a.contextActions[r](e)},items:{}};return(e.find(".img-precontainer-mini .filetype").hasClass("png")||e.find(".img-precontainer-mini .filetype").hasClass("jpg")||e.find(".img-precontainer-mini .filetype").hasClass("jpeg"))&&r&&(t.items.edit_img={name:jQuery("#lang_edit_image").val(),icon:"edit_img",disabled:!1}),e.hasClass("directory")&&0!=jQuery("#type_param").val()&&(t.items.select={name:jQuery("#lang_select").val(),icon:"",disabled:!1}),t.items.copy_url={name:jQuery("#lang_show_url").val(),icon:"url",disabled:!1},(e.find(".img-precontainer-mini .filetype").hasClass("zip")||e.find(".img-precontainer-mini .filetype").hasClass("tar")||e.find(".img-precontainer-mini .filetype").hasClass("gz"))&&(t.items.unzip={name:jQuery("#lang_extract").val(),icon:"extract",disabled:!1}),e.find(".img-precontainer-mini .filetype").hasClass("edit-text-file-allowed")&&(t.items.edit_text_file={name:jQuery("#lang_edit_file").val(),icon:"edit",disabled:!1}),e.hasClass("directory")||1!=jQuery("#duplicate").val()||(t.items.duplicate={name:jQuery("#lang_duplicate").val(),icon:"duplicate",disabled:!1}),e.hasClass("directory")||1!=jQuery("#copy_cut_files_allowed").val()?e.hasClass("directory")&&1==jQuery("#copy_cut_dirs_allowed").val()&&(t.items.copy={name:jQuery("#lang_copy").val(),icon:"copy",disabled:!1},t.items.cut={name:jQuery("#lang_cut").val(),icon:"cut",disabled:!1}):(t.items.copy={name:jQuery("#lang_copy").val(),icon:"copy",disabled:!1},t.items.cut={name:jQuery("#lang_cut").val(),icon:"cut",disabled:!1}),0==jQuery("#clipboard").val()||e.hasClass("directory")||(t.items.paste={name:jQuery("#lang_paste_here").val(),icon:"clipboard-apply",disabled:!1}),e.hasClass("directory")||1!=jQuery("#chmod_files_allowed").val()?e.hasClass("directory")&&1==jQuery("#chmod_dirs_allowed").val()&&(t.items.chmod={name:jQuery("#lang_file_permission").val(),icon:"key",disabled:!1}):t.items.chmod={name:jQuery("#lang_file_permission").val(),icon:"key",disabled:!1},t.items.sep="----",t.items.info={name:""+jQuery("#lang_file_info").val()+"",disabled:!0},t.items.name={name:e.attr("data-name"),icon:"label",disabled:!0},"img"==e.attr("data-type")&&(t.items.dimension={name:e.find(".img-dimension").html(),icon:"dimension",disabled:!0}),"true"!==jQuery("#show_folder_size").val()&&"true"!==jQuery("#show_folder_size").val()||(e.hasClass("directory")?t.items.size={name:e.find(".file-size").html()+" - "+e.find(".nfiles").val()+" "+jQuery("#lang_files").val()+" - "+e.find(".nfolders").val()+" "+jQuery("#lang_folders").val(),icon:"size",disabled:!0}:t.items.size={name:e.find(".file-size").html(),icon:"size",disabled:!0}),t.items.date={name:e.find(".file-date").html(),icon:"date",disabled:!0},t},events:{hide:function(){jQuery("figure").removeClass("selected")}}}),jQuery(document).on("contextmenu",function(e){if(!jQuery(e.target).is("figure"))return!1})},bindGridEvents:function(){function a(e){window[e.attr("data-function")](e.attr("data-file"),jQuery("#field_id").val())}var r=jQuery("ul.grid");r.on("click",".modalAV",function(a){var r=jQuery(this);a.preventDefault();var t=jQuery("#previewAV"),n=jQuery(".body-preview");t.removeData("modal"),t.modal({backdrop:"static",keyboard:!1}),r.hasClass("audio")?n.css("height","80px"):n.css("height","345px"),e.ajax({url:r.attr("data-url"),success:function(e){n.html(e)}})}),r.on("click",".file-preview-btn",function(a){var r=jQuery(this);a.preventDefault(),e.ajax({url:r.attr("data-url"),success:function(e){bootbox.modal(e," "+r.parent().parent().parent().find(".name").val())}})}),r.on("click",".preview",function(){var e=jQuery(this);return 0==e.hasClass("disabled")&&jQuery("#full-img").attr("src",decodeURIComponent(e.attr("data-url"))),!0}),r.on("click",".rename-file",function(){var a=jQuery(this),r=a.parent().parent().parent(),t=r.find("h4"),n=e.trim(t.text());bootbox.prompt(jQuery("#rename").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){null!==e&&(e=_(e),e!=n&&g("rename_file",a.attr("data-path"),e,r,"apply_file_rename"))},n)}),r.on("click",".rename-folder",function(){var a=jQuery(this),r=a.parent().parent().parent(),t=r.find("h4"),n=e.trim(t.text());bootbox.prompt(jQuery("#rename").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(e){null!==e&&(e=_(e).replace(".",""),e!=n&&g("rename_folder",a.attr("data-path"),e,r,"apply_folder_rename"))},n)}),r.on("click",".delete-file",function(){var e=jQuery(this);bootbox.confirm(e.attr("data-confirm"),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){if(1==a){g("delete_file",e.attr("data-path"),"","","");var r=jQuery("#files_number");r.text(parseInt(r.text())-1),e.parent().parent().parent().parent().remove()}})}),r.on("click",".delete-folder",function(){var e=jQuery(this);bootbox.confirm(e.attr("data-confirm"),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){if(1==a){g("delete_folder",e.attr("data-path"),"","","");var r=jQuery("#folders_number");r.text(parseInt(r.text())-1),e.parent().parent().parent().remove()}})}),jQuery("ul.grid").on("click",".link",function(){a(jQuery(this))}),jQuery("ul.grid").on("click","div.box",function(e){var r=jQuery(this).find(".link");if(0!==r.length)a(r);else{var t=jQuery(this).find(".folder-link");0!==t.length&&(document.location=jQuery(t).prop("href"))}})},makeFilters:function(a){jQuery("#filter-input").on("keyup",function(){jQuery(".filters label").removeClass("btn-inverse"),jQuery(".filters label").find("i").removeClass("icon-white"),jQuery("#ff-item-type-all").addClass("btn-inverse"),jQuery("#ff-item-type-all").find("i").addClass("icon-white");var r=_(jQuery(this).val()).toLowerCase();jQuery(this).val(r),a&&S(function(){jQuery("li","ul.grid ").each(function(){var e=jQuery(this);""!=r&&e.attr("data-name").toLowerCase().indexOf(r)==-1?e.hide(100):e.show(100)}),e.ajax({url:"ajax_calls.php?action=filter&type="+r}).done(function(e){""!=e&&bootbox.alert(e)}),S(function(){var e=0!=jQuery("#descending").val();b(e,"."+jQuery("#sort_by").val()),x()},500)},300)}).keypress(function(e){13==e.which&&jQuery("#filter").trigger("click")}),jQuery("#filter").on("click",function(){var e=_(jQuery("#filter-input").val()),a=jQuery("#current_url").val();a+=a.indexOf("?")>=0?"&":"?",window.location.href=a+"filter="+e})},makeUploader:function(){jQuery("#fileupload").fileupload({url:"upload.php",maxChunkSize:2097152}),jQuery("#fileupload").bind("fileuploaddrop",function(e,a){jQuery(".uploader").show(200)}),jQuery("#fileupload").bind("fileuploadsubmit",function(e,a){a.formData={fldr:jQuery("#sub_folder").val()+jQuery("#fldr_value").val()+a.files[0].relativePath}}),jQuery("#fileupload").addClass("fileupload-processing"),e.ajax({url:jQuery("#fileupload").fileupload("option","url"),dataType:"json",context:jQuery("#fileupload")[0]}).always(function(){jQuery(this).removeClass("fileupload-processing")}),jQuery(".upload-btn").on("click",function(){jQuery(".uploader").show(200)}),jQuery(".close-uploader").on("click",function(){jQuery(".uploader").hide(200),setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},420)})},uploadURL:function(){jQuery("#uploadURL").on("click",function(a){a.preventDefault();var r=jQuery("#url").val(),t=jQuery("#fldr_value").val();show_animation(),e.ajax({type:"POST",url:"upload.php",data:{fldr:t,url:r}}).done(function(e){hide_animation(),jQuery("#url").val("")}).fail(function(e){bootbox.alert(jQuery("#lang_error_upload").val()),hide_animation(),jQuery("#url").val("")})})},makeSort:function(a){jQuery("input[name=radio-sort]").on("click",function(){var e=jQuery(this).attr("data-item"),t=jQuery("#"+e),n=jQuery(".filters label");n.removeClass("btn-inverse"),n.find("i").removeClass("icon-white"),jQuery("#filter-input").val(""),t.addClass("btn-inverse"),t.find("i").addClass("icon-white"),"ff-item-type-all"==e?(a?jQuery(".grid li").show(300):window.location.href=jQuery("#current_url").val()+"&sort_by="+jQuery("#sort_by").val()+"&descending="+(r?1:0),"undefined"!=typeof Storage&&localStorage.setItem("sort","")):jQuery(this).is(":checked")&&(jQuery(".grid li").not("."+e).hide(300),jQuery(".grid li."+e).show(300),"undefined"!=typeof Storage&&localStorage.setItem("sort",e)),x()});var r=jQuery("#descending").val();jQuery(".sorter").on("click",function(){var t=jQuery(this);r=jQuery("#sort_by").val()!==t.attr("data-sort")||0==r,a?(e.ajax({url:"ajax_calls.php?action=sort&sort_by="+t.attr("data-sort")+"&descending="+(r?1:0)}),b(r,"."+t.attr("data-sort")),jQuery(" a.sorter").removeClass("descending").removeClass("ascending"),r?jQuery(".sort-"+t.attr("data-sort")).addClass("descending"):jQuery(".sort-"+t.attr("data-sort")).addClass("ascending"),jQuery("#sort_by").val(t.attr("data-sort")),jQuery("#descending").val(r?1:0),x()):window.location.href=jQuery("#current_url").val()+"&sort_by="+t.attr("data-sort")+"&descending="+(r?1:0)})}};jQuery(document).ready(function(){if(C&&R.makeContextMenu(),"undefined"!=typeof Storage&&1!=jQuery("#type_param").val()&&3!=jQuery("#type_param").val()){var r=localStorage.getItem("sort");if(r){var i=jQuery("#"+r);i.addClass("btn-inverse"),i.find("i").addClass("icon-white"),jQuery(".grid li").not("."+r).hide(300),jQuery(".grid li."+r).show(300)}}if(jQuery("#full-img").on("click",function(){jQuery("#previewLightbox").lightbox("hide")}),jQuery("body").on("click",function(){jQuery(".tip-right").tooltip("hide")}),R.bindGridEvents(),parseInt(jQuery("#file_number").val())>parseInt(jQuery("#file_number_limit_js").val()))var o=!1;else var o=!0;if(R.makeSort(o),R.makeFilters(o),R.uploadURL(),jQuery("#info").on("click",function(){bootbox.alert('

    responsive filemanager

    RESPONSIVE filemanager v.'+k+'
    responsivefilemanager.com


    Copyright © Tecrail - Alberto Peripolli. All rights reserved.


    License
    Creative Commons License
    This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License.

    ')}),jQuery("#change_lang_btn").on("click",function(){l()}),R.makeUploader(),jQuery("body").on("keypress",function(e){var a=String.fromCharCode(e.which);if("'"==a||'"'==a||"\\"==a||"/"==a)return!1}),jQuery("ul.grid li figcaption").on("click",'a[data-toggle="lightbox"]',function(){t(decodeURIComponent(jQuery(this).attr("data-url")))}),jQuery(".create-file-btn").on("click",function(){n()}),jQuery(".new-folder").on("click",function(){bootbox.prompt(jQuery("#insert_folder_name").val(),jQuery("#cancel").val(),jQuery("#ok").val(),function(a){if(null!==a){a=_(a).replace(".","");var r=jQuery("#sub_folder").val()+jQuery("#fldr_value").val();e.ajax({type:"POST",url:"execute.php?action=create_folder",data:{path:r,name:a}}).done(function(e){setTimeout(function(){window.location.href=jQuery("#refresh").attr("href")+"&"+(new Date).getTime()},300)})}})}),jQuery(".view-controller button").on("click",function(){var a=jQuery(this);jQuery(".view-controller button").removeClass("btn-inverse"),jQuery(".view-controller i").removeClass("icon-white"),a.addClass("btn-inverse"),a.find("i").addClass("icon-white"),e.ajax({url:"ajax_calls.php?action=view&type="+a.attr("data-value")}).done(function(e){""!=e&&bootbox.alert(e)}),"undefined"!=typeof jQuery("ul.grid")[0]&&jQuery("ul.grid")[0]&&(jQuery("ul.grid")[0].className=jQuery("ul.grid")[0].className.replace(/\blist-view.*?\b/g,"")),"undefined"!=typeof jQuery(".sorter-container")[0]&&jQuery(".sorter-container")[0]&&(jQuery(".sorter-container")[0].className=jQuery(".sorter-container")[0].className.replace(/\blist-view.*?\b/g,""));var r=a.attr("data-value");jQuery("#view").val(r),jQuery("ul.grid").addClass("list-view"+r),jQuery(".sorter-container").addClass("list-view"+r),a.attr("data-value")>=1?v(14):(jQuery("ul.grid li").css("width",126),jQuery("ul.grid figure").css("width",122)),x()}),a.touch?(jQuery("#help").show(),jQuery(".box:not(.no-effect)").swipe({swipeLeft:m,swipeRight:m,threshold:30})):(jQuery(".tip").tooltip({placement:"bottom"}),jQuery(".tip-top").tooltip({placement:"top"}),jQuery(".tip-left").tooltip({placement:"left"}),jQuery(".tip-right").tooltip({placement:"right"}),jQuery("body").addClass("no-touch")),jQuery(".paste-here-btn").on("click",function(){0==jQuery(this).hasClass("disabled")&&f()}),jQuery(".clear-clipboard-btn").on("click",function(){0==jQuery(this).hasClass("disabled")&&s()}),!a.csstransforms){var c=jQuery("figure");c.on("mouseover",function(){0==jQuery("#view").val()&&jQuery("#main-item-container").hasClass("no-effect-slide")===!1&&jQuery(this).find(".box:not(.no-effect)").animate({top:"-26px"},{queue:!1,duration:300})}),c.on("mouseout",function(){0==jQuery("#view").val()&&jQuery(this).find(".box:not(.no-effect)").animate({top:"0px"},{queue:!1,duration:300})})}jQuery(window).resize(function(){v(28)}),v(14),y(1==jQuery("#clipboard").val()?!0:!1),jQuery("li.dir, li.file").draggable({distance:20,cursor:"move",helper:function(){jQuery(this).find("figure").find(".box").css("top","0px");var e=jQuery(this).clone().css("z-index",1e3).find(".box").css("box-shadow","none").css("-webkit-box-shadow","none").parent().parent();return jQuery(this).addClass("selected"),e},start:function(e,a){jQuery(a.helper).addClass("ui-draggable-helper"),0==jQuery("#view").val()&&jQuery("#main-item-container").addClass("no-effect-slide")},stop:function(){jQuery(this).removeClass("selected"),0==jQuery("#view").val()&&jQuery("#main-item-container").removeClass("no-effect-slide")}}),jQuery("li.dir,li.back").droppable({accept:"ul.grid li",activeClass:"ui-state-highlight",hoverClass:"ui-state-hover",drop:function(e,a){p(a.draggable.find("figure"),jQuery(this).find("figure"))}}),jQuery(document).on("keyup","#chmod_form #chmod_value",function(){u(!0)}),jQuery(document).on("change","#chmod_form input",function(){u(!1)}),jQuery(document).on("focusout","#chmod_form #chmod_value",function(){var e=jQuery("#chmod_form #chmod_value");null==e.val().match(/^[0-7]{3}$/)&&(e.val(e.attr("data-def-value")),u(!0))}),T=new LazyLoad,I=new Clipboard(".btn")}),encodeURL=function(e){for(var a=e.split("/"),r=3;r-1?(f=f+"?"+(new Date).getTime(),c=''+o+''):e.inArray(u,d)>-1?c='":e.inArray(u,s)>-1?("mp3"==u&&(u="mpeg"),c='"):c=''+o+"",1==jQuery("#crossdomain").val()?t.postMessage({sender:"responsivefilemanager",url:f,field_id:null,html:c},"*"):parent.tinymce.majorVersion<4?(parent.tinymce.activeEditor.execCommand("mceInsertContent",!1,c),parent.tinymce.activeEditor.windowManager.close(parent.tinymce.activeEditor.windowManager.params.mce_window_id)):(parent.tinymce.activeEditor.insertContent(c),parent.tinymce.activeEditor.windowManager.close())},apply_link=function(e,a){if(1==jQuery("#popup").val())var r=window.opener;else var r=window.parent;var t=jQuery("#callback").val(),n=jQuery("#cur_dir").val();n=n.replace("\\","/");var i=jQuery("#subdir").val();i=i.replace("\\","/");var l=jQuery("#base_url").val();if(1==jQuery("#ftp").val())var o=encodeURL(jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+e);else var u=jQuery("#return_relative_url").val(),o=encodeURL((1==u?i:l+n)+e);if(""!=a)if(1==jQuery("#crossdomain").val())r.postMessage({sender:"responsivefilemanager",url:o,field_id:a},"*");else{var c=jQuery("#"+a,r.document);c.val(o).trigger("change"),0==t?"function"==typeof r.responsive_filemanager_callback&&r.responsive_filemanager_callback(a):"function"==typeof r[t]&&r[t](a),Q()}else apply_any(o)},apply_img=function(e,a){var r;r=1==jQuery("#popup").val()?window.opener:window.parent;var t=jQuery("#callback").val(),n=jQuery("#cur_dir").val();n=n.replace("\\","/");var i=jQuery("#subdir").val();i=i.replace("\\","/");var l=jQuery("#base_url").val();if(1==jQuery("#ftp").val())var o=encodeURL(jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+e);else var u=jQuery("#return_relative_url").val(),o=encodeURL((1==u?i:l+n)+e);if(""!=a)if(1==jQuery("#crossdomain").val())r.postMessage({sender:"responsivefilemanager",url:o,field_id:a},"*");else{var c=jQuery("#"+a,r.document);c.val(o).trigger("change"),0==t?"function"==typeof r.responsive_filemanager_callback&&r.responsive_filemanager_callback(a):"function"==typeof r[t]&&r[t](a),Q()}else jQuery("#add_time_to_img").val()&&(o=o+"?"+(new Date).getTime()),apply_any(o)},apply_video=function(e,a){var r;r=1==jQuery("#popup").val()?window.opener:window.parent;var t=jQuery("#callback").val(),n=jQuery("#cur_dir").val();n=n.replace("\\","/");var i=jQuery("#subdir").val();i=i.replace("\\","/");var l=jQuery("#base_url").val();if(1==jQuery("#ftp").val())var o=encodeURL(jQuery("#ftp_base_url").val()+jQuery("#upload_dir").val()+jQuery("#fldr_value").val()+e);else var u=jQuery("#return_relative_url").val(),o=encodeURL((1==u?i:l+n)+e);if(""!=a)if(1==jQuery("#crossdomain").val())r.postMessage({sender:"responsivefilemanager",url:o,field_id:a},"*");else{var c=jQuery("#"+a,r.document);c.val(o).trigger("change"),0==t?"function"==typeof r.responsive_filemanager_callback&&r.responsive_filemanager_callback(a):"function"==typeof r[t]&&r[t](a),Q()}else apply_any(o)},apply_none=function(e){var a=jQuery("ul.grid").find('li[data-name="'+e+'"] figcaption a');a[1].click(),jQuery(".tip-right").tooltip("hide")},apply_any=function(e){if(1==jQuery("#crossdomain").val())window.parent.postMessage({sender:"responsivefilemanager",url:e,field_id:null},"*");else{var a=jQuery("#editor").val();if("ckeditor"==a){var r=j("CKEditorFuncNum");window.opener.CKEDITOR.tools.callFunction(r,e),window.close()}else parent.tinymce.majorVersion<4?(parent.tinymce.activeEditor.windowManager.params.setUrl(e),parent.tinymce.activeEditor.windowManager.close(parent.tinymce.activeEditor.windowManager.params.mce_window_id)):(parent.tinymce.activeEditor.windowManager.getParams().setUrl(e),parent.tinymce.activeEditor.windowManager.close())}},apply_file_duplicate=function(e,a){var r=e.parent().parent().parent().parent();r.after("
  • "+r.html()+"
  • ");var t=r.next();apply_file_rename(t.find("figure"),a);var n=t.find(".download-form"),i="form"+(new Date).getTime();n.attr("id",i),n.find(".tip-right").attr("onclick","jQuery('#"+i+"').submit();")},apply_file_rename=function(e,a){var r;e.attr("data-name",a),e.parent().attr("data-name",a),e.find("h4").text(a);var t=e.find("a.link");r=t.attr("data-file"); +var n=r.substring(r.lastIndexOf("/")+1),i=r.substring(r.lastIndexOf(".")+1);t.each(function(){jQuery(this).attr("data-file",encodeURIComponent(a+"."+i))}),e.find("img").each(function(){var e=jQuery(this).attr("src");jQuery(this).attr("src",e.replace(n,a+"."+i)+"?time="+(new Date).getTime()),jQuery(this).attr("alt",a+" thumbnails")});var l=e.find("a.preview");r=l.attr("data-url"),"undefined"!=typeof r&&r&&l.attr("data-url",r.replace(encodeURIComponent(n),encodeURIComponent(a+"."+i))),e.parent().attr("data-name",a+"."+i),e.attr("data-name",a+"."+i),e.find(".name_download").val(a+"."+i);var o=e.find("a.rename-file"),u=e.find("a.delete-file"),c=o.attr("data-path"),s=c.replace(n,a+"."+i);o.attr("data-path",s),u.attr("data-path",s)},apply_folder_rename=function(e,a){e.attr("data-name",a),e.find("figure").attr("data-name",a);var r=e.find("h4").find("a").text();e.find("h4 > a").text(a);var t=e.find(".folder-link"),n=t.attr("href"),i=jQuery("#fldr_value").val(),l=n.replace("fldr="+i+encodeURIComponent(r),"fldr="+i+encodeURIComponent(a));t.each(function(){jQuery(this).attr("href",l)});var o=e.find("a.delete-folder"),u=e.find("a.rename-folder"),c=u.attr("data-path"),s=c.lastIndexOf("/"),d=c.substr(0,s+1)+a;o.attr("data-path",d),u.attr("data-path",d)},show_animation=function(){jQuery("#loading_container").css("display","block"),jQuery("#loading").css("opacity",".7")},hide_animation=function(){jQuery("#loading_container").fadeOut()}}(jQuery,Modernizr,image_editor),function(){function e(e,a){a=a||{bubbles:!1,cancelable:!1,detail:void 0};var r=document.createEvent("CustomEvent");return r.initCustomEvent(e,a.bubbles,a.cancelable,a.detail),r}return"function"!=typeof window.CustomEvent&&(e.prototype=window.Event.prototype,void(window.CustomEvent=e))}(); \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/MIT-LICENSE.txt b/core/vendor/filemanager/js/jPlayer/MIT-LICENSE.txt new file mode 100755 index 00000000..741ccdff --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/MIT-LICENSE.txt @@ -0,0 +1,21 @@ +Copyright (c) 2009 - 2013 Happyworm Ltd +http://happyworm.com +http://jplayer.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/README.md b/core/vendor/filemanager/js/jPlayer/README.md new file mode 100755 index 00000000..a1b30116 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/README.md @@ -0,0 +1,32 @@ +# [jPlayer](http://jplayer.org/) : HTML5 Audio & Video for [jQuery](http://jquery.com/) + +Support for [Zepto](http://zeptojs.com/) 1.0+ compiled with the data module. + +## What is jPlayer? + +### jPlayer is a jQuery/Zepto plugin that allows you to: +* **play and control media** files in your webpage. +* create a **consistent interface** and experience across all browsers. +* create and style a media player using **just HTML and CSS**. +* add **audio** and **video** to your jQuery/Zepto projects. +* support more devices using **HTML5**. +* support older browsers using a Flash _fall-back/forward_. +* control media on your website using a [JavaScript API](http://www.jplayer.org/latest/developer-guide/). + +### jPlayer supports: +* HTML5: **mp3, m4a (AAC), m4v (H.264),** ogv*, oga*, wav*, webm* +* Flash: **mp3, m4a (AAC), m4v (H.264),** rtmp, flv. + +_(*) Optional counterpart formats to increase HTML5 cross-browser support._ + +## License +[jPlayer](http://jplayer.org/) is licensed under the [MIT license](http://opensource.org/licenses/MIT). + +## More information: +* [jPlayer.org](http://jplayer.org/) +* [Quick Start Guide](http://www.jplayer.org/latest/quick-start-guide/) +* [Developer Guide and API Reference](http://www.jplayer.org/latest/developer-guide/) + +## Author: +Mark J Panaghiston [@thepag](http://twitter.com/thepag) +[happyworm.com](http://happyworm.com/) diff --git a/core/vendor/filemanager/js/jPlayer/actionscript/Jplayer.as b/core/vendor/filemanager/js/jPlayer/actionscript/Jplayer.as new file mode 100755 index 00000000..ab6940e3 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/actionscript/Jplayer.as @@ -0,0 +1,638 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Licensed under the MIT. + * http://opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Version: 2.4.0 + * Date: 5th June 2013 + * + * FlashVars expected: (AS3 property of: loaderInfo.parameters) + * id: (URL Encoded: String) Id of jPlayer instance + * vol: (Number) Sets the initial volume + * muted: (Boolean in a String) Sets the initial muted state + * jQuery: (URL Encoded: String) Sets the jQuery var name. Used with: someVar = jQuery.noConflict(true); The someVar name must contain jQuery in it. + * + * Compiled using: Adobe Flex Compiler (mxmlc) Version 4.5.1 build 21328 + */ + +package { + import flash.system.Security; + import flash.external.ExternalInterface; + + import flash.utils.Timer; + import flash.events.TimerEvent; + + import flash.text.TextField; + import flash.text.TextFormat; + + import flash.events.KeyboardEvent; + + import flash.display.Sprite; + import happyworm.jPlayer.*; + + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.events.Event; + import flash.net.LocalConnection; + import flash.events.StatusEvent; + + import flash.events.MouseEvent; + + import flash.ui.ContextMenu; + import flash.ui.ContextMenuItem; + import flash.events.ContextMenuEvent; + import flash.net.URLRequest; + import flash.net.navigateToURL; + import flash.media.Video; + + public class Jplayer extends Sprite { + private var jQuery:String; + private var sentNumberFractionDigits:uint = 2; + + public var commonStatus:JplayerStatus = new JplayerStatus(); // Used for inital ready event so volume is correct. + + private var myInitTimer:Timer = new Timer(100, 0); + + private var myMp3Player:JplayerMp3; + private var myMp4Player:JplayerMp4; + + private var myRtmpPlayer:JplayerRtmp; + + private var isRtmp:Boolean = false; + private var isMp4:Boolean = false; + + private var isMp3:Boolean = false; + private var isVideo:Boolean = false; + + private var securityIssue:Boolean = false; // On direct access and when SWF parameters contain illegal characters + + private var contextMenuFix:Sprite = new Sprite(); // A sprite that will be on top and fix the content menu over video bug. (A Flash plugin bug.) + + private var txLog:TextField; + private var debug:Boolean = false; // Set debug to false for release compile! + private var localAIRDebug:Boolean = false; // This is autodetermined by AIR app - leave false! + + private var traceOut:TraceOut; + + public function Jplayer() { + + flash.system.Security.allowDomain("*"); + traceOut = new TraceOut(); + + // Fix to the security exploit reported by Jason Calvert http://appsec.ws/ + checkFlashVars(loaderInfo.parameters); + + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + + if(!securityIssue) { + // The jQuery param is the primary cause of security concerns. + jQuery = loaderInfo.parameters.jQuery + "('#" + loaderInfo.parameters.id + "').jPlayer"; + commonStatus.volume = Number(loaderInfo.parameters.vol); + commonStatus.muted = loaderInfo.parameters.muted == "true"; + + stage.addEventListener(Event.RESIZE, resizeHandler); + stage.addEventListener(MouseEvent.CLICK, clickHandler); + + var initialVolume:Number = commonStatus.volume; + if(commonStatus.muted) { + initialVolume = 0; + } + + myMp3Player = new JplayerMp3(initialVolume); + addChild(myMp3Player); + + myMp4Player = new JplayerMp4(initialVolume); + addChild(myMp4Player); + + myRtmpPlayer = new JplayerRtmp(initialVolume); + addChild(myRtmpPlayer); + + switchType("mp3"); // set default state to mp3 + } + + // The ContextMenu only partially works. The menu select events never occur. + // Investigated and it is something to do with the way jPlayer inserts the Flash on the page. + // A simple test inserting the Jplayer.swf on a page using: 1) SWFObject 2.2 works. 2) AC_FL_RunContent() works. + // jPlayer Flash insertion is based on SWFObject 2.2 and the resaon behind this failure is not clear. The Flash insertion HTML on the page looks similar. + var myContextMenu:ContextMenu = new ContextMenu(); + myContextMenu.hideBuiltInItems(); + var menuItem_jPlayer:ContextMenuItem = new ContextMenuItem("jPlayer " + JplayerStatus.VERSION); + var menuItem_happyworm:ContextMenuItem = new ContextMenuItem("© 2009-2013 Happyworm Ltd", true); + menuItem_jPlayer.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuSelectHandler_jPlayer); + menuItem_happyworm.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuSelectHandler_happyworm); + myContextMenu.customItems.push(menuItem_jPlayer, menuItem_happyworm); + contextMenu = myContextMenu; + + // Log console for dev compile option: debug + if(debug || securityIssue) { + txLog = new TextField(); + txLog.x = 5; + txLog.y = 5; + txLog.width = stage.stageWidth - 10; + txLog.height = stage.stageHeight - 10; + txLog.backgroundColor = 0xEEEEFF; + txLog.border = true; + txLog.background = true; + txLog.multiline = true; + txLog.text = "jPlayer " + JplayerStatus.VERSION; + + if(securityIssue) { + txLog.visible = true; + } else if(debug) { + txLog.visible = false; + } + + this.addChild(txLog); + + if(debug && !securityIssue) { + this.stage.addEventListener(KeyboardEvent.KEY_UP, keyboardHandler); + + myMp3Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler); + myMp4Player.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler); + myRtmpPlayer.addEventListener(JplayerEvent.DEBUG_MSG, debugMsgHandler); + } + } + + // Known Flash problem with contextMenu over video player. + // Add a transparent rectangle into the sprite. + contextMenuFix.graphics.beginFill(0x000000, 0); // Transparent black + contextMenuFix.graphics.drawRect(0, 0, 10, 10); // Arbitary rectangle + contextMenuFix.graphics.endFill(); + addChild(contextMenuFix); // Put the sprite on the top layer. + + if(!securityIssue) { + // Delay init() because Firefox 3.5.7+ developed a bug with local testing in Firebug. + myInitTimer.addEventListener(TimerEvent.TIMER, init); + myInitTimer.start(); + } + } + + private function switchType(playType:String):void { + switch(playType) { + case "rtmpa": + isRtmp=true; + isMp3=false; + isMp4=false; + isVideo=false; + break; + case "rtmpv": + isRtmp=true; + isMp3=false; + isMp4=false; + isVideo=true; + break; + case "mp3": + isRtmp=false; + isMp3=true; + isMp4=false; + isVideo=false; + break; + case "mp4": + isRtmp=false; + isMp3=false; + isMp4=true; + isVideo=false; + break; + case "m4v": + isRtmp=false; + isMp3=false; + isMp4=true; + isVideo=true; + break; + } + + listenToMp3(isMp3); + listenToMp4(isMp4); + listenToRtmp(isRtmp); + } + + private function init(e:TimerEvent):void { + myInitTimer.stop(); + if(ExternalInterface.available && !securityIssue) { + ExternalInterface.addCallback("fl_setAudio_mp3", fl_setAudio_mp3); + ExternalInterface.addCallback("fl_setAudio_m4a", fl_setAudio_m4a); + ExternalInterface.addCallback("fl_setVideo_m4v", fl_setVideo_m4v); + ExternalInterface.addCallback("fl_setAudio_rtmp", fl_setAudio_rtmp); + ExternalInterface.addCallback("fl_setVideo_rtmp", fl_setVideo_rtmp); + ExternalInterface.addCallback("fl_clearMedia", fl_clearMedia); + ExternalInterface.addCallback("fl_load", fl_load); + ExternalInterface.addCallback("fl_play", fl_play); + ExternalInterface.addCallback("fl_pause", fl_pause); + ExternalInterface.addCallback("fl_play_head", fl_play_head); + ExternalInterface.addCallback("fl_volume", fl_volume); + ExternalInterface.addCallback("fl_mute", fl_mute); + + ExternalInterface.call(jQuery, "jPlayerFlashEvent", JplayerEvent.JPLAYER_READY, extractStatusData(commonStatus)); // See JplayerStatus() class for version number. + } + } + private function checkFlashVars(p:Object):void { + // Check for direct access. Inspired by mediaelement.js - Also added name to HTML object for non-IE browsers. + if(ExternalInterface.objectID != null && ExternalInterface.objectID.toString() != "") { + for each (var s:String in p) { + if(illegalChar(s)) { + securityIssue = true; // Found a security concern. + } + } + if(!securityIssue) { + if(jQueryIllegal(p.jQuery)) { + securityIssue = true; // Found a security concern. + } + } + } else { + securityIssue = true; // Direct access disables the callbacks, which were a security concern. + } + } + private function illegalChar(s:String):Boolean { + // A whitelist of accepted chars. + var validParam:RegExp = /^[-A-Za-z0-9_.]+$/; + return !validParam.test(s); + } + private function jQueryIllegal(s:String):Boolean { + // Check param contains the term jQuery. + var validParam:RegExp = /(jQuery)/; + return !validParam.test(s); + } + // switchType() here + private function listenToMp3(active:Boolean):void { + if(active) { + myMp3Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); + myMp3Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); + myMp3Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); + myMp3Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); + + myMp3Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); + myMp3Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); + myMp3Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); + + myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); + myMp3Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); + + myMp3Player.addEventListener(JplayerEvent.JPLAYER_WAITING, jPlayerFlashEvent); // only MP3 atm + myMp3Player.addEventListener(JplayerEvent.JPLAYER_PLAYING, jPlayerFlashEvent); // only MP3 atm + + myMp3Player.addEventListener(JplayerEvent.JPLAYER_CANPLAY, jPlayerFlashEvent); // only MP3 atm + myMp3Player.addEventListener(JplayerEvent.JPLAYER_CANPLAYTHROUGH, jPlayerFlashEvent); // only MP3 atm + } else { + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); + + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); + + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); + + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_WAITING, jPlayerFlashEvent); // only MP3 atm + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_PLAYING, jPlayerFlashEvent); // only MP3 atm + + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_CANPLAY, jPlayerFlashEvent); // only MP3 atm + myMp3Player.removeEventListener(JplayerEvent.JPLAYER_CANPLAYTHROUGH, jPlayerFlashEvent); // only MP3 atm + } + } + private function listenToMp4(active:Boolean):void { + if(active) { + myMp4Player.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); + myMp4Player.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); + myMp4Player.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); + myMp4Player.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); + + myMp4Player.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); + myMp4Player.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); + myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); + + myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); + myMp4Player.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); + + myMp4Player.addEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler + } else { + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); + + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); + + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); + + myMp4Player.removeEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler + } + } + + private function listenToRtmp(active:Boolean):void { + if(active) { + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); + + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); + + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_CANPLAY, jPlayerFlashEvent); + + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); + + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler + } else { + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_ERROR, jPlayerFlashEvent); + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_PROGRESS, jPlayerFlashEvent); + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_TIMEUPDATE, jPlayerFlashEvent); + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_ENDED, jPlayerFlashEvent); + + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_PLAY, jPlayerFlashEvent); + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_PAUSE, jPlayerFlashEvent); + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_LOADSTART, jPlayerFlashEvent); + + myRtmpPlayer.addEventListener(JplayerEvent.JPLAYER_CANPLAY, jPlayerFlashEvent); + + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_SEEKING, jPlayerFlashEvent); + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_SEEKED, jPlayerFlashEvent); + + myRtmpPlayer.removeEventListener(JplayerEvent.JPLAYER_LOADEDMETADATA, jPlayerMetaDataHandler); // Note the unique handler + } + } + + private function fl_setAudio_mp3(src:String):Boolean { + if (src != null) { + log("fl_setAudio_mp3: "+src); + switchType("mp3"); + myMp4Player.clearFile(); + myRtmpPlayer.clearFile(); + myMp3Player.setFile(src); + return true; + } else { + log("fl_setAudio_mp3: null"); + return false; + } + } + private function fl_setAudio_rtmp(src:String):Boolean { + tracer("SET RTMP: "+src); + if (src != null) { + log("fl_setAudio_rtmp: "+src); + switchType("rtmpa"); + myMp4Player.clearFile(); + myMp3Player.clearFile(); + myRtmpPlayer.setFile(src,false); + return true; + } else { + log("fl_setAudio_rtmp: null"); + return false; + } + } + + private function fl_setVideo_rtmp(src:String):Boolean { + tracer("SET RTMP: "+src); + if (src != null) { + log("fl_setVideo_rtmp: "+src); + switchType("rtmpv"); + myMp4Player.clearFile(); + myMp3Player.clearFile(); + myRtmpPlayer.setFile(src,true); + return true; + } else { + log("fl_setVideo_rtmp: null"); + return false; + } + } + private function fl_setAudio_m4a(src:String):Boolean { + if (src != null) { + log("fl_setAudio_m4a: "+src); + switchType("mp4") + myMp3Player.clearFile(); + myRtmpPlayer.clearFile(); + myMp4Player.setFile(src); + return true; + } else { + log("fl_setAudio_m4a: null"); + return false; + } + } + private function fl_setVideo_m4v(src:String):Boolean { + if (src != null) { + log("fl_setVideo_m4v: "+src); + switchType("m4v"); + myMp3Player.clearFile(); + myRtmpPlayer.clearFile(); + myMp4Player.setFile(src); + return true; + } else { + log("fl_setVideo_m4v: null"); + return false; + } + } + private function fl_clearMedia():void { + log("clearMedia."); + myMp3Player.clearFile(); + myMp4Player.clearFile(); + myRtmpPlayer.clearFile(); + } + + private function getType():Object { + var returnType:Object; + if(isMp3) { + returnType=myMp3Player; + } + if(isRtmp) { + returnType=myRtmpPlayer; + } + if(isMp4) { + returnType=myMp4Player; + } + return returnType; + } + + private function fl_load():Boolean { + log("load."); + var returnType:Object = getType(); + return returnType.load(); + } + private function fl_play(time:Number = NaN):Boolean { + log("play: time = " + time); + var returnType:Object = getType(); + return returnType.play(time * 1000); // Flash uses milliseconds + } + private function fl_pause(time:Number = NaN):Boolean { + log("pause: time = " + time); + var returnType:Object = getType(); + return returnType.pause(time * 1000); // Flash uses milliseconds + } + private function fl_play_head(percent:Number):Boolean { + log("play_head: "+percent+"%"); + var returnType:Object = getType(); + return returnType.playHead(percent); + } + private function fl_volume(v:Number):void { + log("volume: "+v); + commonStatus.volume = v; + if(!commonStatus.muted) { + myMp3Player.setVolume(v); + myMp4Player.setVolume(v); + myRtmpPlayer.setVolume(v); + } + } + private function fl_mute(mute:Boolean):void { + log("mute: "+mute); + commonStatus.muted = mute; + if(mute) { + myMp3Player.setVolume(0); + myMp4Player.setVolume(0); + myRtmpPlayer.setVolume(0); + } else { + myMp3Player.setVolume(commonStatus.volume); + myMp4Player.setVolume(commonStatus.volume); + myRtmpPlayer.setVolume(commonStatus.volume); + } + } + private function jPlayerFlashEvent(e:JplayerEvent):void { + log("jPlayer Flash Event: " + e.type + ": " + e.target); + //tracer("jPlayer Flash Event: " + e.type + ": " + e.target); + if(ExternalInterface.available && !securityIssue) { + ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data)); + } + } + + private function tracer(msg:String):void { + traceOut.tracer(msg); + } + + private function extractStatusData(data:JplayerStatus):Object { + var myStatus:Object = { + version: JplayerStatus.VERSION, + src: data.src, + paused: !data.isPlaying, // Changing this name requires inverting all assignments and conditional statements. + srcSet: data.srcSet, + seekPercent: data.seekPercent, + currentPercentRelative: data.currentPercentRelative, + currentPercentAbsolute: data.currentPercentAbsolute, + currentTime: data.currentTime / 1000, // JavaScript uses seconds + duration: data.duration / 1000, // JavaScript uses seconds + videoWidth: data.videoWidth, + videoHeight: data.videoHeight, + volume: commonStatus.volume, + muted: commonStatus.muted + }; + log("extractStatusData: sp="+myStatus.seekPercent+" cpr="+myStatus.currentPercentRelative+" cpa="+myStatus.currentPercentAbsolute+" ct="+myStatus.currentTime+" d="+myStatus.duration); + return myStatus; + } + private function jPlayerMetaDataHandler(e:JplayerEvent):void { + log("jPlayerMetaDataHandler:" + e.target); + if(ExternalInterface.available && !securityIssue) { + resizeHandler(new Event(Event.RESIZE)); + ExternalInterface.call(jQuery, "jPlayerFlashEvent", e.type, extractStatusData(e.data)); + } + } + private function resizeHandler(e:Event):void { + log("resizeHandler: stageWidth = " + stage.stageWidth + " | stageHeight = " + stage.stageHeight); + + var mediaX:Number = 0; + var mediaY:Number = 0; + var mediaWidth:Number = 0; + var mediaHeight:Number = 0; + + var aspectRatioStage:Number = 0; + var aspectRatioVideo:Number = 0; + + var videoItem:*; + + if(isRtmp) { + videoItem = myRtmpPlayer; + } + if(isMp4) { + videoItem = myMp4Player; + } + + if(videoItem) { + if(stage.stageWidth > 0 && stage.stageHeight > 0 && videoItem.myVideo.width > 0 && videoItem.myVideo.height > 0) { + aspectRatioStage = stage.stageWidth / stage.stageHeight; + aspectRatioVideo = videoItem.myVideo.width / videoItem.myVideo.height; + if(aspectRatioStage < aspectRatioVideo) { + mediaWidth = stage.stageWidth; + mediaHeight = stage.stageWidth / aspectRatioVideo; + mediaX = 0; + mediaY = (stage.stageHeight - mediaHeight) / 2; + } else { + mediaWidth = stage.stageHeight * aspectRatioVideo; + mediaHeight = stage.stageHeight; + mediaX = (stage.stageWidth - mediaWidth) / 2; + mediaY = 0; + } + resizeEntity(videoItem, mediaX, mediaY, mediaWidth, mediaHeight); + } + } + if((debug || securityIssue) && stage.stageWidth > 20 && stage.stageHeight > 20) { + txLog.width = stage.stageWidth - 10; + txLog.height = stage.stageHeight - 10; + } + // Resize the sprite so it covers the entire stage area + contextMenuFix.x = 0; + contextMenuFix.y = 0; + contextMenuFix.width = stage.stageWidth; + contextMenuFix.height = stage.stageHeight; + } + private function resizeEntity(entity:Sprite, mediaX:Number, mediaY:Number, mediaWidth:Number, mediaHeight:Number):void { + entity.x = mediaX; + entity.y = mediaY; + entity.width = mediaWidth; + entity.height = mediaHeight; + } + private function clickHandler(e:MouseEvent):void { + // This needs to work with RTMP format too! + if(isMp3) { + jPlayerFlashEvent(new JplayerEvent(JplayerEvent.JPLAYER_CLICK, myMp3Player.myStatus, "click")) + } else { + jPlayerFlashEvent(new JplayerEvent(JplayerEvent.JPLAYER_CLICK, myMp4Player.myStatus, "click")) + } + } + // This event is never called. See comments in class constructor. + private function menuSelectHandler_jPlayer(e:ContextMenuEvent):void { + navigateToURL(new URLRequest("http://jplayer.org/"), "_blank"); + } + // This event is never called. See comments in class constructor. + private function menuSelectHandler_happyworm(e:ContextMenuEvent):void { + navigateToURL(new URLRequest("http://happyworm.com/"), "_blank"); + } + private function log(t:String):void { + if(debug) { + txLog.text = t + "\n" + txLog.text; + localAIRDebug = traceOut.localAIRDebug(); + if(localAIRDebug) { + tracer(t); + } + + if(ExternalInterface.available && !securityIssue) { + ExternalInterface.call("console.log", t); + } + } + } + private function debugMsgHandler(e:JplayerEvent):void { + log(e.msg); + } + private function keyboardHandler(e:KeyboardEvent):void { + log("keyboardHandler: e.keyCode = " + e.keyCode); + switch(e.keyCode) { + case 68 : // d + txLog.visible = !txLog.visible; + log("Toggled log display: " + txLog.visible); + break; + case 76 : // l + if(e.ctrlKey && e.shiftKey) { + txLog.text = "Cleared log."; + } + break; + } + } + } +} diff --git a/core/vendor/filemanager/js/jPlayer/actionscript/Jplayer.fla b/core/vendor/filemanager/js/jPlayer/actionscript/Jplayer.fla new file mode 100755 index 0000000000000000000000000000000000000000..61ae40d3ac2811ebcfd63b1ff3bb590f67984445 GIT binary patch literal 61952 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�DN>v0;j*NSUn@AEC$So)`x?s<|%m5n{;d9tze zPb=N?B#kN?d(QJ@W9gq(y5~t6RW|mV=gG#>Kdp4nlQgPq>^aYqjirBD>1*Z5riuT# Lr)S@~#Q*$1&)N_z literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/ConnectManager.as b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/ConnectManager.as new file mode 100755 index 00000000..1baa0327 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/ConnectManager.as @@ -0,0 +1,295 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Robert M. Hall + * Date: 7th August 2012 + * Custom NetConnection Manager for more robust RTMP support + * Based in part on work by Will Law for the old Akamai NCManager.as + * and some of Will's new work in the OVP base classes (Open Video Player) + * as well as similar approaches by many other NetConnection managers + * + */ + + /* + TODO LIST 08/18/2011: + 1. Wired up errors to dispatch events to Jplayer events to allow them to bubble up to JS + 2. Rework event dispatch to handoff netconnection instead of a passed in reference + 3. Allow a customizeable list of protocols and ports to be used instead of entire list + 4. Allow a specific port/protocol (1 connect type) to be used first, and then optionally fallback on a custom list or the default list + 5. Remove some traces and check a few other items below where I've made notes + */ + +package happyworm.jPlayer { + + import flash.events.*; + import flash.net.*; + + import flash.utils.Timer; + import flash.utils.getTimer; + import flash.utils.clearInterval; + import flash.utils.setInterval; + + public class ConnectManager extends Object { + + private var protocols_arr:Array = new Array("rtmp","rtmpt","rtmpe","rtmpte","rtmps"); + private var ports_arr:Array = new Array("",":1935",":80",":443"); + private const protCount:Number = 5; + private const portCount:Number = 4; + + private var _ncRef:Object; + + private var _aNC:Array; + + private var k_TIMEOUT:Number = 30000; + private var k_startConns:Number; + private var m_connList:Array = []; + private var m_serverName:String; + private var m_appName:String; + private var m_streamName:String; + private var m_connListCounter:Number; + private var m_flashComConnectTimeOut:Number; + private var m_validNetConnection:NetConnection; + + private var connectSuccess:Boolean=false; + + private var negotiating:Boolean=false; + private var idleTimeOut:Boolean=false; + + public function ConnectManager() { + trace ("ConnectManager Initialized Version: 1.00 DT"); + createPortsProtocolsArray(); + } + + private function createPortsProtocolsArray():void { + var outerLoop:Number=0; + var innerLoop:Number=0; + for (outerLoop=0; outerLoop getDuration())) { + // Illegal seek time + seeking(false); + seekedEvent(); + pause(0); + } + } + private function seekingEvent():void { + myStatus.isSeeking = true; + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKING, myStatus)); + } + private function seekedEvent():void { + myStatus.isSeeking = false; + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKED, myStatus)); + } + private function playingHandler(e:TimerEvent):void { + checkPlaying(false); // Without forcing playing event. + } + private function checkPlaying(force:Boolean):void { + if(mySound.isBuffering) { + if(!myStatus.isWaiting) { + waitingEvent(); + } + } else { + if(myStatus.isWaiting || force) { + playingEvent(); + } + } + } + private function waitingEvent():void { + myStatus.isWaiting = true; + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_WAITING, myStatus)); + } + private function playingEvent():void { + myStatus.isWaiting = false; + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_CANPLAY, myStatus)); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAYING, myStatus)); + } + private function waitingHandler(e:TimerEvent):void { + waitingTimer.stop(); + if(myStatus.playOnLoad) { + waitingEvent(); + } + } + public function load():Boolean { + if(myStatus.loadRequired()) { + myStatus.startingDownload(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus)); + waitingTimer.start(); + mySound.load(myRequest, myContext); + return true; + } else { + return false; + } + } + public function play(time:Number = NaN):Boolean { + var wasPlaying:Boolean = myStatus.isPlaying; + + if(!isNaN(time) && myStatus.srcSet) { + if(myStatus.isPlaying) { + myChannel.stop(); + myStatus.isPlaying = false; + } + myStatus.pausePosition = time; + } + + if(myStatus.isStartingDownload) { + myStatus.playOnLoad = true; // Raise flag, captured in loadOpen() + return true; + } else if(myStatus.loadRequired()) { + myStatus.playOnLoad = true; // Raise flag, captured in loadOpen() + return load(); + } else if((myStatus.isLoading || myStatus.isLoaded) && !myStatus.isPlaying) { + if(myStatus.isLoaded && myStatus.pausePosition > getDuration()) { // The time is invalid, ie., past the end. + myStatus.pausePosition = 0; + timeUpdates(false); + timeUpdateEvent(); + if(wasPlaying) { // For when playing and then get a play(huge) + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); + } + } else if(myStatus.pausePosition > getDuration()) { + myStatus.playOnSeek = true; + seeking(true); + } else { + myStatus.isPlaying = true; // Set immediately before playing. Could affects events. + myChannel = mySound.play(myStatus.pausePosition); + myChannel.soundTransform = myTransform; + myChannel.addEventListener(Event.SOUND_COMPLETE, soundCompleteHandler); + timeUpdates(true); + if(!wasPlaying) { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY, myStatus)); + } + checkPlaying(true); // Force the playing event unless waiting, which will be dealt with in the playingTimer. + } + return true; + } else { + return false; + } + } + public function pause(time:Number = NaN):Boolean { + myStatus.playOnLoad = false; // Reset flag in case load/play issued immediately before this command, ie., before loadOpen() event. + myStatus.playOnSeek = false; // Reset flag in case play(time) issued before the command and is still seeking to time set. + + var wasPlaying:Boolean = myStatus.isPlaying; + + // To avoid possible loops with timeupdate and pause(time). A pause() does not have the problem. + var alreadyPausedAtTime:Boolean = false; + if(!isNaN(time) && myStatus.pausePosition == time) { + alreadyPausedAtTime = true; + } + + if(myStatus.isPlaying) { + myStatus.isPlaying = false; + myChannel.stop(); + if(myChannel.position > 0) { // Required otherwise a fast play then pause causes myChannel.position to equal zero and not the correct value. ie., When it happens leave pausePosition alone. + myStatus.pausePosition = myChannel.position; + } + } + + if(!isNaN(time) && myStatus.srcSet) { + myStatus.pausePosition = time; + } + + if(wasPlaying) { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); + } + + if(myStatus.isStartingDownload) { + return true; + } else if(myStatus.loadRequired()) { + if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation. + return load(); + } else { + return true; // Technically the pause(0) succeeded. ie., It did nothing, since nothing was required. + } + } else if(myStatus.isLoading || myStatus.isLoaded) { + if(myStatus.isLoaded && myStatus.pausePosition > getDuration()) { // The time is invalid, ie., past the end. + myStatus.pausePosition = 0; + } else if(myStatus.pausePosition > getDuration()) { + seeking(true); + } + timeUpdates(false); + // Need to be careful with timeupdate event, otherwise a pause in a timeupdate event can cause a loop. + // Neither pause() nor pause(time) will cause a timeupdate loop. + if(wasPlaying || !isNaN(time) && !alreadyPausedAtTime) { + timeUpdateEvent(); + } + return true; + } else { + return false; + } + } + public function playHead(percent:Number):Boolean { + var time:Number = percent * getDuration() / 100; + if(myStatus.isPlaying || myStatus.playOnLoad || myStatus.playOnSeek) { + return play(time); + } else { + return pause(time); + } + } + public function setVolume(v:Number):void { + myStatus.volume = v; + myTransform.volume = v; + myChannel.soundTransform = myTransform; + } + private function updateStatusValues():void { + myStatus.seekPercent = 100 * getLoadRatio(); + myStatus.currentTime = getCurrentTime(); + myStatus.currentPercentRelative = 100 * getCurrentRatioRel(); + myStatus.currentPercentAbsolute = 100 * getCurrentRatioAbs(); + myStatus.duration = getDuration(); + } + public function getLoadRatio():Number { + if((myStatus.isLoading || myStatus.isLoaded) && mySound.bytesTotal > 0) { + return mySound.bytesLoaded / mySound.bytesTotal; + } else { + return 0; + } + } + public function getDuration():Number { + if(mySound.length > 0) { + return mySound.length; + } else { + return 0; + } + } + public function getCurrentTime():Number { + if(myStatus.isPlaying) { + return myChannel.position; + } else { + return myStatus.pausePosition; + } + } + public function getCurrentRatioRel():Number { + if((getDuration() > 0) && (getCurrentTime() <= getDuration())) { + return getCurrentTime() / getDuration(); + } else { + return 0; + } + } + public function getCurrentRatioAbs():Number { + return getCurrentRatioRel() * getLoadRatio(); + } + } +} diff --git a/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerMp4.as b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerMp4.as new file mode 100755 index 00000000..a45e3278 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerMp4.as @@ -0,0 +1,412 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Date: 29th January 2013 + */ + +package happyworm.jPlayer { + import flash.display.Sprite; + + import flash.media.Video; + import flash.media.SoundTransform; + + import flash.net.NetConnection; + import flash.net.NetStream; + + import flash.utils.Timer; + + import flash.events.NetStatusEvent; + import flash.events.SecurityErrorEvent; + import flash.events.TimerEvent; + + public class JplayerMp4 extends Sprite { + + public var myVideo:Video = new Video(); + private var myConnection:NetConnection; + private var myStream:NetStream; + + private var myTransform:SoundTransform = new SoundTransform(); + + public var myStatus:JplayerStatus = new JplayerStatus(); + + private var timeUpdateTimer:Timer = new Timer(250, 0); // Matched to HTML event freq + private var progressTimer:Timer = new Timer(250, 0); // Matched to HTML event freq + private var seekingTimer:Timer = new Timer(100, 0); // Internal: How often seeking is checked to see if it is over. + + public function JplayerMp4(volume:Number) { + myConnection = new NetConnection(); + myConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); + myConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); + myVideo.smoothing = true; + this.addChild(myVideo); + + timeUpdateTimer.addEventListener(TimerEvent.TIMER, timeUpdateHandler); + progressTimer.addEventListener(TimerEvent.TIMER, progressHandler); + seekingTimer.addEventListener(TimerEvent.TIMER, seekingHandler); + + myStatus.volume = volume; + } + private function progressUpdates(active:Boolean):void { + if(active) { + progressTimer.start(); + } else { + progressTimer.stop(); + } + } + private function progressHandler(e:TimerEvent):void { + if(myStatus.isLoading) { + if(getLoadRatio() == 1) { // Close as can get to a loadComplete event since client.onPlayStatus only works with FMS + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressHandler: loadComplete")); + myStatus.loaded(); + progressUpdates(false); + } + } + progressEvent(); + } + private function progressEvent():void { + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "progressEvent:")); + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PROGRESS, myStatus)); + } + private function timeUpdates(active:Boolean):void { + if(active) { + timeUpdateTimer.start(); + } else { + timeUpdateTimer.stop(); + } + } + private function timeUpdateHandler(e:TimerEvent):void { + timeUpdateEvent(); + } + private function timeUpdateEvent():void { + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_TIMEUPDATE, myStatus)); + } + private function seeking(active:Boolean):void { + if(active) { + if(!myStatus.isSeeking) { + seekingEvent(); + } + seekingTimer.start(); + } else { + if(myStatus.isSeeking) { + seekedEvent(); + } + seekingTimer.stop(); + } + } + private function seekingHandler(e:TimerEvent):void { + if(getSeekTimeRatio() <= getLoadRatio()) { + seeking(false); + if(myStatus.playOnSeek) { + myStatus.playOnSeek = false; // Capture the flag. + play(myStatus.pausePosition); // Must pass time or the seek time is never set. + } else { + pause(myStatus.pausePosition); // Must pass time or the stream.time is read. + } + } else if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { + // Illegal seek time + seeking(false); + pause(0); + } + } + private function seekingEvent():void { + myStatus.isSeeking = true; + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKING, myStatus)); + } + private function seekedEvent():void { + myStatus.isSeeking = false; + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKED, myStatus)); + } + private function netStatusHandler(e:NetStatusEvent):void { + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "netStatusHandler: '" + e.info.code + "'")); + switch(e.info.code) { + case "NetConnection.Connect.Success": + connectStream(); + break; + case "NetStream.Play.Start": + // This event code occurs once, when the media is opened. Equiv to loadOpen() in mp3 player. + myStatus.loading(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART, myStatus)); + progressUpdates(true); + // See onMetaDataHandler() for other condition, since duration is vital. + break; + case "NetStream.Play.Stop": + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "NetStream.Play.Stop: getDuration() - getCurrentTime() = " + (getDuration() - getCurrentTime()))); + + // Check if media is at the end (or close) otherwise this was due to download bandwidth stopping playback. ie., Download is not fast enough. + if(Math.abs(getDuration() - getCurrentTime()) < 150) { // Testing found 150ms worked best for M4A files, where playHead(99.9) caused a stuck state due to firing with ~116ms left to play. + endedEvent(); + } + break; + case "NetStream.Seek.InvalidTime": + // Used for capturing invalid set times and clicks on the end of the progress bar. + endedEvent(); + break; + case "NetStream.Play.StreamNotFound": + myStatus.error(); // Resets status except the src, and it sets srcError property. + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ERROR, myStatus)); + break; + } + // "NetStream.Seek.Notify" event code is not very useful. It occurs after every seek(t) command issued and does not appear to wait for the media to be ready. + } + private function endedEvent():void { + var wasPlaying:Boolean = myStatus.isPlaying; + pause(0); + timeUpdates(false); + timeUpdateEvent(); + if(wasPlaying) { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ENDED, myStatus)); + } + } + private function securityErrorHandler(event:SecurityErrorEvent):void { + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "securityErrorHandler.")); + } + private function connectStream():void { + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "connectStream.")); + var customClient:Object = new Object(); + customClient.onMetaData = onMetaDataHandler; + // customClient.onPlayStatus = onPlayStatusHandler; // According to the forums and my tests, onPlayStatus only works with FMS (Flash Media Server). + myStream = null; + myStream = new NetStream(myConnection); + myStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); + myStream.client = customClient; + myVideo.attachNetStream(myStream); + setVolume(myStatus.volume); + myStream.play(myStatus.src); + } + public function setFile(src:String):void { + if(myStream != null) { + myStream.close(); + } + myVideo.clear(); + progressUpdates(false); + timeUpdates(false); + + myStatus.reset(); + myStatus.src = src; + myStatus.srcSet = true; + timeUpdateEvent(); + } + public function clearFile():void { + setFile(""); + myStatus.srcSet = false; + } + public function load():Boolean { + if(myStatus.loadRequired()) { + myStatus.startingDownload(); + myConnection.connect(null); + return true; + } else { + return false; + } + } + public function play(time:Number = NaN):Boolean { + var wasPlaying:Boolean = myStatus.isPlaying; + + if(!isNaN(time) && myStatus.srcSet) { + if(myStatus.isPlaying) { + myStream.pause(); + myStatus.isPlaying = false; + } + myStatus.pausePosition = time; + } + + if(myStatus.isStartingDownload) { + myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler() + return true; + } else if(myStatus.loadRequired()) { + myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler() + return load(); + } else if((myStatus.isLoading || myStatus.isLoaded) && !myStatus.isPlaying) { + if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { // The time is invalid, ie., past the end. + myStream.pause(); // Since it is playing by default at this point. + myStatus.pausePosition = 0; + myStream.seek(0); + timeUpdates(false); + timeUpdateEvent(); + if(wasPlaying) { // For when playing and then get a play(huge) + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); + } + } else if(getSeekTimeRatio() > getLoadRatio()) { // Use an estimate based on the downloaded amount + myStatus.playOnSeek = true; + seeking(true); + myStream.pause(); // Since it is playing by default at this point. + } else { + if(!isNaN(time)) { // Avoid using seek() when it is already correct. + myStream.seek(myStatus.pausePosition/1000); // Since time is in ms and seek() takes seconds + } + myStatus.isPlaying = true; // Set immediately before playing. Could affects events. + myStream.resume(); + timeUpdates(true); + if(!wasPlaying) { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY, myStatus)); + } + } + return true; + } else { + return false; + } + } + public function pause(time:Number = NaN):Boolean { + myStatus.playOnLoad = false; // Reset flag in case load/play issued immediately before this command, ie., before onMetadata() event. + myStatus.playOnSeek = false; // Reset flag in case play(time) issued before the command and is still seeking to time set. + + var wasPlaying:Boolean = myStatus.isPlaying; + + // To avoid possible loops with timeupdate and pause(time). A pause() does not have the problem. + var alreadyPausedAtTime:Boolean = false; + if(!isNaN(time) && myStatus.pausePosition == time) { + alreadyPausedAtTime = true; + } + + // Need to wait for metadata to load before ever issuing a pause. The metadata handler will call this function if needed, when ready. + if(myStream != null && myStatus.metaDataReady) { // myStream is a null until the 1st media is loaded. ie., The 1st ever setMedia being followed by a pause() or pause(t). + myStream.pause(); + } + if(myStatus.isPlaying) { + myStatus.isPlaying = false; + myStatus.pausePosition = myStream.time * 1000; + } + + if(!isNaN(time) && myStatus.srcSet) { + myStatus.pausePosition = time; + } + + if(wasPlaying) { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); + } + + if(myStatus.isStartingDownload) { + return true; + } else if(myStatus.loadRequired()) { + if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation. + return load(); + } else { + return true; // Technically the pause(0) succeeded. ie., It did nothing, since nothing was required. + } + } else if(myStatus.isLoading || myStatus.isLoaded) { + if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) { // The time is invalid, ie., past the end. + myStatus.pausePosition = 0; + myStream.seek(0); + seekedEvent(); // Deals with seeking effect when using setMedia() then pause(huge). NB: There is no preceeding seeking event. + } else if(!isNaN(time)) { + if(getSeekTimeRatio() > getLoadRatio()) { // Use an estimate based on the downloaded amount + seeking(true); + } else { + if(myStatus.metaDataReady) { // Otherwise seek(0) will stop the metadata loading. + myStream.seek(myStatus.pausePosition/1000); + } + } + } + timeUpdates(false); + // Need to be careful with timeupdate event, otherwise a pause in a timeupdate event can cause a loop. + // Neither pause() nor pause(time) will cause a timeupdate loop. + if(wasPlaying || !isNaN(time) && !alreadyPausedAtTime) { + timeUpdateEvent(); + } + return true; + } else { + return false; + } + } + public function playHead(percent:Number):Boolean { + var time:Number = percent * getDuration() * getLoadRatio() / 100; + if(myStatus.isPlaying || myStatus.playOnLoad || myStatus.playOnSeek) { + return play(time); + } else { + return pause(time); + } + } + public function setVolume(v:Number):void { + myStatus.volume = v; + myTransform.volume = v; + if(myStream != null) { + myStream.soundTransform = myTransform; + } + } + private function updateStatusValues():void { + myStatus.seekPercent = 100 * getLoadRatio(); + myStatus.currentTime = getCurrentTime(); + myStatus.currentPercentRelative = 100 * getCurrentRatioRel(); + myStatus.currentPercentAbsolute = 100 * getCurrentRatioAbs(); + myStatus.duration = getDuration(); + } + public function getLoadRatio():Number { + if((myStatus.isLoading || myStatus.isLoaded) && myStream.bytesTotal > 0) { + return myStream.bytesLoaded / myStream.bytesTotal; + } else { + return 0; + } + } + public function getDuration():Number { + return myStatus.duration; // Set from meta data. + } + public function getCurrentTime():Number { + if(myStatus.isPlaying) { + return myStream.time * 1000; + } else { + return myStatus.pausePosition; + } + } + public function getCurrentRatioRel():Number { + if((getLoadRatio() > 0) && (getCurrentRatioAbs() <= getLoadRatio())) { + return getCurrentRatioAbs() / getLoadRatio(); + } else { + return 0; + } + } + public function getCurrentRatioAbs():Number { + if(getDuration() > 0) { + return getCurrentTime() / getDuration(); + } else { + return 0; + } + } + public function getSeekTimeRatio():Number { + if(getDuration() > 0) { + return myStatus.pausePosition / getDuration(); + } else { + return 1; + } + } + public function onMetaDataHandler(info:Object):void { // Used in connectStream() in myStream.client object. + // This event occurs when jumping to the start of static files! ie., seek(0) will cause this event to occur. + if(!myStatus.metaDataReady) { + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "onMetaDataHandler: " + info.duration + " | " + info.width + "x" + info.height)); + + myStatus.metaDataReady = true; // Set flag so that this event only effects jPlayer the 1st time. + myStatus.metaData = info; + myStatus.duration = info.duration * 1000; // Only available via Meta Data. + if(info.width != undefined) { + myVideo.width = myStatus.videoWidth = info.width; + } + if(info.height != undefined) { + myVideo.height = myStatus.videoHeight = info.height; + } + + if(myStatus.playOnLoad) { + myStatus.playOnLoad = false; // Capture the flag + if(myStatus.pausePosition > 0 ) { // Important for setMedia followed by play(time). + play(myStatus.pausePosition); + } else { + play(); // Not always sending pausePosition avoids the extra seek(0) for a normal play() command. + } + } else { + pause(myStatus.pausePosition); // Always send the pausePosition. Important for setMedia() followed by pause(time). Deals with not reading stream.time with setMedia() and play() immediately followed by stop() or pause(0) + } + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADEDMETADATA, myStatus)); + } else { + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG, myStatus, "onMetaDataHandler: Already read (NO EFFECT)")); + } + } + } +} diff --git a/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerRtmp.as b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerRtmp.as new file mode 100755 index 00000000..aae8a4df --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerRtmp.as @@ -0,0 +1,983 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Robert M. Hall + * Date: 29th January 2013 + * Based on JplayerMp4.as with modifications for rtmp + */ + +package happyworm.jPlayer +{ + import flash.display.Sprite; + + import flash.media.Video; + import flash.media.SoundTransform; + + import flash.net.NetConnection; + import flash.net.NetStream; + import flash.net.Responder; + + import flash.utils.Timer; + import flash.utils.getTimer; + + import flash.events.NetStatusEvent; + import flash.events.SecurityErrorEvent; + import flash.events.TimerEvent; + import flash.events.ErrorEvent; + import flash.events.UncaughtErrorEvent; + import flash.utils.clearInterval; + import flash.utils.setInterval; + import happyworm.jPlayer.ConnectManager; + + public class JplayerRtmp extends Sprite + { + + public var myVideo:Video = new Video; + private var myConnection:NetConnection; + private var myStream:NetStream; + + public var responder:Responder; + + private var streamName:String; + + private var connectString:Object; + + private var firstTime:Boolean = true; + + private var myTransform:SoundTransform = new SoundTransform ; + + public var myStatus:JplayerStatus = new JplayerStatus ; + + private var ConnMgr:ConnectManager=new ConnectManager(); + + private var timeUpdateTimer:Timer = new Timer(250,0);// Matched to HTML event freq + private var progressTimer:Timer = new Timer(250,0);// Matched to HTML event freq + private var seekingTimer:Timer = new Timer(100,0);// Internal: How often seeking is checked to see if it is over. + + private var startBuffer:Number = 3; + private var maxBuffer:Number = 12; + + public function JplayerRtmp(volume:Number) + { + myConnection = new NetConnection ; + myConnection.client = this; + + + // Moved the netconnection negotiation into the ConnectManager.as class - not needed for initial connection + // may need to add eventHandler back in for errors only or just dispatch from the ConnectManager..revisit... + + // myConnection.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler); + // myConnection.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler); + myVideo.smoothing = true; + this.addChild(myVideo); + + timeUpdateTimer.addEventListener(TimerEvent.TIMER,timeUpdateHandler); + progressTimer.addEventListener(TimerEvent.TIMER,progressHandler); + seekingTimer.addEventListener(TimerEvent.TIMER,seekingHandler); + + myStatus.volume = volume; + + addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler); + + + } + + + + private function uncaughtErrorHandler(event:UncaughtErrorEvent):void + { + trace("UNCAUGHT ERROR - try loading again"); + + if (event.error is Error) + { + var error:Error = event.error as Error; + trace(error); + // do something with the error + } + else if (event.error is ErrorEvent) + { + var errorEvent:ErrorEvent = event.error as ErrorEvent; + // do something with the error + trace(errorEvent); + } + else + { + // a non-Error, non-ErrorEvent type was thrown and uncaught + } + load(); + } + + + + private function progressUpdates(active:Boolean):void + { + if (active) + { + progressTimer.start(); + } + else + { + progressTimer.stop(); + } + } + + private function progressHandler(e:TimerEvent):void + { + if (myStatus.isLoading) + { + if ((getLoadRatio() == 1)) + {// Close as can get to a loadComplete event since client.onPlayStatus only works with FMS + this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"progressHandler: loadComplete")); + myStatus.loaded(); + progressUpdates(false); + } + } + progressEvent(); + } + + private function progressEvent():void + { + // temporarily disabled progress event dispatching - not really needed for rtmp + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"progressEvent:")); + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PROGRESS,myStatus)); + } + + private function timeUpdates(active:Boolean):void + { + if (active) + { + timeUpdateTimer.start(); + } + else + { + timeUpdateTimer.stop(); + } + } + + private function timeUpdateHandler(e:TimerEvent):void + { + timeUpdateEvent(); + } + + private function timeUpdateEvent():void + { + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_TIMEUPDATE,myStatus)); + } + private function seeking(active:Boolean):void + { + if (active) + { + if (! myStatus.isSeeking) + { + seekingEvent(); + } + seekingTimer.start(); + } + else + { + if (myStatus.isSeeking) + { + seekedEvent(); + } + seekingTimer.stop(); + } + } + private function seekingHandler(e:TimerEvent):void + { + if ((getSeekTimeRatio() <= getLoadRatio())) + { + seeking(false); + if (myStatus.playOnSeek) + { + myStatus.playOnSeek = false;// Capture the flag. + play(myStatus.pausePosition);// Must pass time or the seek time is never set. + } + else + { + pause(myStatus.pausePosition);// Must pass time or the stream.time is read. + } + } + else if (myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration) + { + // Illegal seek time + seeking(false); + pause(0); + } + } + private function seekingEvent():void + { + myStatus.isSeeking = true; + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKING,myStatus)); + } + private function seekedEvent():void + { + myStatus.isSeeking = false; + updateStatusValues(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_SEEKED,myStatus)); + } + + + private function netStatusHandler(e:NetStatusEvent):void + { + trace(("netStatusHandler: " + e.info.code)); + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"netStatusHandler: '" + e.info.code + "'")); + //trace("BEFORE: bufferTime: "+myStream.bufferTime+" - bufferTimeMax: "+myStream.bufferTimeMax); + switch (e.info.code) + { + case "NetConnection.Connect.Success" : + // connectStream(); // This method did not do anything sensible anyway. + // Do not think this case occurs. This was for the static file connection. + // Which now seems to be handled by the Connection Manager. + break; + case "NetStream.Buffer.Full": + if(connectString.streamTYPE == "LIVE") { + myStream.bufferTime = startBuffer; + } else { + myStream.bufferTime = maxBuffer; + } + break; + case "NetStream.Buffer.Flush": + myStream.bufferTime = startBuffer; + break; + case "NetStream.Buffer.Empty": + myStream.bufferTime = startBuffer; + break; + case "NetStream.Seek.Notify": + myStream.bufferTime = startBuffer; + break; + case "NetStream.Play.Start" : + + if (firstTime) { + firstTime = false; // Capture flag + + myStatus.loading(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADSTART,myStatus)); + + // NB: With MP4 player both audio and video types get connected to myVideo. + // NB: Had believed it was important for the audio too, otherwise what plays it? + if(videoBinding) { + myVideo.attachNetStream(myStream); + } + + setVolume(myStatus.volume); + + // Really the progress event just needs to be generated once, and should probably happen before now. + progressUpdates(true); + + // This is an ASSUMPTION! Made it so that the default GUI worked. + // Hence why this part should be refactored. + // Lots of commands sequences after setMedia would be corrupted by this assumption. + // Bascally, we assume that after a setMedia, you will play it. + // Doing setMedia and pause(15) cause the flag to be set incorrectly and the GUI locks up. + myStatus.isPlaying = true; // Should be handled elsewhere. + } + + // Under RTMP, this event code occurs every time the media starts playing and when a new position is seeked to, even when paused. + + // Since under RTMP the event behaviour is quite different, believe a refactor is best here. + // ie., Under RTMP we should be able to know a lot more info about the stream. + + // See onMetaDataHandler() for other condition, since duration is vital. + // See onResult() response handler too. + // Appears to be some duplication between onMetaDataHandler() and onResult(), along with a race between them occuring. + + break; + case "NetStream.Play.UnpublishNotify": + myStream.bufferTime = startBuffer; // was 3 + case "NetStream.Play.Stop" : + myStream.bufferTime = startBuffer; // was 3 + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"NetStream.Play.Stop: getDuration() - getCurrentTime() = " + (getDuration() - getCurrentTime()))); + + // Check if media is at the end (or close) otherwise this was due to download bandwidth stopping playback. ie., Download is not fast enough. + if (Math.abs((getDuration() - getCurrentTime())) < 150) + {// Testing found 150ms worked best for M4A files, where playHead(99.9) caused a stuck state due to firing with ~116ms left to play. + //endedEvent(); + } + break; + case "NetStream.Seek.InvalidTime" : + // Used for capturing invalid set times and clicks on the end of the progress bar. + endedEvent(); + break; + case "NetStream.Play.StreamNotFound" : + myStatus.error(); + // Resets status except the src, and it sets srcError property.; + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ERROR,myStatus)); + break; + } + //trace("AFTER: bufferTime: "+myStream.bufferTime+" - bufferTimeMax: "+myStream.bufferTimeMax); + // "NetStream.Seek.Notify" event code is not very useful. It occurs after every seek(t) command issued and does not appear to wait for the media to be ready. + } + private function endedEvent():void + { + trace("ENDED STREAM EVENT"); + var wasPlaying:Boolean = myStatus.isPlaying; + + // timeUpdates(false); + // timeUpdateEvent(); + pause(0); + + if (wasPlaying) + { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ENDED,myStatus)); + } + } + private function securityErrorHandler(event:SecurityErrorEvent):void + { + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"securityErrorHandler.")); + } + public function connectStream():void + { + trace("CONNECTING"); + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"connectStream.")); + //this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_CANPLAY,myStatus)); + + timeUpdates(true); + progressUpdates(true); + //myVideo.attachNetStream(myStream); + //setVolume(myStatus.volume); + } + + private function onResult(result:Object):void + { + trace("OnResult EVENT FIRED!"); + myStatus.duration = parseFloat(result.toString()) * 1000; + trace((("The stream length is " + result) + " seconds")); + + if(!myConnection.connected) { + load(); + } else { + //this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_CANPLAY,myStatus,"Rockit!")); + + //myStatus.loaded(); + //myStatus.isPlaying=true; + if (! myStatus.metaDataReady) + { + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"onMetaDataHandler: " + myStatus.duration)); + + // Allow multiple onResult Handlers to affect size. As per PR #131 and #98. + // myStatus.metaDataReady = true; + + /*var info:Object = new Object(); + info.duration=myStatus.duration + info.width=undefined; + info.height=undefined; + myStatus.metaData = info; + */ + if (myStatus.playOnLoad) + { + myStatus.playOnLoad = false;// Capture the flag + if (myStatus.pausePosition > 0) + {// Important for setMedia followed by play(time). + play(myStatus.pausePosition); + } + else + { + play();// Not always sending pausePosition avoids the extra seek(0) for a normal play() command. + } + + } + else + { + pause(myStatus.pausePosition);// Always send the pausePosition. Important for setMedia() followed by pause(time). Deals with not reading stream.time with setMedia() and play() immediately followed by stop() or pause(0) + } + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADEDMETADATA,myStatus)); + } + else + { + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"onMetaDataHandler: Already read (NO EFFECT)")); + } + + myStream.play(streamName); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY,myStatus)); + // timeUpdates(false); + } + + } + + private var overRideConnect:Boolean=false; + public function doneYet():void { + if(!myConnection.connected) { + // try again + ConnMgr.stopAll(true); + overRideConnect=true; + trace("Connected: "+myConnection.connected+" - "+myStatus.loadRequired()); + load(); + } + } + + private var videoBinding:Boolean=false; + public function setFile(src:String,videoSupport:Boolean=false):void + { + // videoSupport turns on/off video - by default no video, audio only + videoBinding=videoSupport; + /* Dont close the stream or netconnection here anymore so we can recycle if host/appname are the same + if ((myStream != null)) + { + myStream.close(); + myConnection.close(); + } + */ + if(ConnMgr.getNegotiating() == true) { + //ConnMgr.stopAll(); + ConnMgr.setNegotiating(false); + } + + myVideo.clear(); + + progressUpdates(false); + timeUpdates(false); + + myStatus.reset(); + myStatus.src = src; + myStatus.srcSet = true; + + firstTime = true; + + //myStatus.loaded(); + + if(src != "") { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_CANPLAY,myStatus)); + } + + //timeUpdateEvent(); + } + + public function shutDownNcNs():void { + trace("Connections Closed"); + timeUpdates(false); + progressUpdates(false); + myStream.close(); + myConnection.close(); + + myStatus.reset(); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_ENDED,myStatus)); + } + + public function clearFile():void + { + if (myStream != null) + { + myStream.close(); + // Dont close the netConnection here any longer, as we may recycle it later + // may need an extra way to close manually if switching media types after an rtmp session - revisit + // myConnection.close(); + myStatus.reset(); + } + setFile(""); + myStatus.srcSet = false; + } + + public function parseRTMPsrcConnect(rtmpSrc:String):Object + { + // rtmp://cp76372.live.edgefcs.net/live/Flash1Office@60204 + var appName:String = ""; + var streamFileName:String = ""; + var startIndex:uint = 2 + rtmpSrc.indexOf("//"); + var streamTYPE:String = "recorded"; + var host:String = rtmpSrc.substr(startIndex); + var port:String = ""; + host = host.substr(0,host.indexOf("/")); + var endHost:Number = startIndex + host.length + 1; + + // See if there is a host port specified + if(host.indexOf(":") != -1) { + port = host.substr(host.indexOf(":")+1); + host = host.substr(0,host.indexOf(":")); + } + + // Akamai specific live streams + if (rtmpSrc.lastIndexOf("/live/") != -1) + { + trace("LIVE!"); + + + appName = rtmpSrc.substring(endHost,rtmpSrc.lastIndexOf("/live/") + 6); + streamFileName = rtmpSrc.substr(rtmpSrc.lastIndexOf("/live/") + 6); + streamTYPE="LIVE"; + } else { + streamTYPE="RECORDED"; + + } + + // Mp3 streams with standard appname/no instance name, mp3: prefix + if (rtmpSrc.indexOf(".mp3") != -1) + { + appName = rtmpSrc.substring(endHost,rtmpSrc.indexOf("mp3:")); + streamFileName = rtmpSrc.substr(rtmpSrc.indexOf("mp3:")); + streamFileName = streamFileName.substr(0,streamFileName.length - 4); + } + // rtmp://cp83813.edgefcs.net/ondemand/rob_hall/bruce_campbell_oldspice.flv + + // Mp4 streams with standard appname/no instance name, mp4: prefix + if (rtmpSrc.indexOf("mp4:") != -1) + { + appName = rtmpSrc.substring(endHost,rtmpSrc.indexOf("mp4:")); + streamFileName = rtmpSrc.substr(rtmpSrc.indexOf("mp4:")); + streamFileName = streamFileName.substr(0,streamFileName.length - 4); + } + + // .f4v streams with standard appname/no instance name, .flv extension + if (rtmpSrc.indexOf(".flv") != -1) + { + // allow use of ^ in rtmp string to indicate break point for an appname or instance name that + // contains a / in it where it would require multiple connection attempts or manual configuratiom + // of the appname/instancename + var endApp:Number=0; + if(rtmpSrc.indexOf("^") != -1) { + endApp=rtmpSrc.indexOf("^"); + rtmpSrc.replace("^", "/"); + } else { + endApp = rtmpSrc.indexOf("/",endHost); + } + appName = rtmpSrc.substring(endHost,endApp) + "/"; + streamFileName = rtmpSrc.substr(endApp+1); + } + + if(port=="") { + port="MULTI"; + } + //rtmp, rtmpt, rtmps, rtmpe, rtmpte + + + trace(("\n\n*** HOST: " + host)); + trace(("*** PORT: " + port)); + trace(("*** APPNAME: " + appName)); + trace(("*** StreamName: " + streamFileName)); + + var streamParts:Object = new Object; + streamParts.streamTYPE=streamTYPE; + streamParts.appName = appName; + streamParts.streamFileName = streamFileName; + streamParts.hostName = host; + streamName = streamFileName; + + return streamParts; + } + + public function load():Boolean + { + //trace("LOAD: "+myStatus.src); + if (myStatus.loadRequired() || overRideConnect==true) + { + overRideConnect=false; + myStatus.startingDownload(); + var lastAppName:String; + var lastHostName:String; + + try{ + // we do a try, as these properties might not exist yet + if(connectString.appName != "" && connectString.appName != undefined) { + trace("PREVIOUS APP/HOST INFO AVAILABLE"); + lastAppName = connectString.appName; + lastHostName = connectString.hostName; + trace("LAST: "+lastAppName,lastHostName); + } + } catch (error:Error) { + //trace("*** Caught an error condition: "+error); + } + + connectString = parseRTMPsrcConnect(myStatus.src); + + + + trace("**** LOAD :: CONNECT SOURCE: " +connectString.hostName +" "+ connectString.appName); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_WAITING, myStatus)); + + if((connectString.appName == lastAppName && connectString.hostName == lastHostName) && (myConnection.connected)) { + // recycle the netConnection + trace("RECYCLING NETCONNECTION"); + if ((myStream != null)) + { + myStream.close(); + } + connectStream(); + onBWDone(null,myConnection); + } else { + // myConnection.connect(connectString.appName); + trace("NEW NetConnection Negotiation"); + if ((myStream != null)) + { + myStream.close(); + myConnection.close(); + } + + ConnMgr.stopAll(true); + ConnMgr.negotiateConnect(this,connectString.hostName,connectString.appName); + } + + trace("**** LOAD2 :: CONNECT SOURCE: " +connectString.hostName +" "+ connectString.appName); + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_WAITING, myStatus)); + return true; + } + else + { + return false; + } + } + + + + public function onFCUnsubscribe(info:Object):void + { + trace(("onFCUnSubscribe worked" + info)); + } + + public function onFCSubscribe(info:Object):void + { + trace(("onFCSubscribe worked" + info)); + } + + public function onBWDone(info:Object,nc:NetConnection):void + { + if(nc.connected) { + myConnection=nc; + trace(((("onBWDone " + info) + " :: ") + myStatus.src)); + + var customClient:Object = new Object ; + customClient.onMetaData = onMetaDataHandler; + customClient.onPlayStatus = onPlayStatusHandler;// According to the forums and my tests, onPlayStatus only works with FMS (Flash Media Server). + + myStream = null; + myStream = new NetStream(myConnection); + myStream.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler); + myStream.client = customClient; + if(connectString.streamTYPE == "LIVE") { + myStream.bufferTime = 3; // was 3 + myStream.bufferTimeMax = 24; + startBuffer = 3; + maxBuffer = 12; + + } else { + myStream.bufferTime = .2; // was 3 + myStream.bufferTimeMax = 0; + startBuffer = .2; + maxBuffer = 12; + } + + + //streamName=""; + //var connectString:Object = parseRTMPsrcConnect(myStatus.src); + //streamName=connectString.streamFileName; + + responder = new Responder(onResult); + myConnection.call("getStreamLength",responder,streamName); + } else { + connectStream(); + } + + trace("PLAY SOURCE: "+connectString); + + } + + public function play(time:Number = NaN):Boolean { + //trace("PLAY: "+time+" - isPlaying: "+myStatus.isPlaying +" - myStatus.isStartingDownload:"+myStatus.isStartingDownload); + var wasPlaying:Boolean = myStatus.isPlaying; + + if(!isNaN(time) && myStatus.srcSet) { + if(myStatus.isPlaying) { + myStream.pause(); + myStatus.isPlaying = false; + } + myStatus.pausePosition = time; + } + + if(myStatus.isStartingDownload) { + myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler() + return true; + } else if(myStatus.loadRequired()) { + myStatus.playOnLoad = true; // Raise flag, captured in onMetaDataHandler() + return load(); + } else if((myStatus.isLoading || myStatus.isLoaded) && !myStatus.isPlaying) { + if(myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration && connectString.streamTYPE != "LIVE") { // The time is invalid, ie., past the end. + myStream.pause(); // Since it is playing by default at this point. + myStatus.pausePosition = 0; + trace("SEEKER!"); + myStream.seek(0); + timeUpdates(false); + timeUpdateEvent(); + if(wasPlaying) { // For when playing and then get a play(huge) + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE, myStatus)); + } + } else if(getSeekTimeRatio() > getLoadRatio()) { // Use an estimate based on the downloaded amount + myStatus.playOnSeek = true; + seeking(true); + trace("SEEKER PAUSE!"); + myStream.pause(); // Since it is playing by default at this point. + } else { + if(!isNaN(time)) { // Avoid using seek() when it is already correct. + trace("SEEKER3"); + myStream.seek(myStatus.pausePosition/1000); // Since time is in ms and seek() takes seconds + } + myStatus.isPlaying = true; // Set immediately before playing. Could affects events. + trace("SHOULD GET RESUME!"); + myStream.resume(); + timeUpdates(true); + if(!wasPlaying) { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PLAY, myStatus)); + } + } + return true; + } else { + return false; + } + } + + public function pause(time:Number=NaN):Boolean + { + //trace("PAUSE: "+time); + myStatus.playOnLoad = false;// Reset flag in case load/play issued immediately before this command, ie., before onMetadata() event. + myStatus.playOnSeek = false;// Reset flag in case play(time) issued before the command and is still seeking to time set. + + var wasPlaying:Boolean = myStatus.isPlaying; + + + // To avoid possible loops with timeupdate and pause(time). A pause() does not have the problem. + var alreadyPausedAtTime:Boolean = false; + if(!isNaN(time) && myStatus.pausePosition == time) { + alreadyPausedAtTime = true; + } + + trace("!isNaN: "+!isNaN(time) +" isNaN: "+isNaN(time)); + + // Need to wait for metadata to load before ever issuing a pause. The metadata handler will call this function if needed, when ready. + if (((myStream != null) && myStatus.metaDataReady)) + {// myStream is a null until the 1st media is loaded. ie., The 1st ever setMedia being followed by a pause() or pause(t). + + if(connectString.streamTYPE == "LIVE") { + trace("PAUSING LIVE"); + myStream.play(false) + } else { + trace("PAUSING RECORDED"); + myStream.pause(); + } + } + if (myStatus.isPlaying) + { + myStatus.isPlaying = false; + myStatus.pausePosition = myStream.time * 1000; + } + + if (! isNaN(time) && myStatus.srcSet) + { + myStatus.pausePosition = time; + } + + if (wasPlaying) + { + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_PAUSE,myStatus)); + } + + if (myStatus.isStartingDownload) + { + return true; + } + else if (myStatus.loadRequired()) + { + if ((time > 0)) + {// We do not want the stop() command, which does pause(0), causing a load operation. + return load(); + } + else + { + return true;// Technically the pause(0) succeeded. ie., It did nothing, since nothing was required. + } + } + else if (myStatus.isLoading || myStatus.isLoaded) + { + if (myStatus.metaDataReady && myStatus.pausePosition > myStatus.duration && connectString.streamTYPE != "LIVE" ) + {// The time is invalid, ie., past the end. + myStatus.pausePosition = 0; + + trace("GOT HERE!"); + myStream.seek(0); + seekedEvent();// Deals with seeking effect when using setMedia() then pause(huge). NB: There is no preceeding seeking event. + } + else if (! isNaN(time)) + { + if ((getSeekTimeRatio() > getLoadRatio())) + {// Use an estimate based on the downloaded amount + seeking(true); + } + else + { + if (myStatus.metaDataReady && connectString.streamTYPE != "LIVE") + {// Otherwise seek(0) will stop the metadata loading. + trace("GOT HERE TOO!"); + myStream.seek(myStatus.pausePosition / 1000); + } + } + } + timeUpdates(false); + // Need to be careful with timeupdate event, otherwise a pause in a timeupdate event can cause a loop. + // Neither pause() nor pause(time) will cause a timeupdate loop. + if(wasPlaying || !isNaN(time) && !alreadyPausedAtTime) { + timeUpdateEvent(); + } + return true; + } + else + { + return false; + } + } + public function playHead(percent:Number):Boolean + { + var time:Number = percent * getDuration() * getLoadRatio() / 100; + if (myStatus.isPlaying || myStatus.playOnLoad || myStatus.playOnSeek) + { + return play(time); + } + else + { + return pause(time); + } + } + public function setVolume(v:Number):void + { + myStatus.volume = v; + myTransform.volume = v; + if ((myStream != null)) + { + myStream.soundTransform = myTransform; + } + } + private function updateStatusValues():void + { + //myStatus.seekPercent = 100 * getLoadRatio(); + myStatus.seekPercent = 100; + myStatus.currentTime = getCurrentTime(); + myStatus.currentPercentRelative = 100 * getCurrentRatioRel(); + myStatus.currentPercentAbsolute = 100 * getCurrentRatioAbs(); + myStatus.duration = getDuration(); + } + public function getLoadRatio():Number + { + return 1; + /*trace("LoadRatio:"+myStream.bytesLoaded, myStream.bytesTotal); + if((myStatus.isLoading || myStatus.isLoaded) && myStream.bytesTotal > 0) { + + return myStream.bytesLoaded / myStream.bytesTotal; + } else { + return 0; + } + */ + + } + public function getDuration():Number + { + return myStatus.duration;// Set from meta data. + } + public function getCurrentTime():Number + { + if (myStatus.isPlaying) + { + //trace(myStream.time * 1000); + return myStream.time * 1000; // was +1000 + } + else + { + return myStatus.pausePosition; + } + } + public function getCurrentRatioRel():Number + { + + if ((getCurrentRatioAbs() <= getLoadRatio())) + { + //if((getLoadRatio() > 0) && (getCurrentRatioAbs() <= getLoadRatio())) { + return getCurrentRatioAbs() / getLoadRatio(); + } + else + { + return 0; + } + } + public function getCurrentRatioAbs():Number + { + if ((getDuration() > 0)) + { + return getCurrentTime() / getDuration(); + } + else + { + return 0; + } + } + public function getSeekTimeRatio():Number + { + if ((getDuration() > 0)) + { + return myStatus.pausePosition / getDuration(); + } + else + { + return 1; + } + } + public function onPlayStatusHandler(infoObject:Object):void + { + trace((("OnPlayStatusHandler called: (" + getTimer()) + " ms)")); + for (var prop:* in infoObject) + { + trace(((("\t" + prop) + ":\t") + infoObject[prop])); + } + if (infoObject.code == "NetStream.Play.Complete") + { + endedEvent(); + } + } + + public function onMetaDataHandler(info:Object):void + {// Used in connectStream() in myStream.client object. + // This event occurs when jumping to the start of static files! ie., seek(0) will cause this event to occur. + + if (! myStatus.metaDataReady) + { + trace("\n\n*** METADATA FIRED! ***\n\n"); + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"onMetaDataHandler: " + info.duration + " | " + info.width + "x" + info.height)); + + myStatus.metaDataReady = true;// Set flag so that this event only effects jPlayer the 1st time. + myStatus.metaData = info; + myStatus.duration = info.duration * 1000;// Only available via Meta Data. + if (info.width != undefined) + { + myVideo.width = myStatus.videoWidth = info.width; + } + if (info.height != undefined) + { + myVideo.height = myStatus.videoHeight = info.height; + } + + if (myStatus.playOnLoad) + { + myStatus.playOnLoad = false;// Capture the flag + if (myStatus.pausePosition > 0) + {// Important for setMedia followed by play(time). + play(myStatus.pausePosition); + } + else + { + play();// Not always sending pausePosition avoids the extra seek(0) for a normal play() command. + } + } + else + { + pause(myStatus.pausePosition);// Always send the pausePosition. Important for setMedia() followed by pause(time). Deals with not reading stream.time with setMedia() and play() immediately followed by stop() or pause(0) + } + this.dispatchEvent(new JplayerEvent(JplayerEvent.JPLAYER_LOADEDMETADATA,myStatus)); + } + else + { + //this.dispatchEvent(new JplayerEvent(JplayerEvent.DEBUG_MSG,myStatus,"onMetaDataHandler: Already read (NO EFFECT)")); + } + } +} +} \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerStatus.as b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerStatus.as new file mode 100755 index 00000000..da9f5caf --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/JplayerStatus.as @@ -0,0 +1,110 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Date: 5th June 2013 + */ + +package happyworm.jPlayer { + public class JplayerStatus { + + public static const VERSION:String = "2.4.0"; // The version of the Flash jPlayer entity. + + public var volume:Number = 0.5; // Not affected by reset() + public var muted:Boolean = false; // Not affected by reset() + + public var src:String; + public var srcError:Boolean; + + public var srcSet:Boolean; + public var isPlaying:Boolean; + public var isSeeking:Boolean; + + public var isWaiting:Boolean; + + public var playOnLoad:Boolean; + public var playOnSeek:Boolean; + + public var isStartingDownload:Boolean; + public var isLoading:Boolean; + public var isLoaded:Boolean; + + public var pausePosition:Number; + + public var seekPercent:Number; + public var currentTime:Number; + public var currentPercentRelative:Number; + public var currentPercentAbsolute:Number; + public var duration:Number; + + public var videoWidth:Number; + public var videoHeight:Number; + + public var metaDataReady:Boolean; + public var metaData:Object; + + public function JplayerStatus() { + reset(); + } + public function reset():void { + src = ""; + srcError = false; + + srcSet = false; + isPlaying = false; + isSeeking = false; + + isWaiting = false; + + playOnLoad = false; + playOnSeek = false; + + isStartingDownload = false; + isLoading = false; + isLoaded = false; + + pausePosition = 0; + + seekPercent = 0; + currentTime = 0; + currentPercentRelative = 0; + currentPercentAbsolute = 0; + duration = 0; + + videoWidth = 0; + videoHeight = 0; + + metaDataReady = false; + metaData = {}; + } + public function error():void { + var srcSaved:String = src; + reset(); + src = srcSaved; + srcError = true; + } + public function loadRequired():Boolean { + return (srcSet && !isStartingDownload && !isLoading && !isLoaded); + } + public function startingDownload():void { + isStartingDownload = true; + isLoading = false; + isLoaded = false; + } + public function loading():void { + isStartingDownload = false; + isLoading = true; + isLoaded = false; + } + public function loaded():void { + isStartingDownload = false; + isLoading = false; + isLoaded = true; + } + } +} diff --git a/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/TraceOut.as b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/TraceOut.as new file mode 100755 index 00000000..75be070f --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/actionscript/happyworm/jPlayer/TraceOut.as @@ -0,0 +1,62 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2013 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Robert M. Hall + * Date: 7th August 2012 + */ + +package happyworm.jPlayer +{ + import flash.net.LocalConnection; + import flash.events.StatusEvent; + import flash.system.Capabilities; + import flash.utils.getTimer; + + public class TraceOut + { + + private var outgoing_lc:LocalConnection = new LocalConnection (); + private var firstEvent:Boolean = true; + private var _localAIRDebug:Boolean = false; + + public function TraceOut() + { + outgoing_lc.addEventListener(StatusEvent.STATUS, lcListener); + outgoing_lc.send("_log_output","startLogging",""); + } + + private function lcListener(event:StatusEvent):void + { + // Must have this listener to avoid errors + if (event.level == "error") + { + _localAIRDebug = false; + } + else if(event.level =="status" && firstEvent==true) + { + firstEvent = false; + tracer("<< Successful Connection To Event Logger >>"); + tracer("DEBUG INFO: \n<"+Capabilities.serverString + ">\nFlash Player Version: " + Capabilities.version + "\n"); + _localAIRDebug = true; + } + } + + public function localAIRDebug():Boolean + { + return _localAIRDebug; + } + + public function tracer(msg:String):void + { + trace(msg); + var outMsg:String = "[" + getTimer() + "ms] " + msg; + outgoing_lc.send("_log_output","displayMsg",outMsg); + + } + } +} diff --git a/core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.js b/core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.js new file mode 100755 index 00000000..725caf06 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.js @@ -0,0 +1,496 @@ +/* + * Playlist Object for the jPlayer Plugin + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2014 Happyworm Ltd + * Licensed under the MIT license. + * http://www.opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Version: 2.4.1 + * Date: 19th November 2014 + * + * Requires: + * - jQuery 1.7.0+ + * - jPlayer 2.8.2+ + */ + +/*global jPlayerPlaylist:true */ + +(function($, undefined) { + + jPlayerPlaylist = function(cssSelector, playlist, options) { + var self = this; + + this.current = 0; + this.loop = false; // Flag used with the jPlayer repeat event + this.shuffled = false; + this.removing = false; // Flag is true during remove animation, disabling the remove() method until complete. + + this.cssSelector = $.extend({}, this._cssSelector, cssSelector); // Object: Containing the css selectors for jPlayer and its cssSelectorAncestor + this.options = $.extend(true, { + keyBindings: { + next: { + key: 221, // ] + fn: function() { + self.next(); + } + }, + previous: { + key: 219, // [ + fn: function() { + self.previous(); + } + }, + shuffle: { + key: 83, // s + fn: function() { + self.shuffle(); + } + } + }, + stateClass: { + shuffled: "jp-state-shuffled" + } + }, this._options, options); // Object: The jPlayer constructor options for this playlist and the playlist options + + this.playlist = []; // Array of Objects: The current playlist displayed (Un-shuffled or Shuffled) + this.original = []; // Array of Objects: The original playlist + + this._initPlaylist(playlist); // Copies playlist to this.original. Then mirrors this.original to this.playlist. Creating two arrays, where the element pointers match. (Enables pointer comparison.) + + // Setup the css selectors for the extra interface items used by the playlist. + this.cssSelector.details = this.cssSelector.cssSelectorAncestor + " .jp-details"; // Note that jPlayer controls the text in the title element. + this.cssSelector.playlist = this.cssSelector.cssSelectorAncestor + " .jp-playlist"; + this.cssSelector.next = this.cssSelector.cssSelectorAncestor + " .jp-next"; + this.cssSelector.previous = this.cssSelector.cssSelectorAncestor + " .jp-previous"; + this.cssSelector.shuffle = this.cssSelector.cssSelectorAncestor + " .jp-shuffle"; + this.cssSelector.shuffleOff = this.cssSelector.cssSelectorAncestor + " .jp-shuffle-off"; + + // Override the cssSelectorAncestor given in options + this.options.cssSelectorAncestor = this.cssSelector.cssSelectorAncestor; + + // Override the default repeat event handler + this.options.repeat = function(event) { + self.loop = event.jPlayer.options.loop; + }; + + // Create a ready event handler to initialize the playlist + $(this.cssSelector.jPlayer).bind($.jPlayer.event.ready, function() { + self._init(); + }); + + // Create an ended event handler to move to the next item + $(this.cssSelector.jPlayer).bind($.jPlayer.event.ended, function() { + self.next(); + }); + + // Create a play event handler to pause other instances + $(this.cssSelector.jPlayer).bind($.jPlayer.event.play, function() { + $(this).jPlayer("pauseOthers"); + }); + + // Create a resize event handler to show the title in full screen mode. + $(this.cssSelector.jPlayer).bind($.jPlayer.event.resize, function(event) { + if(event.jPlayer.options.fullScreen) { + $(self.cssSelector.details).show(); + } else { + $(self.cssSelector.details).hide(); + } + }); + + // Create click handlers for the extra buttons that do playlist functions. + $(this.cssSelector.previous).click(function(e) { + e.preventDefault(); + self.previous(); + self.blur(this); + }); + + $(this.cssSelector.next).click(function(e) { + e.preventDefault(); + self.next(); + self.blur(this); + }); + + $(this.cssSelector.shuffle).click(function(e) { + e.preventDefault(); + if(self.shuffled && $(self.cssSelector.jPlayer).jPlayer("option", "useStateClassSkin")) { + self.shuffle(false); + } else { + self.shuffle(true); + } + self.blur(this); + }); + $(this.cssSelector.shuffleOff).click(function(e) { + e.preventDefault(); + self.shuffle(false); + self.blur(this); + }).hide(); + + // Put the title in its initial display state + if(!this.options.fullScreen) { + $(this.cssSelector.details).hide(); + } + + // Remove the empty
  • from the page HTML. Allows page to be valid HTML, while not interfereing with display animations + $(this.cssSelector.playlist + " ul").empty(); + + // Create .on() handlers for the playlist items along with the free media and remove controls. + this._createItemHandlers(); + + // Instance jPlayer + $(this.cssSelector.jPlayer).jPlayer(this.options); + }; + + jPlayerPlaylist.prototype = { + _cssSelector: { // static object, instanced in constructor + jPlayer: "#jquery_jplayer_1", + cssSelectorAncestor: "#jp_container_1" + }, + _options: { // static object, instanced in constructor + playlistOptions: { + autoPlay: false, + loopOnPrevious: false, + shuffleOnLoop: true, + enableRemoveControls: false, + displayTime: 'slow', + addTime: 'fast', + removeTime: 'fast', + shuffleTime: 'slow', + itemClass: "jp-playlist-item", + freeGroupClass: "jp-free-media", + freeItemClass: "jp-playlist-item-free", + removeItemClass: "jp-playlist-item-remove" + } + }, + option: function(option, value) { // For changing playlist options only + if(value === undefined) { + return this.options.playlistOptions[option]; + } + + this.options.playlistOptions[option] = value; + + switch(option) { + case "enableRemoveControls": + this._updateControls(); + break; + case "itemClass": + case "freeGroupClass": + case "freeItemClass": + case "removeItemClass": + this._refresh(true); // Instant + this._createItemHandlers(); + break; + } + return this; + }, + _init: function() { + var self = this; + this._refresh(function() { + if(self.options.playlistOptions.autoPlay) { + self.play(self.current); + } else { + self.select(self.current); + } + }); + }, + _initPlaylist: function(playlist) { + this.current = 0; + this.shuffled = false; + this.removing = false; + this.original = $.extend(true, [], playlist); // Copy the Array of Objects + this._originalPlaylist(); + }, + _originalPlaylist: function() { + var self = this; + this.playlist = []; + // Make both arrays point to the same object elements. Gives us 2 different arrays, each pointing to the same actual object. ie., Not copies of the object. + $.each(this.original, function(i) { + self.playlist[i] = self.original[i]; + }); + }, + _refresh: function(instant) { + /* instant: Can be undefined, true or a function. + * undefined -> use animation timings + * true -> no animation + * function -> use animation timings and excute function at half way point. + */ + var self = this; + + if(instant && !$.isFunction(instant)) { + $(this.cssSelector.playlist + " ul").empty(); + $.each(this.playlist, function(i) { + $(self.cssSelector.playlist + " ul").append(self._createListItem(self.playlist[i])); + }); + this._updateControls(); + } else { + var displayTime = $(this.cssSelector.playlist + " ul").children().length ? this.options.playlistOptions.displayTime : 0; + + $(this.cssSelector.playlist + " ul").slideUp(displayTime, function() { + var $this = $(this); + $(this).empty(); + + $.each(self.playlist, function(i) { + $this.append(self._createListItem(self.playlist[i])); + }); + self._updateControls(); + if($.isFunction(instant)) { + instant(); + } + if(self.playlist.length) { + $(this).slideDown(self.options.playlistOptions.displayTime); + } else { + $(this).show(); + } + }); + } + }, + _createListItem: function(media) { + var self = this; + + // Wrap the
  • contents in a
    + var listItem = "
  • "; + + // Create remove control + listItem += "×"; + + // Create links to free media + if(media.free) { + var first = true; + listItem += "("; + $.each(media, function(property,value) { + if($.jPlayer.prototype.format[property]) { // Check property is a media format. + if(first) { + first = false; + } else { + listItem += " | "; + } + listItem += "" + property + ""; + } + }); + listItem += ")"; + } + + // The title is given next in the HTML otherwise the float:right on the free media corrupts in IE6/7 + listItem += "" + media.title + (media.artist ? " " : "") + ""; + listItem += "
  • "; + + return listItem; + }, + _createItemHandlers: function() { + var self = this; + // Create live handlers for the playlist items + $(this.cssSelector.playlist).off("click", "a." + this.options.playlistOptions.itemClass).on("click", "a." + this.options.playlistOptions.itemClass, function(e) { + e.preventDefault(); + var index = $(this).parent().parent().index(); + if(self.current !== index) { + self.play(index); + } else { + $(self.cssSelector.jPlayer).jPlayer("play"); + } + self.blur(this); + }); + + // Create live handlers that disable free media links to force access via right click + $(this.cssSelector.playlist).off("click", "a." + this.options.playlistOptions.freeItemClass).on("click", "a." + this.options.playlistOptions.freeItemClass, function(e) { + e.preventDefault(); + $(this).parent().parent().find("." + self.options.playlistOptions.itemClass).click(); + self.blur(this); + }); + + // Create live handlers for the remove controls + $(this.cssSelector.playlist).off("click", "a." + this.options.playlistOptions.removeItemClass).on("click", "a." + this.options.playlistOptions.removeItemClass, function(e) { + e.preventDefault(); + var index = $(this).parent().parent().index(); + self.remove(index); + self.blur(this); + }); + }, + _updateControls: function() { + if(this.options.playlistOptions.enableRemoveControls) { + $(this.cssSelector.playlist + " ." + this.options.playlistOptions.removeItemClass).show(); + } else { + $(this.cssSelector.playlist + " ." + this.options.playlistOptions.removeItemClass).hide(); + } + + if(this.shuffled) { + $(this.cssSelector.jPlayer).jPlayer("addStateClass", "shuffled"); + } else { + $(this.cssSelector.jPlayer).jPlayer("removeStateClass", "shuffled"); + } + if($(this.cssSelector.shuffle).length && $(this.cssSelector.shuffleOff).length) { + if(this.shuffled) { + $(this.cssSelector.shuffleOff).show(); + $(this.cssSelector.shuffle).hide(); + } else { + $(this.cssSelector.shuffleOff).hide(); + $(this.cssSelector.shuffle).show(); + } + } + }, + _highlight: function(index) { + if(this.playlist.length && index !== undefined) { + $(this.cssSelector.playlist + " .jp-playlist-current").removeClass("jp-playlist-current"); + $(this.cssSelector.playlist + " li:nth-child(" + (index + 1) + ")").addClass("jp-playlist-current").find(".jp-playlist-item").addClass("jp-playlist-current"); + // $(this.cssSelector.details + " li").html("" + (this.playlist[index].artist ? " " : "")); + } + }, + setPlaylist: function(playlist) { + this._initPlaylist(playlist); + this._init(); + }, + add: function(media, playNow) { + $(this.cssSelector.playlist + " ul").append(this._createListItem(media)).find("li:last-child").hide().slideDown(this.options.playlistOptions.addTime); + this._updateControls(); + this.original.push(media); + this.playlist.push(media); // Both array elements share the same object pointer. Comforms with _initPlaylist(p) system. + + if(playNow) { + this.play(this.playlist.length - 1); + } else { + if(this.original.length === 1) { + this.select(0); + } + } + }, + remove: function(index) { + var self = this; + + if(index === undefined) { + this._initPlaylist([]); + this._refresh(function() { + $(self.cssSelector.jPlayer).jPlayer("clearMedia"); + }); + return true; + } else { + + if(this.removing) { + return false; + } else { + index = (index < 0) ? self.original.length + index : index; // Negative index relates to end of array. + if(0 <= index && index < this.playlist.length) { + this.removing = true; + + $(this.cssSelector.playlist + " li:nth-child(" + (index + 1) + ")").slideUp(this.options.playlistOptions.removeTime, function() { + $(this).remove(); + + if(self.shuffled) { + var item = self.playlist[index]; + $.each(self.original, function(i) { + if(self.original[i] === item) { + self.original.splice(i, 1); + return false; // Exit $.each + } + }); + self.playlist.splice(index, 1); + } else { + self.original.splice(index, 1); + self.playlist.splice(index, 1); + } + + if(self.original.length) { + if(index === self.current) { + self.current = (index < self.original.length) ? self.current : self.original.length - 1; // To cope when last element being selected when it was removed + self.select(self.current); + } else if(index < self.current) { + self.current--; + } + } else { + $(self.cssSelector.jPlayer).jPlayer("clearMedia"); + self.current = 0; + self.shuffled = false; + self._updateControls(); + } + + self.removing = false; + }); + } + return true; + } + } + }, + select: function(index) { + index = (index < 0) ? this.original.length + index : index; // Negative index relates to end of array. + if(0 <= index && index < this.playlist.length) { + this.current = index; + this._highlight(index); + $(this.cssSelector.jPlayer).jPlayer("setMedia", this.playlist[this.current]); + } else { + this.current = 0; + } + }, + play: function(index) { + index = (index < 0) ? this.original.length + index : index; // Negative index relates to end of array. + if(0 <= index && index < this.playlist.length) { + if(this.playlist.length) { + this.select(index); + $(this.cssSelector.jPlayer).jPlayer("play"); + } + } else if(index === undefined) { + $(this.cssSelector.jPlayer).jPlayer("play"); + } + }, + pause: function() { + $(this.cssSelector.jPlayer).jPlayer("pause"); + }, + next: function() { + var index = (this.current + 1 < this.playlist.length) ? this.current + 1 : 0; + + if(this.loop) { + // See if we need to shuffle before looping to start, and only shuffle if more than 1 item. + if(index === 0 && this.shuffled && this.options.playlistOptions.shuffleOnLoop && this.playlist.length > 1) { + this.shuffle(true, true); // playNow + } else { + this.play(index); + } + } else { + // The index will be zero if it just looped round + if(index > 0) { + this.play(index); + } + } + }, + previous: function() { + var index = (this.current - 1 >= 0) ? this.current - 1 : this.playlist.length - 1; + + if(this.loop && this.options.playlistOptions.loopOnPrevious || index < this.playlist.length - 1) { + this.play(index); + } + }, + shuffle: function(shuffled, playNow) { + var self = this; + + if(shuffled === undefined) { + shuffled = !this.shuffled; + } + + if(shuffled || shuffled !== this.shuffled) { + + $(this.cssSelector.playlist + " ul").slideUp(this.options.playlistOptions.shuffleTime, function() { + self.shuffled = shuffled; + if(shuffled) { + self.playlist.sort(function() { + return 0.5 - Math.random(); + }); + } else { + self._originalPlaylist(); + } + self._refresh(true); // Instant + + if(playNow || !$(self.cssSelector.jPlayer).data("jPlayer").status.paused) { + self.play(0); + } else { + self.select(0); + } + + $(this).slideDown(self.options.playlistOptions.shuffleTime); + }); + } + }, + blur: function(that) { + if($(this.cssSelector.jPlayer).jPlayer("option", "autoBlur")) { + $(that).blur(); + } + } + }; +})(jQuery); diff --git a/core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.min.js b/core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.min.js new file mode 100755 index 00000000..6a0e866f --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/add-on/jplayer.playlist.min.js @@ -0,0 +1,2 @@ +/*! jPlayerPlaylist for jPlayer 2.9.2 ~ (c) 2009-2014 Happyworm Ltd ~ MIT License */ +!function(a,b){jPlayerPlaylist=function(b,c,d){var e=this;this.current=0,this.loop=!1,this.shuffled=!1,this.removing=!1,this.cssSelector=a.extend({},this._cssSelector,b),this.options=a.extend(!0,{keyBindings:{next:{key:221,fn:function(){e.next()}},previous:{key:219,fn:function(){e.previous()}},shuffle:{key:83,fn:function(){e.shuffle()}}},stateClass:{shuffled:"jp-state-shuffled"}},this._options,d),this.playlist=[],this.original=[],this._initPlaylist(c),this.cssSelector.details=this.cssSelector.cssSelectorAncestor+" .jp-details",this.cssSelector.playlist=this.cssSelector.cssSelectorAncestor+" .jp-playlist",this.cssSelector.next=this.cssSelector.cssSelectorAncestor+" .jp-next",this.cssSelector.previous=this.cssSelector.cssSelectorAncestor+" .jp-previous",this.cssSelector.shuffle=this.cssSelector.cssSelectorAncestor+" .jp-shuffle",this.cssSelector.shuffleOff=this.cssSelector.cssSelectorAncestor+" .jp-shuffle-off",this.options.cssSelectorAncestor=this.cssSelector.cssSelectorAncestor,this.options.repeat=function(a){e.loop=a.jPlayer.options.loop},a(this.cssSelector.jPlayer).bind(a.jPlayer.event.ready,function(){e._init()}),a(this.cssSelector.jPlayer).bind(a.jPlayer.event.ended,function(){e.next()}),a(this.cssSelector.jPlayer).bind(a.jPlayer.event.play,function(){a(this).jPlayer("pauseOthers")}),a(this.cssSelector.jPlayer).bind(a.jPlayer.event.resize,function(b){b.jPlayer.options.fullScreen?a(e.cssSelector.details).show():a(e.cssSelector.details).hide()}),a(this.cssSelector.previous).click(function(a){a.preventDefault(),e.previous(),e.blur(this)}),a(this.cssSelector.next).click(function(a){a.preventDefault(),e.next(),e.blur(this)}),a(this.cssSelector.shuffle).click(function(b){b.preventDefault(),e.shuffle(e.shuffled&&a(e.cssSelector.jPlayer).jPlayer("option","useStateClassSkin")?!1:!0),e.blur(this)}),a(this.cssSelector.shuffleOff).click(function(a){a.preventDefault(),e.shuffle(!1),e.blur(this)}).hide(),this.options.fullScreen||a(this.cssSelector.details).hide(),a(this.cssSelector.playlist+" ul").empty(),this._createItemHandlers(),a(this.cssSelector.jPlayer).jPlayer(this.options)},jPlayerPlaylist.prototype={_cssSelector:{jPlayer:"#jquery_jplayer_1",cssSelectorAncestor:"#jp_container_1"},_options:{playlistOptions:{autoPlay:!1,loopOnPrevious:!1,shuffleOnLoop:!0,enableRemoveControls:!1,displayTime:"slow",addTime:"fast",removeTime:"fast",shuffleTime:"slow",itemClass:"jp-playlist-item",freeGroupClass:"jp-free-media",freeItemClass:"jp-playlist-item-free",removeItemClass:"jp-playlist-item-remove"}},option:function(a,c){if(c===b)return this.options.playlistOptions[a];switch(this.options.playlistOptions[a]=c,a){case"enableRemoveControls":this._updateControls();break;case"itemClass":case"freeGroupClass":case"freeItemClass":case"removeItemClass":this._refresh(!0),this._createItemHandlers()}return this},_init:function(){var a=this;this._refresh(function(){a.options.playlistOptions.autoPlay?a.play(a.current):a.select(a.current)})},_initPlaylist:function(b){this.current=0,this.shuffled=!1,this.removing=!1,this.original=a.extend(!0,[],b),this._originalPlaylist()},_originalPlaylist:function(){var b=this;this.playlist=[],a.each(this.original,function(a){b.playlist[a]=b.original[a]})},_refresh:function(b){var c=this;if(b&&!a.isFunction(b))a(this.cssSelector.playlist+" ul").empty(),a.each(this.playlist,function(b){a(c.cssSelector.playlist+" ul").append(c._createListItem(c.playlist[b]))}),this._updateControls();else{var d=a(this.cssSelector.playlist+" ul").children().length?this.options.playlistOptions.displayTime:0;a(this.cssSelector.playlist+" ul").slideUp(d,function(){var d=a(this);a(this).empty(),a.each(c.playlist,function(a){d.append(c._createListItem(c.playlist[a]))}),c._updateControls(),a.isFunction(b)&&b(),c.playlist.length?a(this).slideDown(c.options.playlistOptions.displayTime):a(this).show()})}},_createListItem:function(b){var c=this,d="
  • ";if(d+="×",b.free){var e=!0;d+="(",a.each(b,function(b,f){a.jPlayer.prototype.format[b]&&(e?e=!1:d+=" | ",d+=""+b+"")}),d+=")"}return d+=""+b.title+(b.artist?" ":"")+"",d+="
  • "},_createItemHandlers:function(){var b=this;a(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.itemClass).on("click","a."+this.options.playlistOptions.itemClass,function(c){c.preventDefault();var d=a(this).parent().parent().index();b.current!==d?b.play(d):a(b.cssSelector.jPlayer).jPlayer("play"),b.blur(this)}),a(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.freeItemClass).on("click","a."+this.options.playlistOptions.freeItemClass,function(c){c.preventDefault(),a(this).parent().parent().find("."+b.options.playlistOptions.itemClass).click(),b.blur(this)}),a(this.cssSelector.playlist).off("click","a."+this.options.playlistOptions.removeItemClass).on("click","a."+this.options.playlistOptions.removeItemClass,function(c){c.preventDefault();var d=a(this).parent().parent().index();b.remove(d),b.blur(this)})},_updateControls:function(){this.options.playlistOptions.enableRemoveControls?a(this.cssSelector.playlist+" ."+this.options.playlistOptions.removeItemClass).show():a(this.cssSelector.playlist+" ."+this.options.playlistOptions.removeItemClass).hide(),this.shuffled?a(this.cssSelector.jPlayer).jPlayer("addStateClass","shuffled"):a(this.cssSelector.jPlayer).jPlayer("removeStateClass","shuffled"),a(this.cssSelector.shuffle).length&&a(this.cssSelector.shuffleOff).length&&(this.shuffled?(a(this.cssSelector.shuffleOff).show(),a(this.cssSelector.shuffle).hide()):(a(this.cssSelector.shuffleOff).hide(),a(this.cssSelector.shuffle).show()))},_highlight:function(c){this.playlist.length&&c!==b&&(a(this.cssSelector.playlist+" .jp-playlist-current").removeClass("jp-playlist-current"),a(this.cssSelector.playlist+" li:nth-child("+(c+1)+")").addClass("jp-playlist-current").find(".jp-playlist-item").addClass("jp-playlist-current"))},setPlaylist:function(a){this._initPlaylist(a),this._init()},add:function(b,c){a(this.cssSelector.playlist+" ul").append(this._createListItem(b)).find("li:last-child").hide().slideDown(this.options.playlistOptions.addTime),this._updateControls(),this.original.push(b),this.playlist.push(b),c?this.play(this.playlist.length-1):1===this.original.length&&this.select(0)},remove:function(c){var d=this;return c===b?(this._initPlaylist([]),this._refresh(function(){a(d.cssSelector.jPlayer).jPlayer("clearMedia")}),!0):this.removing?!1:(c=0>c?d.original.length+c:c,c>=0&&cb?this.original.length+b:b,b>=0&&bc?this.original.length+c:c,c>=0&&c1?this.shuffle(!0,!0):this.play(a):a>0&&this.play(a)},previous:function(){var a=this.current-1>=0?this.current-1:this.playlist.length-1;(this.loop&&this.options.playlistOptions.loopOnPrevious||a' + (config.visible ? "Hide" : "Show") + ' jPlayer Inspector

    ' + + '
    ' + + '
    ' + + '
    ' + + '

    jPlayer events that have occurred over the past 1 second:' + + '
    (Backgrounds: Never occurred Occurred before Occurred Multiple occurrences reset)

    '; + + // MJP: Would use the next 3 lines for ease, but the events are just slapped on the page. + // $.each($.jPlayer.event, function(eventName,eventType) { + // structure += '
    ' + eventName + '
    '; + // }); + + var eventStyle = "float:left;margin:0 5px 5px 0;padding:0 5px;border:1px dotted #000;"; + // MJP: Doing it longhand so order and layout easier to control. + structure += + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + + '
    '; + + // MJP: Would like a check here in case we missed an event. + + // MJP: Check fails, since it is not on the page yet. +/* $.each($.jPlayer.event, function(eventName,eventType) { + if($("#" + config.eventId[eventType])[0] === undefined) { + structure += '
    ' + eventName + '
    '; + } + }); +*/ + structure += + '
    ' + + '

    Update jPlayer Inspector

    ' + + '
    ' + + '
    '; + $(this).html(structure); + + config.windowJq = $("#" + config.windowId); + config.statusJq = $("#" + config.statusId); + config.configJq = $("#" + config.configId); + config.toggleJq = $("#" + config.toggleId); + config.eventResetJq = $("#" + config.eventResetId); + config.updateJq = $("#" + config.updateId); + + $.each($.jPlayer.event, function(eventName,eventType) { + config.eventJq[eventType] = $("#" + config.eventId[eventType]); + config.eventJq[eventType].text(eventName + " (" + config.eventOccurrence[eventType] + ")"); // Sets the text to the event name and (0); + + config.jPlayer.bind(eventType + ".jPlayerInspector", function(e) { + config.eventOccurrence[e.type]++; + if(config.eventOccurrence[e.type] > 1) { + config.eventJq[e.type].css("background-color","#ff9"); + } else { + config.eventJq[e.type].css("background-color","#9f9"); + } + config.eventJq[e.type].text(eventName + " (" + config.eventOccurrence[e.type] + ")"); + // The timer to handle the color + clearTimeout(config.eventTimeout[e.type]); + config.eventTimeout[e.type] = setTimeout(function() { + config.eventJq[e.type].css("background-color","#fff"); + }, 1000); + // The timer to handle the occurences. + setTimeout(function() { + config.eventOccurrence[e.type]--; + config.eventJq[e.type].text(eventName + " (" + config.eventOccurrence[e.type] + ")"); + }, 1000); + if(config.visible) { // Update the status, if inspector open. + $this.jPlayerInspector("updateStatus"); + } + }); + }); + + config.jPlayer.bind($.jPlayer.event.ready + ".jPlayerInspector", function(e) { + $this.jPlayerInspector("updateConfig"); + }); + + config.toggleJq.click(function() { + if(config.visible) { + $(this).text("Show"); + config.windowJq.hide(); + config.statusJq.empty(); + config.configJq.empty(); + } else { + $(this).text("Hide"); + config.windowJq.show(); + config.updateJq.click(); + } + config.visible = !config.visible; + $(this).blur(); + return false; + }); + + config.eventResetJq.click(function() { + $.each($.jPlayer.event, function(eventName,eventType) { + config.eventJq[eventType].css("background-color","#eee"); + }); + $(this).blur(); + return false; + }); + + config.updateJq.click(function() { + $this.jPlayerInspector("updateStatus"); + $this.jPlayerInspector("updateConfig"); + return false; + }); + + if(!config.visible) { + config.windowJq.hide(); + } else { + // config.updateJq.click(); + } + + $.jPlayerInspector.i++; + + return this; + }, + destroy: function() { + $(this).data("jPlayerInspector") && $(this).data("jPlayerInspector").jPlayer.unbind(".jPlayerInspector"); + $(this).empty(); + }, + updateConfig: function() { // This displays information about jPlayer's configuration in inspector + + var jPlayerInfo = "

    This jPlayer instance is running in your browser where:
    " + + for(i = 0; i < $(this).data("jPlayerInspector").jPlayer.data("jPlayer").solutions.length; i++) { + var solution = $(this).data("jPlayerInspector").jPlayer.data("jPlayer").solutions[i]; + jPlayerInfo += " jPlayer's " + solution + " solution is"; + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].used) { + jPlayerInfo += " being used and will support:"; + for(format in $(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].support) { + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer")[solution].support[format]) { + jPlayerInfo += " " + format; + } + } + jPlayerInfo += "
    "; + } else { + jPlayerInfo += " not required
    "; + } + } + jPlayerInfo += "

    "; + + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.active) { + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active) { + jPlayerInfo += "Problem with jPlayer since both HTML5 and Flash are active."; + } else { + jPlayerInfo += "The HTML5 is active."; + } + } else { + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active) { + jPlayerInfo += "The Flash is active."; + } else { + jPlayerInfo += "No solution is currently active. jPlayer needs a setMedia()."; + } + } + jPlayerInfo += "

    "; + + var formatType = $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.formatType; + jPlayerInfo += "

    status.formatType = '" + formatType + "'
    "; + if(formatType) { + jPlayerInfo += "Browser canPlay('" + $.jPlayer.prototype.format[formatType].codec + "')"; + } else { + jPlayerInfo += "

    "; + } + + jPlayerInfo += "

    status.src = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.src + "'

    "; + + jPlayerInfo += "

    status.media = {
    "; + for(prop in $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media) { + jPlayerInfo += " " + prop + ": " + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media[prop] + "
    "; // Some are strings + } + jPlayerInfo += "};

    " + + jPlayerInfo += "

    "; + jPlayerInfo += "status.videoWidth = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.videoWidth + "'"; + jPlayerInfo += " | status.videoHeight = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.videoHeight + "'"; + jPlayerInfo += "
    status.width = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.width + "'"; + jPlayerInfo += " | status.height = '" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.height + "'"; + jPlayerInfo += "

    "; + + + "

    Raw browser test for HTML5 support. Should equal a function if HTML5 is available.
    "; + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.audio.available) { + jPlayerInfo += "htmlElement.audio.canPlayType = " + (typeof $(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.audio.canPlayType) +"
    " + } + if($(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.video.available) { + jPlayerInfo += "htmlElement.video.canPlayType = " + (typeof $(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.video.canPlayType) +""; + } + jPlayerInfo += "

    "; + + jPlayerInfo += "

    This instance is using the constructor options:
    " + + "$('#" + $(this).data("jPlayerInspector").jPlayer.data("jPlayer").internal.self.id + "').jPlayer({
    " + + + " swfPath: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "swfPath") + "',
    " + + + " solution: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "solution") + "',
    " + + + " supplied: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "supplied") + "',
    " + + + " preload: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "preload") + "',
    " + + + " volume: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "volume") + ",
    " + + + " muted: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "muted") + ",
    " + + + " backgroundColor: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "backgroundColor") + "',
    " + + + " cssSelectorAncestor: '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelectorAncestor") + "',
    " + + + " cssSelector: {"; + + var cssSelector = $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelector"); + for(prop in cssSelector) { + + // jPlayerInfo += "
      " + prop + ": '" + cssSelector[prop] + "'," // This works too of course, but want to use option method for deep keys. + jPlayerInfo += "
      " + prop + ": '" + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "cssSelector." + prop) + "'," + } + + jPlayerInfo = jPlayerInfo.slice(0, -1); // Because the sloppy comma was bugging me. + + jPlayerInfo += "
     },
    " + + + " errorAlerts: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "errorAlerts") + ",
    " + + + " warningAlerts: " + $(this).data("jPlayerInspector").jPlayer.jPlayer("option", "warningAlerts") + "
    " + + + "});

    "; + $(this).data("jPlayerInspector").configJq.html(jPlayerInfo); + return this; + }, + updateStatus: function() { // This displays information about jPlayer's status in the inspector + $(this).data("jPlayerInspector").statusJq.html( + "

    jPlayer is " + + ($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.paused ? "paused" : "playing") + + " at time: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentTime*10)/10 + "s." + + " (d: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.duration*10)/10 + "s" + + ", sp: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.seekPercent) + "%" + + ", cpr: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentRelative) + "%" + + ", cpa: " + Math.floor($(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentAbsolute) + "%)

    " + ); + return this; + } + }; + $.fn.jPlayerInspector = function( method ) { + // Method calling logic + if ( methods[method] ) { + return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.jPlayerInspector' ); + } + }; +})(jQuery); diff --git a/core/vendor/filemanager/js/jPlayer/add-on/jquery.jplayer.inspector.min.js b/core/vendor/filemanager/js/jPlayer/add-on/jquery.jplayer.inspector.min.js new file mode 100755 index 00000000..69925c84 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/add-on/jquery.jplayer.inspector.min.js @@ -0,0 +1,2 @@ +/*! jPlayerInspector for jPlayer 2.9.2 ~ (c) 2009-2014 Happyworm Ltd ~ MIT License */ +!function(a,b){a.jPlayerInspector={},a.jPlayerInspector.i=0,a.jPlayerInspector.defaults={jPlayer:b,idPrefix:"jplayer_inspector_",visible:!1};var c={init:function(b){var c=a(this),d=a.extend({},a.jPlayerInspector.defaults,b);a(this).data("jPlayerInspector",d),d.id=a(this).attr("id"),d.jPlayerId=d.jPlayer.attr("id"),d.windowId=d.idPrefix+"window_"+a.jPlayerInspector.i,d.statusId=d.idPrefix+"status_"+a.jPlayerInspector.i,d.configId=d.idPrefix+"config_"+a.jPlayerInspector.i,d.toggleId=d.idPrefix+"toggle_"+a.jPlayerInspector.i,d.eventResetId=d.idPrefix+"event_reset_"+a.jPlayerInspector.i,d.updateId=d.idPrefix+"update_"+a.jPlayerInspector.i,d.eventWindowId=d.idPrefix+"event_window_"+a.jPlayerInspector.i,d.eventId={},d.eventJq={},d.eventTimeout={},d.eventOccurrence={},a.each(a.jPlayer.event,function(b,c){d.eventId[c]=d.idPrefix+"event_"+b+"_"+a.jPlayerInspector.i,d.eventOccurrence[c]=0});var e='

    '+(d.visible?"Hide":"Show")+' jPlayer Inspector

    jPlayer events that have occurred over the past 1 second:
    (Backgrounds: Never occurred Occurred before Occurred Multiple occurrences reset)

    ',f="float:left;margin:0 5px 5px 0;padding:0 5px;border:1px dotted #000;";return e+='
    ',e+='

    Update jPlayer Inspector

    ',a(this).html(e),d.windowJq=a("#"+d.windowId),d.statusJq=a("#"+d.statusId),d.configJq=a("#"+d.configId),d.toggleJq=a("#"+d.toggleId),d.eventResetJq=a("#"+d.eventResetId),d.updateJq=a("#"+d.updateId),a.each(a.jPlayer.event,function(b,e){d.eventJq[e]=a("#"+d.eventId[e]),d.eventJq[e].text(b+" ("+d.eventOccurrence[e]+")"),d.jPlayer.bind(e+".jPlayerInspector",function(a){d.eventOccurrence[a.type]++,d.eventOccurrence[a.type]>1?d.eventJq[a.type].css("background-color","#ff9"):d.eventJq[a.type].css("background-color","#9f9"),d.eventJq[a.type].text(b+" ("+d.eventOccurrence[a.type]+")"),clearTimeout(d.eventTimeout[a.type]),d.eventTimeout[a.type]=setTimeout(function(){d.eventJq[a.type].css("background-color","#fff")},1e3),setTimeout(function(){d.eventOccurrence[a.type]--,d.eventJq[a.type].text(b+" ("+d.eventOccurrence[a.type]+")")},1e3),d.visible&&c.jPlayerInspector("updateStatus")})}),d.jPlayer.bind(a.jPlayer.event.ready+".jPlayerInspector",function(){c.jPlayerInspector("updateConfig")}),d.toggleJq.click(function(){return d.visible?(a(this).text("Show"),d.windowJq.hide(),d.statusJq.empty(),d.configJq.empty()):(a(this).text("Hide"),d.windowJq.show(),d.updateJq.click()),d.visible=!d.visible,a(this).blur(),!1}),d.eventResetJq.click(function(){return a.each(a.jPlayer.event,function(a,b){d.eventJq[b].css("background-color","#eee")}),a(this).blur(),!1}),d.updateJq.click(function(){return c.jPlayerInspector("updateStatus"),c.jPlayerInspector("updateConfig"),!1}),d.visible||d.windowJq.hide(),a.jPlayerInspector.i++,this},destroy:function(){a(this).data("jPlayerInspector")&&a(this).data("jPlayerInspector").jPlayer.unbind(".jPlayerInspector"),a(this).empty()},updateConfig:function(){var b="

    This jPlayer instance is running in your browser where:
    ";for(i=0;i"+c+" solution is",a(this).data("jPlayerInspector").jPlayer.data("jPlayer")[c].used){b+=" being used and will support:";for(format in a(this).data("jPlayerInspector").jPlayer.data("jPlayer")[c].support)a(this).data("jPlayerInspector").jPlayer.data("jPlayer")[c].support[format]&&(b+=" "+format);b+="
    "}else b+=" not required
    "}b+="

    ",b+=a(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.active?a(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active?"Problem with jPlayer since both HTML5 and Flash are active.":"The HTML5 is active.":a(this).data("jPlayerInspector").jPlayer.data("jPlayer").flash.active?"The Flash is active.":"No solution is currently active. jPlayer needs a setMedia().",b+="

    ";var d=a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.formatType;b+="

    status.formatType = '"+d+"'
    ",b+=d?"Browser canPlay('"+a.jPlayer.prototype.format[d].codec+"')":"

    ",b+="

    status.src = '"+a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.src+"'

    ",b+="

    status.media = {
    ";for(prop in a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media)b+=" "+prop+": "+a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.media[prop]+"
    ";b+="};

    ",b+="

    ",b+="status.videoWidth = '"+a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.videoWidth+"'",b+=" | status.videoHeight = '"+a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.videoHeight+"'",b+="
    status.width = '"+a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.width+"'",b+=" | status.height = '"+a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.height+"'",b+="

    ",a(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.audio.available&&(b+="htmlElement.audio.canPlayType = "+typeof a(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.audio.canPlayType+"
    "),a(this).data("jPlayerInspector").jPlayer.data("jPlayer").html.video.available&&(b+="htmlElement.video.canPlayType = "+typeof a(this).data("jPlayerInspector").jPlayer.data("jPlayer").htmlElement.video.canPlayType+""),b+="

    ",b+="

    This instance is using the constructor options:
    $('#"+a(this).data("jPlayerInspector").jPlayer.data("jPlayer").internal.self.id+"').jPlayer({
     swfPath: '"+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","swfPath")+"',
     solution: '"+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","solution")+"',
     supplied: '"+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","supplied")+"',
     preload: '"+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","preload")+"',
     volume: "+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","volume")+",
     muted: "+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","muted")+",
     backgroundColor: '"+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","backgroundColor")+"',
     cssSelectorAncestor: '"+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","cssSelectorAncestor")+"',
     cssSelector: {";var e=a(this).data("jPlayerInspector").jPlayer.jPlayer("option","cssSelector");for(prop in e)b+="
      "+prop+": '"+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","cssSelector."+prop)+"',";return b=b.slice(0,-1),b+="
     },
     errorAlerts: "+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","errorAlerts")+",
     warningAlerts: "+a(this).data("jPlayerInspector").jPlayer.jPlayer("option","warningAlerts")+"
    });

    ",a(this).data("jPlayerInspector").configJq.html(b),this},updateStatus:function(){return a(this).data("jPlayerInspector").statusJq.html("

    jPlayer is "+(a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.paused?"paused":"playing")+" at time: "+Math.floor(10*a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentTime)/10+"s. (d: "+Math.floor(10*a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.duration)/10+"s, sp: "+Math.floor(a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.seekPercent)+"%, cpr: "+Math.floor(a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentRelative)+"%, cpa: "+Math.floor(a(this).data("jPlayerInspector").jPlayer.data("jPlayer").status.currentPercentAbsolute)+"%)

    "),this}};a.fn.jPlayerInspector=function(b){return c[b]?c[b].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof b&&b?void a.error("Method "+b+" does not exist on jQuery.jPlayerInspector"):c.init.apply(this,arguments)}}(jQuery); \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/jplayer.jquery.json b/core/vendor/filemanager/js/jPlayer/jplayer.jquery.json new file mode 100755 index 00000000..3b7b4376 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/jplayer.jquery.json @@ -0,0 +1,33 @@ +{ + "name": "jplayer", + "title": "jPlayer : HTML5 Audio & Video", + "description": "jPlayer allows you to create a media player with a consistent interface and experience across all browsers.", + "keywords": [ + "audio", + "video", + "media", + "player", + "jplayer", + "html5", + "streaming" + ], + "version": "2.4.0", + "author": { + "name": "Mark J Panaghiston", + "url": "http://happyworm.com/" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/happyworm/jPlayer/blob/master/MIT-LICENSE.txt" + } + ], + "dependencies": { + "jquery": ">=1.7" + }, + "homepage": "http://jplayer.org/", + "demo": "http://jplayer.org/latest/demos/", + "docs": "http://jplayer.org/latest/developer-guide/", + "download": "http://jplayer.org/download/", + "bugs": "https://github.com/happyworm/jPlayer/issues" +} \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.js b/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.js new file mode 100755 index 00000000..842f31b6 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.js @@ -0,0 +1,3506 @@ +/* + * jPlayer Plugin for jQuery JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2009 - 2014 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Version: 2.9.2 + * Date: 14th December 2014 + */ + +/* Support for Zepto 1.0 compiled with optional data module. + * For AMD or NODE/CommonJS support, you will need to manually switch the related 2 lines in the code below. + * Search terms: "jQuery Switch" and "Zepto Switch" + */ + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); // jQuery Switch + // define(['zepto'], factory); // Zepto Switch + } else if (typeof exports === 'object') { + // Node/CommonJS + factory(require('jquery')); // jQuery Switch + //factory(require('zepto')); // Zepto Switch + } else { + // Browser globals + if(root.jQuery) { // Use jQuery if available + factory(root.jQuery); + } else { // Otherwise, use Zepto + factory(root.Zepto); + } + } +}(this, function ($, undefined) { + + // Adapted from jquery.ui.widget.js (1.8.7): $.widget.bridge - Tweaked $.data(this,XYZ) to $(this).data(XYZ) for Zepto + $.fn.jPlayer = function( options ) { + var name = "jPlayer"; + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.charAt( 0 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $(this).data( name ), + methodValue = instance && $.isFunction( instance[options] ) ? + instance[ options ].apply( instance, args ) : + instance; + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $(this).data( name ); + if ( instance ) { + // instance.option( options || {} )._init(); // Orig jquery.ui.widget.js code: Not recommend for jPlayer. ie., Applying new options to an existing instance (via the jPlayer constructor) and performing the _init(). The _init() is what concerns me. It would leave a lot of event handlers acting on jPlayer instance and the interface. + instance.option( options || {} ); // The new constructor only changes the options. Changing options only has basic support atm. + } else { + $(this).data( name, new $.jPlayer( options, this ) ); + } + }); + } + + return returnValue; + }; + + $.jPlayer = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this.element = $(element); + this.options = $.extend(true, {}, + this.options, + options + ); + var self = this; + this.element.bind( "remove.jPlayer", function() { + self.destroy(); + }); + this._init(); + } + }; + // End of: (Adapted from jquery.ui.widget.js (1.8.7)) + + // Zepto is missing one of the animation methods. + if(typeof $.fn.stop !== 'function') { + $.fn.stop = function() {}; + } + + // Emulated HTML5 methods and properties + $.jPlayer.emulateMethods = "load play pause"; + $.jPlayer.emulateStatus = "src readyState networkState currentTime duration paused ended playbackRate"; + $.jPlayer.emulateOptions = "muted volume"; + + // Reserved event names generated by jPlayer that are not part of the HTML5 Media element spec + $.jPlayer.reservedEvent = "ready flashreset resize repeat error warning"; + + // Events generated by jPlayer + $.jPlayer.event = {}; + $.each( + [ + 'ready', + 'setmedia', // Fires when the media is set + 'flashreset', // Similar to the ready event if the Flash solution is set to display:none and then shown again or if it's reloaded for another reason by the browser. For example, using CSS position:fixed on Firefox for the full screen feature. + 'resize', // Occurs when the size changes through a full/restore screen operation or if the size/sizeFull options are changed. + 'repeat', // Occurs when the repeat status changes. Usually through clicks on the repeat button of the interface. + 'click', // Occurs when the user clicks on one of the following: poster image, html video, flash video. + 'error', // Event error code in event.jPlayer.error.type. See $.jPlayer.error + 'warning', // Event warning code in event.jPlayer.warning.type. See $.jPlayer.warning + + // Other events match HTML5 spec. + 'loadstart', + 'progress', + 'suspend', + 'abort', + 'emptied', + 'stalled', + 'play', + 'pause', + 'loadedmetadata', + 'loadeddata', + 'waiting', + 'playing', + 'canplay', + 'canplaythrough', + 'seeking', + 'seeked', + 'timeupdate', + 'ended', + 'ratechange', + 'durationchange', + 'volumechange' + ], + function() { + $.jPlayer.event[ this ] = 'jPlayer_' + this; + } + ); + + $.jPlayer.htmlEvent = [ // These HTML events are bubbled through to the jPlayer event, without any internal action. + "loadstart", + // "progress", // jPlayer uses internally before bubbling. + // "suspend", // jPlayer uses internally before bubbling. + "abort", + // "error", // jPlayer uses internally before bubbling. + "emptied", + "stalled", + // "play", // jPlayer uses internally before bubbling. + // "pause", // jPlayer uses internally before bubbling. + "loadedmetadata", + // "loadeddata", // jPlayer uses internally before bubbling. + // "waiting", // jPlayer uses internally before bubbling. + // "playing", // jPlayer uses internally before bubbling. + "canplay", + "canplaythrough" + // "seeking", // jPlayer uses internally before bubbling. + // "seeked", // jPlayer uses internally before bubbling. + // "timeupdate", // jPlayer uses internally before bubbling. + // "ended", // jPlayer uses internally before bubbling. + // "ratechange" // jPlayer uses internally before bubbling. + // "durationchange" // jPlayer uses internally before bubbling. + // "volumechange" // jPlayer uses internally before bubbling. + ]; + + $.jPlayer.pause = function() { + $.jPlayer.prototype.destroyRemoved(); + $.each($.jPlayer.prototype.instances, function(i, element) { + if(element.data("jPlayer").status.srcSet) { // Check that media is set otherwise would cause error event. + element.jPlayer("pause"); + } + }); + }; + + // Default for jPlayer option.timeFormat + $.jPlayer.timeFormat = { + showHour: false, + showMin: true, + showSec: true, + padHour: false, + padMin: true, + padSec: true, + sepHour: ":", + sepMin: ":", + sepSec: "" + }; + var ConvertTime = function() { + this.init(); + }; + ConvertTime.prototype = { + init: function() { + this.options = { + timeFormat: $.jPlayer.timeFormat + }; + }, + time: function(s) { // function used on jPlayer.prototype._convertTime to enable per instance options. + s = (s && typeof s === 'number') ? s : 0; + + var myTime = new Date(s * 1000), + hour = myTime.getUTCHours(), + min = this.options.timeFormat.showHour ? myTime.getUTCMinutes() : myTime.getUTCMinutes() + hour * 60, + sec = this.options.timeFormat.showMin ? myTime.getUTCSeconds() : myTime.getUTCSeconds() + min * 60, + strHour = (this.options.timeFormat.padHour && hour < 10) ? "0" + hour : hour, + strMin = (this.options.timeFormat.padMin && min < 10) ? "0" + min : min, + strSec = (this.options.timeFormat.padSec && sec < 10) ? "0" + sec : sec, + strTime = ""; + + strTime += this.options.timeFormat.showHour ? strHour + this.options.timeFormat.sepHour : ""; + strTime += this.options.timeFormat.showMin ? strMin + this.options.timeFormat.sepMin : ""; + strTime += this.options.timeFormat.showSec ? strSec + this.options.timeFormat.sepSec : ""; + + return strTime; + } + }; + var myConvertTime = new ConvertTime(); + $.jPlayer.convertTime = function(s) { + return myConvertTime.time(s); + }; + + // Adapting jQuery 1.4.4 code for jQuery.browser. Required since jQuery 1.3.2 does not detect Chrome as webkit. + $.jPlayer.uaBrowser = function( userAgent ) { + var ua = userAgent.toLowerCase(); + + // Useragent RegExp + var rwebkit = /(webkit)[ \/]([\w.]+)/; + var ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/; + var rmsie = /(msie) ([\w.]+)/; + var rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/; + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }; + + // Platform sniffer for detecting mobile devices + $.jPlayer.uaPlatform = function( userAgent ) { + var ua = userAgent.toLowerCase(); + + // Useragent RegExp + var rplatform = /(ipad|iphone|ipod|android|blackberry|playbook|windows ce|webos)/; + var rtablet = /(ipad|playbook)/; + var randroid = /(android)/; + var rmobile = /(mobile)/; + + var platform = rplatform.exec( ua ) || []; + var tablet = rtablet.exec( ua ) || + !rmobile.exec( ua ) && randroid.exec( ua ) || + []; + + if(platform[1]) { + platform[1] = platform[1].replace(/\s/g, "_"); // Change whitespace to underscore. Enables dot notation. + } + + return { platform: platform[1] || "", tablet: tablet[1] || "" }; + }; + + $.jPlayer.browser = { + }; + $.jPlayer.platform = { + }; + + var browserMatch = $.jPlayer.uaBrowser(navigator.userAgent); + if ( browserMatch.browser ) { + $.jPlayer.browser[ browserMatch.browser ] = true; + $.jPlayer.browser.version = browserMatch.version; + } + var platformMatch = $.jPlayer.uaPlatform(navigator.userAgent); + if ( platformMatch.platform ) { + $.jPlayer.platform[ platformMatch.platform ] = true; + $.jPlayer.platform.mobile = !platformMatch.tablet; + $.jPlayer.platform.tablet = !!platformMatch.tablet; + } + + // Internet Explorer (IE) Browser Document Mode Sniffer. Based on code at: + // http://msdn.microsoft.com/en-us/library/cc288325%28v=vs.85%29.aspx#GetMode + $.jPlayer.getDocMode = function() { + var docMode; + if ($.jPlayer.browser.msie) { + if (document.documentMode) { // IE8 or later + docMode = document.documentMode; + } else { // IE 5-7 + docMode = 5; // Assume quirks mode unless proven otherwise + if (document.compatMode) { + if (document.compatMode === "CSS1Compat") { + docMode = 7; // standards mode + } + } + } + } + return docMode; + }; + $.jPlayer.browser.documentMode = $.jPlayer.getDocMode(); + + $.jPlayer.nativeFeatures = { + init: function() { + + /* Fullscreen function naming influenced by W3C naming. + * No support for: Mozilla Proposal: https://wiki.mozilla.org/Gecko:FullScreenAPI + */ + + var d = document, + v = d.createElement('video'), + spec = { + // http://www.w3.org/TR/fullscreen/ + w3c: [ + 'fullscreenEnabled', + 'fullscreenElement', + 'requestFullscreen', + 'exitFullscreen', + 'fullscreenchange', + 'fullscreenerror' + ], + // https://developer.mozilla.org/en-US/docs/DOM/Using_fullscreen_mode + moz: [ + 'mozFullScreenEnabled', + 'mozFullScreenElement', + 'mozRequestFullScreen', + 'mozCancelFullScreen', + 'mozfullscreenchange', + 'mozfullscreenerror' + ], + // http://developer.apple.com/library/safari/#documentation/WebKit/Reference/ElementClassRef/Element/Element.html + // http://developer.apple.com/library/safari/#documentation/UserExperience/Reference/DocumentAdditionsReference/DocumentAdditions/DocumentAdditions.html + webkit: [ + '', + 'webkitCurrentFullScreenElement', + 'webkitRequestFullScreen', + 'webkitCancelFullScreen', + 'webkitfullscreenchange', + '' + ], + // http://developer.apple.com/library/safari/#documentation/AudioVideo/Reference/HTMLVideoElementClassReference/HTMLVideoElement/HTMLVideoElement.html + // https://developer.apple.com/library/safari/samplecode/HTML5VideoEventFlow/Listings/events_js.html#//apple_ref/doc/uid/DTS40010085-events_js-DontLinkElementID_5 + // Events: 'webkitbeginfullscreen' and 'webkitendfullscreen' + webkitVideo: [ + 'webkitSupportsFullscreen', + 'webkitDisplayingFullscreen', + 'webkitEnterFullscreen', + 'webkitExitFullscreen', + '', + '' + ], + ms: [ + '', + 'msFullscreenElement', + 'msRequestFullscreen', + 'msExitFullscreen', + 'MSFullscreenChange', + 'MSFullscreenError' + ] + }, + specOrder = [ + 'w3c', + 'moz', + 'webkit', + 'webkitVideo', + 'ms' + ], + fs, i, il; + + this.fullscreen = fs = { + support: { + w3c: !!d[spec.w3c[0]], + moz: !!d[spec.moz[0]], + webkit: typeof d[spec.webkit[3]] === 'function', + webkitVideo: typeof v[spec.webkitVideo[2]] === 'function', + ms: typeof v[spec.ms[2]] === 'function' + }, + used: {} + }; + + // Store the name of the spec being used and as a handy boolean. + for(i = 0, il = specOrder.length; i < il; i++) { + var n = specOrder[i]; + if(fs.support[n]) { + fs.spec = n; + fs.used[n] = true; + break; + } + } + + if(fs.spec) { + var s = spec[fs.spec]; + fs.api = { + fullscreenEnabled: true, + fullscreenElement: function(elem) { + elem = elem ? elem : d; // Video element required for webkitVideo + return elem[s[1]]; + }, + requestFullscreen: function(elem) { + return elem[s[2]](); // Chrome and Opera want parameter (Element.ALLOW_KEYBOARD_INPUT) but Safari fails if flag used. + }, + exitFullscreen: function(elem) { + elem = elem ? elem : d; // Video element required for webkitVideo + return elem[s[3]](); + } + }; + fs.event = { + fullscreenchange: s[4], + fullscreenerror: s[5] + }; + } else { + fs.api = { + fullscreenEnabled: false, + fullscreenElement: function() { + return null; + }, + requestFullscreen: function() {}, + exitFullscreen: function() {} + }; + fs.event = {}; + } + } + }; + $.jPlayer.nativeFeatures.init(); + + // The keyboard control system. + + // The current jPlayer instance in focus. + $.jPlayer.focus = null; + + // The list of element node names to ignore with key controls. + $.jPlayer.keyIgnoreElementNames = "A INPUT TEXTAREA SELECT BUTTON"; + + // The function that deals with key presses. + var keyBindings = function(event) { + var f = $.jPlayer.focus, + ignoreKey; + + // A jPlayer instance must be in focus. ie., keyEnabled and the last one played. + if(f) { + // What generated the key press? + $.each( $.jPlayer.keyIgnoreElementNames.split(/\s+/g), function(i, name) { + // The strings should already be uppercase. + if(event.target.nodeName.toUpperCase() === name.toUpperCase()) { + ignoreKey = true; + return false; // exit each. + } + }); + if(!ignoreKey) { + // See if the key pressed matches any of the bindings. + $.each(f.options.keyBindings, function(action, binding) { + // The binding could be a null when the default has been disabled. ie., 1st clause in if() + if( + (binding && $.isFunction(binding.fn)) && + ((typeof binding.key === 'number' && event.which === binding.key) || + (typeof binding.key === 'string' && event.key === binding.key)) + ) { + event.preventDefault(); // Key being used by jPlayer, so prevent default operation. + binding.fn(f); + return false; // exit each. + } + }); + } + } + }; + + $.jPlayer.keys = function(en) { + var event = "keydown.jPlayer"; + // Remove any binding, just in case enabled more than once. + $(document.documentElement).unbind(event); + if(en) { + $(document.documentElement).bind(event, keyBindings); + } + }; + + // Enable the global key control handler ready for any jPlayer instance with the keyEnabled option enabled. + $.jPlayer.keys(true); + + $.jPlayer.prototype = { + count: 0, // Static Variable: Change it via prototype. + version: { // Static Object + script: "2.9.2", + needFlash: "2.9.0", + flash: "unknown" + }, + options: { // Instanced in $.jPlayer() constructor + swfPath: "js", // Path to jquery.jplayer.swf. Can be relative, absolute or server root relative. + solution: "html, flash", // Valid solutions: html, flash, aurora. Order defines priority. 1st is highest, + supplied: "mp3", // Defines which formats jPlayer will try and support and the priority by the order. 1st is highest, + auroraFormats: "wav", // List the aurora.js codecs being loaded externally. Its core supports "wav". Specify format in jPlayer context. EG., The aac.js codec gives the "m4a" format. + preload: 'metadata', // HTML5 Spec values: none, metadata, auto. + volume: 0.8, // The volume. Number 0 to 1. + muted: false, + remainingDuration: false, // When true, the remaining time is shown in the duration GUI element. + toggleDuration: false, // When true, clicks on the duration toggle between the duration and remaining display. + captureDuration: true, // When true, clicks on the duration are captured and no longer propagate up the DOM. + playbackRate: 1, + defaultPlaybackRate: 1, + minPlaybackRate: 0.5, + maxPlaybackRate: 4, + wmode: "opaque", // Valid wmode: window, transparent, opaque, direct, gpu. + backgroundColor: "#000000", // To define the jPlayer div and Flash background color. + cssSelectorAncestor: "#jp_container_1", + cssSelector: { // * denotes properties that should only be required when video media type required. _cssSelector() would require changes to enable splitting these into Audio and Video defaults. + videoPlay: ".jp-video-play", // * + play: ".jp-play", + pause: ".jp-pause", + stop: ".jp-stop", + seekBar: ".jp-seek-bar", + playBar: ".jp-play-bar", + mute: ".jp-mute", + unmute: ".jp-unmute", + volumeBar: ".jp-volume-bar", + volumeBarValue: ".jp-volume-bar-value", + volumeMax: ".jp-volume-max", + playbackRateBar: ".jp-playback-rate-bar", + playbackRateBarValue: ".jp-playback-rate-bar-value", + currentTime: ".jp-current-time", + duration: ".jp-duration", + title: ".jp-title", + fullScreen: ".jp-full-screen", // * + restoreScreen: ".jp-restore-screen", // * + repeat: ".jp-repeat", + repeatOff: ".jp-repeat-off", + gui: ".jp-gui", // The interface used with autohide feature. + noSolution: ".jp-no-solution" // For error feedback when jPlayer cannot find a solution. + }, + stateClass: { // Classes added to the cssSelectorAncestor to indicate the state. + playing: "jp-state-playing", + seeking: "jp-state-seeking", + muted: "jp-state-muted", + looped: "jp-state-looped", + fullScreen: "jp-state-full-screen", + noVolume: "jp-state-no-volume" + }, + useStateClassSkin: false, // A state class skin relies on the state classes to change the visual appearance. The single control toggles the effect, for example: play then pause, mute then unmute. + autoBlur: true, // GUI control handlers will drop focus after clicks. + smoothPlayBar: false, // Smooths the play bar transitions, which affects clicks and short media with big changes per second. + fullScreen: false, // Native Full Screen + fullWindow: false, + autohide: { + restored: false, // Controls the interface autohide feature. + full: true, // Controls the interface autohide feature. + fadeIn: 200, // Milliseconds. The period of the fadeIn anim. + fadeOut: 600, // Milliseconds. The period of the fadeOut anim. + hold: 1000 // Milliseconds. The period of the pause before autohide beings. + }, + loop: false, + repeat: function(event) { // The default jPlayer repeat event handler + if(event.jPlayer.options.loop) { + $(this).unbind(".jPlayerRepeat").bind($.jPlayer.event.ended + ".jPlayer.jPlayerRepeat", function() { + $(this).jPlayer("play"); + }); + } else { + $(this).unbind(".jPlayerRepeat"); + } + }, + nativeVideoControls: { + // Works well on standard browsers. + // Phone and tablet browsers can have problems with the controls disappearing. + }, + noFullWindow: { + msie: /msie [0-6]\./, + ipad: /ipad.*?os [0-4]\./, + iphone: /iphone/, + ipod: /ipod/, + android_pad: /android [0-3]\.(?!.*?mobile)/, + android_phone: /(?=.*android)(?!.*chrome)(?=.*mobile)/, + blackberry: /blackberry/, + windows_ce: /windows ce/, + iemobile: /iemobile/, + webos: /webos/ + }, + noVolume: { + ipad: /ipad/, + iphone: /iphone/, + ipod: /ipod/, + android_pad: /android(?!.*?mobile)/, + android_phone: /android.*?mobile/, + blackberry: /blackberry/, + windows_ce: /windows ce/, + iemobile: /iemobile/, + webos: /webos/, + playbook: /playbook/ + }, + timeFormat: { + // Specific time format for this instance. The supported options are defined in $.jPlayer.timeFormat + // For the undefined options we use the default from $.jPlayer.timeFormat + }, + keyEnabled: false, // Enables keyboard controls. + audioFullScreen: false, // Enables keyboard controls to enter full screen with audio media. + keyBindings: { // The key control object, defining the key codes and the functions to execute. + // The parameter, f = $.jPlayer.focus, will be checked truethy before attempting to call any of these functions. + // Properties may be added to this object, in key/fn pairs, to enable other key controls. EG, for the playlist add-on. + play: { + key: 80, // p + fn: function(f) { + if(f.status.paused) { + f.play(); + } else { + f.pause(); + } + } + }, + fullScreen: { + key: 70, // f + fn: function(f) { + if(f.status.video || f.options.audioFullScreen) { + f._setOption("fullScreen", !f.options.fullScreen); + } + } + }, + muted: { + key: 77, // m + fn: function(f) { + f._muted(!f.options.muted); + } + }, + volumeUp: { + key: 190, // . + fn: function(f) { + f.volume(f.options.volume + 0.1); + } + }, + volumeDown: { + key: 188, // , + fn: function(f) { + f.volume(f.options.volume - 0.1); + } + }, + loop: { + key: 76, // l + fn: function(f) { + f._loop(!f.options.loop); + } + } + }, + verticalVolume: false, // Calculate volume from the bottom of the volume bar. Default is from the left. Also volume affects either width or height. + verticalPlaybackRate: false, + globalVolume: false, // Set to make volume and muted changes affect all jPlayer instances with this option enabled + idPrefix: "jp", // Prefix for the ids of html elements created by jPlayer. For flash, this must not include characters: . - + * / \ + noConflict: "jQuery", + emulateHtml: false, // Emulates the HTML5 Media element on the jPlayer element. + consoleAlerts: true, // Alerts are sent to the console.log() instead of alert(). + errorAlerts: false, + warningAlerts: false + }, + optionsAudio: { + size: { + width: "0px", + height: "0px", + cssClass: "" + }, + sizeFull: { + width: "0px", + height: "0px", + cssClass: "" + } + }, + optionsVideo: { + size: { + width: "480px", + height: "270px", + cssClass: "jp-video-270p" + }, + sizeFull: { + width: "100%", + height: "100%", + cssClass: "jp-video-full" + } + }, + instances: {}, // Static Object + status: { // Instanced in _init() + src: "", + media: {}, + paused: true, + format: {}, + formatType: "", + waitForPlay: true, // Same as waitForLoad except in case where preloading. + waitForLoad: true, + srcSet: false, + video: false, // True if playing a video + seekPercent: 0, + currentPercentRelative: 0, + currentPercentAbsolute: 0, + currentTime: 0, + duration: 0, + remaining: 0, + videoWidth: 0, // Intrinsic width of the video in pixels. + videoHeight: 0, // Intrinsic height of the video in pixels. + readyState: 0, + networkState: 0, + playbackRate: 1, // Warning - Now both an option and a status property + ended: 0 + +/* Persistant status properties created dynamically at _init(): + width + height + cssClass + nativeVideoControls + noFullWindow + noVolume + playbackRateEnabled // Warning - Technically, we can have both Flash and HTML, so this might not be correct if the Flash is active. That is a niche case. +*/ + }, + + internal: { // Instanced in _init() + ready: false + // instance: undefined + // domNode: undefined + // htmlDlyCmdId: undefined + // autohideId: undefined + // mouse: undefined + // cmdsIgnored + }, + solution: { // Static Object: Defines the solutions built in jPlayer. + html: true, + aurora: true, + flash: true + }, + // 'MPEG-4 support' : canPlayType('video/mp4; codecs="mp4v.20.8"') + format: { // Static Object + mp3: { + codec: 'audio/mpeg', + flashCanPlay: true, + media: 'audio' + }, + m4a: { // AAC / MP4 + codec: 'audio/mp4; codecs="mp4a.40.2"', + flashCanPlay: true, + media: 'audio' + }, + m3u8a: { // AAC / MP4 / Apple HLS + codec: 'application/vnd.apple.mpegurl; codecs="mp4a.40.2"', + flashCanPlay: false, + media: 'audio' + }, + m3ua: { // M3U + codec: 'audio/mpegurl', + flashCanPlay: false, + media: 'audio' + }, + oga: { // OGG + codec: 'audio/ogg; codecs="vorbis, opus"', + flashCanPlay: false, + media: 'audio' + }, + flac: { // FLAC + codec: 'audio/x-flac', + flashCanPlay: false, + media: 'audio' + }, + wav: { // PCM + codec: 'audio/wav; codecs="1"', + flashCanPlay: false, + media: 'audio' + }, + webma: { // WEBM + codec: 'audio/webm; codecs="vorbis"', + flashCanPlay: false, + media: 'audio' + }, + fla: { // FLV / F4A + codec: 'audio/x-flv', + flashCanPlay: true, + media: 'audio' + }, + rtmpa: { // RTMP AUDIO + codec: 'audio/rtmp; codecs="rtmp"', + flashCanPlay: true, + media: 'audio' + }, + m4v: { // H.264 / MP4 + codec: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"', + flashCanPlay: true, + media: 'video' + }, + m3u8v: { // H.264 / AAC / MP4 / Apple HLS + codec: 'application/vnd.apple.mpegurl; codecs="avc1.42E01E, mp4a.40.2"', + flashCanPlay: false, + media: 'video' + }, + m3uv: { // M3U + codec: 'audio/mpegurl', + flashCanPlay: false, + media: 'video' + }, + ogv: { // OGG + codec: 'video/ogg; codecs="theora, vorbis"', + flashCanPlay: false, + media: 'video' + }, + webmv: { // WEBM + codec: 'video/webm; codecs="vorbis, vp8"', + flashCanPlay: false, + media: 'video' + }, + flv: { // FLV / F4V + codec: 'video/x-flv', + flashCanPlay: true, + media: 'video' + }, + rtmpv: { // RTMP VIDEO + codec: 'video/rtmp; codecs="rtmp"', + flashCanPlay: true, + media: 'video' + } + }, + _init: function() { + var self = this; + + this.element.empty(); + + this.status = $.extend({}, this.status); // Copy static to unique instance. + this.internal = $.extend({}, this.internal); // Copy static to unique instance. + + // Initialize the time format + this.options.timeFormat = $.extend({}, $.jPlayer.timeFormat, this.options.timeFormat); + + // On iOS, assume commands will be ignored before user initiates them. + this.internal.cmdsIgnored = $.jPlayer.platform.ipad || $.jPlayer.platform.iphone || $.jPlayer.platform.ipod; + + this.internal.domNode = this.element.get(0); + + // Add key bindings focus to 1st jPlayer instanced with key control enabled. + if(this.options.keyEnabled && !$.jPlayer.focus) { + $.jPlayer.focus = this; + } + + // A fix for Android where older (2.3) and even some 4.x devices fail to work when changing the *audio* SRC and then playing immediately. + this.androidFix = { + setMedia: false, // True when media set + play: false, // True when a progress event will instruct the media to play + pause: false, // True when a progress event will instruct the media to pause at a time. + time: NaN // The play(time) parameter + }; + if($.jPlayer.platform.android) { + this.options.preload = this.options.preload !== 'auto' ? 'metadata' : 'auto'; // Default to metadata, but allow auto. + } + + this.formats = []; // Array based on supplied string option. Order defines priority. + this.solutions = []; // Array based on solution string option. Order defines priority. + this.require = {}; // Which media types are required: video, audio. + + this.htmlElement = {}; // DOM elements created by jPlayer + this.html = {}; // In _init()'s this.desired code and setmedia(): Accessed via this[solution], where solution from this.solutions array. + this.html.audio = {}; + this.html.video = {}; + this.aurora = {}; // In _init()'s this.desired code and setmedia(): Accessed via this[solution], where solution from this.solutions array. + this.aurora.formats = []; + this.aurora.properties = []; + this.flash = {}; // In _init()'s this.desired code and setmedia(): Accessed via this[solution], where solution from this.solutions array. + + this.css = {}; + this.css.cs = {}; // Holds the css selector strings + this.css.jq = {}; // Holds jQuery selectors. ie., $(css.cs.method) + + this.ancestorJq = []; // Holds jQuery selector of cssSelectorAncestor. Init would use $() instead of [], but it is only 1.4+ + + this.options.volume = this._limitValue(this.options.volume, 0, 1); // Limit volume value's bounds. + + // Create the formats array, with prority based on the order of the supplied formats string + $.each(this.options.supplied.toLowerCase().split(","), function(index1, value1) { + var format = value1.replace(/^\s+|\s+$/g, ""); //trim + if(self.format[format]) { // Check format is valid. + var dupFound = false; + $.each(self.formats, function(index2, value2) { // Check for duplicates + if(format === value2) { + dupFound = true; + return false; + } + }); + if(!dupFound) { + self.formats.push(format); + } + } + }); + + // Create the solutions array, with prority based on the order of the solution string + $.each(this.options.solution.toLowerCase().split(","), function(index1, value1) { + var solution = value1.replace(/^\s+|\s+$/g, ""); //trim + if(self.solution[solution]) { // Check solution is valid. + var dupFound = false; + $.each(self.solutions, function(index2, value2) { // Check for duplicates + if(solution === value2) { + dupFound = true; + return false; + } + }); + if(!dupFound) { + self.solutions.push(solution); + } + } + }); + + // Create Aurora.js formats array + $.each(this.options.auroraFormats.toLowerCase().split(","), function(index1, value1) { + var format = value1.replace(/^\s+|\s+$/g, ""); //trim + if(self.format[format]) { // Check format is valid. + var dupFound = false; + $.each(self.aurora.formats, function(index2, value2) { // Check for duplicates + if(format === value2) { + dupFound = true; + return false; + } + }); + if(!dupFound) { + self.aurora.formats.push(format); + } + } + }); + + this.internal.instance = "jp_" + this.count; + this.instances[this.internal.instance] = this.element; + + // Check the jPlayer div has an id and create one if required. Important for Flash to know the unique id for comms. + if(!this.element.attr("id")) { + this.element.attr("id", this.options.idPrefix + "_jplayer_" + this.count); + } + + this.internal.self = $.extend({}, { + id: this.element.attr("id"), + jq: this.element + }); + this.internal.audio = $.extend({}, { + id: this.options.idPrefix + "_audio_" + this.count, + jq: undefined + }); + this.internal.video = $.extend({}, { + id: this.options.idPrefix + "_video_" + this.count, + jq: undefined + }); + this.internal.flash = $.extend({}, { + id: this.options.idPrefix + "_flash_" + this.count, + jq: undefined, + swf: this.options.swfPath + (this.options.swfPath.toLowerCase().slice(-4) !== ".swf" ? (this.options.swfPath && this.options.swfPath.slice(-1) !== "/" ? "/" : "") + "jquery.jplayer.swf" : "") + }); + this.internal.poster = $.extend({}, { + id: this.options.idPrefix + "_poster_" + this.count, + jq: undefined + }); + + // Register listeners defined in the constructor + $.each($.jPlayer.event, function(eventName,eventType) { + if(self.options[eventName] !== undefined) { + self.element.bind(eventType + ".jPlayer", self.options[eventName]); // With .jPlayer namespace. + self.options[eventName] = undefined; // Destroy the handler pointer copy on the options. Reason, events can be added/removed in other ways so this could be obsolete and misleading. + } + }); + + // Determine if we require solutions for audio, video or both media types. + this.require.audio = false; + this.require.video = false; + $.each(this.formats, function(priority, format) { + self.require[self.format[format].media] = true; + }); + + // Now required types are known, finish the options default settings. + if(this.require.video) { + this.options = $.extend(true, {}, + this.optionsVideo, + this.options + ); + } else { + this.options = $.extend(true, {}, + this.optionsAudio, + this.options + ); + } + this._setSize(); // update status and jPlayer element size + + // Determine the status for Blocklisted options. + this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); + this.status.noFullWindow = this._uaBlocklist(this.options.noFullWindow); + this.status.noVolume = this._uaBlocklist(this.options.noVolume); + + // Create event handlers if native fullscreen is supported + if($.jPlayer.nativeFeatures.fullscreen.api.fullscreenEnabled) { + this._fullscreenAddEventListeners(); + } + + // The native controls are only for video and are disabled when audio is also used. + this._restrictNativeVideoControls(); + + // Create the poster image. + this.htmlElement.poster = document.createElement('img'); + this.htmlElement.poster.id = this.internal.poster.id; + this.htmlElement.poster.onload = function() { // Note that this did not work on Firefox 3.6: poster.addEventListener("onload", function() {}, false); Did not investigate x-browser. + if(!self.status.video || self.status.waitForPlay) { + self.internal.poster.jq.show(); + } + }; + this.element.append(this.htmlElement.poster); + this.internal.poster.jq = $("#" + this.internal.poster.id); + this.internal.poster.jq.css({'width': this.status.width, 'height': this.status.height}); + this.internal.poster.jq.hide(); + this.internal.poster.jq.bind("click.jPlayer", function() { + self._trigger($.jPlayer.event.click); + }); + + // Generate the required media elements + this.html.audio.available = false; + if(this.require.audio) { // If a supplied format is audio + this.htmlElement.audio = document.createElement('audio'); + this.htmlElement.audio.id = this.internal.audio.id; + this.html.audio.available = !!this.htmlElement.audio.canPlayType && this._testCanPlayType(this.htmlElement.audio); // Test is for IE9 on Win Server 2008. + } + this.html.video.available = false; + if(this.require.video) { // If a supplied format is video + this.htmlElement.video = document.createElement('video'); + this.htmlElement.video.id = this.internal.video.id; + this.html.video.available = !!this.htmlElement.video.canPlayType && this._testCanPlayType(this.htmlElement.video); // Test is for IE9 on Win Server 2008. + } + + this.flash.available = this._checkForFlash(10.1); + + this.html.canPlay = {}; + this.aurora.canPlay = {}; + this.flash.canPlay = {}; + $.each(this.formats, function(priority, format) { + self.html.canPlay[format] = self.html[self.format[format].media].available && "" !== self.htmlElement[self.format[format].media].canPlayType(self.format[format].codec); + self.aurora.canPlay[format] = ($.inArray(format, self.aurora.formats) > -1); + self.flash.canPlay[format] = self.format[format].flashCanPlay && self.flash.available; + }); + this.html.desired = false; + this.aurora.desired = false; + this.flash.desired = false; + $.each(this.solutions, function(solutionPriority, solution) { + if(solutionPriority === 0) { + self[solution].desired = true; + } else { + var audioCanPlay = false; + var videoCanPlay = false; + $.each(self.formats, function(formatPriority, format) { + if(self[self.solutions[0]].canPlay[format]) { // The other solution can play + if(self.format[format].media === 'video') { + videoCanPlay = true; + } else { + audioCanPlay = true; + } + } + }); + self[solution].desired = (self.require.audio && !audioCanPlay) || (self.require.video && !videoCanPlay); + } + }); + // This is what jPlayer will support, based on solution and supplied. + this.html.support = {}; + this.aurora.support = {}; + this.flash.support = {}; + $.each(this.formats, function(priority, format) { + self.html.support[format] = self.html.canPlay[format] && self.html.desired; + self.aurora.support[format] = self.aurora.canPlay[format] && self.aurora.desired; + self.flash.support[format] = self.flash.canPlay[format] && self.flash.desired; + }); + // If jPlayer is supporting any format in a solution, then the solution is used. + this.html.used = false; + this.aurora.used = false; + this.flash.used = false; + $.each(this.solutions, function(solutionPriority, solution) { + $.each(self.formats, function(formatPriority, format) { + if(self[solution].support[format]) { + self[solution].used = true; + return false; + } + }); + }); + + // Init solution active state and the event gates to false. + this._resetActive(); + this._resetGate(); + + // Set up the css selectors for the control and feedback entities. + this._cssSelectorAncestor(this.options.cssSelectorAncestor); + + // If neither html nor aurora nor flash are being used by this browser, then media playback is not possible. Trigger an error event. + if(!(this.html.used || this.aurora.used || this.flash.used)) { + this._error( { + type: $.jPlayer.error.NO_SOLUTION, + context: "{solution:'" + this.options.solution + "', supplied:'" + this.options.supplied + "'}", + message: $.jPlayer.errorMsg.NO_SOLUTION, + hint: $.jPlayer.errorHint.NO_SOLUTION + }); + if(this.css.jq.noSolution.length) { + this.css.jq.noSolution.show(); + } + } else { + if(this.css.jq.noSolution.length) { + this.css.jq.noSolution.hide(); + } + } + + // Add the flash solution if it is being used. + if(this.flash.used) { + var htmlObj, + flashVars = 'jQuery=' + encodeURI(this.options.noConflict) + '&id=' + encodeURI(this.internal.self.id) + '&vol=' + this.options.volume + '&muted=' + this.options.muted; + + // Code influenced by SWFObject 2.2: http://code.google.com/p/swfobject/ + // Non IE browsers have an initial Flash size of 1 by 1 otherwise the wmode affected the Flash ready event. + + if($.jPlayer.browser.msie && (Number($.jPlayer.browser.version) < 9 || $.jPlayer.browser.documentMode < 9)) { + var objStr = ''; + + var paramStr = [ + '', + '', + '', + '', + '' + ]; + + htmlObj = document.createElement(objStr); + for(var i=0; i < paramStr.length; i++) { + htmlObj.appendChild(document.createElement(paramStr[i])); + } + } else { + var createParam = function(el, n, v) { + var p = document.createElement("param"); + p.setAttribute("name", n); + p.setAttribute("value", v); + el.appendChild(p); + }; + + htmlObj = document.createElement("object"); + htmlObj.setAttribute("id", this.internal.flash.id); + htmlObj.setAttribute("name", this.internal.flash.id); + htmlObj.setAttribute("data", this.internal.flash.swf); + htmlObj.setAttribute("type", "application/x-shockwave-flash"); + htmlObj.setAttribute("width", "1"); // Non-zero + htmlObj.setAttribute("height", "1"); // Non-zero + htmlObj.setAttribute("tabindex", "-1"); + createParam(htmlObj, "flashvars", flashVars); + createParam(htmlObj, "allowscriptaccess", "always"); + createParam(htmlObj, "bgcolor", this.options.backgroundColor); + createParam(htmlObj, "wmode", this.options.wmode); + } + + this.element.append(htmlObj); + this.internal.flash.jq = $(htmlObj); + } + + // Setup playbackRate ability before using _addHtmlEventListeners() + if(this.html.used && !this.flash.used) { // If only HTML + // Using the audio element capabilities for playbackRate. ie., Assuming video element is the same. + this.status.playbackRateEnabled = this._testPlaybackRate('audio'); + } else { + this.status.playbackRateEnabled = false; + } + + this._updatePlaybackRate(); + + // Add the HTML solution if being used. + if(this.html.used) { + + // The HTML Audio handlers + if(this.html.audio.available) { + this._addHtmlEventListeners(this.htmlElement.audio, this.html.audio); + this.element.append(this.htmlElement.audio); + this.internal.audio.jq = $("#" + this.internal.audio.id); + } + + // The HTML Video handlers + if(this.html.video.available) { + this._addHtmlEventListeners(this.htmlElement.video, this.html.video); + this.element.append(this.htmlElement.video); + this.internal.video.jq = $("#" + this.internal.video.id); + if(this.status.nativeVideoControls) { + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } else { + this.internal.video.jq.css({'width':'0px', 'height':'0px'}); // Using size 0x0 since a .hide() causes issues in iOS + } + this.internal.video.jq.bind("click.jPlayer", function() { + self._trigger($.jPlayer.event.click); + }); + } + } + + // Add the Aurora.js solution if being used. + if(this.aurora.used) { + // Aurora.js player need to be created for each media, see setMedia function. + } + + // Create the bridge that emulates the HTML Media element on the jPlayer DIV + if( this.options.emulateHtml ) { + this._emulateHtmlBridge(); + } + + if((this.html.used || this.aurora.used) && !this.flash.used) { // If only HTML, then emulate flash ready() call after 100ms. + setTimeout( function() { + self.internal.ready = true; + self.version.flash = "n/a"; + self._trigger($.jPlayer.event.repeat); // Trigger the repeat event so its handler can initialize itself with the loop option. + self._trigger($.jPlayer.event.ready); + }, 100); + } + + // Initialize the interface components with the options. + this._updateNativeVideoControls(); + // The other controls are now setup in _cssSelectorAncestor() + if(this.css.jq.videoPlay.length) { + this.css.jq.videoPlay.hide(); + } + + $.jPlayer.prototype.count++; // Change static variable via prototype. + }, + destroy: function() { + // MJP: The background change remains. Would need to store the original to restore it correctly. + // MJP: The jPlayer element's size change remains. + + // Clear the media to reset the GUI and stop any downloads. Streams on some browsers had persited. (Chrome) + this.clearMedia(); + // Remove the size/sizeFull cssClass from the cssSelectorAncestor + this._removeUiClass(); + // Remove the times from the GUI + if(this.css.jq.currentTime.length) { + this.css.jq.currentTime.text(""); + } + if(this.css.jq.duration.length) { + this.css.jq.duration.text(""); + } + // Remove any bindings from the interface controls. + $.each(this.css.jq, function(fn, jq) { + // Check selector is valid before trying to execute method. + if(jq.length) { + jq.unbind(".jPlayer"); + } + }); + // Remove the click handlers for $.jPlayer.event.click + this.internal.poster.jq.unbind(".jPlayer"); + if(this.internal.video.jq) { + this.internal.video.jq.unbind(".jPlayer"); + } + // Remove the fullscreen event handlers + this._fullscreenRemoveEventListeners(); + // Remove key bindings + if(this === $.jPlayer.focus) { + $.jPlayer.focus = null; + } + // Destroy the HTML bridge. + if(this.options.emulateHtml) { + this._destroyHtmlBridge(); + } + this.element.removeData("jPlayer"); // Remove jPlayer data + this.element.unbind(".jPlayer"); // Remove all event handlers created by the jPlayer constructor + this.element.empty(); // Remove the inserted child elements + + delete this.instances[this.internal.instance]; // Clear the instance on the static instance object + }, + destroyRemoved: function() { // Destroy any instances that have gone away. + var self = this; + $.each(this.instances, function(i, element) { + if(self.element !== element) { // Do not destroy this instance. + if(!element.data("jPlayer")) { // Check that element is a real jPlayer. + element.jPlayer("destroy"); + delete self.instances[i]; + } + } + }); + }, + enable: function() { // Plan to implement + // options.disabled = false + }, + disable: function () { // Plan to implement + // options.disabled = true + }, + _testCanPlayType: function(elem) { + // IE9 on Win Server 2008 did not implement canPlayType(), but it has the property. + try { + elem.canPlayType(this.format.mp3.codec); // The type is irrelevant. + return true; + } catch(err) { + return false; + } + }, + _testPlaybackRate: function(type) { + // type: String 'audio' or 'video' + var el, rate = 0.5; + type = typeof type === 'string' ? type : 'audio'; + el = document.createElement(type); + // Wrapping in a try/catch, just in case older HTML5 browsers throw and error. + try { + if('playbackRate' in el) { + el.playbackRate = rate; + return el.playbackRate === rate; + } else { + return false; + } + } catch(err) { + return false; + } + }, + _uaBlocklist: function(list) { + // list : object with properties that are all regular expressions. Property names are irrelevant. + // Returns true if the user agent is matched in list. + var ua = navigator.userAgent.toLowerCase(), + block = false; + + $.each(list, function(p, re) { + if(re && re.test(ua)) { + block = true; + return false; // exit $.each. + } + }); + return block; + }, + _restrictNativeVideoControls: function() { + // Fallback to noFullWindow when nativeVideoControls is true and audio media is being used. Affects when both media types are used. + if(this.require.audio) { + if(this.status.nativeVideoControls) { + this.status.nativeVideoControls = false; + this.status.noFullWindow = true; + } + } + }, + _updateNativeVideoControls: function() { + if(this.html.video.available && this.html.used) { + // Turn the HTML Video controls on/off + this.htmlElement.video.controls = this.status.nativeVideoControls; + // Show/hide the jPlayer GUI. + this._updateAutohide(); + // For when option changed. The poster image is not updated, as it is dealt with in setMedia(). Acceptable degradation since seriously doubt these options will change on the fly. Can again review later. + if(this.status.nativeVideoControls && this.require.video) { + this.internal.poster.jq.hide(); + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } else if(this.status.waitForPlay && this.status.video) { + this.internal.poster.jq.show(); + this.internal.video.jq.css({'width': '0px', 'height': '0px'}); + } + } + }, + _addHtmlEventListeners: function(mediaElement, entity) { + var self = this; + mediaElement.preload = this.options.preload; + mediaElement.muted = this.options.muted; + mediaElement.volume = this.options.volume; + + if(this.status.playbackRateEnabled) { + mediaElement.defaultPlaybackRate = this.options.defaultPlaybackRate; + mediaElement.playbackRate = this.options.playbackRate; + } + + // Create the event listeners + // Only want the active entity to affect jPlayer and bubble events. + // Using entity.gate so that object is referenced and gate property always current + + mediaElement.addEventListener("progress", function() { + if(entity.gate) { + if(self.internal.cmdsIgnored && this.readyState > 0) { // Detect iOS executed the command + self.internal.cmdsIgnored = false; + } + self._getHtmlStatus(mediaElement); + self._updateInterface(); + self._trigger($.jPlayer.event.progress); + } + }, false); + mediaElement.addEventListener("loadeddata", function() { + if(entity.gate) { + self.androidFix.setMedia = false; // Disable the fix after the first progress event. + if(self.androidFix.play) { // Play Android audio - performing the fix. + self.androidFix.play = false; + self.play(self.androidFix.time); + } + if(self.androidFix.pause) { // Pause Android audio at time - performing the fix. + self.androidFix.pause = false; + self.pause(self.androidFix.time); + } + self._trigger($.jPlayer.event.loadeddata); + } + }, false); + mediaElement.addEventListener("timeupdate", function() { + if(entity.gate) { + self._getHtmlStatus(mediaElement); + self._updateInterface(); + self._trigger($.jPlayer.event.timeupdate); + } + }, false); + mediaElement.addEventListener("durationchange", function() { + if(entity.gate) { + self._getHtmlStatus(mediaElement); + self._updateInterface(); + self._trigger($.jPlayer.event.durationchange); + } + }, false); + mediaElement.addEventListener("play", function() { + if(entity.gate) { + self._updateButtons(true); + self._html_checkWaitForPlay(); // So the native controls update this variable and puts the hidden interface in the correct state. Affects toggling native controls. + self._trigger($.jPlayer.event.play); + } + }, false); + mediaElement.addEventListener("playing", function() { + if(entity.gate) { + self._updateButtons(true); + self._seeked(); + self._trigger($.jPlayer.event.playing); + } + }, false); + mediaElement.addEventListener("pause", function() { + if(entity.gate) { + self._updateButtons(false); + self._trigger($.jPlayer.event.pause); + } + }, false); + mediaElement.addEventListener("waiting", function() { + if(entity.gate) { + self._seeking(); + self._trigger($.jPlayer.event.waiting); + } + }, false); + mediaElement.addEventListener("seeking", function() { + if(entity.gate) { + self._seeking(); + self._trigger($.jPlayer.event.seeking); + } + }, false); + mediaElement.addEventListener("seeked", function() { + if(entity.gate) { + self._seeked(); + self._trigger($.jPlayer.event.seeked); + } + }, false); + mediaElement.addEventListener("volumechange", function() { + if(entity.gate) { + // Read the values back from the element as the Blackberry PlayBook shares the volume with the physical buttons master volume control. + // However, when tested 6th July 2011, those buttons do not generate an event. The physical play/pause button does though. + self.options.volume = mediaElement.volume; + self.options.muted = mediaElement.muted; + self._updateMute(); + self._updateVolume(); + self._trigger($.jPlayer.event.volumechange); + } + }, false); + mediaElement.addEventListener("ratechange", function() { + if(entity.gate) { + self.options.defaultPlaybackRate = mediaElement.defaultPlaybackRate; + self.options.playbackRate = mediaElement.playbackRate; + self._updatePlaybackRate(); + self._trigger($.jPlayer.event.ratechange); + } + }, false); + mediaElement.addEventListener("suspend", function() { // Seems to be the only way of capturing that the iOS4 browser did not actually play the media from the page code. ie., It needs a user gesture. + if(entity.gate) { + self._seeked(); + self._trigger($.jPlayer.event.suspend); + } + }, false); + mediaElement.addEventListener("ended", function() { + if(entity.gate) { + // Order of the next few commands are important. Change the time and then pause. + // Solves a bug in Firefox, where issuing pause 1st causes the media to play from the start. ie., The pause is ignored. + if(!$.jPlayer.browser.webkit) { // Chrome crashes if you do this in conjunction with a setMedia command in an ended event handler. ie., The playlist demo. + self.htmlElement.media.currentTime = 0; // Safari does not care about this command. ie., It works with or without this line. (Both Safari and Chrome are Webkit.) + } + self.htmlElement.media.pause(); // Pause otherwise a click on the progress bar will play from that point, when it shouldn't, since it stopped playback. + self._updateButtons(false); + self._getHtmlStatus(mediaElement, true); // With override true. Otherwise Chrome leaves progress at full. + self._updateInterface(); + self._trigger($.jPlayer.event.ended); + } + }, false); + mediaElement.addEventListener("error", function() { + if(entity.gate) { + self._updateButtons(false); + self._seeked(); + if(self.status.srcSet) { // Deals with case of clearMedia() causing an error event. + clearTimeout(self.internal.htmlDlyCmdId); // Clears any delayed commands used in the HTML solution. + self.status.waitForLoad = true; // Allows the load operation to try again. + self.status.waitForPlay = true; // Reset since a play was captured. + if(self.status.video && !self.status.nativeVideoControls) { + self.internal.video.jq.css({'width':'0px', 'height':'0px'}); + } + if(self._validString(self.status.media.poster) && !self.status.nativeVideoControls) { + self.internal.poster.jq.show(); + } + if(self.css.jq.videoPlay.length) { + self.css.jq.videoPlay.show(); + } + self._error( { + type: $.jPlayer.error.URL, + context: self.status.src, // this.src shows absolute urls. Want context to show the url given. + message: $.jPlayer.errorMsg.URL, + hint: $.jPlayer.errorHint.URL + }); + } + } + }, false); + // Create all the other event listeners that bubble up to a jPlayer event from html, without being used by jPlayer. + $.each($.jPlayer.htmlEvent, function(i, eventType) { + mediaElement.addEventListener(this, function() { + if(entity.gate) { + self._trigger($.jPlayer.event[eventType]); + } + }, false); + }); + }, + _addAuroraEventListeners : function(player, entity) { + var self = this; + //player.preload = this.options.preload; + //player.muted = this.options.muted; + player.volume = this.options.volume * 100; + + // Create the event listeners + // Only want the active entity to affect jPlayer and bubble events. + // Using entity.gate so that object is referenced and gate property always current + + player.on("progress", function() { + if(entity.gate) { + if(self.internal.cmdsIgnored && this.readyState > 0) { // Detect iOS executed the command + self.internal.cmdsIgnored = false; + } + self._getAuroraStatus(player); + self._updateInterface(); + self._trigger($.jPlayer.event.progress); + // Progress with song duration, we estimate timeupdate need to be triggered too. + if (player.duration > 0) { + self._trigger($.jPlayer.event.timeupdate); + } + } + }, false); + player.on("ready", function() { + if(entity.gate) { + self._trigger($.jPlayer.event.loadeddata); + } + }, false); + player.on("duration", function() { + if(entity.gate) { + self._getAuroraStatus(player); + self._updateInterface(); + self._trigger($.jPlayer.event.durationchange); + } + }, false); + player.on("end", function() { + if(entity.gate) { + // Order of the next few commands are important. Change the time and then pause. + self._updateButtons(false); + self._getAuroraStatus(player, true); + self._updateInterface(); + self._trigger($.jPlayer.event.ended); + } + }, false); + player.on("error", function() { + if(entity.gate) { + self._updateButtons(false); + self._seeked(); + if(self.status.srcSet) { // Deals with case of clearMedia() causing an error event. + self.status.waitForLoad = true; // Allows the load operation to try again. + self.status.waitForPlay = true; // Reset since a play was captured. + if(self.status.video && !self.status.nativeVideoControls) { + self.internal.video.jq.css({'width':'0px', 'height':'0px'}); + } + if(self._validString(self.status.media.poster) && !self.status.nativeVideoControls) { + self.internal.poster.jq.show(); + } + if(self.css.jq.videoPlay.length) { + self.css.jq.videoPlay.show(); + } + self._error( { + type: $.jPlayer.error.URL, + context: self.status.src, // this.src shows absolute urls. Want context to show the url given. + message: $.jPlayer.errorMsg.URL, + hint: $.jPlayer.errorHint.URL + }); + } + } + }, false); + }, + _getHtmlStatus: function(media, override) { + var ct = 0, cpa = 0, sp = 0, cpr = 0; + + // Fixes the duration bug in iOS, where the durationchange event occurs when media.duration is not always correct. + // Fixes the initial duration bug in BB OS7, where the media.duration is infinity and displays as NaN:NaN due to Date() using inifity. + if(isFinite(media.duration)) { + this.status.duration = media.duration; + } + + ct = media.currentTime; + cpa = (this.status.duration > 0) ? 100 * ct / this.status.duration : 0; + if((typeof media.seekable === "object") && (media.seekable.length > 0)) { + sp = (this.status.duration > 0) ? 100 * media.seekable.end(media.seekable.length-1) / this.status.duration : 100; + cpr = (this.status.duration > 0) ? 100 * media.currentTime / media.seekable.end(media.seekable.length-1) : 0; // Duration conditional for iOS duration bug. ie., seekable.end is a NaN in that case. + } else { + sp = 100; + cpr = cpa; + } + + if(override) { + ct = 0; + cpr = 0; + cpa = 0; + } + + this.status.seekPercent = sp; + this.status.currentPercentRelative = cpr; + this.status.currentPercentAbsolute = cpa; + this.status.currentTime = ct; + + this.status.remaining = this.status.duration - this.status.currentTime; + + this.status.videoWidth = media.videoWidth; + this.status.videoHeight = media.videoHeight; + + this.status.readyState = media.readyState; + this.status.networkState = media.networkState; + this.status.playbackRate = media.playbackRate; + this.status.ended = media.ended; + }, + _getAuroraStatus: function(player, override) { + var ct = 0, cpa = 0, sp = 0, cpr = 0; + + this.status.duration = player.duration / 1000; + + ct = player.currentTime / 1000; + cpa = (this.status.duration > 0) ? 100 * ct / this.status.duration : 0; + if(player.buffered > 0) { + sp = (this.status.duration > 0) ? (player.buffered * this.status.duration) / this.status.duration : 100; + cpr = (this.status.duration > 0) ? ct / (player.buffered * this.status.duration) : 0; + } else { + sp = 100; + cpr = cpa; + } + + if(override) { + ct = 0; + cpr = 0; + cpa = 0; + } + + this.status.seekPercent = sp; + this.status.currentPercentRelative = cpr; + this.status.currentPercentAbsolute = cpa; + this.status.currentTime = ct; + + this.status.remaining = this.status.duration - this.status.currentTime; + + this.status.readyState = 4; // status.readyState; + this.status.networkState = 0; // status.networkState; + this.status.playbackRate = 1; // status.playbackRate; + this.status.ended = false; // status.ended; + }, + _resetStatus: function() { + this.status = $.extend({}, this.status, $.jPlayer.prototype.status); // Maintains the status properties that persist through a reset. + }, + _trigger: function(eventType, error, warning) { // eventType always valid as called using $.jPlayer.event.eventType + var event = $.Event(eventType); + event.jPlayer = {}; + event.jPlayer.version = $.extend({}, this.version); + event.jPlayer.options = $.extend(true, {}, this.options); // Deep copy + event.jPlayer.status = $.extend(true, {}, this.status); // Deep copy + event.jPlayer.html = $.extend(true, {}, this.html); // Deep copy + event.jPlayer.aurora = $.extend(true, {}, this.aurora); // Deep copy + event.jPlayer.flash = $.extend(true, {}, this.flash); // Deep copy + if(error) { + event.jPlayer.error = $.extend({}, error); + } + if(warning) { + event.jPlayer.warning = $.extend({}, warning); + } + this.element.trigger(event); + }, + jPlayerFlashEvent: function(eventType, status) { // Called from Flash + if(eventType === $.jPlayer.event.ready) { + if(!this.internal.ready) { + this.internal.ready = true; + this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); // Once Flash generates the ready event, minimise to zero as it is not affected by wmode anymore. + + this.version.flash = status.version; + if(this.version.needFlash !== this.version.flash) { + this._error( { + type: $.jPlayer.error.VERSION, + context: this.version.flash, + message: $.jPlayer.errorMsg.VERSION + this.version.flash, + hint: $.jPlayer.errorHint.VERSION + }); + } + this._trigger($.jPlayer.event.repeat); // Trigger the repeat event so its handler can initialize itself with the loop option. + this._trigger(eventType); + } else { + // This condition occurs if the Flash is hidden and then shown again. + // Firefox also reloads the Flash if the CSS position changes. position:fixed is used for full screen. + + // Only do this if the Flash is the solution being used at the moment. Affects Media players where both solution may be being used. + if(this.flash.gate) { + + // Send the current status to the Flash now that it is ready (available) again. + if(this.status.srcSet) { + + // Need to read original status before issuing the setMedia command. + var currentTime = this.status.currentTime, + paused = this.status.paused; + + this.setMedia(this.status.media); + this.volumeWorker(this.options.volume); + if(currentTime > 0) { + if(paused) { + this.pause(currentTime); + } else { + this.play(currentTime); + } + } + } + this._trigger($.jPlayer.event.flashreset); + } + } + } + if(this.flash.gate) { + switch(eventType) { + case $.jPlayer.event.progress: + this._getFlashStatus(status); + this._updateInterface(); + this._trigger(eventType); + break; + case $.jPlayer.event.timeupdate: + this._getFlashStatus(status); + this._updateInterface(); + this._trigger(eventType); + break; + case $.jPlayer.event.play: + this._seeked(); + this._updateButtons(true); + this._trigger(eventType); + break; + case $.jPlayer.event.pause: + this._updateButtons(false); + this._trigger(eventType); + break; + case $.jPlayer.event.ended: + this._updateButtons(false); + this._trigger(eventType); + break; + case $.jPlayer.event.click: + this._trigger(eventType); // This could be dealt with by the default + break; + case $.jPlayer.event.error: + this.status.waitForLoad = true; // Allows the load operation to try again. + this.status.waitForPlay = true; // Reset since a play was captured. + if(this.status.video) { + this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); + } + if(this._validString(this.status.media.poster)) { + this.internal.poster.jq.show(); + } + if(this.css.jq.videoPlay.length && this.status.video) { + this.css.jq.videoPlay.show(); + } + if(this.status.video) { // Set up for another try. Execute before error event. + this._flash_setVideo(this.status.media); + } else { + this._flash_setAudio(this.status.media); + } + this._updateButtons(false); + this._error( { + type: $.jPlayer.error.URL, + context:status.src, + message: $.jPlayer.errorMsg.URL, + hint: $.jPlayer.errorHint.URL + }); + break; + case $.jPlayer.event.seeking: + this._seeking(); + this._trigger(eventType); + break; + case $.jPlayer.event.seeked: + this._seeked(); + this._trigger(eventType); + break; + case $.jPlayer.event.ready: + // The ready event is handled outside the switch statement. + // Captured here otherwise 2 ready events would be generated if the ready event handler used setMedia. + break; + default: + this._trigger(eventType); + } + } + return false; + }, + _getFlashStatus: function(status) { + this.status.seekPercent = status.seekPercent; + this.status.currentPercentRelative = status.currentPercentRelative; + this.status.currentPercentAbsolute = status.currentPercentAbsolute; + this.status.currentTime = status.currentTime; + this.status.duration = status.duration; + this.status.remaining = status.duration - status.currentTime; + + this.status.videoWidth = status.videoWidth; + this.status.videoHeight = status.videoHeight; + + // The Flash does not generate this information in this release + this.status.readyState = 4; // status.readyState; + this.status.networkState = 0; // status.networkState; + this.status.playbackRate = 1; // status.playbackRate; + this.status.ended = false; // status.ended; + }, + _updateButtons: function(playing) { + if(playing === undefined) { + playing = !this.status.paused; + } else { + this.status.paused = !playing; + } + // Apply the state classes. (For the useStateClassSkin:true option) + if(playing) { + this.addStateClass('playing'); + } else { + this.removeStateClass('playing'); + } + if(!this.status.noFullWindow && this.options.fullWindow) { + this.addStateClass('fullScreen'); + } else { + this.removeStateClass('fullScreen'); + } + if(this.options.loop) { + this.addStateClass('looped'); + } else { + this.removeStateClass('looped'); + } + // Toggle the GUI element pairs. (For the useStateClassSkin:false option) + if(this.css.jq.play.length && this.css.jq.pause.length) { + if(playing) { + this.css.jq.play.hide(); + this.css.jq.pause.show(); + } else { + this.css.jq.play.show(); + this.css.jq.pause.hide(); + } + } + if(this.css.jq.restoreScreen.length && this.css.jq.fullScreen.length) { + if(this.status.noFullWindow) { + this.css.jq.fullScreen.hide(); + this.css.jq.restoreScreen.hide(); + } else if(this.options.fullWindow) { + this.css.jq.fullScreen.hide(); + this.css.jq.restoreScreen.show(); + } else { + this.css.jq.fullScreen.show(); + this.css.jq.restoreScreen.hide(); + } + } + if(this.css.jq.repeat.length && this.css.jq.repeatOff.length) { + if(this.options.loop) { + this.css.jq.repeat.hide(); + this.css.jq.repeatOff.show(); + } else { + this.css.jq.repeat.show(); + this.css.jq.repeatOff.hide(); + } + } + }, + _updateInterface: function() { + if(this.css.jq.seekBar.length) { + this.css.jq.seekBar.width(this.status.seekPercent+"%"); + } + if(this.css.jq.playBar.length) { + if(this.options.smoothPlayBar) { + this.css.jq.playBar.stop().animate({ + width: this.status.currentPercentAbsolute+"%" + }, 250, "linear"); + } else { + this.css.jq.playBar.width(this.status.currentPercentRelative+"%"); + } + } + var currentTimeText = ''; + if(this.css.jq.currentTime.length) { + currentTimeText = this._convertTime(this.status.currentTime); + if(currentTimeText !== this.css.jq.currentTime.text()) { + this.css.jq.currentTime.text(this._convertTime(this.status.currentTime)); + } + } + var durationText = '', + duration = this.status.duration, + remaining = this.status.remaining; + if(this.css.jq.duration.length) { + if(typeof this.status.media.duration === 'string') { + durationText = this.status.media.duration; + } else { + if(typeof this.status.media.duration === 'number') { + duration = this.status.media.duration; + remaining = duration - this.status.currentTime; + } + if(this.options.remainingDuration) { + durationText = (remaining > 0 ? '-' : '') + this._convertTime(remaining); + } else { + durationText = this._convertTime(duration); + } + } + if(durationText !== this.css.jq.duration.text()) { + this.css.jq.duration.text(durationText); + } + } + }, + _convertTime: ConvertTime.prototype.time, + _seeking: function() { + if(this.css.jq.seekBar.length) { + this.css.jq.seekBar.addClass("jp-seeking-bg"); + } + this.addStateClass('seeking'); + }, + _seeked: function() { + if(this.css.jq.seekBar.length) { + this.css.jq.seekBar.removeClass("jp-seeking-bg"); + } + this.removeStateClass('seeking'); + }, + _resetGate: function() { + this.html.audio.gate = false; + this.html.video.gate = false; + this.aurora.gate = false; + this.flash.gate = false; + }, + _resetActive: function() { + this.html.active = false; + this.aurora.active = false; + this.flash.active = false; + }, + _escapeHtml: function(s) { + return s.split('&').join('&').split('<').join('<').split('>').join('>').split('"').join('"'); + }, + _qualifyURL: function(url) { + var el = document.createElement('div'); + el.innerHTML= 'x'; + return el.firstChild.href; + }, + _absoluteMediaUrls: function(media) { + var self = this; + $.each(media, function(type, url) { + if(url && self.format[type] && url.substr(0, 5) !== "data:") { + media[type] = self._qualifyURL(url); + } + }); + return media; + }, + addStateClass: function(state) { + if(this.ancestorJq.length) { + this.ancestorJq.addClass(this.options.stateClass[state]); + } + }, + removeStateClass: function(state) { + if(this.ancestorJq.length) { + this.ancestorJq.removeClass(this.options.stateClass[state]); + } + }, + setMedia: function(media) { + + /* media[format] = String: URL of format. Must contain all of the supplied option's video or audio formats. + * media.poster = String: Video poster URL. + * media.track = Array: Of objects defining the track element: kind, src, srclang, label, def. + * media.stream = Boolean: * NOT IMPLEMENTED * Designating actual media streams. ie., "false/undefined" for files. Plan to refresh the flash every so often. + */ + + var self = this, + supported = false, + posterChanged = this.status.media.poster !== media.poster; // Compare before reset. Important for OSX Safari as this.htmlElement.poster.src is absolute, even if original poster URL was relative. + + this._resetMedia(); + this._resetGate(); + this._resetActive(); + + // Clear the Android Fix. + this.androidFix.setMedia = false; + this.androidFix.play = false; + this.androidFix.pause = false; + + // Convert all media URLs to absolute URLs. + media = this._absoluteMediaUrls(media); + + $.each(this.formats, function(formatPriority, format) { + var isVideo = self.format[format].media === 'video'; + $.each(self.solutions, function(solutionPriority, solution) { + if(self[solution].support[format] && self._validString(media[format])) { // Format supported in solution and url given for format. + var isHtml = solution === 'html'; + var isAurora = solution === 'aurora'; + + if(isVideo) { + if(isHtml) { + self.html.video.gate = true; + self._html_setVideo(media); + self.html.active = true; + } else { + self.flash.gate = true; + self._flash_setVideo(media); + self.flash.active = true; + } + if(self.css.jq.videoPlay.length) { + self.css.jq.videoPlay.show(); + } + self.status.video = true; + } else { + if(isHtml) { + self.html.audio.gate = true; + self._html_setAudio(media); + self.html.active = true; + + // Setup the Android Fix - Only for HTML audio. + if($.jPlayer.platform.android) { + self.androidFix.setMedia = true; + } + } else if(isAurora) { + self.aurora.gate = true; + self._aurora_setAudio(media); + self.aurora.active = true; + } else { + self.flash.gate = true; + self._flash_setAudio(media); + self.flash.active = true; + } + if(self.css.jq.videoPlay.length) { + self.css.jq.videoPlay.hide(); + } + self.status.video = false; + } + + supported = true; + return false; // Exit $.each + } + }); + if(supported) { + return false; // Exit $.each + } + }); + + if(supported) { + if(!(this.status.nativeVideoControls && this.html.video.gate)) { + // Set poster IMG if native video controls are not being used + // Note: With IE the IMG onload event occurs immediately when cached. + // Note: Poster hidden by default in _resetMedia() + if(this._validString(media.poster)) { + if(posterChanged) { // Since some browsers do not generate img onload event. + this.htmlElement.poster.src = media.poster; + } else { + this.internal.poster.jq.show(); + } + } + } + if(typeof media.title === 'string') { + if(this.css.jq.title.length) { + this.css.jq.title.html(media.title); + } + if(this.htmlElement.audio) { + this.htmlElement.audio.setAttribute('title', media.title); + } + if(this.htmlElement.video) { + this.htmlElement.video.setAttribute('title', media.title); + } + } + this.status.srcSet = true; + this.status.media = $.extend({}, media); + this._updateButtons(false); + this._updateInterface(); + this._trigger($.jPlayer.event.setmedia); + } else { // jPlayer cannot support any formats provided in this browser + // Send an error event + this._error( { + type: $.jPlayer.error.NO_SUPPORT, + context: "{supplied:'" + this.options.supplied + "'}", + message: $.jPlayer.errorMsg.NO_SUPPORT, + hint: $.jPlayer.errorHint.NO_SUPPORT + }); + } + }, + _resetMedia: function() { + this._resetStatus(); + this._updateButtons(false); + this._updateInterface(); + this._seeked(); + this.internal.poster.jq.hide(); + + clearTimeout(this.internal.htmlDlyCmdId); + + if(this.html.active) { + this._html_resetMedia(); + } else if(this.aurora.active) { + this._aurora_resetMedia(); + } else if(this.flash.active) { + this._flash_resetMedia(); + } + }, + clearMedia: function() { + this._resetMedia(); + + if(this.html.active) { + this._html_clearMedia(); + } else if(this.aurora.active) { + this._aurora_clearMedia(); + } else if(this.flash.active) { + this._flash_clearMedia(); + } + + this._resetGate(); + this._resetActive(); + }, + load: function() { + if(this.status.srcSet) { + if(this.html.active) { + this._html_load(); + } else if(this.aurora.active) { + this._aurora_load(); + } else if(this.flash.active) { + this._flash_load(); + } + } else { + this._urlNotSetError("load"); + } + }, + focus: function() { + if(this.options.keyEnabled) { + $.jPlayer.focus = this; + } + }, + play: function(time) { + var guiAction = typeof time === "object"; // Flags GUI click events so we know this was not a direct command, but an action taken by the user on the GUI. + if(guiAction && this.options.useStateClassSkin && !this.status.paused) { + this.pause(time); // The time would be the click event, but passing it over so info is not lost. + } else { + time = (typeof time === "number") ? time : NaN; // Remove jQuery event from click handler + if(this.status.srcSet) { + this.focus(); + if(this.html.active) { + this._html_play(time); + } else if(this.aurora.active) { + this._aurora_play(time); + } else if(this.flash.active) { + this._flash_play(time); + } + } else { + this._urlNotSetError("play"); + } + } + }, + videoPlay: function() { // Handles clicks on the play button over the video poster + this.play(); + }, + pause: function(time) { + time = (typeof time === "number") ? time : NaN; // Remove jQuery event from click handler + if(this.status.srcSet) { + if(this.html.active) { + this._html_pause(time); + } else if(this.aurora.active) { + this._aurora_pause(time); + } else if(this.flash.active) { + this._flash_pause(time); + } + } else { + this._urlNotSetError("pause"); + } + }, + tellOthers: function(command, conditions) { + var self = this, + hasConditions = typeof conditions === 'function', + args = Array.prototype.slice.call(arguments); // Convert arguments to an Array. + + if(typeof command !== 'string') { // Ignore, since no command. + return; // Return undefined to maintain chaining. + } + if(hasConditions) { + args.splice(1, 1); // Remove the conditions from the arguments + } + + $.jPlayer.prototype.destroyRemoved(); + $.each(this.instances, function() { + // Remember that "this" is the instance's "element" in the $.each() loop. + if(self.element !== this) { // Do not tell my instance. + if(!hasConditions || conditions.call(this.data("jPlayer"), self)) { + this.jPlayer.apply(this, args); + } + } + }); + }, + pauseOthers: function(time) { + this.tellOthers("pause", function() { + // In the conditions function, the "this" context is the other instance's jPlayer object. + return this.status.srcSet; + }, time); + }, + stop: function() { + if(this.status.srcSet) { + if(this.html.active) { + this._html_pause(0); + } else if(this.aurora.active) { + this._aurora_pause(0); + } else if(this.flash.active) { + this._flash_pause(0); + } + } else { + this._urlNotSetError("stop"); + } + }, + playHead: function(p) { + p = this._limitValue(p, 0, 100); + if(this.status.srcSet) { + if(this.html.active) { + this._html_playHead(p); + } else if(this.aurora.active) { + this._aurora_playHead(p); + } else if(this.flash.active) { + this._flash_playHead(p); + } + } else { + this._urlNotSetError("playHead"); + } + }, + _muted: function(muted) { + this.mutedWorker(muted); + if(this.options.globalVolume) { + this.tellOthers("mutedWorker", function() { + // Check the other instance has global volume enabled. + return this.options.globalVolume; + }, muted); + } + }, + mutedWorker: function(muted) { + this.options.muted = muted; + if(this.html.used) { + this._html_setProperty('muted', muted); + } + if(this.aurora.used) { + this._aurora_mute(muted); + } + if(this.flash.used) { + this._flash_mute(muted); + } + + // The HTML solution generates this event from the media element itself. + if(!this.html.video.gate && !this.html.audio.gate) { + this._updateMute(muted); + this._updateVolume(this.options.volume); + this._trigger($.jPlayer.event.volumechange); + } + }, + mute: function(mute) { // mute is either: undefined (true), an event object (true) or a boolean (muted). + var guiAction = typeof mute === "object"; // Flags GUI click events so we know this was not a direct command, but an action taken by the user on the GUI. + if(guiAction && this.options.useStateClassSkin && this.options.muted) { + this._muted(false); + } else { + mute = mute === undefined ? true : !!mute; + this._muted(mute); + } + }, + unmute: function(unmute) { // unmute is either: undefined (true), an event object (true) or a boolean (!muted). + unmute = unmute === undefined ? true : !!unmute; + this._muted(!unmute); + }, + _updateMute: function(mute) { + if(mute === undefined) { + mute = this.options.muted; + } + if(mute) { + this.addStateClass('muted'); + } else { + this.removeStateClass('muted'); + } + if(this.css.jq.mute.length && this.css.jq.unmute.length) { + if(this.status.noVolume) { + this.css.jq.mute.hide(); + this.css.jq.unmute.hide(); + } else if(mute) { + this.css.jq.mute.hide(); + this.css.jq.unmute.show(); + } else { + this.css.jq.mute.show(); + this.css.jq.unmute.hide(); + } + } + }, + volume: function(v) { + this.volumeWorker(v); + if(this.options.globalVolume) { + this.tellOthers("volumeWorker", function() { + // Check the other instance has global volume enabled. + return this.options.globalVolume; + }, v); + } + }, + volumeWorker: function(v) { + v = this._limitValue(v, 0, 1); + this.options.volume = v; + + if(this.html.used) { + this._html_setProperty('volume', v); + } + if(this.aurora.used) { + this._aurora_volume(v); + } + if(this.flash.used) { + this._flash_volume(v); + } + + // The HTML solution generates this event from the media element itself. + if(!this.html.video.gate && !this.html.audio.gate) { + this._updateVolume(v); + this._trigger($.jPlayer.event.volumechange); + } + }, + volumeBar: function(e) { // Handles clicks on the volumeBar + if(this.css.jq.volumeBar.length) { + // Using $(e.currentTarget) to enable multiple volume bars + var $bar = $(e.currentTarget), + offset = $bar.offset(), + x = e.pageX - offset.left, + w = $bar.width(), + y = $bar.height() - e.pageY + offset.top, + h = $bar.height(); + if(this.options.verticalVolume) { + this.volume(y/h); + } else { + this.volume(x/w); + } + } + if(this.options.muted) { + this._muted(false); + } + }, + _updateVolume: function(v) { + if(v === undefined) { + v = this.options.volume; + } + v = this.options.muted ? 0 : v; + + if(this.status.noVolume) { + this.addStateClass('noVolume'); + if(this.css.jq.volumeBar.length) { + this.css.jq.volumeBar.hide(); + } + if(this.css.jq.volumeBarValue.length) { + this.css.jq.volumeBarValue.hide(); + } + if(this.css.jq.volumeMax.length) { + this.css.jq.volumeMax.hide(); + } + } else { + this.removeStateClass('noVolume'); + if(this.css.jq.volumeBar.length) { + this.css.jq.volumeBar.show(); + } + if(this.css.jq.volumeBarValue.length) { + this.css.jq.volumeBarValue.show(); + this.css.jq.volumeBarValue[this.options.verticalVolume ? "height" : "width"]((v*100)+"%"); + } + if(this.css.jq.volumeMax.length) { + this.css.jq.volumeMax.show(); + } + } + }, + volumeMax: function() { // Handles clicks on the volume max + this.volume(1); + if(this.options.muted) { + this._muted(false); + } + }, + _cssSelectorAncestor: function(ancestor) { + var self = this; + this.options.cssSelectorAncestor = ancestor; + this._removeUiClass(); + this.ancestorJq = ancestor ? $(ancestor) : []; // Would use $() instead of [], but it is only 1.4+ + if(ancestor && this.ancestorJq.length !== 1) { // So empty strings do not generate the warning. + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_COUNT, + context: ancestor, + message: $.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.ancestorJq.length + " found for cssSelectorAncestor.", + hint: $.jPlayer.warningHint.CSS_SELECTOR_COUNT + }); + } + this._addUiClass(); + $.each(this.options.cssSelector, function(fn, cssSel) { + self._cssSelector(fn, cssSel); + }); + + // Set the GUI to the current state. + this._updateInterface(); + this._updateButtons(); + this._updateAutohide(); + this._updateVolume(); + this._updateMute(); + }, + _cssSelector: function(fn, cssSel) { + var self = this; + if(typeof cssSel === 'string') { + if($.jPlayer.prototype.options.cssSelector[fn]) { + if(this.css.jq[fn] && this.css.jq[fn].length) { + this.css.jq[fn].unbind(".jPlayer"); + } + this.options.cssSelector[fn] = cssSel; + this.css.cs[fn] = this.options.cssSelectorAncestor + " " + cssSel; + + if(cssSel) { // Checks for empty string + this.css.jq[fn] = $(this.css.cs[fn]); + } else { + this.css.jq[fn] = []; // To comply with the css.jq[fn].length check before its use. As of jQuery 1.4 could have used $() for an empty set. + } + + if(this.css.jq[fn].length && this[fn]) { + var handler = function(e) { + e.preventDefault(); + self[fn](e); + if(self.options.autoBlur) { + $(this).blur(); + } else { + $(this).focus(); // Force focus for ARIA. + } + }; + this.css.jq[fn].bind("click.jPlayer", handler); // Using jPlayer namespace + } + + if(cssSel && this.css.jq[fn].length !== 1) { // So empty strings do not generate the warning. ie., they just remove the old one. + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_COUNT, + context: this.css.cs[fn], + message: $.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.css.jq[fn].length + " found for " + fn + " method.", + hint: $.jPlayer.warningHint.CSS_SELECTOR_COUNT + }); + } + } else { + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_METHOD, + context: fn, + message: $.jPlayer.warningMsg.CSS_SELECTOR_METHOD, + hint: $.jPlayer.warningHint.CSS_SELECTOR_METHOD + }); + } + } else { + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_STRING, + context: cssSel, + message: $.jPlayer.warningMsg.CSS_SELECTOR_STRING, + hint: $.jPlayer.warningHint.CSS_SELECTOR_STRING + }); + } + }, + duration: function(e) { + if(this.options.toggleDuration) { + if(this.options.captureDuration) { + e.stopPropagation(); + } + this._setOption("remainingDuration", !this.options.remainingDuration); + } + }, + seekBar: function(e) { // Handles clicks on the seekBar + if(this.css.jq.seekBar.length) { + // Using $(e.currentTarget) to enable multiple seek bars + var $bar = $(e.currentTarget), + offset = $bar.offset(), + x = e.pageX - offset.left, + w = $bar.width(), + p = 100 * x / w; + this.playHead(p); + } + }, + playbackRate: function(pbr) { + this._setOption("playbackRate", pbr); + }, + playbackRateBar: function(e) { // Handles clicks on the playbackRateBar + if(this.css.jq.playbackRateBar.length) { + // Using $(e.currentTarget) to enable multiple playbackRate bars + var $bar = $(e.currentTarget), + offset = $bar.offset(), + x = e.pageX - offset.left, + w = $bar.width(), + y = $bar.height() - e.pageY + offset.top, + h = $bar.height(), + ratio, pbr; + if(this.options.verticalPlaybackRate) { + ratio = y/h; + } else { + ratio = x/w; + } + pbr = ratio * (this.options.maxPlaybackRate - this.options.minPlaybackRate) + this.options.minPlaybackRate; + this.playbackRate(pbr); + } + }, + _updatePlaybackRate: function() { + var pbr = this.options.playbackRate, + ratio = (pbr - this.options.minPlaybackRate) / (this.options.maxPlaybackRate - this.options.minPlaybackRate); + if(this.status.playbackRateEnabled) { + if(this.css.jq.playbackRateBar.length) { + this.css.jq.playbackRateBar.show(); + } + if(this.css.jq.playbackRateBarValue.length) { + this.css.jq.playbackRateBarValue.show(); + this.css.jq.playbackRateBarValue[this.options.verticalPlaybackRate ? "height" : "width"]((ratio*100)+"%"); + } + } else { + if(this.css.jq.playbackRateBar.length) { + this.css.jq.playbackRateBar.hide(); + } + if(this.css.jq.playbackRateBarValue.length) { + this.css.jq.playbackRateBarValue.hide(); + } + } + }, + repeat: function(event) { // Handle clicks on the repeat button + var guiAction = typeof event === "object"; // Flags GUI click events so we know this was not a direct command, but an action taken by the user on the GUI. + if(guiAction && this.options.useStateClassSkin && this.options.loop) { + this._loop(false); + } else { + this._loop(true); + } + }, + repeatOff: function() { // Handle clicks on the repeatOff button + this._loop(false); + }, + _loop: function(loop) { + if(this.options.loop !== loop) { + this.options.loop = loop; + this._updateButtons(); + this._trigger($.jPlayer.event.repeat); + } + }, + + // Options code adapted from ui.widget.js (1.8.7). Made changes so the key can use dot notation. To match previous getData solution in jPlayer 1. + option: function(key, value) { + var options = key; + + // Enables use: options(). Returns a copy of options object + if ( arguments.length === 0 ) { + return $.extend( true, {}, this.options ); + } + + if(typeof key === "string") { + var keys = key.split("."); + + // Enables use: options("someOption") Returns a copy of the option. Supports dot notation. + if(value === undefined) { + + var opt = $.extend(true, {}, this.options); + for(var i = 0; i < keys.length; i++) { + if(opt[keys[i]] !== undefined) { + opt = opt[keys[i]]; + } else { + this._warning( { + type: $.jPlayer.warning.OPTION_KEY, + context: key, + message: $.jPlayer.warningMsg.OPTION_KEY, + hint: $.jPlayer.warningHint.OPTION_KEY + }); + return undefined; + } + } + return opt; + } + + // Enables use: options("someOptionObject", someObject}). Creates: {someOptionObject:someObject} + // Enables use: options("someOption", someValue). Creates: {someOption:someValue} + // Enables use: options("someOptionObject.someOption", someValue). Creates: {someOptionObject:{someOption:someValue}} + + options = {}; + var opts = options; + + for(var j = 0; j < keys.length; j++) { + if(j < keys.length - 1) { + opts[keys[j]] = {}; + opts = opts[keys[j]]; + } else { + opts[keys[j]] = value; + } + } + } + + // Otherwise enables use: options(optionObject). Uses original object (the key) + + this._setOptions(options); + + return this; + }, + _setOptions: function(options) { + var self = this; + $.each(options, function(key, value) { // This supports the 2 level depth that the options of jPlayer has. Would review if we ever need more depth. + self._setOption(key, value); + }); + + return this; + }, + _setOption: function(key, value) { + var self = this; + + // The ability to set options is limited at this time. + + switch(key) { + case "volume" : + this.volume(value); + break; + case "muted" : + this._muted(value); + break; + case "globalVolume" : + this.options[key] = value; + break; + case "cssSelectorAncestor" : + this._cssSelectorAncestor(value); // Set and refresh all associations for the new ancestor. + break; + case "cssSelector" : + $.each(value, function(fn, cssSel) { + self._cssSelector(fn, cssSel); // NB: The option is set inside this function, after further validity checks. + }); + break; + case "playbackRate" : + this.options[key] = value = this._limitValue(value, this.options.minPlaybackRate, this.options.maxPlaybackRate); + if(this.html.used) { + this._html_setProperty('playbackRate', value); + } + this._updatePlaybackRate(); + break; + case "defaultPlaybackRate" : + this.options[key] = value = this._limitValue(value, this.options.minPlaybackRate, this.options.maxPlaybackRate); + if(this.html.used) { + this._html_setProperty('defaultPlaybackRate', value); + } + this._updatePlaybackRate(); + break; + case "minPlaybackRate" : + this.options[key] = value = this._limitValue(value, 0.1, this.options.maxPlaybackRate - 0.1); + this._updatePlaybackRate(); + break; + case "maxPlaybackRate" : + this.options[key] = value = this._limitValue(value, this.options.minPlaybackRate + 0.1, 16); + this._updatePlaybackRate(); + break; + case "fullScreen" : + if(this.options[key] !== value) { // if changed + var wkv = $.jPlayer.nativeFeatures.fullscreen.used.webkitVideo; + if(!wkv || wkv && !this.status.waitForPlay) { + if(!wkv) { // No sensible way to unset option on these devices. + this.options[key] = value; + } + if(value) { + this._requestFullscreen(); + } else { + this._exitFullscreen(); + } + if(!wkv) { + this._setOption("fullWindow", value); + } + } + } + break; + case "fullWindow" : + if(this.options[key] !== value) { // if changed + this._removeUiClass(); + this.options[key] = value; + this._refreshSize(); + } + break; + case "size" : + if(!this.options.fullWindow && this.options[key].cssClass !== value.cssClass) { + this._removeUiClass(); + } + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this._refreshSize(); + break; + case "sizeFull" : + if(this.options.fullWindow && this.options[key].cssClass !== value.cssClass) { + this._removeUiClass(); + } + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this._refreshSize(); + break; + case "autohide" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this._updateAutohide(); + break; + case "loop" : + this._loop(value); + break; + case "remainingDuration" : + this.options[key] = value; + this._updateInterface(); + break; + case "toggleDuration" : + this.options[key] = value; + break; + case "nativeVideoControls" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); + this._restrictNativeVideoControls(); + this._updateNativeVideoControls(); + break; + case "noFullWindow" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); // Need to check again as noFullWindow can depend on this flag and the restrict() can override it. + this.status.noFullWindow = this._uaBlocklist(this.options.noFullWindow); + this._restrictNativeVideoControls(); + this._updateButtons(); + break; + case "noVolume" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.status.noVolume = this._uaBlocklist(this.options.noVolume); + this._updateVolume(); + this._updateMute(); + break; + case "emulateHtml" : + if(this.options[key] !== value) { // To avoid multiple event handlers being created, if true already. + this.options[key] = value; + if(value) { + this._emulateHtmlBridge(); + } else { + this._destroyHtmlBridge(); + } + } + break; + case "timeFormat" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + break; + case "keyEnabled" : + this.options[key] = value; + if(!value && this === $.jPlayer.focus) { + $.jPlayer.focus = null; + } + break; + case "keyBindings" : + this.options[key] = $.extend(true, {}, this.options[key], value); // store a merged DEEP copy of it, incase not all properties changed. + break; + case "audioFullScreen" : + this.options[key] = value; + break; + case "autoBlur" : + this.options[key] = value; + break; + } + + return this; + }, + // End of: (Options code adapted from ui.widget.js) + + _refreshSize: function() { + this._setSize(); // update status and jPlayer element size + this._addUiClass(); // update the ui class + this._updateSize(); // update internal sizes + this._updateButtons(); + this._updateAutohide(); + this._trigger($.jPlayer.event.resize); + }, + _setSize: function() { + // Determine the current size from the options + if(this.options.fullWindow) { + this.status.width = this.options.sizeFull.width; + this.status.height = this.options.sizeFull.height; + this.status.cssClass = this.options.sizeFull.cssClass; + } else { + this.status.width = this.options.size.width; + this.status.height = this.options.size.height; + this.status.cssClass = this.options.size.cssClass; + } + + // Set the size of the jPlayer area. + this.element.css({'width': this.status.width, 'height': this.status.height}); + }, + _addUiClass: function() { + if(this.ancestorJq.length) { + this.ancestorJq.addClass(this.status.cssClass); + } + }, + _removeUiClass: function() { + if(this.ancestorJq.length) { + this.ancestorJq.removeClass(this.status.cssClass); + } + }, + _updateSize: function() { + // The poster uses show/hide so can simply resize it. + this.internal.poster.jq.css({'width': this.status.width, 'height': this.status.height}); + + // Video html or flash resized if necessary at this time, or if native video controls being used. + if(!this.status.waitForPlay && this.html.active && this.status.video || this.html.video.available && this.html.used && this.status.nativeVideoControls) { + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } + else if(!this.status.waitForPlay && this.flash.active && this.status.video) { + this.internal.flash.jq.css({'width': this.status.width, 'height': this.status.height}); + } + }, + _updateAutohide: function() { + var self = this, + event = "mousemove.jPlayer", + namespace = ".jPlayerAutohide", + eventType = event + namespace, + handler = function(event) { + var moved = false, + deltaX, deltaY; + if(typeof self.internal.mouse !== "undefined") { + //get the change from last position to this position + deltaX = self.internal.mouse.x - event.pageX; + deltaY = self.internal.mouse.y - event.pageY; + moved = (Math.floor(deltaX) > 0) || (Math.floor(deltaY)>0); + } else { + moved = true; + } + // store current position for next method execution + self.internal.mouse = { + x : event.pageX, + y : event.pageY + }; + // if mouse has been actually moved, do the gui fadeIn/fadeOut + if (moved) { + self.css.jq.gui.fadeIn(self.options.autohide.fadeIn, function() { + clearTimeout(self.internal.autohideId); + self.internal.autohideId = setTimeout( function() { + self.css.jq.gui.fadeOut(self.options.autohide.fadeOut); + }, self.options.autohide.hold); + }); + } + }; + + if(this.css.jq.gui.length) { + + // End animations first so that its callback is executed now. + // Otherwise an in progress fadeIn animation still has the callback to fadeOut again. + this.css.jq.gui.stop(true, true); + + // Removes the fadeOut operation from the fadeIn callback. + clearTimeout(this.internal.autohideId); + // undefine mouse + delete this.internal.mouse; + + this.element.unbind(namespace); + this.css.jq.gui.unbind(namespace); + + if(!this.status.nativeVideoControls) { + if(this.options.fullWindow && this.options.autohide.full || !this.options.fullWindow && this.options.autohide.restored) { + this.element.bind(eventType, handler); + this.css.jq.gui.bind(eventType, handler); + this.css.jq.gui.hide(); + } else { + this.css.jq.gui.show(); + } + } else { + this.css.jq.gui.hide(); + } + } + }, + fullScreen: function(event) { + var guiAction = typeof event === "object"; // Flags GUI click events so we know this was not a direct command, but an action taken by the user on the GUI. + if(guiAction && this.options.useStateClassSkin && this.options.fullScreen) { + this._setOption("fullScreen", false); + } else { + this._setOption("fullScreen", true); + } + }, + restoreScreen: function() { + this._setOption("fullScreen", false); + }, + _fullscreenAddEventListeners: function() { + var self = this, + fs = $.jPlayer.nativeFeatures.fullscreen; + + if(fs.api.fullscreenEnabled) { + if(fs.event.fullscreenchange) { + // Create the event handler function and store it for removal. + if(typeof this.internal.fullscreenchangeHandler !== 'function') { + this.internal.fullscreenchangeHandler = function() { + self._fullscreenchange(); + }; + } + document.addEventListener(fs.event.fullscreenchange, this.internal.fullscreenchangeHandler, false); + } + // No point creating handler for fullscreenerror. + // Either logic avoids fullscreen occurring (w3c/moz), or their is no event on the browser (webkit). + } + }, + _fullscreenRemoveEventListeners: function() { + var fs = $.jPlayer.nativeFeatures.fullscreen; + if(this.internal.fullscreenchangeHandler) { + document.removeEventListener(fs.event.fullscreenchange, this.internal.fullscreenchangeHandler, false); + } + }, + _fullscreenchange: function() { + // If nothing is fullscreen, then we cannot be in fullscreen mode. + if(this.options.fullScreen && !$.jPlayer.nativeFeatures.fullscreen.api.fullscreenElement()) { + this._setOption("fullScreen", false); + } + }, + _requestFullscreen: function() { + // Either the container or the jPlayer div + var e = this.ancestorJq.length ? this.ancestorJq[0] : this.element[0], + fs = $.jPlayer.nativeFeatures.fullscreen; + + // This method needs the video element. For iOS and Android. + if(fs.used.webkitVideo) { + e = this.htmlElement.video; + } + + if(fs.api.fullscreenEnabled) { + fs.api.requestFullscreen(e); + } + }, + _exitFullscreen: function() { + + var fs = $.jPlayer.nativeFeatures.fullscreen, + e; + + // This method needs the video element. For iOS and Android. + if(fs.used.webkitVideo) { + e = this.htmlElement.video; + } + + if(fs.api.fullscreenEnabled) { + fs.api.exitFullscreen(e); + } + }, + _html_initMedia: function(media) { + // Remove any existing track elements + var $media = $(this.htmlElement.media).empty(); + + // Create any track elements given with the media, as an Array of track Objects. + $.each(media.track || [], function(i,v) { + var track = document.createElement('track'); + track.setAttribute("kind", v.kind ? v.kind : ""); + track.setAttribute("src", v.src ? v.src : ""); + track.setAttribute("srclang", v.srclang ? v.srclang : ""); + track.setAttribute("label", v.label ? v.label : ""); + if(v.def) { + track.setAttribute("default", v.def); + } + $media.append(track); + }); + + this.htmlElement.media.src = this.status.src; + + if(this.options.preload !== 'none') { + this._html_load(); // See function for comments + } + this._trigger($.jPlayer.event.timeupdate); // The flash generates this event for its solution. + }, + _html_setFormat: function(media) { + var self = this; + // Always finds a format due to checks in setMedia() + $.each(this.formats, function(priority, format) { + if(self.html.support[format] && media[format]) { + self.status.src = media[format]; + self.status.format[format] = true; + self.status.formatType = format; + return false; + } + }); + }, + _html_setAudio: function(media) { + this._html_setFormat(media); + this.htmlElement.media = this.htmlElement.audio; + this._html_initMedia(media); + }, + _html_setVideo: function(media) { + this._html_setFormat(media); + if(this.status.nativeVideoControls) { + this.htmlElement.video.poster = this._validString(media.poster) ? media.poster : ""; + } + this.htmlElement.media = this.htmlElement.video; + this._html_initMedia(media); + }, + _html_resetMedia: function() { + if(this.htmlElement.media) { + if(this.htmlElement.media.id === this.internal.video.id && !this.status.nativeVideoControls) { + this.internal.video.jq.css({'width':'0px', 'height':'0px'}); + } + this.htmlElement.media.pause(); + } + }, + _html_clearMedia: function() { + if(this.htmlElement.media) { + this.htmlElement.media.src = "about:blank"; + // The following load() is only required for Firefox 3.6 (PowerMacs). + // Recent HTMl5 browsers only require the src change. Due to changes in W3C spec and load() effect. + this.htmlElement.media.load(); // Stops an old, "in progress" download from continuing the download. Triggers the loadstart, error and emptied events, due to the empty src. Also an abort event if a download was in progress. + } + }, + _html_load: function() { + // This function remains to allow the early HTML5 browsers to work, such as Firefox 3.6 + // A change in the W3C spec for the media.load() command means that this is no longer necessary. + // This command should be removed and actually causes minor undesirable effects on some browsers. Such as loading the whole file and not only the metadata. + if(this.status.waitForLoad) { + this.status.waitForLoad = false; + this.htmlElement.media.load(); + } + clearTimeout(this.internal.htmlDlyCmdId); + }, + _html_play: function(time) { + var self = this, + media = this.htmlElement.media; + + this.androidFix.pause = false; // Cancel the pause fix. + + this._html_load(); // Loads if required and clears any delayed commands. + + // Setup the Android Fix. + if(this.androidFix.setMedia) { + this.androidFix.play = true; + this.androidFix.time = time; + + } else if(!isNaN(time)) { + + // Attempt to play it, since iOS has been ignoring commands + if(this.internal.cmdsIgnored) { + media.play(); + } + + try { + // !media.seekable is for old HTML5 browsers, like Firefox 3.6. + // Checking seekable.length is important for iOS6 to work with setMedia().play(time) + if(!media.seekable || typeof media.seekable === "object" && media.seekable.length > 0) { + media.currentTime = time; + media.play(); + } else { + throw 1; + } + } catch(err) { + this.internal.htmlDlyCmdId = setTimeout(function() { + self.play(time); + }, 250); + return; // Cancel execution and wait for the delayed command. + } + } else { + media.play(); + } + this._html_checkWaitForPlay(); + }, + _html_pause: function(time) { + var self = this, + media = this.htmlElement.media; + + this.androidFix.play = false; // Cancel the play fix. + + if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation. + this._html_load(); // Loads if required and clears any delayed commands. + } else { + clearTimeout(this.internal.htmlDlyCmdId); + } + + // Order of these commands is important for Safari (Win) and IE9. Pause then change currentTime. + media.pause(); + + // Setup the Android Fix. + if(this.androidFix.setMedia) { + this.androidFix.pause = true; + this.androidFix.time = time; + + } else if(!isNaN(time)) { + try { + if(!media.seekable || typeof media.seekable === "object" && media.seekable.length > 0) { + media.currentTime = time; + } else { + throw 1; + } + } catch(err) { + this.internal.htmlDlyCmdId = setTimeout(function() { + self.pause(time); + }, 250); + return; // Cancel execution and wait for the delayed command. + } + } + if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button. + this._html_checkWaitForPlay(); + } + }, + _html_playHead: function(percent) { + var self = this, + media = this.htmlElement.media; + + this._html_load(); // Loads if required and clears any delayed commands. + + // This playHead() method needs a refactor to apply the android fix. + + try { + if(typeof media.seekable === "object" && media.seekable.length > 0) { + media.currentTime = percent * media.seekable.end(media.seekable.length-1) / 100; + } else if(media.duration > 0 && !isNaN(media.duration)) { + media.currentTime = percent * media.duration / 100; + } else { + throw "e"; + } + } catch(err) { + this.internal.htmlDlyCmdId = setTimeout(function() { + self.playHead(percent); + }, 250); + return; // Cancel execution and wait for the delayed command. + } + if(!this.status.waitForLoad) { + this._html_checkWaitForPlay(); + } + }, + _html_checkWaitForPlay: function() { + if(this.status.waitForPlay) { + this.status.waitForPlay = false; + if(this.css.jq.videoPlay.length) { + this.css.jq.videoPlay.hide(); + } + if(this.status.video) { + this.internal.poster.jq.hide(); + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } + } + }, + _html_setProperty: function(property, value) { + if(this.html.audio.available) { + this.htmlElement.audio[property] = value; + } + if(this.html.video.available) { + this.htmlElement.video[property] = value; + } + }, + _aurora_setAudio: function(media) { + var self = this; + + // Always finds a format due to checks in setMedia() + $.each(this.formats, function(priority, format) { + if(self.aurora.support[format] && media[format]) { + self.status.src = media[format]; + self.status.format[format] = true; + self.status.formatType = format; + + return false; + } + }); + + this.aurora.player = new AV.Player.fromURL(this.status.src); + this._addAuroraEventListeners(this.aurora.player, this.aurora); + + if(this.options.preload === 'auto') { + this._aurora_load(); + this.status.waitForLoad = false; + } + }, + _aurora_resetMedia: function() { + if (this.aurora.player) { + this.aurora.player.stop(); + } + }, + _aurora_clearMedia: function() { + // Nothing to clear. + }, + _aurora_load: function() { + if(this.status.waitForLoad) { + this.status.waitForLoad = false; + this.aurora.player.preload(); + } + }, + _aurora_play: function(time) { + if (!this.status.waitForLoad) { + if (!isNaN(time)) { + this.aurora.player.seek(time); + } + } + if (!this.aurora.player.playing) { + this.aurora.player.play(); + } + this.status.waitForLoad = false; + this._aurora_checkWaitForPlay(); + + // No event from the player, update UI now. + this._updateButtons(true); + this._trigger($.jPlayer.event.play); + }, + _aurora_pause: function(time) { + if (!isNaN(time)) { + this.aurora.player.seek(time * 1000); + } + this.aurora.player.pause(); + + if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button. + this._aurora_checkWaitForPlay(); + } + + // No event from the player, update UI now. + this._updateButtons(false); + this._trigger($.jPlayer.event.pause); + }, + _aurora_playHead: function(percent) { + if(this.aurora.player.duration > 0) { + // The seek() sould be in milliseconds, but the only codec that works with seek (aac.js) uses seconds. + this.aurora.player.seek(percent * this.aurora.player.duration / 100); // Using seconds + } + + if(!this.status.waitForLoad) { + this._aurora_checkWaitForPlay(); + } + }, + _aurora_checkWaitForPlay: function() { + if(this.status.waitForPlay) { + this.status.waitForPlay = false; + } + }, + _aurora_volume: function(v) { + this.aurora.player.volume = v * 100; + }, + _aurora_mute: function(m) { + if (m) { + this.aurora.properties.lastvolume = this.aurora.player.volume; + this.aurora.player.volume = 0; + } else { + this.aurora.player.volume = this.aurora.properties.lastvolume; + } + this.aurora.properties.muted = m; + }, + _flash_setAudio: function(media) { + var self = this; + try { + // Always finds a format due to checks in setMedia() + $.each(this.formats, function(priority, format) { + if(self.flash.support[format] && media[format]) { + switch (format) { + case "m4a" : + case "fla" : + self._getMovie().fl_setAudio_m4a(media[format]); + break; + case "mp3" : + self._getMovie().fl_setAudio_mp3(media[format]); + break; + case "rtmpa": + self._getMovie().fl_setAudio_rtmp(media[format]); + break; + } + self.status.src = media[format]; + self.status.format[format] = true; + self.status.formatType = format; + return false; + } + }); + + if(this.options.preload === 'auto') { + this._flash_load(); + this.status.waitForLoad = false; + } + } catch(err) { this._flashError(err); } + }, + _flash_setVideo: function(media) { + var self = this; + try { + // Always finds a format due to checks in setMedia() + $.each(this.formats, function(priority, format) { + if(self.flash.support[format] && media[format]) { + switch (format) { + case "m4v" : + case "flv" : + self._getMovie().fl_setVideo_m4v(media[format]); + break; + case "rtmpv": + self._getMovie().fl_setVideo_rtmp(media[format]); + break; + } + self.status.src = media[format]; + self.status.format[format] = true; + self.status.formatType = format; + return false; + } + }); + + if(this.options.preload === 'auto') { + this._flash_load(); + this.status.waitForLoad = false; + } + } catch(err) { this._flashError(err); } + }, + _flash_resetMedia: function() { + this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); // Must do via CSS as setting attr() to zero causes a jQuery error in IE. + this._flash_pause(NaN); + }, + _flash_clearMedia: function() { + try { + this._getMovie().fl_clearMedia(); + } catch(err) { this._flashError(err); } + }, + _flash_load: function() { + try { + this._getMovie().fl_load(); + } catch(err) { this._flashError(err); } + this.status.waitForLoad = false; + }, + _flash_play: function(time) { + try { + this._getMovie().fl_play(time); + } catch(err) { this._flashError(err); } + this.status.waitForLoad = false; + this._flash_checkWaitForPlay(); + }, + _flash_pause: function(time) { + try { + this._getMovie().fl_pause(time); + } catch(err) { this._flashError(err); } + if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button. + this.status.waitForLoad = false; + this._flash_checkWaitForPlay(); + } + }, + _flash_playHead: function(p) { + try { + this._getMovie().fl_play_head(p); + } catch(err) { this._flashError(err); } + if(!this.status.waitForLoad) { + this._flash_checkWaitForPlay(); + } + }, + _flash_checkWaitForPlay: function() { + if(this.status.waitForPlay) { + this.status.waitForPlay = false; + if(this.css.jq.videoPlay.length) { + this.css.jq.videoPlay.hide(); + } + if(this.status.video) { + this.internal.poster.jq.hide(); + this.internal.flash.jq.css({'width': this.status.width, 'height': this.status.height}); + } + } + }, + _flash_volume: function(v) { + try { + this._getMovie().fl_volume(v); + } catch(err) { this._flashError(err); } + }, + _flash_mute: function(m) { + try { + this._getMovie().fl_mute(m); + } catch(err) { this._flashError(err); } + }, + _getMovie: function() { + return document[this.internal.flash.id]; + }, + _getFlashPluginVersion: function() { + + // _getFlashPluginVersion() code influenced by: + // - FlashReplace 1.01: http://code.google.com/p/flashreplace/ + // - SWFObject 2.2: http://code.google.com/p/swfobject/ + + var version = 0, + flash; + if(window.ActiveXObject) { + try { + flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); + if (flash) { // flash will return null when ActiveX is disabled + var v = flash.GetVariable("$version"); + if(v) { + v = v.split(" ")[1].split(","); + version = parseInt(v[0], 10) + "." + parseInt(v[1], 10); + } + } + } catch(e) {} + } + else if(navigator.plugins && navigator.mimeTypes.length > 0) { + flash = navigator.plugins["Shockwave Flash"]; + if(flash) { + version = navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/, "$1"); + } + } + return version * 1; // Converts to a number + }, + _checkForFlash: function (version) { + var flashOk = false; + if(this._getFlashPluginVersion() >= version) { + flashOk = true; + } + return flashOk; + }, + _validString: function(url) { + return (url && typeof url === "string"); // Empty strings return false + }, + _limitValue: function(value, min, max) { + return (value < min) ? min : ((value > max) ? max : value); + }, + _urlNotSetError: function(context) { + this._error( { + type: $.jPlayer.error.URL_NOT_SET, + context: context, + message: $.jPlayer.errorMsg.URL_NOT_SET, + hint: $.jPlayer.errorHint.URL_NOT_SET + }); + }, + _flashError: function(error) { + var errorType; + if(!this.internal.ready) { + errorType = "FLASH"; + } else { + errorType = "FLASH_DISABLED"; + } + this._error( { + type: $.jPlayer.error[errorType], + context: this.internal.flash.swf, + message: $.jPlayer.errorMsg[errorType] + error.message, + hint: $.jPlayer.errorHint[errorType] + }); + // Allow the audio player to recover if display:none and then shown again, or with position:fixed on Firefox. + // This really only affects audio in a media player, as an audio player could easily move the jPlayer element away from such issues. + this.internal.flash.jq.css({'width':'1px', 'height':'1px'}); + }, + _error: function(error) { + this._trigger($.jPlayer.event.error, error); + if(this.options.errorAlerts) { + this._alert("Error!" + (error.message ? "\n" + error.message : "") + (error.hint ? "\n" + error.hint : "") + "\nContext: " + error.context); + } + }, + _warning: function(warning) { + this._trigger($.jPlayer.event.warning, undefined, warning); + if(this.options.warningAlerts) { + this._alert("Warning!" + (warning.message ? "\n" + warning.message : "") + (warning.hint ? "\n" + warning.hint : "") + "\nContext: " + warning.context); + } + }, + _alert: function(message) { + var msg = "jPlayer " + this.version.script + " : id='" + this.internal.self.id +"' : " + message; + if(!this.options.consoleAlerts) { + alert(msg); + } else if(window.console && window.console.log) { + window.console.log(msg); + } + }, + _emulateHtmlBridge: function() { + var self = this; + + // Emulate methods on jPlayer's DOM element. + $.each( $.jPlayer.emulateMethods.split(/\s+/g), function(i, name) { + self.internal.domNode[name] = function(arg) { + self[name](arg); + }; + + }); + + // Bubble jPlayer events to its DOM element. + $.each($.jPlayer.event, function(eventName,eventType) { + var nativeEvent = true; + $.each( $.jPlayer.reservedEvent.split(/\s+/g), function(i, name) { + if(name === eventName) { + nativeEvent = false; + return false; + } + }); + if(nativeEvent) { + self.element.bind(eventType + ".jPlayer.jPlayerHtml", function() { // With .jPlayer & .jPlayerHtml namespaces. + self._emulateHtmlUpdate(); + var domEvent = document.createEvent("Event"); + domEvent.initEvent(eventName, false, true); + self.internal.domNode.dispatchEvent(domEvent); + }); + } + // The error event would require a special case + }); + + // IE9 has a readyState property on all elements. The document should have it, but all (except media) elements inherit it in IE9. This conflicts with Popcorn, which polls the readyState. + }, + _emulateHtmlUpdate: function() { + var self = this; + + $.each( $.jPlayer.emulateStatus.split(/\s+/g), function(i, name) { + self.internal.domNode[name] = self.status[name]; + }); + $.each( $.jPlayer.emulateOptions.split(/\s+/g), function(i, name) { + self.internal.domNode[name] = self.options[name]; + }); + }, + _destroyHtmlBridge: function() { + var self = this; + + // Bridge event handlers are also removed by destroy() through .jPlayer namespace. + this.element.unbind(".jPlayerHtml"); // Remove all event handlers created by the jPlayer bridge. So you can change the emulateHtml option. + + // Remove the methods and properties + var emulated = $.jPlayer.emulateMethods + " " + $.jPlayer.emulateStatus + " " + $.jPlayer.emulateOptions; + $.each( emulated.split(/\s+/g), function(i, name) { + delete self.internal.domNode[name]; + }); + } + }; + + $.jPlayer.error = { + FLASH: "e_flash", + FLASH_DISABLED: "e_flash_disabled", + NO_SOLUTION: "e_no_solution", + NO_SUPPORT: "e_no_support", + URL: "e_url", + URL_NOT_SET: "e_url_not_set", + VERSION: "e_version" + }; + + $.jPlayer.errorMsg = { + FLASH: "jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ", // Used in: _flashError() + FLASH_DISABLED: "jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ", // Used in: _flashError() + NO_SOLUTION: "No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.", // Used in: _init() + NO_SUPPORT: "It is not possible to play any media format provided in setMedia() on this browser using your current options.", // Used in: setMedia() + URL: "Media URL could not be loaded.", // Used in: jPlayerFlashEvent() and _addHtmlEventListeners() + URL_NOT_SET: "Attempt to issue media playback commands, while no media url is set.", // Used in: load(), play(), pause(), stop() and playHead() + VERSION: "jPlayer " + $.jPlayer.prototype.version.script + " needs Jplayer.swf version " + $.jPlayer.prototype.version.needFlash + " but found " // Used in: jPlayerReady() + }; + + $.jPlayer.errorHint = { + FLASH: "Check your swfPath option and that Jplayer.swf is there.", + FLASH_DISABLED: "Check that you have not display:none; the jPlayer entity or any ancestor.", + NO_SOLUTION: "Review the jPlayer options: support and supplied.", + NO_SUPPORT: "Video or audio formats defined in the supplied option are missing.", + URL: "Check media URL is valid.", + URL_NOT_SET: "Use setMedia() to set the media URL.", + VERSION: "Update jPlayer files." + }; + + $.jPlayer.warning = { + CSS_SELECTOR_COUNT: "e_css_selector_count", + CSS_SELECTOR_METHOD: "e_css_selector_method", + CSS_SELECTOR_STRING: "e_css_selector_string", + OPTION_KEY: "e_option_key" + }; + + $.jPlayer.warningMsg = { + CSS_SELECTOR_COUNT: "The number of css selectors found did not equal one: ", + CSS_SELECTOR_METHOD: "The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.", + CSS_SELECTOR_STRING: "The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.", + OPTION_KEY: "The option requested in jPlayer('option') is undefined." + }; + + $.jPlayer.warningHint = { + CSS_SELECTOR_COUNT: "Check your css selector and the ancestor.", + CSS_SELECTOR_METHOD: "Check your method name.", + CSS_SELECTOR_STRING: "Check your css selector is a string.", + OPTION_KEY: "Check your option name." + }; +})); diff --git a/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.min.js b/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.min.js new file mode 100755 index 00000000..99f64d71 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.min.js @@ -0,0 +1,3 @@ +/*! jPlayer 2.9.2 for jQuery ~ (c) 2009-2014 Happyworm Ltd ~ MIT License */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],b):b("object"==typeof exports?require("jquery"):a.jQuery?a.jQuery:a.Zepto)}(this,function(a,b){a.fn.jPlayer=function(c){var d="jPlayer",e="string"==typeof c,f=Array.prototype.slice.call(arguments,1),g=this;return c=!e&&f.length?a.extend.apply(null,[!0,c].concat(f)):c,e&&"_"===c.charAt(0)?g:(this.each(e?function(){var e=a(this).data(d),h=e&&a.isFunction(e[c])?e[c].apply(e,f):e;return h!==e&&h!==b?(g=h,!1):void 0}:function(){var b=a(this).data(d);b?b.option(c||{}):a(this).data(d,new a.jPlayer(c,this))}),g)},a.jPlayer=function(b,c){if(arguments.length){this.element=a(c),this.options=a.extend(!0,{},this.options,b);var d=this;this.element.bind("remove.jPlayer",function(){d.destroy()}),this._init()}},"function"!=typeof a.fn.stop&&(a.fn.stop=function(){}),a.jPlayer.emulateMethods="load play pause",a.jPlayer.emulateStatus="src readyState networkState currentTime duration paused ended playbackRate",a.jPlayer.emulateOptions="muted volume",a.jPlayer.reservedEvent="ready flashreset resize repeat error warning",a.jPlayer.event={},a.each(["ready","setmedia","flashreset","resize","repeat","click","error","warning","loadstart","progress","suspend","abort","emptied","stalled","play","pause","loadedmetadata","loadeddata","waiting","playing","canplay","canplaythrough","seeking","seeked","timeupdate","ended","ratechange","durationchange","volumechange"],function(){a.jPlayer.event[this]="jPlayer_"+this}),a.jPlayer.htmlEvent=["loadstart","abort","emptied","stalled","loadedmetadata","canplay","canplaythrough"],a.jPlayer.pause=function(){a.jPlayer.prototype.destroyRemoved(),a.each(a.jPlayer.prototype.instances,function(a,b){b.data("jPlayer").status.srcSet&&b.jPlayer("pause")})},a.jPlayer.timeFormat={showHour:!1,showMin:!0,showSec:!0,padHour:!1,padMin:!0,padSec:!0,sepHour:":",sepMin:":",sepSec:""};var c=function(){this.init()};c.prototype={init:function(){this.options={timeFormat:a.jPlayer.timeFormat}},time:function(a){a=a&&"number"==typeof a?a:0;var b=new Date(1e3*a),c=b.getUTCHours(),d=this.options.timeFormat.showHour?b.getUTCMinutes():b.getUTCMinutes()+60*c,e=this.options.timeFormat.showMin?b.getUTCSeconds():b.getUTCSeconds()+60*d,f=this.options.timeFormat.padHour&&10>c?"0"+c:c,g=this.options.timeFormat.padMin&&10>d?"0"+d:d,h=this.options.timeFormat.padSec&&10>e?"0"+e:e,i="";return i+=this.options.timeFormat.showHour?f+this.options.timeFormat.sepHour:"",i+=this.options.timeFormat.showMin?g+this.options.timeFormat.sepMin:"",i+=this.options.timeFormat.showSec?h+this.options.timeFormat.sepSec:""}};var d=new c;a.jPlayer.convertTime=function(a){return d.time(a)},a.jPlayer.uaBrowser=function(a){var b=a.toLowerCase(),c=/(webkit)[ \/]([\w.]+)/,d=/(opera)(?:.*version)?[ \/]([\w.]+)/,e=/(msie) ([\w.]+)/,f=/(mozilla)(?:.*? rv:([\w.]+))?/,g=c.exec(b)||d.exec(b)||e.exec(b)||b.indexOf("compatible")<0&&f.exec(b)||[];return{browser:g[1]||"",version:g[2]||"0"}},a.jPlayer.uaPlatform=function(a){var b=a.toLowerCase(),c=/(ipad|iphone|ipod|android|blackberry|playbook|windows ce|webos)/,d=/(ipad|playbook)/,e=/(android)/,f=/(mobile)/,g=c.exec(b)||[],h=d.exec(b)||!f.exec(b)&&e.exec(b)||[];return g[1]&&(g[1]=g[1].replace(/\s/g,"_")),{platform:g[1]||"",tablet:h[1]||""}},a.jPlayer.browser={},a.jPlayer.platform={};var e=a.jPlayer.uaBrowser(navigator.userAgent);e.browser&&(a.jPlayer.browser[e.browser]=!0,a.jPlayer.browser.version=e.version);var f=a.jPlayer.uaPlatform(navigator.userAgent);f.platform&&(a.jPlayer.platform[f.platform]=!0,a.jPlayer.platform.mobile=!f.tablet,a.jPlayer.platform.tablet=!!f.tablet),a.jPlayer.getDocMode=function(){var b;return a.jPlayer.browser.msie&&(document.documentMode?b=document.documentMode:(b=5,document.compatMode&&"CSS1Compat"===document.compatMode&&(b=7))),b},a.jPlayer.browser.documentMode=a.jPlayer.getDocMode(),a.jPlayer.nativeFeatures={init:function(){var a,b,c,d=document,e=d.createElement("video"),f={w3c:["fullscreenEnabled","fullscreenElement","requestFullscreen","exitFullscreen","fullscreenchange","fullscreenerror"],moz:["mozFullScreenEnabled","mozFullScreenElement","mozRequestFullScreen","mozCancelFullScreen","mozfullscreenchange","mozfullscreenerror"],webkit:["","webkitCurrentFullScreenElement","webkitRequestFullScreen","webkitCancelFullScreen","webkitfullscreenchange",""],webkitVideo:["webkitSupportsFullscreen","webkitDisplayingFullscreen","webkitEnterFullscreen","webkitExitFullscreen","",""],ms:["","msFullscreenElement","msRequestFullscreen","msExitFullscreen","MSFullscreenChange","MSFullscreenError"]},g=["w3c","moz","webkit","webkitVideo","ms"];for(this.fullscreen=a={support:{w3c:!!d[f.w3c[0]],moz:!!d[f.moz[0]],webkit:"function"==typeof d[f.webkit[3]],webkitVideo:"function"==typeof e[f.webkitVideo[2]],ms:"function"==typeof e[f.ms[2]]},used:{}},b=0,c=g.length;c>b;b++){var h=g[b];if(a.support[h]){a.spec=h,a.used[h]=!0;break}}if(a.spec){var i=f[a.spec];a.api={fullscreenEnabled:!0,fullscreenElement:function(a){return a=a?a:d,a[i[1]]},requestFullscreen:function(a){return a[i[2]]()},exitFullscreen:function(a){return a=a?a:d,a[i[3]]()}},a.event={fullscreenchange:i[4],fullscreenerror:i[5]}}else a.api={fullscreenEnabled:!1,fullscreenElement:function(){return null},requestFullscreen:function(){},exitFullscreen:function(){}},a.event={}}},a.jPlayer.nativeFeatures.init(),a.jPlayer.focus=null,a.jPlayer.keyIgnoreElementNames="A INPUT TEXTAREA SELECT BUTTON";var g=function(b){var c,d=a.jPlayer.focus;d&&(a.each(a.jPlayer.keyIgnoreElementNames.split(/\s+/g),function(a,d){return b.target.nodeName.toUpperCase()===d.toUpperCase()?(c=!0,!1):void 0}),c||a.each(d.options.keyBindings,function(c,e){return e&&a.isFunction(e.fn)&&("number"==typeof e.key&&b.which===e.key||"string"==typeof e.key&&b.key===e.key)?(b.preventDefault(),e.fn(d),!1):void 0}))};a.jPlayer.keys=function(b){var c="keydown.jPlayer";a(document.documentElement).unbind(c),b&&a(document.documentElement).bind(c,g)},a.jPlayer.keys(!0),a.jPlayer.prototype={count:0,version:{script:"2.9.2",needFlash:"2.9.0",flash:"unknown"},options:{swfPath:"js",solution:"html, flash",supplied:"mp3",auroraFormats:"wav",preload:"metadata",volume:.8,muted:!1,remainingDuration:!1,toggleDuration:!1,captureDuration:!0,playbackRate:1,defaultPlaybackRate:1,minPlaybackRate:.5,maxPlaybackRate:4,wmode:"opaque",backgroundColor:"#000000",cssSelectorAncestor:"#jp_container_1",cssSelector:{videoPlay:".jp-video-play",play:".jp-play",pause:".jp-pause",stop:".jp-stop",seekBar:".jp-seek-bar",playBar:".jp-play-bar",mute:".jp-mute",unmute:".jp-unmute",volumeBar:".jp-volume-bar",volumeBarValue:".jp-volume-bar-value",volumeMax:".jp-volume-max",playbackRateBar:".jp-playback-rate-bar",playbackRateBarValue:".jp-playback-rate-bar-value",currentTime:".jp-current-time",duration:".jp-duration",title:".jp-title",fullScreen:".jp-full-screen",restoreScreen:".jp-restore-screen",repeat:".jp-repeat",repeatOff:".jp-repeat-off",gui:".jp-gui",noSolution:".jp-no-solution"},stateClass:{playing:"jp-state-playing",seeking:"jp-state-seeking",muted:"jp-state-muted",looped:"jp-state-looped",fullScreen:"jp-state-full-screen",noVolume:"jp-state-no-volume"},useStateClassSkin:!1,autoBlur:!0,smoothPlayBar:!1,fullScreen:!1,fullWindow:!1,autohide:{restored:!1,full:!0,fadeIn:200,fadeOut:600,hold:1e3},loop:!1,repeat:function(b){b.jPlayer.options.loop?a(this).unbind(".jPlayerRepeat").bind(a.jPlayer.event.ended+".jPlayer.jPlayerRepeat",function(){a(this).jPlayer("play")}):a(this).unbind(".jPlayerRepeat")},nativeVideoControls:{},noFullWindow:{msie:/msie [0-6]\./,ipad:/ipad.*?os [0-4]\./,iphone:/iphone/,ipod:/ipod/,android_pad:/android [0-3]\.(?!.*?mobile)/,android_phone:/(?=.*android)(?!.*chrome)(?=.*mobile)/,blackberry:/blackberry/,windows_ce:/windows ce/,iemobile:/iemobile/,webos:/webos/},noVolume:{ipad:/ipad/,iphone:/iphone/,ipod:/ipod/,android_pad:/android(?!.*?mobile)/,android_phone:/android.*?mobile/,blackberry:/blackberry/,windows_ce:/windows ce/,iemobile:/iemobile/,webos:/webos/,playbook:/playbook/},timeFormat:{},keyEnabled:!1,audioFullScreen:!1,keyBindings:{play:{key:80,fn:function(a){a.status.paused?a.play():a.pause()}},fullScreen:{key:70,fn:function(a){(a.status.video||a.options.audioFullScreen)&&a._setOption("fullScreen",!a.options.fullScreen)}},muted:{key:77,fn:function(a){a._muted(!a.options.muted)}},volumeUp:{key:190,fn:function(a){a.volume(a.options.volume+.1)}},volumeDown:{key:188,fn:function(a){a.volume(a.options.volume-.1)}},loop:{key:76,fn:function(a){a._loop(!a.options.loop)}}},verticalVolume:!1,verticalPlaybackRate:!1,globalVolume:!1,idPrefix:"jp",noConflict:"jQuery",emulateHtml:!1,consoleAlerts:!0,errorAlerts:!1,warningAlerts:!1},optionsAudio:{size:{width:"0px",height:"0px",cssClass:""},sizeFull:{width:"0px",height:"0px",cssClass:""}},optionsVideo:{size:{width:"480px",height:"270px",cssClass:"jp-video-270p"},sizeFull:{width:"100%",height:"100%",cssClass:"jp-video-full"}},instances:{},status:{src:"",media:{},paused:!0,format:{},formatType:"",waitForPlay:!0,waitForLoad:!0,srcSet:!1,video:!1,seekPercent:0,currentPercentRelative:0,currentPercentAbsolute:0,currentTime:0,duration:0,remaining:0,videoWidth:0,videoHeight:0,readyState:0,networkState:0,playbackRate:1,ended:0},internal:{ready:!1},solution:{html:!0,aurora:!0,flash:!0},format:{mp3:{codec:"audio/mpeg",flashCanPlay:!0,media:"audio"},m4a:{codec:'audio/mp4; codecs="mp4a.40.2"',flashCanPlay:!0,media:"audio"},m3u8a:{codec:'application/vnd.apple.mpegurl; codecs="mp4a.40.2"',flashCanPlay:!1,media:"audio"},m3ua:{codec:"audio/mpegurl",flashCanPlay:!1,media:"audio"},oga:{codec:'audio/ogg; codecs="vorbis, opus"',flashCanPlay:!1,media:"audio"},flac:{codec:"audio/x-flac",flashCanPlay:!1,media:"audio"},wav:{codec:'audio/wav; codecs="1"',flashCanPlay:!1,media:"audio"},webma:{codec:'audio/webm; codecs="vorbis"',flashCanPlay:!1,media:"audio"},fla:{codec:"audio/x-flv",flashCanPlay:!0,media:"audio"},rtmpa:{codec:'audio/rtmp; codecs="rtmp"',flashCanPlay:!0,media:"audio"},m4v:{codec:'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',flashCanPlay:!0,media:"video"},m3u8v:{codec:'application/vnd.apple.mpegurl; codecs="avc1.42E01E, mp4a.40.2"',flashCanPlay:!1,media:"video"},m3uv:{codec:"audio/mpegurl",flashCanPlay:!1,media:"video"},ogv:{codec:'video/ogg; codecs="theora, vorbis"',flashCanPlay:!1,media:"video"},webmv:{codec:'video/webm; codecs="vorbis, vp8"',flashCanPlay:!1,media:"video"},flv:{codec:"video/x-flv",flashCanPlay:!0,media:"video"},rtmpv:{codec:'video/rtmp; codecs="rtmp"',flashCanPlay:!0,media:"video"}},_init:function(){var c=this;if(this.element.empty(),this.status=a.extend({},this.status),this.internal=a.extend({},this.internal),this.options.timeFormat=a.extend({},a.jPlayer.timeFormat,this.options.timeFormat),this.internal.cmdsIgnored=a.jPlayer.platform.ipad||a.jPlayer.platform.iphone||a.jPlayer.platform.ipod,this.internal.domNode=this.element.get(0),this.options.keyEnabled&&!a.jPlayer.focus&&(a.jPlayer.focus=this),this.androidFix={setMedia:!1,play:!1,pause:!1,time:0/0},a.jPlayer.platform.android&&(this.options.preload="auto"!==this.options.preload?"metadata":"auto"),this.formats=[],this.solutions=[],this.require={},this.htmlElement={},this.html={},this.html.audio={},this.html.video={},this.aurora={},this.aurora.formats=[],this.aurora.properties=[],this.flash={},this.css={},this.css.cs={},this.css.jq={},this.ancestorJq=[],this.options.volume=this._limitValue(this.options.volume,0,1),a.each(this.options.supplied.toLowerCase().split(","),function(b,d){var e=d.replace(/^\s+|\s+$/g,"");if(c.format[e]){var f=!1;a.each(c.formats,function(a,b){return e===b?(f=!0,!1):void 0}),f||c.formats.push(e)}}),a.each(this.options.solution.toLowerCase().split(","),function(b,d){var e=d.replace(/^\s+|\s+$/g,"");if(c.solution[e]){var f=!1;a.each(c.solutions,function(a,b){return e===b?(f=!0,!1):void 0}),f||c.solutions.push(e)}}),a.each(this.options.auroraFormats.toLowerCase().split(","),function(b,d){var e=d.replace(/^\s+|\s+$/g,"");if(c.format[e]){var f=!1;a.each(c.aurora.formats,function(a,b){return e===b?(f=!0,!1):void 0}),f||c.aurora.formats.push(e)}}),this.internal.instance="jp_"+this.count,this.instances[this.internal.instance]=this.element,this.element.attr("id")||this.element.attr("id",this.options.idPrefix+"_jplayer_"+this.count),this.internal.self=a.extend({},{id:this.element.attr("id"),jq:this.element}),this.internal.audio=a.extend({},{id:this.options.idPrefix+"_audio_"+this.count,jq:b}),this.internal.video=a.extend({},{id:this.options.idPrefix+"_video_"+this.count,jq:b}),this.internal.flash=a.extend({},{id:this.options.idPrefix+"_flash_"+this.count,jq:b,swf:this.options.swfPath+(".swf"!==this.options.swfPath.toLowerCase().slice(-4)?(this.options.swfPath&&"/"!==this.options.swfPath.slice(-1)?"/":"")+"jquery.jplayer.swf":"")}),this.internal.poster=a.extend({},{id:this.options.idPrefix+"_poster_"+this.count,jq:b}),a.each(a.jPlayer.event,function(a,d){c.options[a]!==b&&(c.element.bind(d+".jPlayer",c.options[a]),c.options[a]=b)}),this.require.audio=!1,this.require.video=!1,a.each(this.formats,function(a,b){c.require[c.format[b].media]=!0}),this.options=this.require.video?a.extend(!0,{},this.optionsVideo,this.options):a.extend(!0,{},this.optionsAudio,this.options),this._setSize(),this.status.nativeVideoControls=this._uaBlocklist(this.options.nativeVideoControls),this.status.noFullWindow=this._uaBlocklist(this.options.noFullWindow),this.status.noVolume=this._uaBlocklist(this.options.noVolume),a.jPlayer.nativeFeatures.fullscreen.api.fullscreenEnabled&&this._fullscreenAddEventListeners(),this._restrictNativeVideoControls(),this.htmlElement.poster=document.createElement("img"),this.htmlElement.poster.id=this.internal.poster.id,this.htmlElement.poster.onload=function(){(!c.status.video||c.status.waitForPlay)&&c.internal.poster.jq.show()},this.element.append(this.htmlElement.poster),this.internal.poster.jq=a("#"+this.internal.poster.id),this.internal.poster.jq.css({width:this.status.width,height:this.status.height}),this.internal.poster.jq.hide(),this.internal.poster.jq.bind("click.jPlayer",function(){c._trigger(a.jPlayer.event.click)}),this.html.audio.available=!1,this.require.audio&&(this.htmlElement.audio=document.createElement("audio"),this.htmlElement.audio.id=this.internal.audio.id,this.html.audio.available=!!this.htmlElement.audio.canPlayType&&this._testCanPlayType(this.htmlElement.audio)),this.html.video.available=!1,this.require.video&&(this.htmlElement.video=document.createElement("video"),this.htmlElement.video.id=this.internal.video.id,this.html.video.available=!!this.htmlElement.video.canPlayType&&this._testCanPlayType(this.htmlElement.video)),this.flash.available=this._checkForFlash(10.1),this.html.canPlay={},this.aurora.canPlay={},this.flash.canPlay={},a.each(this.formats,function(b,d){c.html.canPlay[d]=c.html[c.format[d].media].available&&""!==c.htmlElement[c.format[d].media].canPlayType(c.format[d].codec),c.aurora.canPlay[d]=a.inArray(d,c.aurora.formats)>-1,c.flash.canPlay[d]=c.format[d].flashCanPlay&&c.flash.available}),this.html.desired=!1,this.aurora.desired=!1,this.flash.desired=!1,a.each(this.solutions,function(b,d){if(0===b)c[d].desired=!0;else{var e=!1,f=!1;a.each(c.formats,function(a,b){c[c.solutions[0]].canPlay[b]&&("video"===c.format[b].media?f=!0:e=!0)}),c[d].desired=c.require.audio&&!e||c.require.video&&!f}}),this.html.support={},this.aurora.support={},this.flash.support={},a.each(this.formats,function(a,b){c.html.support[b]=c.html.canPlay[b]&&c.html.desired,c.aurora.support[b]=c.aurora.canPlay[b]&&c.aurora.desired,c.flash.support[b]=c.flash.canPlay[b]&&c.flash.desired}),this.html.used=!1,this.aurora.used=!1,this.flash.used=!1,a.each(this.solutions,function(b,d){a.each(c.formats,function(a,b){return c[d].support[b]?(c[d].used=!0,!1):void 0})}),this._resetActive(),this._resetGate(),this._cssSelectorAncestor(this.options.cssSelectorAncestor),this.html.used||this.aurora.used||this.flash.used?this.css.jq.noSolution.length&&this.css.jq.noSolution.hide():(this._error({type:a.jPlayer.error.NO_SOLUTION,context:"{solution:'"+this.options.solution+"', supplied:'"+this.options.supplied+"'}",message:a.jPlayer.errorMsg.NO_SOLUTION,hint:a.jPlayer.errorHint.NO_SOLUTION}),this.css.jq.noSolution.length&&this.css.jq.noSolution.show()),this.flash.used){var d,e="jQuery="+encodeURI(this.options.noConflict)+"&id="+encodeURI(this.internal.self.id)+"&vol="+this.options.volume+"&muted="+this.options.muted;if(a.jPlayer.browser.msie&&(Number(a.jPlayer.browser.version)<9||a.jPlayer.browser.documentMode<9)){var f='',g=['','','','',''];d=document.createElement(f);for(var h=0;h0&&(d.internal.cmdsIgnored=!1),d._getHtmlStatus(b),d._updateInterface(),d._trigger(a.jPlayer.event.progress))},!1),b.addEventListener("loadeddata",function(){c.gate&&(d.androidFix.setMedia=!1,d.androidFix.play&&(d.androidFix.play=!1,d.play(d.androidFix.time)),d.androidFix.pause&&(d.androidFix.pause=!1,d.pause(d.androidFix.time)),d._trigger(a.jPlayer.event.loadeddata))},!1),b.addEventListener("timeupdate",function(){c.gate&&(d._getHtmlStatus(b),d._updateInterface(),d._trigger(a.jPlayer.event.timeupdate))},!1),b.addEventListener("durationchange",function(){c.gate&&(d._getHtmlStatus(b),d._updateInterface(),d._trigger(a.jPlayer.event.durationchange))},!1),b.addEventListener("play",function(){c.gate&&(d._updateButtons(!0),d._html_checkWaitForPlay(),d._trigger(a.jPlayer.event.play))},!1),b.addEventListener("playing",function(){c.gate&&(d._updateButtons(!0),d._seeked(),d._trigger(a.jPlayer.event.playing))},!1),b.addEventListener("pause",function(){c.gate&&(d._updateButtons(!1),d._trigger(a.jPlayer.event.pause))},!1),b.addEventListener("waiting",function(){c.gate&&(d._seeking(),d._trigger(a.jPlayer.event.waiting))},!1),b.addEventListener("seeking",function(){c.gate&&(d._seeking(),d._trigger(a.jPlayer.event.seeking))},!1),b.addEventListener("seeked",function(){c.gate&&(d._seeked(),d._trigger(a.jPlayer.event.seeked))},!1),b.addEventListener("volumechange",function(){c.gate&&(d.options.volume=b.volume,d.options.muted=b.muted,d._updateMute(),d._updateVolume(),d._trigger(a.jPlayer.event.volumechange))},!1),b.addEventListener("ratechange",function(){c.gate&&(d.options.defaultPlaybackRate=b.defaultPlaybackRate,d.options.playbackRate=b.playbackRate,d._updatePlaybackRate(),d._trigger(a.jPlayer.event.ratechange))},!1),b.addEventListener("suspend",function(){c.gate&&(d._seeked(),d._trigger(a.jPlayer.event.suspend))},!1),b.addEventListener("ended",function(){c.gate&&(a.jPlayer.browser.webkit||(d.htmlElement.media.currentTime=0),d.htmlElement.media.pause(),d._updateButtons(!1),d._getHtmlStatus(b,!0),d._updateInterface(),d._trigger(a.jPlayer.event.ended))},!1),b.addEventListener("error",function(){c.gate&&(d._updateButtons(!1),d._seeked(),d.status.srcSet&&(clearTimeout(d.internal.htmlDlyCmdId),d.status.waitForLoad=!0,d.status.waitForPlay=!0,d.status.video&&!d.status.nativeVideoControls&&d.internal.video.jq.css({width:"0px",height:"0px"}),d._validString(d.status.media.poster)&&!d.status.nativeVideoControls&&d.internal.poster.jq.show(),d.css.jq.videoPlay.length&&d.css.jq.videoPlay.show(),d._error({type:a.jPlayer.error.URL,context:d.status.src,message:a.jPlayer.errorMsg.URL,hint:a.jPlayer.errorHint.URL})))},!1),a.each(a.jPlayer.htmlEvent,function(e,f){b.addEventListener(this,function(){c.gate&&d._trigger(a.jPlayer.event[f])},!1)})},_addAuroraEventListeners:function(b,c){var d=this;b.volume=100*this.options.volume,b.on("progress",function(){c.gate&&(d.internal.cmdsIgnored&&this.readyState>0&&(d.internal.cmdsIgnored=!1),d._getAuroraStatus(b),d._updateInterface(),d._trigger(a.jPlayer.event.progress),b.duration>0&&d._trigger(a.jPlayer.event.timeupdate))},!1),b.on("ready",function(){c.gate&&d._trigger(a.jPlayer.event.loadeddata)},!1),b.on("duration",function(){c.gate&&(d._getAuroraStatus(b),d._updateInterface(),d._trigger(a.jPlayer.event.durationchange))},!1),b.on("end",function(){c.gate&&(d._updateButtons(!1),d._getAuroraStatus(b,!0),d._updateInterface(),d._trigger(a.jPlayer.event.ended))},!1),b.on("error",function(){c.gate&&(d._updateButtons(!1),d._seeked(),d.status.srcSet&&(d.status.waitForLoad=!0,d.status.waitForPlay=!0,d.status.video&&!d.status.nativeVideoControls&&d.internal.video.jq.css({width:"0px",height:"0px"}),d._validString(d.status.media.poster)&&!d.status.nativeVideoControls&&d.internal.poster.jq.show(),d.css.jq.videoPlay.length&&d.css.jq.videoPlay.show(),d._error({type:a.jPlayer.error.URL,context:d.status.src,message:a.jPlayer.errorMsg.URL,hint:a.jPlayer.errorHint.URL})))},!1)},_getHtmlStatus:function(a,b){var c=0,d=0,e=0,f=0;isFinite(a.duration)&&(this.status.duration=a.duration),c=a.currentTime,d=this.status.duration>0?100*c/this.status.duration:0,"object"==typeof a.seekable&&a.seekable.length>0?(e=this.status.duration>0?100*a.seekable.end(a.seekable.length-1)/this.status.duration:100,f=this.status.duration>0?100*a.currentTime/a.seekable.end(a.seekable.length-1):0):(e=100,f=d),b&&(c=0,f=0,d=0),this.status.seekPercent=e,this.status.currentPercentRelative=f,this.status.currentPercentAbsolute=d,this.status.currentTime=c,this.status.remaining=this.status.duration-this.status.currentTime,this.status.videoWidth=a.videoWidth,this.status.videoHeight=a.videoHeight,this.status.readyState=a.readyState,this.status.networkState=a.networkState,this.status.playbackRate=a.playbackRate,this.status.ended=a.ended},_getAuroraStatus:function(a,b){var c=0,d=0,e=0,f=0;this.status.duration=a.duration/1e3,c=a.currentTime/1e3,d=this.status.duration>0?100*c/this.status.duration:0,a.buffered>0?(e=this.status.duration>0?a.buffered*this.status.duration/this.status.duration:100,f=this.status.duration>0?c/(a.buffered*this.status.duration):0):(e=100,f=d),b&&(c=0,f=0,d=0),this.status.seekPercent=e,this.status.currentPercentRelative=f,this.status.currentPercentAbsolute=d,this.status.currentTime=c,this.status.remaining=this.status.duration-this.status.currentTime,this.status.readyState=4,this.status.networkState=0,this.status.playbackRate=1,this.status.ended=!1},_resetStatus:function(){this.status=a.extend({},this.status,a.jPlayer.prototype.status)},_trigger:function(b,c,d){var e=a.Event(b);e.jPlayer={},e.jPlayer.version=a.extend({},this.version),e.jPlayer.options=a.extend(!0,{},this.options),e.jPlayer.status=a.extend(!0,{},this.status),e.jPlayer.html=a.extend(!0,{},this.html),e.jPlayer.aurora=a.extend(!0,{},this.aurora),e.jPlayer.flash=a.extend(!0,{},this.flash),c&&(e.jPlayer.error=a.extend({},c)),d&&(e.jPlayer.warning=a.extend({},d)),this.element.trigger(e)},jPlayerFlashEvent:function(b,c){if(b===a.jPlayer.event.ready)if(this.internal.ready){if(this.flash.gate){if(this.status.srcSet){var d=this.status.currentTime,e=this.status.paused;this.setMedia(this.status.media),this.volumeWorker(this.options.volume),d>0&&(e?this.pause(d):this.play(d))}this._trigger(a.jPlayer.event.flashreset)}}else this.internal.ready=!0,this.internal.flash.jq.css({width:"0px",height:"0px"}),this.version.flash=c.version,this.version.needFlash!==this.version.flash&&this._error({type:a.jPlayer.error.VERSION,context:this.version.flash,message:a.jPlayer.errorMsg.VERSION+this.version.flash,hint:a.jPlayer.errorHint.VERSION}),this._trigger(a.jPlayer.event.repeat),this._trigger(b);if(this.flash.gate)switch(b){case a.jPlayer.event.progress:this._getFlashStatus(c),this._updateInterface(),this._trigger(b);break;case a.jPlayer.event.timeupdate:this._getFlashStatus(c),this._updateInterface(),this._trigger(b);break;case a.jPlayer.event.play:this._seeked(),this._updateButtons(!0),this._trigger(b);break;case a.jPlayer.event.pause:this._updateButtons(!1),this._trigger(b);break;case a.jPlayer.event.ended:this._updateButtons(!1),this._trigger(b);break;case a.jPlayer.event.click:this._trigger(b);break;case a.jPlayer.event.error:this.status.waitForLoad=!0,this.status.waitForPlay=!0,this.status.video&&this.internal.flash.jq.css({width:"0px",height:"0px"}),this._validString(this.status.media.poster)&&this.internal.poster.jq.show(),this.css.jq.videoPlay.length&&this.status.video&&this.css.jq.videoPlay.show(),this.status.video?this._flash_setVideo(this.status.media):this._flash_setAudio(this.status.media),this._updateButtons(!1),this._error({type:a.jPlayer.error.URL,context:c.src,message:a.jPlayer.errorMsg.URL,hint:a.jPlayer.errorHint.URL});break;case a.jPlayer.event.seeking:this._seeking(),this._trigger(b);break;case a.jPlayer.event.seeked:this._seeked(),this._trigger(b);break;case a.jPlayer.event.ready:break;default:this._trigger(b)}return!1},_getFlashStatus:function(a){this.status.seekPercent=a.seekPercent,this.status.currentPercentRelative=a.currentPercentRelative,this.status.currentPercentAbsolute=a.currentPercentAbsolute,this.status.currentTime=a.currentTime,this.status.duration=a.duration,this.status.remaining=a.duration-a.currentTime,this.status.videoWidth=a.videoWidth,this.status.videoHeight=a.videoHeight,this.status.readyState=4,this.status.networkState=0,this.status.playbackRate=1,this.status.ended=!1},_updateButtons:function(a){a===b?a=!this.status.paused:this.status.paused=!a,a?this.addStateClass("playing"):this.removeStateClass("playing"),!this.status.noFullWindow&&this.options.fullWindow?this.addStateClass("fullScreen"):this.removeStateClass("fullScreen"),this.options.loop?this.addStateClass("looped"):this.removeStateClass("looped"),this.css.jq.play.length&&this.css.jq.pause.length&&(a?(this.css.jq.play.hide(),this.css.jq.pause.show()):(this.css.jq.play.show(),this.css.jq.pause.hide())),this.css.jq.restoreScreen.length&&this.css.jq.fullScreen.length&&(this.status.noFullWindow?(this.css.jq.fullScreen.hide(),this.css.jq.restoreScreen.hide()):this.options.fullWindow?(this.css.jq.fullScreen.hide(),this.css.jq.restoreScreen.show()):(this.css.jq.fullScreen.show(),this.css.jq.restoreScreen.hide())),this.css.jq.repeat.length&&this.css.jq.repeatOff.length&&(this.options.loop?(this.css.jq.repeat.hide(),this.css.jq.repeatOff.show()):(this.css.jq.repeat.show(),this.css.jq.repeatOff.hide()))},_updateInterface:function(){this.css.jq.seekBar.length&&this.css.jq.seekBar.width(this.status.seekPercent+"%"),this.css.jq.playBar.length&&(this.options.smoothPlayBar?this.css.jq.playBar.stop().animate({width:this.status.currentPercentAbsolute+"%"},250,"linear"):this.css.jq.playBar.width(this.status.currentPercentRelative+"%"));var a="";this.css.jq.currentTime.length&&(a=this._convertTime(this.status.currentTime),a!==this.css.jq.currentTime.text()&&this.css.jq.currentTime.text(this._convertTime(this.status.currentTime)));var b="",c=this.status.duration,d=this.status.remaining;this.css.jq.duration.length&&("string"==typeof this.status.media.duration?b=this.status.media.duration:("number"==typeof this.status.media.duration&&(c=this.status.media.duration,d=c-this.status.currentTime),b=this.options.remainingDuration?(d>0?"-":"")+this._convertTime(d):this._convertTime(c)),b!==this.css.jq.duration.text()&&this.css.jq.duration.text(b))},_convertTime:c.prototype.time,_seeking:function(){this.css.jq.seekBar.length&&this.css.jq.seekBar.addClass("jp-seeking-bg"),this.addStateClass("seeking")},_seeked:function(){this.css.jq.seekBar.length&&this.css.jq.seekBar.removeClass("jp-seeking-bg"),this.removeStateClass("seeking")},_resetGate:function(){this.html.audio.gate=!1,this.html.video.gate=!1,this.aurora.gate=!1,this.flash.gate=!1},_resetActive:function(){this.html.active=!1,this.aurora.active=!1,this.flash.active=!1},_escapeHtml:function(a){return a.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""")},_qualifyURL:function(a){var b=document.createElement("div"); +return b.innerHTML='x',b.firstChild.href},_absoluteMediaUrls:function(b){var c=this;return a.each(b,function(a,d){d&&c.format[a]&&"data:"!==d.substr(0,5)&&(b[a]=c._qualifyURL(d))}),b},addStateClass:function(a){this.ancestorJq.length&&this.ancestorJq.addClass(this.options.stateClass[a])},removeStateClass:function(a){this.ancestorJq.length&&this.ancestorJq.removeClass(this.options.stateClass[a])},setMedia:function(b){var c=this,d=!1,e=this.status.media.poster!==b.poster;this._resetMedia(),this._resetGate(),this._resetActive(),this.androidFix.setMedia=!1,this.androidFix.play=!1,this.androidFix.pause=!1,b=this._absoluteMediaUrls(b),a.each(this.formats,function(e,f){var g="video"===c.format[f].media;return a.each(c.solutions,function(e,h){if(c[h].support[f]&&c._validString(b[f])){var i="html"===h,j="aurora"===h;return g?(i?(c.html.video.gate=!0,c._html_setVideo(b),c.html.active=!0):(c.flash.gate=!0,c._flash_setVideo(b),c.flash.active=!0),c.css.jq.videoPlay.length&&c.css.jq.videoPlay.show(),c.status.video=!0):(i?(c.html.audio.gate=!0,c._html_setAudio(b),c.html.active=!0,a.jPlayer.platform.android&&(c.androidFix.setMedia=!0)):j?(c.aurora.gate=!0,c._aurora_setAudio(b),c.aurora.active=!0):(c.flash.gate=!0,c._flash_setAudio(b),c.flash.active=!0),c.css.jq.videoPlay.length&&c.css.jq.videoPlay.hide(),c.status.video=!1),d=!0,!1}}),d?!1:void 0}),d?(this.status.nativeVideoControls&&this.html.video.gate||this._validString(b.poster)&&(e?this.htmlElement.poster.src=b.poster:this.internal.poster.jq.show()),"string"==typeof b.title&&(this.css.jq.title.length&&this.css.jq.title.html(b.title),this.htmlElement.audio&&this.htmlElement.audio.setAttribute("title",b.title),this.htmlElement.video&&this.htmlElement.video.setAttribute("title",b.title)),this.status.srcSet=!0,this.status.media=a.extend({},b),this._updateButtons(!1),this._updateInterface(),this._trigger(a.jPlayer.event.setmedia)):this._error({type:a.jPlayer.error.NO_SUPPORT,context:"{supplied:'"+this.options.supplied+"'}",message:a.jPlayer.errorMsg.NO_SUPPORT,hint:a.jPlayer.errorHint.NO_SUPPORT})},_resetMedia:function(){this._resetStatus(),this._updateButtons(!1),this._updateInterface(),this._seeked(),this.internal.poster.jq.hide(),clearTimeout(this.internal.htmlDlyCmdId),this.html.active?this._html_resetMedia():this.aurora.active?this._aurora_resetMedia():this.flash.active&&this._flash_resetMedia()},clearMedia:function(){this._resetMedia(),this.html.active?this._html_clearMedia():this.aurora.active?this._aurora_clearMedia():this.flash.active&&this._flash_clearMedia(),this._resetGate(),this._resetActive()},load:function(){this.status.srcSet?this.html.active?this._html_load():this.aurora.active?this._aurora_load():this.flash.active&&this._flash_load():this._urlNotSetError("load")},focus:function(){this.options.keyEnabled&&(a.jPlayer.focus=this)},play:function(a){var b="object"==typeof a;b&&this.options.useStateClassSkin&&!this.status.paused?this.pause(a):(a="number"==typeof a?a:0/0,this.status.srcSet?(this.focus(),this.html.active?this._html_play(a):this.aurora.active?this._aurora_play(a):this.flash.active&&this._flash_play(a)):this._urlNotSetError("play"))},videoPlay:function(){this.play()},pause:function(a){a="number"==typeof a?a:0/0,this.status.srcSet?this.html.active?this._html_pause(a):this.aurora.active?this._aurora_pause(a):this.flash.active&&this._flash_pause(a):this._urlNotSetError("pause")},tellOthers:function(b,c){var d=this,e="function"==typeof c,f=Array.prototype.slice.call(arguments);"string"==typeof b&&(e&&f.splice(1,1),a.jPlayer.prototype.destroyRemoved(),a.each(this.instances,function(){d.element!==this&&(!e||c.call(this.data("jPlayer"),d))&&this.jPlayer.apply(this,f)}))},pauseOthers:function(a){this.tellOthers("pause",function(){return this.status.srcSet},a)},stop:function(){this.status.srcSet?this.html.active?this._html_pause(0):this.aurora.active?this._aurora_pause(0):this.flash.active&&this._flash_pause(0):this._urlNotSetError("stop")},playHead:function(a){a=this._limitValue(a,0,100),this.status.srcSet?this.html.active?this._html_playHead(a):this.aurora.active?this._aurora_playHead(a):this.flash.active&&this._flash_playHead(a):this._urlNotSetError("playHead")},_muted:function(a){this.mutedWorker(a),this.options.globalVolume&&this.tellOthers("mutedWorker",function(){return this.options.globalVolume},a)},mutedWorker:function(b){this.options.muted=b,this.html.used&&this._html_setProperty("muted",b),this.aurora.used&&this._aurora_mute(b),this.flash.used&&this._flash_mute(b),this.html.video.gate||this.html.audio.gate||(this._updateMute(b),this._updateVolume(this.options.volume),this._trigger(a.jPlayer.event.volumechange))},mute:function(a){var c="object"==typeof a;c&&this.options.useStateClassSkin&&this.options.muted?this._muted(!1):(a=a===b?!0:!!a,this._muted(a))},unmute:function(a){a=a===b?!0:!!a,this._muted(!a)},_updateMute:function(a){a===b&&(a=this.options.muted),a?this.addStateClass("muted"):this.removeStateClass("muted"),this.css.jq.mute.length&&this.css.jq.unmute.length&&(this.status.noVolume?(this.css.jq.mute.hide(),this.css.jq.unmute.hide()):a?(this.css.jq.mute.hide(),this.css.jq.unmute.show()):(this.css.jq.mute.show(),this.css.jq.unmute.hide()))},volume:function(a){this.volumeWorker(a),this.options.globalVolume&&this.tellOthers("volumeWorker",function(){return this.options.globalVolume},a)},volumeWorker:function(b){b=this._limitValue(b,0,1),this.options.volume=b,this.html.used&&this._html_setProperty("volume",b),this.aurora.used&&this._aurora_volume(b),this.flash.used&&this._flash_volume(b),this.html.video.gate||this.html.audio.gate||(this._updateVolume(b),this._trigger(a.jPlayer.event.volumechange))},volumeBar:function(b){if(this.css.jq.volumeBar.length){var c=a(b.currentTarget),d=c.offset(),e=b.pageX-d.left,f=c.width(),g=c.height()-b.pageY+d.top,h=c.height();this.volume(this.options.verticalVolume?g/h:e/f)}this.options.muted&&this._muted(!1)},_updateVolume:function(a){a===b&&(a=this.options.volume),a=this.options.muted?0:a,this.status.noVolume?(this.addStateClass("noVolume"),this.css.jq.volumeBar.length&&this.css.jq.volumeBar.hide(),this.css.jq.volumeBarValue.length&&this.css.jq.volumeBarValue.hide(),this.css.jq.volumeMax.length&&this.css.jq.volumeMax.hide()):(this.removeStateClass("noVolume"),this.css.jq.volumeBar.length&&this.css.jq.volumeBar.show(),this.css.jq.volumeBarValue.length&&(this.css.jq.volumeBarValue.show(),this.css.jq.volumeBarValue[this.options.verticalVolume?"height":"width"](100*a+"%")),this.css.jq.volumeMax.length&&this.css.jq.volumeMax.show())},volumeMax:function(){this.volume(1),this.options.muted&&this._muted(!1)},_cssSelectorAncestor:function(b){var c=this;this.options.cssSelectorAncestor=b,this._removeUiClass(),this.ancestorJq=b?a(b):[],b&&1!==this.ancestorJq.length&&this._warning({type:a.jPlayer.warning.CSS_SELECTOR_COUNT,context:b,message:a.jPlayer.warningMsg.CSS_SELECTOR_COUNT+this.ancestorJq.length+" found for cssSelectorAncestor.",hint:a.jPlayer.warningHint.CSS_SELECTOR_COUNT}),this._addUiClass(),a.each(this.options.cssSelector,function(a,b){c._cssSelector(a,b)}),this._updateInterface(),this._updateButtons(),this._updateAutohide(),this._updateVolume(),this._updateMute()},_cssSelector:function(b,c){var d=this;if("string"==typeof c)if(a.jPlayer.prototype.options.cssSelector[b]){if(this.css.jq[b]&&this.css.jq[b].length&&this.css.jq[b].unbind(".jPlayer"),this.options.cssSelector[b]=c,this.css.cs[b]=this.options.cssSelectorAncestor+" "+c,this.css.jq[b]=c?a(this.css.cs[b]):[],this.css.jq[b].length&&this[b]){var e=function(c){c.preventDefault(),d[b](c),d.options.autoBlur?a(this).blur():a(this).focus()};this.css.jq[b].bind("click.jPlayer",e)}c&&1!==this.css.jq[b].length&&this._warning({type:a.jPlayer.warning.CSS_SELECTOR_COUNT,context:this.css.cs[b],message:a.jPlayer.warningMsg.CSS_SELECTOR_COUNT+this.css.jq[b].length+" found for "+b+" method.",hint:a.jPlayer.warningHint.CSS_SELECTOR_COUNT})}else this._warning({type:a.jPlayer.warning.CSS_SELECTOR_METHOD,context:b,message:a.jPlayer.warningMsg.CSS_SELECTOR_METHOD,hint:a.jPlayer.warningHint.CSS_SELECTOR_METHOD});else this._warning({type:a.jPlayer.warning.CSS_SELECTOR_STRING,context:c,message:a.jPlayer.warningMsg.CSS_SELECTOR_STRING,hint:a.jPlayer.warningHint.CSS_SELECTOR_STRING})},duration:function(a){this.options.toggleDuration&&(this.options.captureDuration&&a.stopPropagation(),this._setOption("remainingDuration",!this.options.remainingDuration))},seekBar:function(b){if(this.css.jq.seekBar.length){var c=a(b.currentTarget),d=c.offset(),e=b.pageX-d.left,f=c.width(),g=100*e/f;this.playHead(g)}},playbackRate:function(a){this._setOption("playbackRate",a)},playbackRateBar:function(b){if(this.css.jq.playbackRateBar.length){var c,d,e=a(b.currentTarget),f=e.offset(),g=b.pageX-f.left,h=e.width(),i=e.height()-b.pageY+f.top,j=e.height();c=this.options.verticalPlaybackRate?i/j:g/h,d=c*(this.options.maxPlaybackRate-this.options.minPlaybackRate)+this.options.minPlaybackRate,this.playbackRate(d)}},_updatePlaybackRate:function(){var a=this.options.playbackRate,b=(a-this.options.minPlaybackRate)/(this.options.maxPlaybackRate-this.options.minPlaybackRate);this.status.playbackRateEnabled?(this.css.jq.playbackRateBar.length&&this.css.jq.playbackRateBar.show(),this.css.jq.playbackRateBarValue.length&&(this.css.jq.playbackRateBarValue.show(),this.css.jq.playbackRateBarValue[this.options.verticalPlaybackRate?"height":"width"](100*b+"%"))):(this.css.jq.playbackRateBar.length&&this.css.jq.playbackRateBar.hide(),this.css.jq.playbackRateBarValue.length&&this.css.jq.playbackRateBarValue.hide())},repeat:function(a){var b="object"==typeof a;this._loop(b&&this.options.useStateClassSkin&&this.options.loop?!1:!0)},repeatOff:function(){this._loop(!1)},_loop:function(b){this.options.loop!==b&&(this.options.loop=b,this._updateButtons(),this._trigger(a.jPlayer.event.repeat))},option:function(c,d){var e=c;if(0===arguments.length)return a.extend(!0,{},this.options);if("string"==typeof c){var f=c.split(".");if(d===b){for(var g=a.extend(!0,{},this.options),h=0;h0||Math.floor(d)>0):e=!0,a.internal.mouse={x:b.pageX,y:b.pageY},e&&a.css.jq.gui.fadeIn(a.options.autohide.fadeIn,function(){clearTimeout(a.internal.autohideId),a.internal.autohideId=setTimeout(function(){a.css.jq.gui.fadeOut(a.options.autohide.fadeOut)},a.options.autohide.hold)})};this.css.jq.gui.length&&(this.css.jq.gui.stop(!0,!0),clearTimeout(this.internal.autohideId),delete this.internal.mouse,this.element.unbind(c),this.css.jq.gui.unbind(c),this.status.nativeVideoControls?this.css.jq.gui.hide():this.options.fullWindow&&this.options.autohide.full||!this.options.fullWindow&&this.options.autohide.restored?(this.element.bind(d,e),this.css.jq.gui.bind(d,e),this.css.jq.gui.hide()):this.css.jq.gui.show())},fullScreen:function(a){var b="object"==typeof a;b&&this.options.useStateClassSkin&&this.options.fullScreen?this._setOption("fullScreen",!1):this._setOption("fullScreen",!0)},restoreScreen:function(){this._setOption("fullScreen",!1)},_fullscreenAddEventListeners:function(){var b=this,c=a.jPlayer.nativeFeatures.fullscreen;c.api.fullscreenEnabled&&c.event.fullscreenchange&&("function"!=typeof this.internal.fullscreenchangeHandler&&(this.internal.fullscreenchangeHandler=function(){b._fullscreenchange()}),document.addEventListener(c.event.fullscreenchange,this.internal.fullscreenchangeHandler,!1))},_fullscreenRemoveEventListeners:function(){var b=a.jPlayer.nativeFeatures.fullscreen;this.internal.fullscreenchangeHandler&&document.removeEventListener(b.event.fullscreenchange,this.internal.fullscreenchangeHandler,!1)},_fullscreenchange:function(){this.options.fullScreen&&!a.jPlayer.nativeFeatures.fullscreen.api.fullscreenElement()&&this._setOption("fullScreen",!1)},_requestFullscreen:function(){var b=this.ancestorJq.length?this.ancestorJq[0]:this.element[0],c=a.jPlayer.nativeFeatures.fullscreen;c.used.webkitVideo&&(b=this.htmlElement.video),c.api.fullscreenEnabled&&c.api.requestFullscreen(b)},_exitFullscreen:function(){var b,c=a.jPlayer.nativeFeatures.fullscreen;c.used.webkitVideo&&(b=this.htmlElement.video),c.api.fullscreenEnabled&&c.api.exitFullscreen(b)},_html_initMedia:function(b){var c=a(this.htmlElement.media).empty();a.each(b.track||[],function(a,b){var d=document.createElement("track");d.setAttribute("kind",b.kind?b.kind:""),d.setAttribute("src",b.src?b.src:""),d.setAttribute("srclang",b.srclang?b.srclang:""),d.setAttribute("label",b.label?b.label:""),b.def&&d.setAttribute("default",b.def),c.append(d)}),this.htmlElement.media.src=this.status.src,"none"!==this.options.preload&&this._html_load(),this._trigger(a.jPlayer.event.timeupdate)},_html_setFormat:function(b){var c=this;a.each(this.formats,function(a,d){return c.html.support[d]&&b[d]?(c.status.src=b[d],c.status.format[d]=!0,c.status.formatType=d,!1):void 0})},_html_setAudio:function(a){this._html_setFormat(a),this.htmlElement.media=this.htmlElement.audio,this._html_initMedia(a)},_html_setVideo:function(a){this._html_setFormat(a),this.status.nativeVideoControls&&(this.htmlElement.video.poster=this._validString(a.poster)?a.poster:""),this.htmlElement.media=this.htmlElement.video,this._html_initMedia(a)},_html_resetMedia:function(){this.htmlElement.media&&(this.htmlElement.media.id!==this.internal.video.id||this.status.nativeVideoControls||this.internal.video.jq.css({width:"0px",height:"0px"}),this.htmlElement.media.pause())},_html_clearMedia:function(){this.htmlElement.media&&(this.htmlElement.media.src="about:blank",this.htmlElement.media.load())},_html_load:function(){this.status.waitForLoad&&(this.status.waitForLoad=!1,this.htmlElement.media.load()),clearTimeout(this.internal.htmlDlyCmdId)},_html_play:function(a){var b=this,c=this.htmlElement.media;if(this.androidFix.pause=!1,this._html_load(),this.androidFix.setMedia)this.androidFix.play=!0,this.androidFix.time=a;else if(isNaN(a))c.play();else{this.internal.cmdsIgnored&&c.play();try{if(c.seekable&&!("object"==typeof c.seekable&&c.seekable.length>0))throw 1;c.currentTime=a,c.play()}catch(d){return void(this.internal.htmlDlyCmdId=setTimeout(function(){b.play(a)},250))}}this._html_checkWaitForPlay()},_html_pause:function(a){var b=this,c=this.htmlElement.media;if(this.androidFix.play=!1,a>0?this._html_load():clearTimeout(this.internal.htmlDlyCmdId),c.pause(),this.androidFix.setMedia)this.androidFix.pause=!0,this.androidFix.time=a;else if(!isNaN(a))try{if(c.seekable&&!("object"==typeof c.seekable&&c.seekable.length>0))throw 1;c.currentTime=a}catch(d){return void(this.internal.htmlDlyCmdId=setTimeout(function(){b.pause(a)},250))}a>0&&this._html_checkWaitForPlay()},_html_playHead:function(a){var b=this,c=this.htmlElement.media;this._html_load();try{if("object"==typeof c.seekable&&c.seekable.length>0)c.currentTime=a*c.seekable.end(c.seekable.length-1)/100;else{if(!(c.duration>0)||isNaN(c.duration))throw"e";c.currentTime=a*c.duration/100}}catch(d){return void(this.internal.htmlDlyCmdId=setTimeout(function(){b.playHead(a)},250))}this.status.waitForLoad||this._html_checkWaitForPlay()},_html_checkWaitForPlay:function(){this.status.waitForPlay&&(this.status.waitForPlay=!1,this.css.jq.videoPlay.length&&this.css.jq.videoPlay.hide(),this.status.video&&(this.internal.poster.jq.hide(),this.internal.video.jq.css({width:this.status.width,height:this.status.height})))},_html_setProperty:function(a,b){this.html.audio.available&&(this.htmlElement.audio[a]=b),this.html.video.available&&(this.htmlElement.video[a]=b)},_aurora_setAudio:function(b){var c=this;a.each(this.formats,function(a,d){return c.aurora.support[d]&&b[d]?(c.status.src=b[d],c.status.format[d]=!0,c.status.formatType=d,!1):void 0}),this.aurora.player=new AV.Player.fromURL(this.status.src),this._addAuroraEventListeners(this.aurora.player,this.aurora),"auto"===this.options.preload&&(this._aurora_load(),this.status.waitForLoad=!1)},_aurora_resetMedia:function(){this.aurora.player&&this.aurora.player.stop()},_aurora_clearMedia:function(){},_aurora_load:function(){this.status.waitForLoad&&(this.status.waitForLoad=!1,this.aurora.player.preload())},_aurora_play:function(b){this.status.waitForLoad||isNaN(b)||this.aurora.player.seek(b),this.aurora.player.playing||this.aurora.player.play(),this.status.waitForLoad=!1,this._aurora_checkWaitForPlay(),this._updateButtons(!0),this._trigger(a.jPlayer.event.play)},_aurora_pause:function(b){isNaN(b)||this.aurora.player.seek(1e3*b),this.aurora.player.pause(),b>0&&this._aurora_checkWaitForPlay(),this._updateButtons(!1),this._trigger(a.jPlayer.event.pause)},_aurora_playHead:function(a){this.aurora.player.duration>0&&this.aurora.player.seek(a*this.aurora.player.duration/100),this.status.waitForLoad||this._aurora_checkWaitForPlay()},_aurora_checkWaitForPlay:function(){this.status.waitForPlay&&(this.status.waitForPlay=!1)},_aurora_volume:function(a){this.aurora.player.volume=100*a},_aurora_mute:function(a){a?(this.aurora.properties.lastvolume=this.aurora.player.volume,this.aurora.player.volume=0):this.aurora.player.volume=this.aurora.properties.lastvolume,this.aurora.properties.muted=a},_flash_setAudio:function(b){var c=this;try{a.each(this.formats,function(a,d){if(c.flash.support[d]&&b[d]){switch(d){case"m4a":case"fla":c._getMovie().fl_setAudio_m4a(b[d]);break;case"mp3":c._getMovie().fl_setAudio_mp3(b[d]);break;case"rtmpa":c._getMovie().fl_setAudio_rtmp(b[d])}return c.status.src=b[d],c.status.format[d]=!0,c.status.formatType=d,!1}}),"auto"===this.options.preload&&(this._flash_load(),this.status.waitForLoad=!1)}catch(d){this._flashError(d)}},_flash_setVideo:function(b){var c=this;try{a.each(this.formats,function(a,d){if(c.flash.support[d]&&b[d]){switch(d){case"m4v":case"flv":c._getMovie().fl_setVideo_m4v(b[d]);break;case"rtmpv":c._getMovie().fl_setVideo_rtmp(b[d])}return c.status.src=b[d],c.status.format[d]=!0,c.status.formatType=d,!1}}),"auto"===this.options.preload&&(this._flash_load(),this.status.waitForLoad=!1)}catch(d){this._flashError(d)}},_flash_resetMedia:function(){this.internal.flash.jq.css({width:"0px",height:"0px"}),this._flash_pause(0/0)},_flash_clearMedia:function(){try{this._getMovie().fl_clearMedia()}catch(a){this._flashError(a)}},_flash_load:function(){try{this._getMovie().fl_load()}catch(a){this._flashError(a)}this.status.waitForLoad=!1},_flash_play:function(a){try{this._getMovie().fl_play(a)}catch(b){this._flashError(b)}this.status.waitForLoad=!1,this._flash_checkWaitForPlay()},_flash_pause:function(a){try{this._getMovie().fl_pause(a)}catch(b){this._flashError(b)}a>0&&(this.status.waitForLoad=!1,this._flash_checkWaitForPlay())},_flash_playHead:function(a){try{this._getMovie().fl_play_head(a)}catch(b){this._flashError(b)}this.status.waitForLoad||this._flash_checkWaitForPlay()},_flash_checkWaitForPlay:function(){this.status.waitForPlay&&(this.status.waitForPlay=!1,this.css.jq.videoPlay.length&&this.css.jq.videoPlay.hide(),this.status.video&&(this.internal.poster.jq.hide(),this.internal.flash.jq.css({width:this.status.width,height:this.status.height})))},_flash_volume:function(a){try{this._getMovie().fl_volume(a)}catch(b){this._flashError(b)}},_flash_mute:function(a){try{this._getMovie().fl_mute(a)}catch(b){this._flashError(b)}},_getMovie:function(){return document[this.internal.flash.id]},_getFlashPluginVersion:function(){var a,b=0;if(window.ActiveXObject)try{if(a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash")){var c=a.GetVariable("$version");c&&(c=c.split(" ")[1].split(","),b=parseInt(c[0],10)+"."+parseInt(c[1],10))}}catch(d){}else navigator.plugins&&navigator.mimeTypes.length>0&&(a=navigator.plugins["Shockwave Flash"],a&&(b=navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/,"$1")));return 1*b},_checkForFlash:function(a){var b=!1;return this._getFlashPluginVersion()>=a&&(b=!0),b},_validString:function(a){return a&&"string"==typeof a},_limitValue:function(a,b,c){return b>a?b:a>c?c:a},_urlNotSetError:function(b){this._error({type:a.jPlayer.error.URL_NOT_SET,context:b,message:a.jPlayer.errorMsg.URL_NOT_SET,hint:a.jPlayer.errorHint.URL_NOT_SET})},_flashError:function(b){var c;c=this.internal.ready?"FLASH_DISABLED":"FLASH",this._error({type:a.jPlayer.error[c],context:this.internal.flash.swf,message:a.jPlayer.errorMsg[c]+b.message,hint:a.jPlayer.errorHint[c]}),this.internal.flash.jq.css({width:"1px",height:"1px"})},_error:function(b){this._trigger(a.jPlayer.event.error,b),this.options.errorAlerts&&this._alert("Error!"+(b.message?"\n"+b.message:"")+(b.hint?"\n"+b.hint:"")+"\nContext: "+b.context)},_warning:function(c){this._trigger(a.jPlayer.event.warning,b,c),this.options.warningAlerts&&this._alert("Warning!"+(c.message?"\n"+c.message:"")+(c.hint?"\n"+c.hint:"")+"\nContext: "+c.context)},_alert:function(a){var b="jPlayer "+this.version.script+" : id='"+this.internal.self.id+"' : "+a;this.options.consoleAlerts?window.console&&window.console.log&&window.console.log(b):alert(b)},_emulateHtmlBridge:function(){var b=this;a.each(a.jPlayer.emulateMethods.split(/\s+/g),function(a,c){b.internal.domNode[c]=function(a){b[c](a)}}),a.each(a.jPlayer.event,function(c,d){var e=!0;a.each(a.jPlayer.reservedEvent.split(/\s+/g),function(a,b){return b===c?(e=!1,!1):void 0}),e&&b.element.bind(d+".jPlayer.jPlayerHtml",function(){b._emulateHtmlUpdate();var a=document.createEvent("Event");a.initEvent(c,!1,!0),b.internal.domNode.dispatchEvent(a)})})},_emulateHtmlUpdate:function(){var b=this;a.each(a.jPlayer.emulateStatus.split(/\s+/g),function(a,c){b.internal.domNode[c]=b.status[c]}),a.each(a.jPlayer.emulateOptions.split(/\s+/g),function(a,c){b.internal.domNode[c]=b.options[c]})},_destroyHtmlBridge:function(){var b=this;this.element.unbind(".jPlayerHtml");var c=a.jPlayer.emulateMethods+" "+a.jPlayer.emulateStatus+" "+a.jPlayer.emulateOptions;a.each(c.split(/\s+/g),function(a,c){delete b.internal.domNode[c]})}},a.jPlayer.error={FLASH:"e_flash",FLASH_DISABLED:"e_flash_disabled",NO_SOLUTION:"e_no_solution",NO_SUPPORT:"e_no_support",URL:"e_url",URL_NOT_SET:"e_url_not_set",VERSION:"e_version"},a.jPlayer.errorMsg={FLASH:"jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ",FLASH_DISABLED:"jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ",NO_SOLUTION:"No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.",NO_SUPPORT:"It is not possible to play any media format provided in setMedia() on this browser using your current options.",URL:"Media URL could not be loaded.",URL_NOT_SET:"Attempt to issue media playback commands, while no media url is set.",VERSION:"jPlayer "+a.jPlayer.prototype.version.script+" needs Jplayer.swf version "+a.jPlayer.prototype.version.needFlash+" but found "},a.jPlayer.errorHint={FLASH:"Check your swfPath option and that Jplayer.swf is there.",FLASH_DISABLED:"Check that you have not display:none; the jPlayer entity or any ancestor.",NO_SOLUTION:"Review the jPlayer options: support and supplied.",NO_SUPPORT:"Video or audio formats defined in the supplied option are missing.",URL:"Check media URL is valid.",URL_NOT_SET:"Use setMedia() to set the media URL.",VERSION:"Update jPlayer files."},a.jPlayer.warning={CSS_SELECTOR_COUNT:"e_css_selector_count",CSS_SELECTOR_METHOD:"e_css_selector_method",CSS_SELECTOR_STRING:"e_css_selector_string",OPTION_KEY:"e_option_key"},a.jPlayer.warningMsg={CSS_SELECTOR_COUNT:"The number of css selectors found did not equal one: ",CSS_SELECTOR_METHOD:"The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",CSS_SELECTOR_STRING:"The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.",OPTION_KEY:"The option requested in jPlayer('option') is undefined."},a.jPlayer.warningHint={CSS_SELECTOR_COUNT:"Check your css selector and the ancestor.",CSS_SELECTOR_METHOD:"Check your method name.",CSS_SELECTOR_STRING:"Check your css selector is a string.",OPTION_KEY:"Check your option name."}}); \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.swf b/core/vendor/filemanager/js/jPlayer/jplayer/jquery.jplayer.swf new file mode 100755 index 0000000000000000000000000000000000000000..340f7f98d0d363bafa787e2bcc7422e15fb7f41c GIT binary patch literal 13714 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 Kh=yOW5&svT>H|gq literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/jquery.jplayer/Jplayer.swf b/core/vendor/filemanager/js/jPlayer/jquery.jplayer/Jplayer.swf new file mode 100755 index 0000000000000000000000000000000000000000..85c0ba38eede8cabc9b85603c2239082a548f549 GIT binary patch literal 14085 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'; + + var paramStr = [ + '', + '', + '', + '', + '' + ]; + + htmlObj = document.createElement(objStr); + for(var i=0; i < paramStr.length; i++) { + htmlObj.appendChild(document.createElement(paramStr[i])); + } + } else { + var createParam = function(el, n, v) { + var p = document.createElement("param"); + p.setAttribute("name", n); + p.setAttribute("value", v); + el.appendChild(p); + }; + + htmlObj = document.createElement("object"); + htmlObj.setAttribute("id", this.internal.flash.id); + htmlObj.setAttribute("name", this.internal.flash.id); + htmlObj.setAttribute("data", this.internal.flash.swf); + htmlObj.setAttribute("type", "application/x-shockwave-flash"); + htmlObj.setAttribute("width", "1"); // Non-zero + htmlObj.setAttribute("height", "1"); // Non-zero + htmlObj.setAttribute("tabindex", "-1"); + createParam(htmlObj, "flashvars", flashVars); + createParam(htmlObj, "allowscriptaccess", "always"); + createParam(htmlObj, "bgcolor", this.options.backgroundColor); + createParam(htmlObj, "wmode", this.options.wmode); + } + + this.element.append(htmlObj); + this.internal.flash.jq = $(htmlObj); + } + + // Add the HTML solution if being used. + if(this.html.used) { + + // The HTML Audio handlers + if(this.html.audio.available) { + this._addHtmlEventListeners(this.htmlElement.audio, this.html.audio); + this.element.append(this.htmlElement.audio); + this.internal.audio.jq = $("#" + this.internal.audio.id); + } + + // The HTML Video handlers + if(this.html.video.available) { + this._addHtmlEventListeners(this.htmlElement.video, this.html.video); + this.element.append(this.htmlElement.video); + this.internal.video.jq = $("#" + this.internal.video.id); + if(this.status.nativeVideoControls) { + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } else { + this.internal.video.jq.css({'width':'0px', 'height':'0px'}); // Using size 0x0 since a .hide() causes issues in iOS + } + this.internal.video.jq.bind("click.jPlayer", function() { + self._trigger($.jPlayer.event.click); + }); + } + } + + // Create the bridge that emulates the HTML Media element on the jPlayer DIV + if( this.options.emulateHtml ) { + this._emulateHtmlBridge(); + } + + if(this.html.used && !this.flash.used) { // If only HTML, then emulate flash ready() call after 100ms. + setTimeout( function() { + self.internal.ready = true; + self.version.flash = "n/a"; + self._trigger($.jPlayer.event.repeat); // Trigger the repeat event so its handler can initialize itself with the loop option. + self._trigger($.jPlayer.event.ready); + }, 100); + } + + // Initialize the interface components with the options. + this._updateNativeVideoControls(); + // The other controls are now setup in _cssSelectorAncestor() + if(this.css.jq.videoPlay.length) { + this.css.jq.videoPlay.hide(); + } + + $.jPlayer.prototype.count++; // Change static variable via prototype. + }, + destroy: function() { + // MJP: The background change remains. Would need to store the original to restore it correctly. + // MJP: The jPlayer element's size change remains. + + // Clear the media to reset the GUI and stop any downloads. Streams on some browsers had persited. (Chrome) + this.clearMedia(); + // Remove the size/sizeFull cssClass from the cssSelectorAncestor + this._removeUiClass(); + // Remove the times from the GUI + if(this.css.jq.currentTime.length) { + this.css.jq.currentTime.text(""); + } + if(this.css.jq.duration.length) { + this.css.jq.duration.text(""); + } + // Remove any bindings from the interface controls. + $.each(this.css.jq, function(fn, jq) { + // Check selector is valid before trying to execute method. + if(jq.length) { + jq.unbind(".jPlayer"); + } + }); + // Remove the click handlers for $.jPlayer.event.click + this.internal.poster.jq.unbind(".jPlayer"); + if(this.internal.video.jq) { + this.internal.video.jq.unbind(".jPlayer"); + } + // Remove the fullscreen event handlers + this._fullscreenRemoveEventListeners(); + // Remove key bindings + if(this === $.jPlayer.focus) { + $.jPlayer.focus = null; + } + // Destroy the HTML bridge. + if(this.options.emulateHtml) { + this._destroyHtmlBridge(); + } + this.element.removeData("jPlayer"); // Remove jPlayer data + this.element.unbind(".jPlayer"); // Remove all event handlers created by the jPlayer constructor + this.element.empty(); // Remove the inserted child elements + + delete this.instances[this.internal.instance]; // Clear the instance on the static instance object + }, + enable: function() { // Plan to implement + // options.disabled = false + }, + disable: function () { // Plan to implement + // options.disabled = true + }, + _testCanPlayType: function(elem) { + // IE9 on Win Server 2008 did not implement canPlayType(), but it has the property. + try { + elem.canPlayType(this.format.mp3.codec); // The type is irrelevant. + return true; + } catch(err) { + return false; + } + }, + _uaBlocklist: function(list) { + // list : object with properties that are all regular expressions. Property names are irrelevant. + // Returns true if the user agent is matched in list. + var ua = navigator.userAgent.toLowerCase(), + block = false; + + $.each(list, function(p, re) { + if(re && re.test(ua)) { + block = true; + return false; // exit $.each. + } + }); + return block; + }, + _restrictNativeVideoControls: function() { + // Fallback to noFullWindow when nativeVideoControls is true and audio media is being used. Affects when both media types are used. + if(this.require.audio) { + if(this.status.nativeVideoControls) { + this.status.nativeVideoControls = false; + this.status.noFullWindow = true; + } + } + }, + _updateNativeVideoControls: function() { + if(this.html.video.available && this.html.used) { + // Turn the HTML Video controls on/off + this.htmlElement.video.controls = this.status.nativeVideoControls; + // Show/hide the jPlayer GUI. + this._updateAutohide(); + // For when option changed. The poster image is not updated, as it is dealt with in setMedia(). Acceptable degradation since seriously doubt these options will change on the fly. Can again review later. + if(this.status.nativeVideoControls && this.require.video) { + this.internal.poster.jq.hide(); + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } else if(this.status.waitForPlay && this.status.video) { + this.internal.poster.jq.show(); + this.internal.video.jq.css({'width': '0px', 'height': '0px'}); + } + } + }, + _addHtmlEventListeners: function(mediaElement, entity) { + var self = this; + mediaElement.preload = this.options.preload; + mediaElement.muted = this.options.muted; + mediaElement.volume = this.options.volume; + + // Create the event listeners + // Only want the active entity to affect jPlayer and bubble events. + // Using entity.gate so that object is referenced and gate property always current + + mediaElement.addEventListener("progress", function() { + if(entity.gate) { + if(self.internal.cmdsIgnored && this.readyState > 0) { // Detect iOS executed the command + self.internal.cmdsIgnored = false; + } + self._getHtmlStatus(mediaElement); + self._updateInterface(); + self._trigger($.jPlayer.event.progress); + } + }, false); + mediaElement.addEventListener("timeupdate", function() { + if(entity.gate) { + self._getHtmlStatus(mediaElement); + self._updateInterface(); + self._trigger($.jPlayer.event.timeupdate); + } + }, false); + mediaElement.addEventListener("durationchange", function() { + if(entity.gate) { + self._getHtmlStatus(mediaElement); + self._updateInterface(); + self._trigger($.jPlayer.event.durationchange); + } + }, false); + mediaElement.addEventListener("play", function() { + if(entity.gate) { + self._updateButtons(true); + self._html_checkWaitForPlay(); // So the native controls update this variable and puts the hidden interface in the correct state. Affects toggling native controls. + self._trigger($.jPlayer.event.play); + } + }, false); + mediaElement.addEventListener("playing", function() { + if(entity.gate) { + self._updateButtons(true); + self._seeked(); + self._trigger($.jPlayer.event.playing); + } + }, false); + mediaElement.addEventListener("pause", function() { + if(entity.gate) { + self._updateButtons(false); + self._trigger($.jPlayer.event.pause); + } + }, false); + mediaElement.addEventListener("waiting", function() { + if(entity.gate) { + self._seeking(); + self._trigger($.jPlayer.event.waiting); + } + }, false); + mediaElement.addEventListener("seeking", function() { + if(entity.gate) { + self._seeking(); + self._trigger($.jPlayer.event.seeking); + } + }, false); + mediaElement.addEventListener("seeked", function() { + if(entity.gate) { + self._seeked(); + self._trigger($.jPlayer.event.seeked); + } + }, false); + mediaElement.addEventListener("volumechange", function() { + if(entity.gate) { + // Read the values back from the element as the Blackberry PlayBook shares the volume with the physical buttons master volume control. + // However, when tested 6th July 2011, those buttons do not generate an event. The physical play/pause button does though. + self.options.volume = mediaElement.volume; + self.options.muted = mediaElement.muted; + self._updateMute(); + self._updateVolume(); + self._trigger($.jPlayer.event.volumechange); + } + }, false); + mediaElement.addEventListener("suspend", function() { // Seems to be the only way of capturing that the iOS4 browser did not actually play the media from the page code. ie., It needs a user gesture. + if(entity.gate) { + self._seeked(); + self._trigger($.jPlayer.event.suspend); + } + }, false); + mediaElement.addEventListener("ended", function() { + if(entity.gate) { + // Order of the next few commands are important. Change the time and then pause. + // Solves a bug in Firefox, where issuing pause 1st causes the media to play from the start. ie., The pause is ignored. + if(!$.jPlayer.browser.webkit) { // Chrome crashes if you do this in conjunction with a setMedia command in an ended event handler. ie., The playlist demo. + self.htmlElement.media.currentTime = 0; // Safari does not care about this command. ie., It works with or without this line. (Both Safari and Chrome are Webkit.) + } + self.htmlElement.media.pause(); // Pause otherwise a click on the progress bar will play from that point, when it shouldn't, since it stopped playback. + self._updateButtons(false); + self._getHtmlStatus(mediaElement, true); // With override true. Otherwise Chrome leaves progress at full. + self._updateInterface(); + self._trigger($.jPlayer.event.ended); + } + }, false); + mediaElement.addEventListener("error", function() { + if(entity.gate) { + self._updateButtons(false); + self._seeked(); + if(self.status.srcSet) { // Deals with case of clearMedia() causing an error event. + clearTimeout(self.internal.htmlDlyCmdId); // Clears any delayed commands used in the HTML solution. + self.status.waitForLoad = true; // Allows the load operation to try again. + self.status.waitForPlay = true; // Reset since a play was captured. + if(self.status.video && !self.status.nativeVideoControls) { + self.internal.video.jq.css({'width':'0px', 'height':'0px'}); + } + if(self._validString(self.status.media.poster) && !self.status.nativeVideoControls) { + self.internal.poster.jq.show(); + } + if(self.css.jq.videoPlay.length) { + self.css.jq.videoPlay.show(); + } + self._error( { + type: $.jPlayer.error.URL, + context: self.status.src, // this.src shows absolute urls. Want context to show the url given. + message: $.jPlayer.errorMsg.URL, + hint: $.jPlayer.errorHint.URL + }); + } + } + }, false); + // Create all the other event listeners that bubble up to a jPlayer event from html, without being used by jPlayer. + $.each($.jPlayer.htmlEvent, function(i, eventType) { + mediaElement.addEventListener(this, function() { + if(entity.gate) { + self._trigger($.jPlayer.event[eventType]); + } + }, false); + }); + }, + _getHtmlStatus: function(media, override) { + var ct = 0, cpa = 0, sp = 0, cpr = 0; + + // Fixes the duration bug in iOS, where the durationchange event occurs when media.duration is not always correct. + // Fixes the initial duration bug in BB OS7, where the media.duration is infinity and displays as NaN:NaN due to Date() using inifity. + if(isFinite(media.duration)) { + this.status.duration = media.duration; + } + + ct = media.currentTime; + cpa = (this.status.duration > 0) ? 100 * ct / this.status.duration : 0; + if((typeof media.seekable === "object") && (media.seekable.length > 0)) { + sp = (this.status.duration > 0) ? 100 * media.seekable.end(media.seekable.length-1) / this.status.duration : 100; + cpr = (this.status.duration > 0) ? 100 * media.currentTime / media.seekable.end(media.seekable.length-1) : 0; // Duration conditional for iOS duration bug. ie., seekable.end is a NaN in that case. + } else { + sp = 100; + cpr = cpa; + } + + if(override) { + ct = 0; + cpr = 0; + cpa = 0; + } + + this.status.seekPercent = sp; + this.status.currentPercentRelative = cpr; + this.status.currentPercentAbsolute = cpa; + this.status.currentTime = ct; + + this.status.videoWidth = media.videoWidth; + this.status.videoHeight = media.videoHeight; + + this.status.readyState = media.readyState; + this.status.networkState = media.networkState; + this.status.playbackRate = media.playbackRate; + this.status.ended = media.ended; + }, + _resetStatus: function() { + this.status = $.extend({}, this.status, $.jPlayer.prototype.status); // Maintains the status properties that persist through a reset. + }, + _trigger: function(eventType, error, warning) { // eventType always valid as called using $.jPlayer.event.eventType + var event = $.Event(eventType); + event.jPlayer = {}; + event.jPlayer.version = $.extend({}, this.version); + event.jPlayer.options = $.extend(true, {}, this.options); // Deep copy + event.jPlayer.status = $.extend(true, {}, this.status); // Deep copy + event.jPlayer.html = $.extend(true, {}, this.html); // Deep copy + event.jPlayer.flash = $.extend(true, {}, this.flash); // Deep copy + if(error) { + event.jPlayer.error = $.extend({}, error); + } + if(warning) { + event.jPlayer.warning = $.extend({}, warning); + } + this.element.trigger(event); + }, + jPlayerFlashEvent: function(eventType, status) { // Called from Flash + if(eventType === $.jPlayer.event.ready) { + if(!this.internal.ready) { + this.internal.ready = true; + this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); // Once Flash generates the ready event, minimise to zero as it is not affected by wmode anymore. + + this.version.flash = status.version; + if(this.version.needFlash !== this.version.flash) { + this._error( { + type: $.jPlayer.error.VERSION, + context: this.version.flash, + message: $.jPlayer.errorMsg.VERSION + this.version.flash, + hint: $.jPlayer.errorHint.VERSION + }); + } + this._trigger($.jPlayer.event.repeat); // Trigger the repeat event so its handler can initialize itself with the loop option. + this._trigger(eventType); + } else { + // This condition occurs if the Flash is hidden and then shown again. + // Firefox also reloads the Flash if the CSS position changes. position:fixed is used for full screen. + + // Only do this if the Flash is the solution being used at the moment. Affects Media players where both solution may be being used. + if(this.flash.gate) { + + // Send the current status to the Flash now that it is ready (available) again. + if(this.status.srcSet) { + + // Need to read original status before issuing the setMedia command. + var currentTime = this.status.currentTime, + paused = this.status.paused; + + this.setMedia(this.status.media); + if(currentTime > 0) { + if(paused) { + this.pause(currentTime); + } else { + this.play(currentTime); + } + } + } + this._trigger($.jPlayer.event.flashreset); + } + } + } + if(this.flash.gate) { + switch(eventType) { + case $.jPlayer.event.progress: + this._getFlashStatus(status); + this._updateInterface(); + this._trigger(eventType); + break; + case $.jPlayer.event.timeupdate: + this._getFlashStatus(status); + this._updateInterface(); + this._trigger(eventType); + break; + case $.jPlayer.event.play: + this._seeked(); + this._updateButtons(true); + this._trigger(eventType); + break; + case $.jPlayer.event.pause: + this._updateButtons(false); + this._trigger(eventType); + break; + case $.jPlayer.event.ended: + this._updateButtons(false); + this._trigger(eventType); + break; + case $.jPlayer.event.click: + this._trigger(eventType); // This could be dealt with by the default + break; + case $.jPlayer.event.error: + this.status.waitForLoad = true; // Allows the load operation to try again. + this.status.waitForPlay = true; // Reset since a play was captured. + if(this.status.video) { + this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); + } + if(this._validString(this.status.media.poster)) { + this.internal.poster.jq.show(); + } + if(this.css.jq.videoPlay.length && this.status.video) { + this.css.jq.videoPlay.show(); + } + if(this.status.video) { // Set up for another try. Execute before error event. + this._flash_setVideo(this.status.media); + } else { + this._flash_setAudio(this.status.media); + } + this._updateButtons(false); + this._error( { + type: $.jPlayer.error.URL, + context:status.src, + message: $.jPlayer.errorMsg.URL, + hint: $.jPlayer.errorHint.URL + }); + break; + case $.jPlayer.event.seeking: + this._seeking(); + this._trigger(eventType); + break; + case $.jPlayer.event.seeked: + this._seeked(); + this._trigger(eventType); + break; + case $.jPlayer.event.ready: + // The ready event is handled outside the switch statement. + // Captured here otherwise 2 ready events would be generated if the ready event handler used setMedia. + break; + default: + this._trigger(eventType); + } + } + return false; + }, + _getFlashStatus: function(status) { + this.status.seekPercent = status.seekPercent; + this.status.currentPercentRelative = status.currentPercentRelative; + this.status.currentPercentAbsolute = status.currentPercentAbsolute; + this.status.currentTime = status.currentTime; + this.status.duration = status.duration; + + this.status.videoWidth = status.videoWidth; + this.status.videoHeight = status.videoHeight; + + // The Flash does not generate this information in this release + this.status.readyState = 4; // status.readyState; + this.status.networkState = 0; // status.networkState; + this.status.playbackRate = 1; // status.playbackRate; + this.status.ended = false; // status.ended; + }, + _updateButtons: function(playing) { + if(playing === undefined) { + playing = !this.status.paused; + } else { + this.status.paused = !playing; + } + if(this.css.jq.play.length && this.css.jq.pause.length) { + if(playing) { + this.css.jq.play.hide(); + this.css.jq.pause.show(); + } else { + this.css.jq.play.show(); + this.css.jq.pause.hide(); + } + } + if(this.css.jq.restoreScreen.length && this.css.jq.fullScreen.length) { + if(this.status.noFullWindow) { + this.css.jq.fullScreen.hide(); + this.css.jq.restoreScreen.hide(); + } else if(this.options.fullWindow) { + this.css.jq.fullScreen.hide(); + this.css.jq.restoreScreen.show(); + } else { + this.css.jq.fullScreen.show(); + this.css.jq.restoreScreen.hide(); + } + } + if(this.css.jq.repeat.length && this.css.jq.repeatOff.length) { + if(this.options.loop) { + this.css.jq.repeat.hide(); + this.css.jq.repeatOff.show(); + } else { + this.css.jq.repeat.show(); + this.css.jq.repeatOff.hide(); + } + } + }, + _updateInterface: function() { + if(this.css.jq.seekBar.length) { + this.css.jq.seekBar.width(this.status.seekPercent+"%"); + } + if(this.css.jq.playBar.length) { + if(this.options.smoothPlayBar) { + this.css.jq.playBar.stop().animate({ + width: this.status.currentPercentAbsolute+"%" + }, 250, "linear"); + } else { + this.css.jq.playBar.width(this.status.currentPercentRelative+"%"); + } + } + if(this.css.jq.currentTime.length) { + this.css.jq.currentTime.text(this._convertTime(this.status.currentTime)); + } + if(this.css.jq.duration.length) { + this.css.jq.duration.text(this._convertTime(this.status.duration)); + } + }, + _convertTime: ConvertTime.prototype.time, + _seeking: function() { + if(this.css.jq.seekBar.length) { + this.css.jq.seekBar.addClass("jp-seeking-bg"); + } + }, + _seeked: function() { + if(this.css.jq.seekBar.length) { + this.css.jq.seekBar.removeClass("jp-seeking-bg"); + } + }, + _resetGate: function() { + this.html.audio.gate = false; + this.html.video.gate = false; + this.flash.gate = false; + }, + _resetActive: function() { + this.html.active = false; + this.flash.active = false; + }, + setMedia: function(media) { + + /* media[format] = String: URL of format. Must contain all of the supplied option's video or audio formats. + * media.poster = String: Video poster URL. + * media.subtitles = String: * NOT IMPLEMENTED * URL of subtitles SRT file + * media.chapters = String: * NOT IMPLEMENTED * URL of chapters SRT file + * media.stream = Boolean: * NOT IMPLEMENTED * Designating actual media streams. ie., "false/undefined" for files. Plan to refresh the flash every so often. + */ + + var self = this, + supported = false, + posterChanged = this.status.media.poster !== media.poster; // Compare before reset. Important for OSX Safari as this.htmlElement.poster.src is absolute, even if original poster URL was relative. + + this._resetMedia(); + this._resetGate(); + this._resetActive(); + + $.each(this.formats, function(formatPriority, format) { + var isVideo = self.format[format].media === 'video'; + $.each(self.solutions, function(solutionPriority, solution) { + if(self[solution].support[format] && self._validString(media[format])) { // Format supported in solution and url given for format. + var isHtml = solution === 'html'; + + if(isVideo) { + if(isHtml) { + self.html.video.gate = true; + self._html_setVideo(media); + self.html.active = true; + } else { + self.flash.gate = true; + self._flash_setVideo(media); + self.flash.active = true; + } + if(self.css.jq.videoPlay.length) { + self.css.jq.videoPlay.show(); + } + self.status.video = true; + } else { + if(isHtml) { + self.html.audio.gate = true; + self._html_setAudio(media); + self.html.active = true; + } else { + self.flash.gate = true; + self._flash_setAudio(media); + self.flash.active = true; + } + if(self.css.jq.videoPlay.length) { + self.css.jq.videoPlay.hide(); + } + self.status.video = false; + } + + supported = true; + return false; // Exit $.each + } + }); + if(supported) { + return false; // Exit $.each + } + }); + + if(supported) { + if(!(this.status.nativeVideoControls && this.html.video.gate)) { + // Set poster IMG if native video controls are not being used + // Note: With IE the IMG onload event occurs immediately when cached. + // Note: Poster hidden by default in _resetMedia() + if(this._validString(media.poster)) { + if(posterChanged) { // Since some browsers do not generate img onload event. + this.htmlElement.poster.src = media.poster; + } else { + this.internal.poster.jq.show(); + } + } + } + this.status.srcSet = true; + this.status.media = $.extend({}, media); + this._updateButtons(false); + this._updateInterface(); + } else { // jPlayer cannot support any formats provided in this browser + // Send an error event + this._error( { + type: $.jPlayer.error.NO_SUPPORT, + context: "{supplied:'" + this.options.supplied + "'}", + message: $.jPlayer.errorMsg.NO_SUPPORT, + hint: $.jPlayer.errorHint.NO_SUPPORT + }); + } + }, + _resetMedia: function() { + this._resetStatus(); + this._updateButtons(false); + this._updateInterface(); + this._seeked(); + this.internal.poster.jq.hide(); + + clearTimeout(this.internal.htmlDlyCmdId); + + if(this.html.active) { + this._html_resetMedia(); + } else if(this.flash.active) { + this._flash_resetMedia(); + } + }, + clearMedia: function() { + this._resetMedia(); + + if(this.html.active) { + this._html_clearMedia(); + } else if(this.flash.active) { + this._flash_clearMedia(); + } + + this._resetGate(); + this._resetActive(); + }, + load: function() { + if(this.status.srcSet) { + if(this.html.active) { + this._html_load(); + } else if(this.flash.active) { + this._flash_load(); + } + } else { + this._urlNotSetError("load"); + } + }, + focus: function() { + if(this.options.keyEnabled) { + $.jPlayer.focus = this; + } + }, + play: function(time) { + time = (typeof time === "number") ? time : NaN; // Remove jQuery event from click handler + if(this.status.srcSet) { + this.focus(); + if(this.html.active) { + this._html_play(time); + } else if(this.flash.active) { + this._flash_play(time); + } + } else { + this._urlNotSetError("play"); + } + }, + videoPlay: function() { // Handles clicks on the play button over the video poster + this.play(); + }, + pause: function(time) { + time = (typeof time === "number") ? time : NaN; // Remove jQuery event from click handler + if(this.status.srcSet) { + if(this.html.active) { + this._html_pause(time); + } else if(this.flash.active) { + this._flash_pause(time); + } + } else { + this._urlNotSetError("pause"); + } + }, + pauseOthers: function() { + var self = this; + $.each(this.instances, function(i, element) { + if(self.element !== element) { // Do not this instance. + if(element.data("jPlayer").status.srcSet) { // Check that media is set otherwise would cause error event. + element.jPlayer("pause"); + } + } + }); + }, + stop: function() { + if(this.status.srcSet) { + if(this.html.active) { + this._html_pause(0); + } else if(this.flash.active) { + this._flash_pause(0); + } + } else { + this._urlNotSetError("stop"); + } + }, + playHead: function(p) { + p = this._limitValue(p, 0, 100); + if(this.status.srcSet) { + if(this.html.active) { + this._html_playHead(p); + } else if(this.flash.active) { + this._flash_playHead(p); + } + } else { + this._urlNotSetError("playHead"); + } + }, + _muted: function(muted) { + this.options.muted = muted; + if(this.html.used) { + this._html_mute(muted); + } + if(this.flash.used) { + this._flash_mute(muted); + } + + // The HTML solution generates this event from the media element itself. + if(!this.html.video.gate && !this.html.audio.gate) { + this._updateMute(muted); + this._updateVolume(this.options.volume); + this._trigger($.jPlayer.event.volumechange); + } + }, + mute: function(mute) { // mute is either: undefined (true), an event object (true) or a boolean (muted). + mute = mute === undefined ? true : !!mute; + this._muted(mute); + }, + unmute: function(unmute) { // unmute is either: undefined (true), an event object (true) or a boolean (!muted). + unmute = unmute === undefined ? true : !!unmute; + this._muted(!unmute); + }, + _updateMute: function(mute) { + if(mute === undefined) { + mute = this.options.muted; + } + if(this.css.jq.mute.length && this.css.jq.unmute.length) { + if(this.status.noVolume) { + this.css.jq.mute.hide(); + this.css.jq.unmute.hide(); + } else if(mute) { + this.css.jq.mute.hide(); + this.css.jq.unmute.show(); + } else { + this.css.jq.mute.show(); + this.css.jq.unmute.hide(); + } + } + }, + volume: function(v) { + v = this._limitValue(v, 0, 1); + this.options.volume = v; + + if(this.html.used) { + this._html_volume(v); + } + if(this.flash.used) { + this._flash_volume(v); + } + + // The HTML solution generates this event from the media element itself. + if(!this.html.video.gate && !this.html.audio.gate) { + this._updateVolume(v); + this._trigger($.jPlayer.event.volumechange); + } + }, + volumeBar: function(e) { // Handles clicks on the volumeBar + if(this.css.jq.volumeBar.length) { + // Using $(e.currentTarget) to enable multiple volume bars + var $bar = $(e.currentTarget), + offset = $bar.offset(), + x = e.pageX - offset.left, + w = $bar.width(), + y = $bar.height() - e.pageY + offset.top, + h = $bar.height(); + if(this.options.verticalVolume) { + this.volume(y/h); + } else { + this.volume(x/w); + } + } + if(this.options.muted) { + this._muted(false); + } + }, + volumeBarValue: function() { // Handles clicks on the volumeBarValue + // The volumeBar handles this event as the event propagates up the DOM. + }, + _updateVolume: function(v) { + if(v === undefined) { + v = this.options.volume; + } + v = this.options.muted ? 0 : v; + + if(this.status.noVolume) { + if(this.css.jq.volumeBar.length) { + this.css.jq.volumeBar.hide(); + } + if(this.css.jq.volumeBarValue.length) { + this.css.jq.volumeBarValue.hide(); + } + if(this.css.jq.volumeMax.length) { + this.css.jq.volumeMax.hide(); + } + } else { + if(this.css.jq.volumeBar.length) { + this.css.jq.volumeBar.show(); + } + if(this.css.jq.volumeBarValue.length) { + this.css.jq.volumeBarValue.show(); + this.css.jq.volumeBarValue[this.options.verticalVolume ? "height" : "width"]((v*100)+"%"); + } + if(this.css.jq.volumeMax.length) { + this.css.jq.volumeMax.show(); + } + } + }, + volumeMax: function() { // Handles clicks on the volume max + this.volume(1); + if(this.options.muted) { + this._muted(false); + } + }, + _cssSelectorAncestor: function(ancestor) { + var self = this; + this.options.cssSelectorAncestor = ancestor; + this._removeUiClass(); + this.ancestorJq = ancestor ? $(ancestor) : []; // Would use $() instead of [], but it is only 1.4+ + if(ancestor && this.ancestorJq.length !== 1) { // So empty strings do not generate the warning. + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_COUNT, + context: ancestor, + message: $.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.ancestorJq.length + " found for cssSelectorAncestor.", + hint: $.jPlayer.warningHint.CSS_SELECTOR_COUNT + }); + } + this._addUiClass(); + $.each(this.options.cssSelector, function(fn, cssSel) { + self._cssSelector(fn, cssSel); + }); + + // Set the GUI to the current state. + this._updateInterface(); + this._updateButtons(); + this._updateAutohide(); + this._updateVolume(); + this._updateMute(); + }, + _cssSelector: function(fn, cssSel) { + var self = this; + if(typeof cssSel === 'string') { + if($.jPlayer.prototype.options.cssSelector[fn]) { + if(this.css.jq[fn] && this.css.jq[fn].length) { + this.css.jq[fn].unbind(".jPlayer"); + } + this.options.cssSelector[fn] = cssSel; + this.css.cs[fn] = this.options.cssSelectorAncestor + " " + cssSel; + + if(cssSel) { // Checks for empty string + this.css.jq[fn] = $(this.css.cs[fn]); + } else { + this.css.jq[fn] = []; // To comply with the css.jq[fn].length check before its use. As of jQuery 1.4 could have used $() for an empty set. + } + + if(this.css.jq[fn].length) { + var handler = function(e) { + e.preventDefault(); + self[fn](e); + $(this).blur(); + }; + this.css.jq[fn].bind("click.jPlayer", handler); // Using jPlayer namespace + } + + if(cssSel && this.css.jq[fn].length !== 1) { // So empty strings do not generate the warning. ie., they just remove the old one. + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_COUNT, + context: this.css.cs[fn], + message: $.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.css.jq[fn].length + " found for " + fn + " method.", + hint: $.jPlayer.warningHint.CSS_SELECTOR_COUNT + }); + } + } else { + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_METHOD, + context: fn, + message: $.jPlayer.warningMsg.CSS_SELECTOR_METHOD, + hint: $.jPlayer.warningHint.CSS_SELECTOR_METHOD + }); + } + } else { + this._warning( { + type: $.jPlayer.warning.CSS_SELECTOR_STRING, + context: cssSel, + message: $.jPlayer.warningMsg.CSS_SELECTOR_STRING, + hint: $.jPlayer.warningHint.CSS_SELECTOR_STRING + }); + } + }, + seekBar: function(e) { // Handles clicks on the seekBar + if(this.css.jq.seekBar.length) { + // Using $(e.currentTarget) to enable multiple seek bars + var $bar = $(e.currentTarget), + offset = $bar.offset(), + x = e.pageX - offset.left, + w = $bar.width(), + p = 100 * x / w; + this.playHead(p); + } + }, + playBar: function() { // Handles clicks on the playBar + // The seekBar handles this event as the event propagates up the DOM. + }, + repeat: function() { // Handle clicks on the repeat button + this._loop(true); + }, + repeatOff: function() { // Handle clicks on the repeatOff button + this._loop(false); + }, + _loop: function(loop) { + if(this.options.loop !== loop) { + this.options.loop = loop; + this._updateButtons(); + this._trigger($.jPlayer.event.repeat); + } + }, + + // Plan to review the cssSelector method to cope with missing associated functions accordingly. + + currentTime: function() { // Handles clicks on the text + // Added to avoid errors using cssSelector system for the text + }, + duration: function() { // Handles clicks on the text + // Added to avoid errors using cssSelector system for the text + }, + gui: function() { // Handles clicks on the gui + // Added to avoid errors using cssSelector system for the gui + }, + noSolution: function() { // Handles clicks on the error message + // Added to avoid errors using cssSelector system for no-solution + }, + + // Options code adapted from ui.widget.js (1.8.7). Made changes so the key can use dot notation. To match previous getData solution in jPlayer 1. + option: function(key, value) { + var options = key; + + // Enables use: options(). Returns a copy of options object + if ( arguments.length === 0 ) { + return $.extend( true, {}, this.options ); + } + + if(typeof key === "string") { + var keys = key.split("."); + + // Enables use: options("someOption") Returns a copy of the option. Supports dot notation. + if(value === undefined) { + + var opt = $.extend(true, {}, this.options); + for(var i = 0; i < keys.length; i++) { + if(opt[keys[i]] !== undefined) { + opt = opt[keys[i]]; + } else { + this._warning( { + type: $.jPlayer.warning.OPTION_KEY, + context: key, + message: $.jPlayer.warningMsg.OPTION_KEY, + hint: $.jPlayer.warningHint.OPTION_KEY + }); + return undefined; + } + } + return opt; + } + + // Enables use: options("someOptionObject", someObject}). Creates: {someOptionObject:someObject} + // Enables use: options("someOption", someValue). Creates: {someOption:someValue} + // Enables use: options("someOptionObject.someOption", someValue). Creates: {someOptionObject:{someOption:someValue}} + + options = {}; + var opts = options; + + for(var j = 0; j < keys.length; j++) { + if(j < keys.length - 1) { + opts[keys[j]] = {}; + opts = opts[keys[j]]; + } else { + opts[keys[j]] = value; + } + } + } + + // Otherwise enables use: options(optionObject). Uses original object (the key) + + this._setOptions(options); + + return this; + }, + _setOptions: function(options) { + var self = this; + $.each(options, function(key, value) { // This supports the 2 level depth that the options of jPlayer has. Would review if we ever need more depth. + self._setOption(key, value); + }); + + return this; + }, + _setOption: function(key, value) { + var self = this; + + // The ability to set options is limited at this time. + + switch(key) { + case "volume" : + this.volume(value); + break; + case "muted" : + this._muted(value); + break; + case "cssSelectorAncestor" : + this._cssSelectorAncestor(value); // Set and refresh all associations for the new ancestor. + break; + case "cssSelector" : + $.each(value, function(fn, cssSel) { + self._cssSelector(fn, cssSel); // NB: The option is set inside this function, after further validity checks. + }); + break; + case "fullScreen" : + if(this.options[key] !== value) { // if changed + var wkv = $.jPlayer.nativeFeatures.fullscreen.used.webkitVideo; + if(!wkv || wkv && !this.status.waitForPlay) { + if(!wkv) { // No sensible way to unset option on these devices. + this.options[key] = value; + } + if(value) { + this._requestFullscreen(); + } else { + this._exitFullscreen(); + } + if(!wkv) { + this._setOption("fullWindow", value); + } + } + } + break; + case "fullWindow" : + if(this.options[key] !== value) { // if changed + this._removeUiClass(); + this.options[key] = value; + this._refreshSize(); + } + break; + case "size" : + if(!this.options.fullWindow && this.options[key].cssClass !== value.cssClass) { + this._removeUiClass(); + } + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this._refreshSize(); + break; + case "sizeFull" : + if(this.options.fullWindow && this.options[key].cssClass !== value.cssClass) { + this._removeUiClass(); + } + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this._refreshSize(); + break; + case "autohide" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this._updateAutohide(); + break; + case "loop" : + this._loop(value); + break; + case "nativeVideoControls" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); + this._restrictNativeVideoControls(); + this._updateNativeVideoControls(); + break; + case "noFullWindow" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls); // Need to check again as noFullWindow can depend on this flag and the restrict() can override it. + this.status.noFullWindow = this._uaBlocklist(this.options.noFullWindow); + this._restrictNativeVideoControls(); + this._updateButtons(); + break; + case "noVolume" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + this.status.noVolume = this._uaBlocklist(this.options.noVolume); + this._updateVolume(); + this._updateMute(); + break; + case "emulateHtml" : + if(this.options[key] !== value) { // To avoid multiple event handlers being created, if true already. + this.options[key] = value; + if(value) { + this._emulateHtmlBridge(); + } else { + this._destroyHtmlBridge(); + } + } + break; + case "timeFormat" : + this.options[key] = $.extend({}, this.options[key], value); // store a merged copy of it, incase not all properties changed. + break; + case "keyEnabled" : + this.options[key] = value; + if(!value && this === $.jPlayer.focus) { + $.jPlayer.focus = null; + } + break; + case "keyBindings" : + this.options[key] = $.extend(true, {}, this.options[key], value); // store a merged DEEP copy of it, incase not all properties changed. + break; + case "audioFullScreen" : + this.options[key] = value; + break; + } + + return this; + }, + // End of: (Options code adapted from ui.widget.js) + + _refreshSize: function() { + this._setSize(); // update status and jPlayer element size + this._addUiClass(); // update the ui class + this._updateSize(); // update internal sizes + this._updateButtons(); + this._updateAutohide(); + this._trigger($.jPlayer.event.resize); + }, + _setSize: function() { + // Determine the current size from the options + if(this.options.fullWindow) { + this.status.width = this.options.sizeFull.width; + this.status.height = this.options.sizeFull.height; + this.status.cssClass = this.options.sizeFull.cssClass; + } else { + this.status.width = this.options.size.width; + this.status.height = this.options.size.height; + this.status.cssClass = this.options.size.cssClass; + } + + // Set the size of the jPlayer area. + this.element.css({'width': this.status.width, 'height': this.status.height}); + }, + _addUiClass: function() { + if(this.ancestorJq.length) { + this.ancestorJq.addClass(this.status.cssClass); + } + }, + _removeUiClass: function() { + if(this.ancestorJq.length) { + this.ancestorJq.removeClass(this.status.cssClass); + } + }, + _updateSize: function() { + // The poster uses show/hide so can simply resize it. + this.internal.poster.jq.css({'width': this.status.width, 'height': this.status.height}); + + // Video html or flash resized if necessary at this time, or if native video controls being used. + if(!this.status.waitForPlay && this.html.active && this.status.video || this.html.video.available && this.html.used && this.status.nativeVideoControls) { + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } + else if(!this.status.waitForPlay && this.flash.active && this.status.video) { + this.internal.flash.jq.css({'width': this.status.width, 'height': this.status.height}); + } + }, + _updateAutohide: function() { + var self = this, + event = "mousemove.jPlayer", + namespace = ".jPlayerAutohide", + eventType = event + namespace, + handler = function() { + self.css.jq.gui.fadeIn(self.options.autohide.fadeIn, function() { + clearTimeout(self.internal.autohideId); + self.internal.autohideId = setTimeout( function() { + self.css.jq.gui.fadeOut(self.options.autohide.fadeOut); + }, self.options.autohide.hold); + }); + }; + + if(this.css.jq.gui.length) { + + // End animations first so that its callback is executed now. + // Otherwise an in progress fadeIn animation still has the callback to fadeOut again. + this.css.jq.gui.stop(true, true); + + // Removes the fadeOut operation from the fadeIn callback. + clearTimeout(this.internal.autohideId); + + this.element.unbind(namespace); + this.css.jq.gui.unbind(namespace); + + if(!this.status.nativeVideoControls) { + if(this.options.fullWindow && this.options.autohide.full || !this.options.fullWindow && this.options.autohide.restored) { + this.element.bind(eventType, handler); + this.css.jq.gui.bind(eventType, handler); + this.css.jq.gui.hide(); + } else { + this.css.jq.gui.show(); + } + } else { + this.css.jq.gui.hide(); + } + } + }, + fullScreen: function() { + this._setOption("fullScreen", true); + }, + restoreScreen: function() { + this._setOption("fullScreen", false); + }, + _fullscreenAddEventListeners: function() { + var self = this, + fs = $.jPlayer.nativeFeatures.fullscreen; + + if(fs.api.fullscreenEnabled) { + if(fs.event.fullscreenchange) { + // Create the event handler function and store it for removal. + if(typeof this.internal.fullscreenchangeHandler !== 'function') { + this.internal.fullscreenchangeHandler = function() { + self._fullscreenchange(); + }; + } + document.addEventListener(fs.event.fullscreenchange, this.internal.fullscreenchangeHandler, false); + } + // No point creating handler for fullscreenerror. + // Either logic avoids fullscreen occurring (w3c/moz), or their is no event on the browser (webkit). + } + }, + _fullscreenRemoveEventListeners: function() { + var fs = $.jPlayer.nativeFeatures.fullscreen; + if(this.internal.fullscreenchangeHandler) { + document.addEventListener(fs.event.fullscreenchange, this.internal.fullscreenchangeHandler, false); + } + }, + _fullscreenchange: function() { + // If nothing is fullscreen, then we cannot be in fullscreen mode. + if(this.options.fullScreen && !$.jPlayer.nativeFeatures.fullscreen.api.fullscreenElement()) { + this._setOption("fullScreen", false); + } + }, + _requestFullscreen: function() { + // Either the container or the jPlayer div + var e = this.ancestorJq.length ? this.ancestorJq[0] : this.element[0], + fs = $.jPlayer.nativeFeatures.fullscreen; + + // This method needs the video element. For iOS and Android. + if(fs.used.webkitVideo) { + e = this.htmlElement.video; + } + + if(fs.api.fullscreenEnabled) { + fs.api.requestFullscreen(e); + } + }, + _exitFullscreen: function() { + + var fs = $.jPlayer.nativeFeatures.fullscreen, + e; + + // This method needs the video element. For iOS and Android. + if(fs.used.webkitVideo) { + e = this.htmlElement.video; + } + + if(fs.api.fullscreenEnabled) { + fs.api.exitFullscreen(e); + } + }, + _html_initMedia: function(media) { + // Remove any existing track elements + var $media = $(this.htmlElement.media).empty(); + + // Create any track elements given with the media, as an Array of track Objects. + $.each(media.track || [], function(i,v) { + var track = document.createElement('track'); + track.setAttribute("kind", v.kind ? v.kind : ""); + track.setAttribute("src", v.src ? v.src : ""); + track.setAttribute("srclang", v.srclang ? v.srclang : ""); + track.setAttribute("label", v.label ? v.label : ""); + if(v.def) { + track.setAttribute("default", v.def); + } + $media.append(track); + }); + + this.htmlElement.media.src = this.status.src; + + if(this.options.preload !== 'none') { + this._html_load(); // See function for comments + } + this._trigger($.jPlayer.event.timeupdate); // The flash generates this event for its solution. + }, + _html_setFormat: function(media) { + var self = this; + // Always finds a format due to checks in setMedia() + $.each(this.formats, function(priority, format) { + if(self.html.support[format] && media[format]) { + self.status.src = media[format]; + self.status.format[format] = true; + self.status.formatType = format; + return false; + } + }); + }, + _html_setAudio: function(media) { + this._html_setFormat(media); + this.htmlElement.media = this.htmlElement.audio; + this._html_initMedia(media); + }, + _html_setVideo: function(media) { + this._html_setFormat(media); + if(this.status.nativeVideoControls) { + this.htmlElement.video.poster = this._validString(media.poster) ? media.poster : ""; + } + this.htmlElement.media = this.htmlElement.video; + this._html_initMedia(media); + }, + _html_resetMedia: function() { + if(this.htmlElement.media) { + if(this.htmlElement.media.id === this.internal.video.id && !this.status.nativeVideoControls) { + this.internal.video.jq.css({'width':'0px', 'height':'0px'}); + } + this.htmlElement.media.pause(); + } + }, + _html_clearMedia: function() { + if(this.htmlElement.media) { + this.htmlElement.media.src = "about:blank"; + // The following load() is only required for Firefox 3.6 (PowerMacs). + // Recent HTMl5 browsers only require the src change. Due to changes in W3C spec and load() effect. + this.htmlElement.media.load(); // Stops an old, "in progress" download from continuing the download. Triggers the loadstart, error and emptied events, due to the empty src. Also an abort event if a download was in progress. + } + }, + _html_load: function() { + // This function remains to allow the early HTML5 browsers to work, such as Firefox 3.6 + // A change in the W3C spec for the media.load() command means that this is no longer necessary. + // This command should be removed and actually causes minor undesirable effects on some browsers. Such as loading the whole file and not only the metadata. + if(this.status.waitForLoad) { + this.status.waitForLoad = false; + this.htmlElement.media.load(); + } + clearTimeout(this.internal.htmlDlyCmdId); + }, + _html_play: function(time) { + var self = this, + media = this.htmlElement.media; + + this._html_load(); // Loads if required and clears any delayed commands. + + if(!isNaN(time)) { + + // Attempt to play it, since iOS has been ignoring commands + if(this.internal.cmdsIgnored) { + media.play(); + } + + try { + // !media.seekable is for old HTML5 browsers, like Firefox 3.6. + // Checking seekable.length is important for iOS6 to work with setMedia().play(time) + if(!media.seekable || typeof media.seekable === "object" && media.seekable.length > 0) { + media.currentTime = time; + media.play(); + } else { + throw 1; + } + } catch(err) { + this.internal.htmlDlyCmdId = setTimeout(function() { + self.play(time); + }, 250); + return; // Cancel execution and wait for the delayed command. + } + } else { + media.play(); + } + this._html_checkWaitForPlay(); + }, + _html_pause: function(time) { + var self = this, + media = this.htmlElement.media; + + if(time > 0) { // We do not want the stop() command, which does pause(0), causing a load operation. + this._html_load(); // Loads if required and clears any delayed commands. + } else { + clearTimeout(this.internal.htmlDlyCmdId); + } + + // Order of these commands is important for Safari (Win) and IE9. Pause then change currentTime. + media.pause(); + + if(!isNaN(time)) { + try { + if(!media.seekable || typeof media.seekable === "object" && media.seekable.length > 0) { + media.currentTime = time; + } else { + throw 1; + } + } catch(err) { + this.internal.htmlDlyCmdId = setTimeout(function() { + self.pause(time); + }, 250); + return; // Cancel execution and wait for the delayed command. + } + } + if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button. + this._html_checkWaitForPlay(); + } + }, + _html_playHead: function(percent) { + var self = this, + media = this.htmlElement.media; + + this._html_load(); // Loads if required and clears any delayed commands. + + try { + if(typeof media.seekable === "object" && media.seekable.length > 0) { + media.currentTime = percent * media.seekable.end(media.seekable.length-1) / 100; + } else if(media.duration > 0 && !isNaN(media.duration)) { + media.currentTime = percent * media.duration / 100; + } else { + throw "e"; + } + } catch(err) { + this.internal.htmlDlyCmdId = setTimeout(function() { + self.playHead(percent); + }, 250); + return; // Cancel execution and wait for the delayed command. + } + if(!this.status.waitForLoad) { + this._html_checkWaitForPlay(); + } + }, + _html_checkWaitForPlay: function() { + if(this.status.waitForPlay) { + this.status.waitForPlay = false; + if(this.css.jq.videoPlay.length) { + this.css.jq.videoPlay.hide(); + } + if(this.status.video) { + this.internal.poster.jq.hide(); + this.internal.video.jq.css({'width': this.status.width, 'height': this.status.height}); + } + } + }, + _html_volume: function(v) { + if(this.html.audio.available) { + this.htmlElement.audio.volume = v; + } + if(this.html.video.available) { + this.htmlElement.video.volume = v; + } + }, + _html_mute: function(m) { + if(this.html.audio.available) { + this.htmlElement.audio.muted = m; + } + if(this.html.video.available) { + this.htmlElement.video.muted = m; + } + }, + _flash_setAudio: function(media) { + var self = this; + try { + // Always finds a format due to checks in setMedia() + $.each(this.formats, function(priority, format) { + if(self.flash.support[format] && media[format]) { + switch (format) { + case "m4a" : + case "fla" : + self._getMovie().fl_setAudio_m4a(media[format]); + break; + case "mp3" : + self._getMovie().fl_setAudio_mp3(media[format]); + break; + case "rtmpa": + self._getMovie().fl_setAudio_rtmp(media[format]); + break; + } + self.status.src = media[format]; + self.status.format[format] = true; + self.status.formatType = format; + return false; + } + }); + + if(this.options.preload === 'auto') { + this._flash_load(); + this.status.waitForLoad = false; + } + } catch(err) { this._flashError(err); } + }, + _flash_setVideo: function(media) { + var self = this; + try { + // Always finds a format due to checks in setMedia() + $.each(this.formats, function(priority, format) { + if(self.flash.support[format] && media[format]) { + switch (format) { + case "m4v" : + case "flv" : + self._getMovie().fl_setVideo_m4v(media[format]); + break; + case "rtmpv": + self._getMovie().fl_setVideo_rtmp(media[format]); + break; + } + self.status.src = media[format]; + self.status.format[format] = true; + self.status.formatType = format; + return false; + } + }); + + if(this.options.preload === 'auto') { + this._flash_load(); + this.status.waitForLoad = false; + } + } catch(err) { this._flashError(err); } + }, + _flash_resetMedia: function() { + this.internal.flash.jq.css({'width':'0px', 'height':'0px'}); // Must do via CSS as setting attr() to zero causes a jQuery error in IE. + this._flash_pause(NaN); + }, + _flash_clearMedia: function() { + try { + this._getMovie().fl_clearMedia(); + } catch(err) { this._flashError(err); } + }, + _flash_load: function() { + try { + this._getMovie().fl_load(); + } catch(err) { this._flashError(err); } + this.status.waitForLoad = false; + }, + _flash_play: function(time) { + try { + this._getMovie().fl_play(time); + } catch(err) { this._flashError(err); } + this.status.waitForLoad = false; + this._flash_checkWaitForPlay(); + }, + _flash_pause: function(time) { + try { + this._getMovie().fl_pause(time); + } catch(err) { this._flashError(err); } + if(time > 0) { // Avoids a setMedia() followed by stop() or pause(0) hiding the video play button. + this.status.waitForLoad = false; + this._flash_checkWaitForPlay(); + } + }, + _flash_playHead: function(p) { + try { + this._getMovie().fl_play_head(p); + } catch(err) { this._flashError(err); } + if(!this.status.waitForLoad) { + this._flash_checkWaitForPlay(); + } + }, + _flash_checkWaitForPlay: function() { + if(this.status.waitForPlay) { + this.status.waitForPlay = false; + if(this.css.jq.videoPlay.length) { + this.css.jq.videoPlay.hide(); + } + if(this.status.video) { + this.internal.poster.jq.hide(); + this.internal.flash.jq.css({'width': this.status.width, 'height': this.status.height}); + } + } + }, + _flash_volume: function(v) { + try { + this._getMovie().fl_volume(v); + } catch(err) { this._flashError(err); } + }, + _flash_mute: function(m) { + try { + this._getMovie().fl_mute(m); + } catch(err) { this._flashError(err); } + }, + _getMovie: function() { + return document[this.internal.flash.id]; + }, + _getFlashPluginVersion: function() { + + // _getFlashPluginVersion() code influenced by: + // - FlashReplace 1.01: http://code.google.com/p/flashreplace/ + // - SWFObject 2.2: http://code.google.com/p/swfobject/ + + var version = 0, + flash; + if(window.ActiveXObject) { + try { + flash = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); + if (flash) { // flash will return null when ActiveX is disabled + var v = flash.GetVariable("$version"); + if(v) { + v = v.split(" ")[1].split(","); + version = parseInt(v[0], 10) + "." + parseInt(v[1], 10); + } + } + } catch(e) {} + } + else if(navigator.plugins && navigator.mimeTypes.length > 0) { + flash = navigator.plugins["Shockwave Flash"]; + if(flash) { + version = navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/, "$1"); + } + } + return version * 1; // Converts to a number + }, + _checkForFlash: function (version) { + var flashOk = false; + if(this._getFlashPluginVersion() >= version) { + flashOk = true; + } + return flashOk; + }, + _validString: function(url) { + return (url && typeof url === "string"); // Empty strings return false + }, + _limitValue: function(value, min, max) { + return (value < min) ? min : ((value > max) ? max : value); + }, + _urlNotSetError: function(context) { + this._error( { + type: $.jPlayer.error.URL_NOT_SET, + context: context, + message: $.jPlayer.errorMsg.URL_NOT_SET, + hint: $.jPlayer.errorHint.URL_NOT_SET + }); + }, + _flashError: function(error) { + var errorType; + if(!this.internal.ready) { + errorType = "FLASH"; + } else { + errorType = "FLASH_DISABLED"; + } + this._error( { + type: $.jPlayer.error[errorType], + context: this.internal.flash.swf, + message: $.jPlayer.errorMsg[errorType] + error.message, + hint: $.jPlayer.errorHint[errorType] + }); + // Allow the audio player to recover if display:none and then shown again, or with position:fixed on Firefox. + // This really only affects audio in a media player, as an audio player could easily move the jPlayer element away from such issues. + this.internal.flash.jq.css({'width':'1px', 'height':'1px'}); + }, + _error: function(error) { + this._trigger($.jPlayer.event.error, error); + if(this.options.errorAlerts) { + this._alert("Error!" + (error.message ? "\n\n" + error.message : "") + (error.hint ? "\n\n" + error.hint : "") + "\n\nContext: " + error.context); + } + }, + _warning: function(warning) { + this._trigger($.jPlayer.event.warning, undefined, warning); + if(this.options.warningAlerts) { + this._alert("Warning!" + (warning.message ? "\n\n" + warning.message : "") + (warning.hint ? "\n\n" + warning.hint : "") + "\n\nContext: " + warning.context); + } + }, + _alert: function(message) { + alert("jPlayer " + this.version.script + " : id='" + this.internal.self.id +"' : " + message); + }, + _emulateHtmlBridge: function() { + var self = this; + + // Emulate methods on jPlayer's DOM element. + $.each( $.jPlayer.emulateMethods.split(/\s+/g), function(i, name) { + self.internal.domNode[name] = function(arg) { + self[name](arg); + }; + + }); + + // Bubble jPlayer events to its DOM element. + $.each($.jPlayer.event, function(eventName,eventType) { + var nativeEvent = true; + $.each( $.jPlayer.reservedEvent.split(/\s+/g), function(i, name) { + if(name === eventName) { + nativeEvent = false; + return false; + } + }); + if(nativeEvent) { + self.element.bind(eventType + ".jPlayer.jPlayerHtml", function() { // With .jPlayer & .jPlayerHtml namespaces. + self._emulateHtmlUpdate(); + var domEvent = document.createEvent("Event"); + domEvent.initEvent(eventName, false, true); + self.internal.domNode.dispatchEvent(domEvent); + }); + } + // The error event would require a special case + }); + + // IE9 has a readyState property on all elements. The document should have it, but all (except media) elements inherit it in IE9. This conflicts with Popcorn, which polls the readyState. + }, + _emulateHtmlUpdate: function() { + var self = this; + + $.each( $.jPlayer.emulateStatus.split(/\s+/g), function(i, name) { + self.internal.domNode[name] = self.status[name]; + }); + $.each( $.jPlayer.emulateOptions.split(/\s+/g), function(i, name) { + self.internal.domNode[name] = self.options[name]; + }); + }, + _destroyHtmlBridge: function() { + var self = this; + + // Bridge event handlers are also removed by destroy() through .jPlayer namespace. + this.element.unbind(".jPlayerHtml"); // Remove all event handlers created by the jPlayer bridge. So you can change the emulateHtml option. + + // Remove the methods and properties + var emulated = $.jPlayer.emulateMethods + " " + $.jPlayer.emulateStatus + " " + $.jPlayer.emulateOptions; + $.each( emulated.split(/\s+/g), function(i, name) { + delete self.internal.domNode[name]; + }); + } + }; + + $.jPlayer.error = { + FLASH: "e_flash", + FLASH_DISABLED: "e_flash_disabled", + NO_SOLUTION: "e_no_solution", + NO_SUPPORT: "e_no_support", + URL: "e_url", + URL_NOT_SET: "e_url_not_set", + VERSION: "e_version" + }; + + $.jPlayer.errorMsg = { + FLASH: "jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ", // Used in: _flashError() + FLASH_DISABLED: "jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ", // Used in: _flashError() + NO_SOLUTION: "No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.", // Used in: _init() + NO_SUPPORT: "It is not possible to play any media format provided in setMedia() on this browser using your current options.", // Used in: setMedia() + URL: "Media URL could not be loaded.", // Used in: jPlayerFlashEvent() and _addHtmlEventListeners() + URL_NOT_SET: "Attempt to issue media playback commands, while no media url is set.", // Used in: load(), play(), pause(), stop() and playHead() + VERSION: "jPlayer " + $.jPlayer.prototype.version.script + " needs Jplayer.swf version " + $.jPlayer.prototype.version.needFlash + " but found " // Used in: jPlayerReady() + }; + + $.jPlayer.errorHint = { + FLASH: "Check your swfPath option and that Jplayer.swf is there.", + FLASH_DISABLED: "Check that you have not display:none; the jPlayer entity or any ancestor.", + NO_SOLUTION: "Review the jPlayer options: support and supplied.", + NO_SUPPORT: "Video or audio formats defined in the supplied option are missing.", + URL: "Check media URL is valid.", + URL_NOT_SET: "Use setMedia() to set the media URL.", + VERSION: "Update jPlayer files." + }; + + $.jPlayer.warning = { + CSS_SELECTOR_COUNT: "e_css_selector_count", + CSS_SELECTOR_METHOD: "e_css_selector_method", + CSS_SELECTOR_STRING: "e_css_selector_string", + OPTION_KEY: "e_option_key" + }; + + $.jPlayer.warningMsg = { + CSS_SELECTOR_COUNT: "The number of css selectors found did not equal one: ", + CSS_SELECTOR_METHOD: "The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.", + CSS_SELECTOR_STRING: "The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.", + OPTION_KEY: "The option requested in jPlayer('option') is undefined." + }; + + $.jPlayer.warningHint = { + CSS_SELECTOR_COUNT: "Check your css selector and the ancestor.", + CSS_SELECTOR_METHOD: "Check your method name.", + CSS_SELECTOR_STRING: "Check your css selector is a string.", + OPTION_KEY: "Check your option name." + }; +})); diff --git a/core/vendor/filemanager/js/jPlayer/package.json b/core/vendor/filemanager/js/jPlayer/package.json new file mode 100755 index 00000000..70656c2b --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/package.json @@ -0,0 +1,27 @@ +{ + "name": "jplayer", + "version": "2.4.0", + "description": "The jQuery HTML5 Audio / Video Library", + "homepage": "http://www.jplayer.org/", + "keywords": [ + "audio", + "video" + ], + "dependencies": { + "jquery": ">1.7.0" + }, + "licenses": [ + { + "type": "MIT", + "url": "http://www.opensource.org/licenses/MIT" + } + ], + "repositories": [ + { + "type": "git", + "url": "https://github.com/happyworm/jPlayer.git" + } + ], + "github": "http://github.com/happyworm/jPlayer", + "main": "jquery.jplayer/jquery.jplayer.js" +} diff --git a/core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.js b/core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.js new file mode 100755 index 00000000..8eff0dac --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.js @@ -0,0 +1,579 @@ +/* + * jPlayer Player Plugin for Popcorn JavaScript Library + * http://www.jplayer.org + * + * Copyright (c) 2012 - 2014 Happyworm Ltd + * Licensed under the MIT license. + * http://opensource.org/licenses/MIT + * + * Author: Mark J Panaghiston + * Version: 1.1.6 + * Date: 27th November 2014 + * + * For Popcorn Version: 1.3 + * For jPlayer Version: 2.9.0 + * Requires: jQuery 1.7+ + * Note: jQuery dependancy cannot be removed since jPlayer 2 is a jQuery plugin. Use of jQuery will be kept to a minimum. + */ + +(function(Popcorn) { + + var JQUERY_SCRIPT = '//code.jquery.com/jquery-1.11.1.min.js', // Used if jQuery not already present. + JPLAYER_SCRIPT = '//code.jplayer.org/2.9.0/jplayer/jquery.jplayer.min.js', // Used if jPlayer not already present. + JPLAYER_SWFPATH = '//code.jplayer.org/2.9.0/jplayer/jquery.jplayer.swf', // Used if not specified in jPlayer options via SRC Object. + SOLUTION = 'html,flash', // The default solution option. + DEBUG = false, // Decided to leave the debugging option and console output in for the time being. Overhead is trivial. + jQueryDownloading = false, // Flag to stop multiple instances from each pulling in jQuery, thus corrupting it. + jPlayerDownloading = false, // Flag to stop multiple instances from each pulling in jPlayer, thus corrupting it. + format = { // Duplicate of jPlayer 2.5.0 object, to avoid always requiring jQuery and jPlayer to be loaded before performing the _canPlayType() test. + mp3: { + codec: 'audio/mpeg', + flashCanPlay: true, + media: 'audio' + }, + m4a: { // AAC / MP4 + codec: 'audio/mp4; codecs="mp4a.40.2"', + flashCanPlay: true, + media: 'audio' + }, + m3u8a: { // AAC / MP4 / Apple HLS + codec: 'application/vnd.apple.mpegurl; codecs="mp4a.40.2"', + flashCanPlay: false, + media: 'audio' + }, + m3ua: { // M3U + codec: 'audio/mpegurl', + flashCanPlay: false, + media: 'audio' + }, + oga: { // OGG + codec: 'audio/ogg; codecs="vorbis, opus"', + flashCanPlay: false, + media: 'audio' + }, + flac: { // FLAC + codec: 'audio/x-flac', + flashCanPlay: false, + media: 'audio' + }, + wav: { // PCM + codec: 'audio/wav; codecs="1"', + flashCanPlay: false, + media: 'audio' + }, + webma: { // WEBM + codec: 'audio/webm; codecs="vorbis"', + flashCanPlay: false, + media: 'audio' + }, + fla: { // FLV / F4A + codec: 'audio/x-flv', + flashCanPlay: true, + media: 'audio' + }, + rtmpa: { // RTMP AUDIO + codec: 'audio/rtmp; codecs="rtmp"', + flashCanPlay: true, + media: 'audio' + }, + m4v: { // H.264 / MP4 + codec: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"', + flashCanPlay: true, + media: 'video' + }, + m3u8v: { // H.264 / AAC / MP4 / Apple HLS + codec: 'application/vnd.apple.mpegurl; codecs="avc1.42E01E, mp4a.40.2"', + flashCanPlay: false, + media: 'video' + }, + m3uv: { // M3U + codec: 'audio/mpegurl', + flashCanPlay: false, + media: 'video' + }, + ogv: { // OGG + codec: 'video/ogg; codecs="theora, vorbis"', + flashCanPlay: false, + media: 'video' + }, + webmv: { // WEBM + codec: 'video/webm; codecs="vorbis, vp8"', + flashCanPlay: false, + media: 'video' + }, + flv: { // FLV / F4V + codec: 'video/x-flv', + flashCanPlay: true, + media: 'video' + }, + rtmpv: { // RTMP VIDEO + codec: 'video/rtmp; codecs="rtmp"', + flashCanPlay: true, + media: 'video' + } + }, + isObject = function(val) { // Basic check for Object + if(val && typeof val === 'object' && val.hasOwnProperty) { + return true; + } else { + return false; + } + }, + getMediaType = function(url) { // Function to gleam the media type from the URL + var mediaType = false; + if(/\.mp3$/i.test(url)) { + mediaType = 'mp3'; + } else if(/\.mp4$/i.test(url) || /\.m4v$/i.test(url)) { + mediaType = 'm4v'; + } else if(/\.m4a$/i.test(url)) { + mediaType = 'm4a'; + } else if(/\.ogg$/i.test(url) || /\.oga$/i.test(url)) { + mediaType = 'oga'; + } else if(/\.ogv$/i.test(url)) { + mediaType = 'ogv'; + } else if(/\.webm$/i.test(url)) { + mediaType = 'webmv'; + } + return mediaType; + }, + getSupplied = function(url) { // Function to generate a supplied option from an src object. ie., When supplied not specified. + var supplied = '', + separator = ''; + if(isObject(url)) { + // Generate supplied option from object's properties. Non-format properties would be ignored by jPlayer. Order is unpredictable. + for(var prop in url) { + if(url.hasOwnProperty(prop)) { + supplied += separator + prop; + separator = ','; + } + } + } + if(DEBUG) console.log('getSupplied(): Generated: supplied = "' + supplied + '"'); + return supplied; + }; + + Popcorn.player( 'jplayer', { + _canPlayType: function( containerType, url ) { + // url : Either a String or an Object structured similar a jPlayer media object. ie., As used by setMedia in jPlayer. + // The url object may also contain a solution and supplied property. + + // Define the src object structure here! + + var cType = containerType.toLowerCase(), + srcObj = { + media:{}, + options:{} + }, + rVal = false, // Only a boolean false means it is not supported. + mediaType; + + if(cType !== 'video' && cType !== 'audio') { + + if(typeof url === 'string') { + // Check it starts with http, so the URL is absolute... Well, it is not a perfect check. + if(/^http.*/i.test(url)) { + mediaType = getMediaType(url); + if(mediaType) { + srcObj.media[mediaType] = url; + srcObj.options.solution = SOLUTION; + srcObj.options.supplied = mediaType; + } + } + } else { + srcObj = url; // Assume the url is an src object. + } + + // Check for Object and appropriate minimum data structure. + if(isObject(srcObj) && isObject(srcObj.media)) { + + if(!isObject(srcObj.options)) { + srcObj.options = {}; + } + + if(!srcObj.options.solution) { + srcObj.options.solution = SOLUTION; + } + + if(!srcObj.options.supplied) { + srcObj.options.supplied = getSupplied(srcObj.media); + } + + // Figure out how jPlayer will play it. + // This may not work properly when both audio and video is supplied. ie., A media player. But it should return truethy and jPlayer can figure it out. + + var solution = srcObj.options.solution.toLowerCase().split(","), // Create the solution array, with prority based on the order of the solution string. + supplied = srcObj.options.supplied.toLowerCase().split(","); // Create the supplied formats array, with prority based on the order of the supplied formats string. + + for(var sol = 0; sol < solution.length; sol++) { + + var solutionType = solution[sol].replace(/^\s+|\s+$/g, ""), //trim + checkingHtml = solutionType === 'html', + checkingFlash = solutionType === 'flash', + mediaElem; + + for(var fmt = 0; fmt < supplied.length; fmt++) { + mediaType = supplied[fmt].replace(/^\s+|\s+$/g, ""); //trim + if(format[mediaType]) { // Check format is valid. + + // Create an HTML5 media element for the type of media. + if(!mediaElem && checkingHtml) { + mediaElem = document.createElement(format[mediaType].media); + } + // See if the HTML5 media element can play the MIME / Codec type. + // Flash also returns the object if the format is playable, so it is truethy, but that html property is false. + // This assumes Flash is available, but that should be dealt with by jPlayer if that happens. + var htmlCanPlay = !!(mediaElem && mediaElem.canPlayType && mediaElem.canPlayType(format[mediaType].codec)), + htmlWillPlay = htmlCanPlay && checkingHtml, + flashWillPlay = format[mediaType].flashCanPlay && checkingFlash; + // The first one found will match what jPlayer uses. + if(htmlWillPlay || flashWillPlay) { + rVal = { + html: htmlWillPlay, + type: mediaType + }; + sol = solution.length; // Exit solution loop + fmt = supplied.length; // Exit supplied loop + } + } + } + } + } + } + return rVal; + }, + // _setup: function( options ) { // Warning: options is deprecated. + _setup: function() { + var media = this, + myPlayer, // The jQuery selector of the jPlayer element. Usually a
    + jPlayerObj, // The jPlayer data instance. For performance and DRY code. + mediaType = 'unknown', + jpMedia = {}, + jpOptions = {}, + ready = false, // Used during init to override the annoying duration dependance in the track event padding during Popcorn's isReady(). ie., We is ready after loadeddata and duration can then be set real value at leisure. + duration = 0, // For the durationchange event with both HTML5 and Flash solutions. Used with 'ready' to keep control during the Popcorn isReady() via loadeddata event. (Duration=0 is bad.) + durationchangeId = null, // A timeout ID used with delayed durationchange event. (Because of the duration=NaN fudge to avoid Popcorn track event corruption.) + canplaythrough = false, + error = null, // The MediaError object. + + dispatchDurationChange = function() { + if(ready) { + if(DEBUG) console.log('Dispatched event : durationchange : ' + duration); + media.dispatchEvent('durationchange'); + } else { + if(DEBUG) console.log('DELAYED EVENT (!ready) : durationchange : ' + duration); + clearTimeout(durationchangeId); // Stop multiple triggers causing multiple timeouts running in parallel. + durationchangeId = setTimeout(dispatchDurationChange, 250); + } + }, + + jPlayerFlashEventsPatch = function() { + + /* Events already supported by jPlayer Flash: + * loadstart + * loadedmetadata (M4A, M4V) + * progress + * play + * pause + * seeking + * seeked + * timeupdate + * ended + * volumechange + * error <- See the custom handler in jPlayerInit() + */ + + /* Events patched: + * loadeddata + * durationchange + * canplaythrough + * playing + */ + + /* Events NOT patched: + * suspend + * abort + * emptied + * stalled + * loadedmetadata (MP3) + * waiting + * canplay + * ratechange + */ + + // Triggering patched events through the jPlayer Object so the events are homogeneous. ie., The contain the event.jPlayer data structure. + + var checkDuration = function(event) { + if(event.jPlayer.status.duration !== duration) { + duration = event.jPlayer.status.duration; + dispatchDurationChange(); + } + }, + + checkCanPlayThrough = function(event) { + if(!canplaythrough && event.jPlayer.status.seekPercent === 100) { + canplaythrough = true; + setTimeout(function() { + if(DEBUG) console.log('Trigger : canplaythrough'); + jPlayerObj._trigger($.jPlayer.event.canplaythrough); + }, 0); + } + }; + + myPlayer.bind($.jPlayer.event.loadstart, function() { + setTimeout(function() { + if(DEBUG) console.log('Trigger : loadeddata'); + jPlayerObj._trigger($.jPlayer.event.loadeddata); + }, 0); + }) + .bind($.jPlayer.event.progress, function(event) { + checkDuration(event); + checkCanPlayThrough(event); + }) + .bind($.jPlayer.event.timeupdate, function(event) { + checkDuration(event); + checkCanPlayThrough(event); + }) + .bind($.jPlayer.event.play, function() { + setTimeout(function() { + if(DEBUG) console.log('Trigger : playing'); + jPlayerObj._trigger($.jPlayer.event.playing); + }, 0); + }); + + if(DEBUG) console.log('Created CUSTOM event handlers for FLASH'); + }, + + jPlayerInit = function() { + (function($) { + + myPlayer = $('#' + media.id); + + if(typeof media.src === 'string') { + mediaType = getMediaType(media.src); + jpMedia[mediaType] = media.src; + jpOptions.supplied = mediaType; + jpOptions.solution = SOLUTION; + } else if(isObject(media.src)) { + jpMedia = isObject(media.src.media) ? media.src.media : {}; + jpOptions = isObject(media.src.options) ? media.src.options : {}; + jpOptions.solution = jpOptions.solution || SOLUTION; + jpOptions.supplied = jpOptions.supplied || getSupplied(media.src.media); + } + + // Allow the swfPath to be set to local server. ie., If the jPlayer Plugin is local and already on the page, then you can also use the local SWF. + jpOptions.swfPath = jpOptions.swfPath || JPLAYER_SWFPATH; + + myPlayer.bind($.jPlayer.event.ready, function(event) { + if(event.jPlayer.flash.used) { + jPlayerFlashEventsPatch(); + } + // Set the media andd load it, so that the Flash solution behaves similar to HTML5 solution. + // This also allows the loadstart event to be used to know jPlayer is ready. + $(this).jPlayer('setMedia', jpMedia).jPlayer('load'); + }); + + // Do not auto-bubble the reserved events, nor the loadeddata and durationchange event, since the duration must be carefully handled when loadeddata event occurs. + // See the duration property code for more details. (Ranting.) + + var reservedEvents = $.jPlayer.reservedEvent + ' loadeddata durationchange', + reservedEvent = reservedEvents.split(/\s+/g); + + // Generate event handlers for all the standard HTML5 media events. (Except durationchange) + + var bindEvent = function(name) { + myPlayer.bind($.jPlayer.event[name], function(event) { + if(DEBUG) console.log('Dispatched event: ' + name + (event && event.jPlayer ? ' (' + event.jPlayer.status.currentTime + 's)' : '')); // Must be after dispatch for some reason on Firefox/Opera + media.dispatchEvent(name); + }); + if(DEBUG) console.log('Created event handler for: ' + name); + }; + + for(var eventName in $.jPlayer.event) { + if($.jPlayer.event.hasOwnProperty(eventName)) { + var nativeEvent = true; + for(var iRes in reservedEvent) { + if(reservedEvent.hasOwnProperty(iRes)) { + if(reservedEvent[iRes] === eventName) { + nativeEvent = false; + break; + } + } + } + if(nativeEvent) { + bindEvent(eventName); + } else { + if(DEBUG) console.log('Skipped auto event handler creation for: ' + eventName); + } + } + } + + myPlayer.bind($.jPlayer.event.loadeddata, function(event) { + if(DEBUG) console.log('Dispatched event: loadeddata' + (event && event.jPlayer ? ' (' + event.jPlayer.status.currentTime + 's)' : '')); + media.dispatchEvent('loadeddata'); + ready = true; + }); + if(DEBUG) console.log('Created CUSTOM event handler for: loadeddata'); + + myPlayer.bind($.jPlayer.event.durationchange, function(event) { + duration = event.jPlayer.status.duration; + dispatchDurationChange(); + }); + if(DEBUG) console.log('Created CUSTOM event handler for: durationchange'); + + // The error event is a special case. Plus jPlayer error event assumes it is a broken URL. (It could also be a decoder error... Or aborted or a Network error.) + myPlayer.bind($.jPlayer.event.error, function(event) { + // Not sure how to handle the error situation. Popcorn does not appear to have the error or error.code property documented here: http://popcornjs.org/popcorn-docs/media-methods/ + // If any error event happens, then something has gone pear shaped. + + error = event.jPlayer.error; // Saving object pointer, not a copy of the object. Possible garbage collection issue... But the player is dead anyway, so don't care. + + if(error.type === $.jPlayer.error.URL) { + error.code = 4; // MEDIA_ERR_SRC_NOT_SUPPORTED since jPlayer makes this assumption. It is the most common error, then the decode error. Never seen either of the other 2 error types occur. + } else { + error.code = 0; // It was a jPlayer error, not an HTML5 media error. + } + + if(DEBUG) console.log('Dispatched event: error'); + if(DEBUG) console.dir(error); + media.dispatchEvent('error'); + }); + if(DEBUG) console.log('Created CUSTOM event handler for: error'); + + Popcorn.player.defineProperty( media, 'error', { + set: function() { + // Read-only property + return error; + }, + get: function() { + return error; + } + }); + + Popcorn.player.defineProperty( media, 'currentTime', { + set: function( val ) { + if(jPlayerObj.status.paused) { + myPlayer.jPlayer('pause', val); + } else { + myPlayer.jPlayer('play', val); + } + return val; + }, + get: function() { + return jPlayerObj.status.currentTime; + } + }); + + /* The joy of duration and the loadeddata event isReady() handler + * The duration is assumed to be a NaN or a valid duration. + * jPlayer uses zero instead of a NaN and this screws up the Popcorn track event start/end arrays padding. + * This line here: + * videoDurationPlus = duration != duration ? Number.MAX_VALUE : duration + 1; + * Not sure why it is not simply: + * videoDurationPlus = Number.MAX_VALUE; // Who cares if the padding is close to the real duration? + * So if you trigger loadeddata before the duration is correct, the track event padding is screwed up. (It pads the start, not the end... Well, duration+1 = 0+1 = 1s) + * That line makes the MP3 Flash fallback difficult to setup. The whole MP3 will need to load before the duration is known. + * Planning on using a NaN for duration until a >0 value is found... Except with MP3, where seekPercent must be 100% before setting the duration. + * Why not just use a NaN during init... And then correct the duration later? + */ + + Popcorn.player.defineProperty( media, 'duration', { + set: function() { + // Read-only property + if(ready) { + return duration; + } else { + return NaN; + } + }, + get: function() { + if(ready) { + return duration; // Popcorn has initialized, we can now use duration zero or whatever without fear. + } else { + return NaN; // Keep the duration a NaN until after loadeddata event has occurred. Otherwise Popcorn track event padding is corrupted. + } + } + }); + + Popcorn.player.defineProperty( media, 'muted', { + set: function( val ) { + myPlayer.jPlayer('mute', val); + return jPlayerObj.options.muted; + }, + get: function() { + return jPlayerObj.options.muted; + } + }); + + Popcorn.player.defineProperty( media, 'volume', { + set: function( val ) { + myPlayer.jPlayer('volume', val); + return jPlayerObj.options.volume; + }, + get: function() { + return jPlayerObj.options.volume; + } + }); + + Popcorn.player.defineProperty( media, 'paused', { + set: function() { + // Read-only property + return jPlayerObj.status.paused; + }, + get: function() { + return jPlayerObj.status.paused; + } + }); + + media.play = function() { + myPlayer.jPlayer('play'); + }; + media.pause = function() { + myPlayer.jPlayer('pause'); + }; + + myPlayer.jPlayer(jpOptions); // Instance jPlayer. Note that the options should not have a ready event defined... Kill it by default? + jPlayerObj = myPlayer.data('jPlayer'); + + }(jQuery)); + }, + + jPlayerCheck = function() { + if (!jQuery.jPlayer) { + if (!jPlayerDownloading) { + jPlayerDownloading = true; + Popcorn.getScript(JPLAYER_SCRIPT, function() { + jPlayerDownloading = false; + jPlayerInit(); + }); + } else { + setTimeout(jPlayerCheck, 250); + } + } else { + jPlayerInit(); + } + }, + + jQueryCheck = function() { + if (!window.jQuery) { + if (!jQueryDownloading) { + jQueryDownloading = true; + Popcorn.getScript(JQUERY_SCRIPT, function() { + jQueryDownloading = false; + jPlayerCheck(); + }); + } else { + setTimeout(jQueryCheck, 250); + } + } else { + jPlayerCheck(); + } + }; + + jQueryCheck(); + }, + _teardown: function() { + jQuery('#' + this.id).jPlayer('destroy'); + } + }); + +}(Popcorn)); \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.min.js b/core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.min.js new file mode 100755 index 00000000..9b69a139 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/popcorn/popcorn.jplayer.min.js @@ -0,0 +1,2 @@ +/*! Popcorn Player for jPlayer 2.9.2 ~ (c) 2009-2014 Happyworm Ltd ~ MIT License */ +!function(a){var b="//code.jquery.com/jquery-1.11.1.min.js",c="//code.jplayer.org/2.9.0/jplayer/jquery.jplayer.min.js",d="//code.jplayer.org/2.9.0/jplayer/jquery.jplayer.swf",e="html,flash",f=!1,g=!1,h=!1,i={mp3:{codec:"audio/mpeg",flashCanPlay:!0,media:"audio"},m4a:{codec:'audio/mp4; codecs="mp4a.40.2"',flashCanPlay:!0,media:"audio"},m3u8a:{codec:'application/vnd.apple.mpegurl; codecs="mp4a.40.2"',flashCanPlay:!1,media:"audio"},m3ua:{codec:"audio/mpegurl",flashCanPlay:!1,media:"audio"},oga:{codec:'audio/ogg; codecs="vorbis, opus"',flashCanPlay:!1,media:"audio"},flac:{codec:"audio/x-flac",flashCanPlay:!1,media:"audio"},wav:{codec:'audio/wav; codecs="1"',flashCanPlay:!1,media:"audio"},webma:{codec:'audio/webm; codecs="vorbis"',flashCanPlay:!1,media:"audio"},fla:{codec:"audio/x-flv",flashCanPlay:!0,media:"audio"},rtmpa:{codec:'audio/rtmp; codecs="rtmp"',flashCanPlay:!0,media:"audio"},m4v:{codec:'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',flashCanPlay:!0,media:"video"},m3u8v:{codec:'application/vnd.apple.mpegurl; codecs="avc1.42E01E, mp4a.40.2"',flashCanPlay:!1,media:"video"},m3uv:{codec:"audio/mpegurl",flashCanPlay:!1,media:"video"},ogv:{codec:'video/ogg; codecs="theora, vorbis"',flashCanPlay:!1,media:"video"},webmv:{codec:'video/webm; codecs="vorbis, vp8"',flashCanPlay:!1,media:"video"},flv:{codec:"video/x-flv",flashCanPlay:!0,media:"video"},rtmpv:{codec:'video/rtmp; codecs="rtmp"',flashCanPlay:!0,media:"video"}},j=function(a){return a&&"object"==typeof a&&a.hasOwnProperty?!0:!1},k=function(a){var b=!1;return/\.mp3$/i.test(a)?b="mp3":/\.mp4$/i.test(a)||/\.m4v$/i.test(a)?b="m4v":/\.m4a$/i.test(a)?b="m4a":/\.ogg$/i.test(a)||/\.oga$/i.test(a)?b="oga":/\.ogv$/i.test(a)?b="ogv":/\.webm$/i.test(a)&&(b="webmv"),b},l=function(a){var b="",c="";if(j(a))for(var d in a)a.hasOwnProperty(d)&&(b+=c+d,c=",");return f&&console.log('getSupplied(): Generated: supplied = "'+b+'"'),b};a.player("jplayer",{_canPlayType:function(a,b){var c,d=a.toLowerCase(),f={media:{},options:{}},g=!1;if("video"!==d&&"audio"!==d&&("string"==typeof b?/^http.*/i.test(b)&&(c=k(b),c&&(f.media[c]=b,f.options.solution=e,f.options.supplied=c)):f=b,j(f)&&j(f.media))){j(f.options)||(f.options={}),f.options.solution||(f.options.solution=e),f.options.supplied||(f.options.supplied=l(f.media));for(var h=f.options.solution.toLowerCase().split(","),m=f.options.supplied.toLowerCase().split(","),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 I?Z5i}0Xq{#rvLx| literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/image/jplayer.blue.monday.seeking.gif b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/image/jplayer.blue.monday.seeking.gif new file mode 100755 index 0000000000000000000000000000000000000000..dbd2105ab933f0336e1f732e32a54c6d6a8e1441 GIT binary patch literal 3284 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.css b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.css new file mode 100755 index 00000000..1a5da65e --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.css @@ -0,0 +1,640 @@ +/* + * Skin for jPlayer Plugin (jQuery JavaScript Library) + * http://www.jplayer.org + * + * Skin Name: Blue Monday + * + * Copyright (c) 2010-2012 Happyworm Ltd + * Dual licensed under the MIT and GPL licenses. + * - http://www.opensource.org/licenses/mit-license.php + * - http://www.gnu.org/copyleft/gpl.html + * + * Author: Silvia Benvenuti + * Skin Version: 4.3 (jPlayer 2.2.0) + * Date: 19th November 2012 + */ + +div.jp-audio, +div.jp-audio-stream, +div.jp-video { + + /* Edit the font-size to counteract inherited font sizing. + * Eg. 1.25em = 1 / 0.8em + */ + + font-size:1.25em; /* 1.25em for testing in site pages */ /* No parent CSS that can effect the size in the demos ZIP */ + + font-family:Verdana, Arial, sans-serif; + line-height:1.6; + color: #666; + border:1px solid #009be3; + background-color:#eee; +} +div.jp-audio { + width:420px; +} +div.jp-audio-stream { + width:182px; +} +div.jp-video-270p { + width:480px; +} +div.jp-video-360p { + width:640px; +} +div.jp-video-full { + /* Rules for IE6 (full-screen) */ + width:480px; + height:270px; + /* Rules for IE7 (full-screen) - Otherwise the relative container causes other page items that are not position:static (default) to appear over the video/gui. */ + position:static !important; position:relative; +} + +/* The z-index rule is defined in this manner to enable Popcorn plugins that add overlays to video area. EG. Subtitles. */ +div.jp-video-full div div { + z-index:1000; +} + +div.jp-video-full div.jp-jplayer { + top: 0; + left: 0; + position: fixed !important; position: relative; /* Rules for IE6 (full-screen) */ + overflow: hidden; +} + +div.jp-video-full div.jp-gui { + position: fixed !important; position: static; /* Rules for IE6 (full-screen) */ + top: 0; + left: 0; + width:100%; + height:100%; + z-index:1001; /* 1 layer above the others. */ +} + +div.jp-video-full div.jp-interface { + position: absolute !important; position: relative; /* Rules for IE6 (full-screen) */ + bottom: 0; + left: 0; +} + +div.jp-interface { + position: relative; + background-color:#eee; + width:100%; +} + +div.jp-audio div.jp-type-single div.jp-interface { + height:80px; +} +div.jp-audio div.jp-type-playlist div.jp-interface { + height:80px; +} + +div.jp-audio-stream div.jp-type-single div.jp-interface { + height:80px; +} + +div.jp-video div.jp-interface { + border-top:1px solid #009be3; +} + +/* @group CONTROLS */ + +div.jp-controls-holder { + clear: both; + width:440px; + margin:0 auto; + position: relative; + overflow:hidden; + top:-8px; /* This negative value depends on the size of the text in jp-currentTime and jp-duration */ +} + +div.jp-interface ul.jp-controls { + list-style-type:none; + margin:0; + padding: 0; + overflow:hidden; +} + +div.jp-audio ul.jp-controls { + width: 380px; + padding:20px 20px 0 20px; +} + +div.jp-audio-stream ul.jp-controls { + width: 142px; + padding:20px 20px 0 20px; +} + +div.jp-video div.jp-type-single ul.jp-controls { + width: 78px; + margin-left: 200px; +} + +div.jp-video div.jp-type-playlist ul.jp-controls { + width: 134px; + margin-left: 172px; +} +div.jp-video ul.jp-controls, +div.jp-interface ul.jp-controls li { + display:inline; + float: left; +} + +div.jp-interface ul.jp-controls a { + display:block; + overflow:hidden; + text-indent:-9999px; +} +a.jp-play, +a.jp-pause { + width:40px; + height:40px; +} + +a.jp-play { + background: url("jplayer.blue.monday.jpg") 0 0 no-repeat; +} +a.jp-play:hover { + background: url("jplayer.blue.monday.jpg") -41px 0 no-repeat; +} +a.jp-pause { + background: url("jplayer.blue.monday.jpg") 0 -42px no-repeat; + display: none; +} +a.jp-pause:hover { + background: url("jplayer.blue.monday.jpg") -41px -42px no-repeat; +} + +a.jp-stop, a.jp-previous, a.jp-next { + width:28px; + height:28px; + margin-top:6px; +} + +a.jp-stop { + background: url("jplayer.blue.monday.jpg") 0 -83px no-repeat; + margin-left:10px; +} + +a.jp-stop:hover { + background: url("jplayer.blue.monday.jpg") -29px -83px no-repeat; +} + +a.jp-previous { + background: url("jplayer.blue.monday.jpg") 0 -112px no-repeat; +} +a.jp-previous:hover { + background: url("jplayer.blue.monday.jpg") -29px -112px no-repeat; +} + +a.jp-next { + background: url("jplayer.blue.monday.jpg") 0 -141px no-repeat; +} +a.jp-next:hover { + background: url("jplayer.blue.monday.jpg") -29px -141px no-repeat; +} + +/* @end */ + +/* @group progress bar */ + +div.jp-progress { + overflow:hidden; + background-color: #ddd; +} +div.jp-audio div.jp-progress { + position: absolute; + top:32px; + height:15px; +} +div.jp-audio div.jp-type-single div.jp-progress { + left:110px; + width:186px; +} +div.jp-audio div.jp-type-playlist div.jp-progress { + left:166px; + width:130px; +} +div.jp-video div.jp-progress { + top:0px; + left:0px; + width:100%; + height:10px; +} +div.jp-seek-bar { + background: url("jplayer.blue.monday.jpg") 0 -202px repeat-x; + width:0px; + height:100%; + cursor: pointer; +} +div.jp-play-bar { + background: url("jplayer.blue.monday.jpg") 0 -218px repeat-x ; + width:0px; + height:100%; +} + +/* The seeking class is added/removed inside jPlayer */ +div.jp-seeking-bg { + background: url("jplayer.blue.monday.seeking.gif"); +} + +/* @end */ + +/* @group volume controls */ + + +a.jp-mute, +a.jp-unmute, +a.jp-volume-max { + width:18px; + height:15px; + margin-top:12px; +} + +div.jp-audio div.jp-type-single a.jp-mute, +div.jp-audio div.jp-type-single a.jp-unmute { + margin-left: 210px; +} +div.jp-audio div.jp-type-playlist a.jp-mute, +div.jp-audio div.jp-type-playlist a.jp-unmute { + margin-left: 154px; +} + +div.jp-audio-stream div.jp-type-single a.jp-mute, +div.jp-audio-stream div.jp-type-single a.jp-unmute { + margin-left:10px; +} + +div.jp-audio a.jp-volume-max, +div.jp-audio-stream a.jp-volume-max { + margin-left: 56px; +} + +div.jp-video a.jp-mute, +div.jp-video a.jp-unmute, +div.jp-video a.jp-volume-max { + position: absolute; + top:12px; + margin-top:0; +} + +div.jp-video a.jp-mute, +div.jp-video a.jp-unmute { + left: 50px; +} + +div.jp-video a.jp-volume-max { + left: 134px; +} + +a.jp-mute { + background: url("jplayer.blue.monday.jpg") 0 -170px no-repeat; +} +a.jp-mute:hover { + background: url("jplayer.blue.monday.jpg") -19px -170px no-repeat; +} +a.jp-unmute { + background: url("jplayer.blue.monday.jpg") -60px -170px no-repeat; + display: none; +} +a.jp-unmute:hover { + background: url("jplayer.blue.monday.jpg") -79px -170px no-repeat; +} +a.jp-volume-max { + background: url("jplayer.blue.monday.jpg") 0 -186px no-repeat; +} +a.jp-volume-max:hover { + background: url("jplayer.blue.monday.jpg") -19px -186px no-repeat; +} + +div.jp-volume-bar { + position: absolute; + overflow:hidden; + background: url("jplayer.blue.monday.jpg") 0 -250px repeat-x; + width:46px; + height:5px; + cursor: pointer; +} +div.jp-audio div.jp-volume-bar { + top:37px; + left:330px; +} +div.jp-audio-stream div.jp-volume-bar { + top:37px; + left:92px; +} +div.jp-video div.jp-volume-bar { + top:17px; + left:72px; +} +div.jp-volume-bar-value { + background: url("jplayer.blue.monday.jpg") 0 -256px repeat-x; + width:0px; + height:5px; +} + +/* @end */ + +/* @group current time and duration */ + +div.jp-audio div.jp-time-holder { + position:absolute; + top:50px; +} +div.jp-audio div.jp-type-single div.jp-time-holder { + left:110px; + width:186px; +} +div.jp-audio div.jp-type-playlist div.jp-time-holder { + left:166px; + width:130px; +} + +div.jp-current-time, +div.jp-duration { + width:60px; + font-size:.64em; + font-style:oblique; +} +div.jp-current-time { + float: left; + display:inline; +} +div.jp-duration { + float: right; + display:inline; + text-align: right; +} + +div.jp-video div.jp-current-time { + margin-left:20px; +} +div.jp-video div.jp-duration { + margin-right:20px; +} + +/* @end */ + +/* @group playlist */ + +div.jp-title { + font-weight:bold; + text-align:center; +} + +div.jp-title, +div.jp-playlist { + width:100%; + background-color:#ccc; + border-top:1px solid #009be3; +} +div.jp-type-single div.jp-title, +div.jp-type-playlist div.jp-title, +div.jp-type-single div.jp-playlist { + border-top:none; +} +div.jp-title ul, +div.jp-playlist ul { + list-style-type:none; + margin:0; + padding:0 20px; + font-size:.72em; +} + +div.jp-title li { + padding:5px 0; + font-weight:bold; +} +div.jp-playlist li { + padding:5px 0 4px 20px; + border-bottom:1px solid #eee; +} + +div.jp-playlist li div { + display:inline; +} + +/* Note that the first-child (IE6) and last-child (IE6/7/8) selectors do not work on IE */ + +div.jp-type-playlist div.jp-playlist li:last-child { + padding:5px 0 5px 20px; + border-bottom:none; +} +div.jp-type-playlist div.jp-playlist li.jp-playlist-current { + list-style-type:square; + list-style-position:inside; + padding-left:7px; +} +div.jp-type-playlist div.jp-playlist a { + color: #333; + text-decoration: none; +} +div.jp-type-playlist div.jp-playlist a:hover { + color:#0d88c1; +} +div.jp-type-playlist div.jp-playlist a.jp-playlist-current { + color:#0d88c1; +} + +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove { + float:right; + display:inline; + text-align:right; + margin-right:10px; + font-weight:bold; + color:#666; +} +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove:hover { + color:#0d88c1; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media { + float:right; + display:inline; + text-align:right; + margin-right:10px; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media a{ + color:#666; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media a:hover{ + color:#0d88c1; +} +span.jp-artist { + font-size:.8em; + color:#666; +} + +/* @end */ + +div.jp-video-play { + width:100%; + overflow:hidden; /* Important for nested negative margins to work in modern browsers */ + cursor:pointer; + background-color:rgba(0,0,0,0); /* Makes IE9 work with the active area over the whole video area. IE6/7/8 only have the button as active area. */ +} +div.jp-video-270p div.jp-video-play { + margin-top:-270px; + height:270px; +} +div.jp-video-360p div.jp-video-play { + margin-top:-360px; + height:360px; +} +div.jp-video-full div.jp-video-play { + height:100%; +} +a.jp-video-play-icon { + position:relative; + display:block; + width: 112px; + height: 100px; + + margin-left:-56px; + margin-top:-50px; + left:50%; + top:50%; + + background: url("jplayer.blue.monday.video.play.png") 0 0 no-repeat; + text-indent:-9999px; +} +div.jp-video-play:hover a.jp-video-play-icon { + background: url("jplayer.blue.monday.video.play.png") 0 -100px no-repeat; +} + + + + + +div.jp-jplayer audio, +div.jp-jplayer { + width:0px; + height:0px; +} + +div.jp-jplayer { + background-color: #000000; +} + + + + + +/* @group TOGGLES */ + +/* The audio toggles are nested inside jp-time-holder */ + +ul.jp-toggles { + list-style-type:none; + padding:0; + margin:0 auto; + overflow:hidden; +} + +div.jp-audio .jp-type-single ul.jp-toggles { + width:25px; +} +div.jp-audio .jp-type-playlist ul.jp-toggles { + width:55px; + margin: 0; + position: absolute; + left: 325px; + top: 50px; +} + +div.jp-video ul.jp-toggles { + margin-top:10px; + width:100px; +} + +ul.jp-toggles li { + display:block; + float:right; +} + +ul.jp-toggles li a { + display:block; + width:25px; + height:18px; + text-indent:-9999px; + line-height:100%; /* need this for IE6 */ +} + +a.jp-full-screen { + background: url("jplayer.blue.monday.jpg") 0 -310px no-repeat; + margin-left: 20px; +} + +a.jp-full-screen:hover { + background: url("jplayer.blue.monday.jpg") -30px -310px no-repeat; +} + +a.jp-restore-screen { + background: url("jplayer.blue.monday.jpg") -60px -310px no-repeat; + margin-left: 20px; +} + +a.jp-restore-screen:hover { + background: url("jplayer.blue.monday.jpg") -90px -310px no-repeat; +} + +a.jp-repeat { + background: url("jplayer.blue.monday.jpg") 0 -290px no-repeat; +} + +a.jp-repeat:hover { + background: url("jplayer.blue.monday.jpg") -30px -290px no-repeat; +} + +a.jp-repeat-off { + background: url("jplayer.blue.monday.jpg") -60px -290px no-repeat; +} + +a.jp-repeat-off:hover { + background: url("jplayer.blue.monday.jpg") -90px -290px no-repeat; +} + +a.jp-shuffle { + background: url("jplayer.blue.monday.jpg") 0 -270px no-repeat; + margin-left: 5px; +} + +a.jp-shuffle:hover { + background: url("jplayer.blue.monday.jpg") -30px -270px no-repeat; +} + +a.jp-shuffle-off { + background: url("jplayer.blue.monday.jpg") -60px -270px no-repeat; + margin-left: 5px; +} + +a.jp-shuffle-off:hover { + background: url("jplayer.blue.monday.jpg") -90px -270px no-repeat; +} + + +/* @end */ + +/* @group NO SOLUTION error feedback */ + +.jp-no-solution { + padding:5px; + font-size:.8em; + background-color:#eee; + border:2px solid #009be3; + color:#000; + display:none; +} + +.jp-no-solution a { + color:#000; +} + +.jp-no-solution span { + font-size:1em; + display:block; + text-align:center; + font-weight:bold; +} + +/* @end */ diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.jpg b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.jpg new file mode 100755 index 0000000000000000000000000000000000000000..adab53ff7b6ea893972ce1f2c24323d319b8e5ea GIT binary patch literal 23189 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 I?Z5i}0Xq{#rvLx| literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.seeking.gif b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/jplayer.blue.monday.seeking.gif new file mode 100755 index 0000000000000000000000000000000000000000..dbd2105ab933f0336e1f732e32a54c6d6a8e1441 GIT binary patch literal 3284 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.playlist.html b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.playlist.html new file mode 100755 index 00000000..2c2d2dd0 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.playlist.html @@ -0,0 +1,42 @@ + + diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.single.html b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.single.html new file mode 100755 index 00000000..3b3341fe --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.single.html @@ -0,0 +1,37 @@ + + diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.stream.html b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.stream.html new file mode 100755 index 00000000..efeb5048 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.audio.stream.html @@ -0,0 +1,24 @@ + + diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.playlist.html b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.playlist.html new file mode 100755 index 00000000..7ffc474e --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.playlist.html @@ -0,0 +1,52 @@ + diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.single.html b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.single.html new file mode 100755 index 00000000..c9a16f83 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/mustache/jplayer.blue.monday.video.single.html @@ -0,0 +1,43 @@ + diff --git a/core/vendor/filemanager/js/jPlayer/skin/blue.monday/skin.handlebars b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/skin.handlebars new file mode 100755 index 00000000..b8ec557f --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/blue.monday/skin.handlebars @@ -0,0 +1,40 @@ + + \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.css b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.css new file mode 100755 index 00000000..8703b18d --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.css @@ -0,0 +1,572 @@ +/*! Pink Flag Skin for jPlayer 2.9.2 ~ (c) 2009-2014 Happyworm Ltd ~ MIT License */ + +/* + * Skin for jPlayer Plugin (jQuery JavaScript Library) + * http://www.jplayer.org + * + * Skin Name: Pink Flag + * + * Copyright (c) 2012 - 2014 Happyworm Ltd + * Licensed under the MIT license. + * - http://www.opensource.org/licenses/mit-license.php + * + * Author: Silvia Benvenuti + * Skin Version: 2.1 (jPlayer 2.8.0) + * Date: 13th November 2014 + */ +.jp-audio *:focus, +.jp-audio-stream *:focus, +.jp-video *:focus { + /* Disable the browser focus highlighting. */ + outline: none; } + +.jp-audio button::-moz-focus-inner, +.jp-audio-stream button::-moz-focus-inner, +.jp-video button::-moz-focus-inner { + /* Disable the browser CSS3 focus highlighting. */ + border: 0; } + +.jp-audio, +.jp-audio-stream, +.jp-video { + font-size: 16px; + font-family: Verdana, Arial, sans-serif; + line-height: 1.6; + color: #fff; + border-top: 1px solid #554461; + border-left: 1px solid #554461; + border-right: 1px solid #180a1f; + border-bottom: 1px solid #180a1f; + background-color: #3a2a45; } + +.jp-audio { + width: 201px; + padding: 20px; } + +.jp-audio-stream { + width: 101px; + padding: 20px 20px 10px 20px; } + +.jp-video-270p { + width: 480px; } + +.jp-video-360p { + width: 640px; } + +.jp-video-full { + /* Rules for IE6 (full-screen) */ + width: 480px; + height: 270px; + /* Rules for IE7 (full-screen) - Otherwise the relative container causes other page items that are not position:static (default) to appear over the video/gui. */ + position: static !important; + position: relative; } + +/* The z-index rule is defined in this manner to enable Popcorn plugins that add overlays to video area. EG. Subtitles. */ +.jp-video-full div div { + z-index: 1000; } + +.jp-video-full .jp-jplayer { + top: 0; + left: 0; + position: fixed !important; + position: relative; + /* Rules for IE6 (full-screen) */ + overflow: hidden; } + +.jp-video-full .jp-gui { + position: fixed !important; + position: static; + /* Rules for IE6 (full-screen) */ + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 1001; + /* 1 layer above the others. */ } + +.jp-video-full .jp-interface { + position: absolute !important; + position: relative; + /* Rules for IE6 (full-screen) */ + bottom: 0; + left: 0; } + +.jp-interface { + position: relative; + width: 100%; + background-color: #3a2a45; + /* Required for the full screen */ } + +/* @group CONTROLS */ +.jp-video .jp-controls-holder { + clear: both; + width: 440px; + margin: 0 auto 10px auto; + position: relative; + overflow: hidden; } + +.jp-audio .jp-controls-holder { + height: 80px; } + +.jp-audio-stream .jp-controls-holder { + height: 50px; } + +.jp-controls { + background: url("../image/jplayer.pink.flag.jpg") 0 0 no-repeat; + padding: 1px 0 2px 1px; + overflow: hidden; + width: 201px; + height: 34px; } + +.jp-audio .jp-controls, +.jp-audio-stream .jp-controls { + margin: 0 auto; } + +.jp-audio-stream .jp-controls { + width: 100px; } + +.jp-video .jp-controls { + margin: 0 0 0 115px; + float: left; + display: inline; + /* need this to fix IE6 double margin */ } + +.jp-controls button { + display: block; + float: left; + overflow: hidden; + text-indent: -9999px; + height: 34px; + margin: 0 1px 2px 0; + padding: 0; + border: none; + cursor: pointer; } + +/* @group single player controls */ +.jp-type-single .jp-controls button { + width: 99px; } + +.jp-type-single .jp-play { + background: url("../image/jplayer.pink.flag.jpg") 0px -40px no-repeat; } + +.jp-type-single .jp-play:focus { + background: url("../image/jplayer.pink.flag.jpg") -100px -40px no-repeat; } + +.jp-state-playing .jp-type-single .jp-play { + background: url("../image/jplayer.pink.flag.jpg") 0px -120px no-repeat; } + +.jp-state-playing .jp-type-single .jp-play:focus { + background: url("../image/jplayer.pink.flag.jpg") -100px -120px no-repeat; } + +/* The right border is normally in the ul background image. */ +.jp-audio-stream .jp-play, +.jp-audio-stream .jp-pause { + border-right: 1px solid #180920; } + +.jp-type-single .jp-stop { + background: url("../image/jplayer.pink.flag.jpg") 0px -80px no-repeat; } + +.jp-type-single .jp-stop:focus { + background: url("../image/jplayer.pink.flag.jpg") -100px -80px no-repeat; } + +/* @end */ +/* @group playlist player controls */ +.jp-type-playlist .jp-controls button { + width: 49px; } + +.jp-type-playlist .jp-play { + background: url("../image/jplayer.pink.flag.jpg") -24px -40px no-repeat; } + +.jp-type-playlist .jp-play:focus { + background: url("../image/jplayer.pink.flag.jpg") -124px -40px no-repeat; } + +.jp-state-playing div.jp-type-playlist .jp-play { + background: url("../image/jplayer.pink.flag.jpg") -24px -120px no-repeat; } + +.jp-state-playing div.jp-type-playlist .jp-play:focus { + background: url("../image/jplayer.pink.flag.jpg") -124px -120px no-repeat; } + +.jp-type-playlist .jp-stop { + background: url("../image/jplayer.pink.flag.jpg") -24px -80px no-repeat; } + +.jp-type-playlist .jp-stop:focus { + background: url("../image/jplayer.pink.flag.jpg") -124px -80px no-repeat; } + +.jp-type-playlist .jp-previous { + background: url("../image/jplayer.pink.flag.jpg") -24px -200px no-repeat; } + +.jp-type-playlist .jp-previous:focus { + background: url("../image/jplayer.pink.flag.jpg") -124px -200px no-repeat; } + +.jp-type-playlist .jp-next { + background: url("../image/jplayer.pink.flag.jpg") -24px -160px no-repeat; } + +.jp-type-playlist .jp-next:focus { + background: url("../image/jplayer.pink.flag.jpg") -124px -160px no-repeat; } + +/* @end */ +/* @group TOGGLES */ +.jp-toggles { + padding: 0; + margin: 0 auto; + overflow: hidden; } + +.jp-audio .jp-toggles { + width: 55px; } + +.jp-audio .jp-type-single .jp-toggles { + width: 25px; } + +.jp-video .jp-toggles { + float: left; + width: 105px; + margin: 10px 0 0 15px; } + +.jp-toggles button { + display: block; + float: left; + width: 25px; + height: 18px; + text-indent: -9999px; + line-height: 100%; + /* need this for IE6 */ + border: none; + cursor: pointer; } + +.jp-full-screen { + background: url("../image/jplayer.pink.flag.jpg") 0 -420px no-repeat; + margin-left: 15px; } + +.jp-full-screen:focus { + background: url("../image/jplayer.pink.flag.jpg") -30px -420px no-repeat; } + +.jp-state-full-screen .jp-full-screen { + background: url("../image/jplayer.pink.flag.jpg") -60px -420px no-repeat; } + +.jp-state-full-screen .jp-full-screen:focus { + background: url("../image/jplayer.pink.flag.jpg") -90px -420px no-repeat; } + +.jp-repeat { + background: url("../image/jplayer.pink.flag.jpg") 0 -440px no-repeat; + margin-left: 0; } + +.jp-repeat:focus { + background: url("../image/jplayer.pink.flag.jpg") -30px -440px no-repeat; } + +.jp-state-looped .jp-repeat { + background: url("../image/jplayer.pink.flag.jpg") -60px -440px no-repeat; } + +.jp-state-looped .jp-repeat:focus { + background: url("../image/jplayer.pink.flag.jpg") -90px -440px no-repeat; } + +.jp-shuffle { + background: url("../image/jplayer.pink.flag.jpg") 0 -460px no-repeat; + margin-left: 15px; } + +.jp-shuffle:focus { + background: url("../image/jplayer.pink.flag.jpg") -30px -460px no-repeat; } + +.jp-state-shuffled .jp-shuffle { + background: url("../image/jplayer.pink.flag.jpg") -60px -460px no-repeat; } + +.jp-state-shuffled .jp-shuffle:focus { + background: url("../image/jplayer.pink.flag.jpg") -90px -460px no-repeat; } + +.jp-audio .jp-shuffle { + margin-left: 5px; } + +/* @end */ +/* @group progress bar */ +/* The seeking class is added/removed inside jPlayer */ +div.jp-seeking-bg { + background: url("../image/jplayer.pink.flag.seeking.gif"); } + +.jp-progress { + background: url("../image/jplayer.pink.flag.jpg") 0px -240px no-repeat; + width: 197px; + height: 13px; + padding: 0 2px 2px 2px; + margin-bottom: 4px; + overflow: hidden; } + +div.jp-video .jp-progress { + border-top: 1px solid #180a1f; + border-bottom: 1px solid #554560; + width: 100%; + background-image: none; + padding: 0; } + +.jp-seek-bar { + background: url("../image/jplayer.pink.flag.jpg") 0px -260px repeat-x; + width: 0px; + height: 100%; + overflow: hidden; + cursor: pointer; } + +.jp-play-bar { + background: url("../image/jplayer.pink.flag.jpg") 0px -280px repeat-x; + width: 0px; + height: 100%; + overflow: hidden; } + +/* @end */ +/* @group volume controls */ +.jp-state-no-volume .jp-volume-controls { + display: none; } + +.jp-audio .jp-volume-controls, +.jp-audio-stream .jp-volume-controls { + height: 30px; } + +.jp-volume-controls button { + position: absolute; + display: block; + overflow: hidden; + text-indent: -9999px; + margin: 0; + padding: 0; + width: 16px; + height: 11px; + border: none; + cursor: pointer; } + +.jp-audio .jp-volume-controls .jp-mute, +.jp-audio-stream .jp-volume-controls .jp-mute { + top: -6px; + left: 0; } + +.jp-audio .jp-volume-controls .jp-volume-max, +.jp-audio-stream .jp-volume-controls .jp-volume-max { + top: -6px; + right: 0; } + +.jp-video .jp-volume-controls .jp-mute, +.jp-video .jp-volume-controls .jp-unmute { + left: 0; + top: 14px; } + +.jp-video .jp-volume-controls .jp-volume-max { + left: 84px; + top: 14px; } + +.jp-volume-controls .jp-mute { + background: url("../image/jplayer.pink.flag.jpg") 0px -330px no-repeat; } + +.jp-volume-controls .jp-mute:focus { + background: url("../image/jplayer.pink.flag.jpg") -25px -330px no-repeat; } + +.jp-state-muted .jp-volume-controls .jp-mute { + background: url("../image/jplayer.pink.flag.jpg") -60px -330px no-repeat; } + +.jp-state-muted .jp-volume-controls .jp-mute:focus { + background: url("../image/jplayer.pink.flag.jpg") -85px -330px no-repeat; } + +.jp-volume-controls .jp-volume-max { + background: url("../image/jplayer.pink.flag.jpg") 0px -350px no-repeat; } + +.jp-volume-controls .jp-volume-max:focus { + background: url("../image/jplayer.pink.flag.jpg") -25px -350px no-repeat; } + +.jp-volume-bar { + background: url("../image/jplayer.pink.flag.jpg") 0px -300px repeat-x; + position: absolute; + width: 197px; + height: 4px; + padding: 2px 2px 1px 2px; + overflow: hidden; + cursor: pointer; } + +.jp-audio .jp-interface .jp-volume-bar, +.jp-audio-stream .jp-interface .jp-volume-bar { + top: 10px; + left: 0; } + +.jp-audio-stream .jp-interface .jp-volume-bar { + width: 97px; + border-right: 1px solid #180920; + padding-right: 1px; } + +.jp-video .jp-volume-bar { + top: 0; + left: 0; + width: 95px; + border-right: 1px solid #180920; + padding-right: 1px; + margin-top: 30px; } + +.jp-volume-bar-value { + background: url("../image/jplayer.pink.flag.jpg") 0px -320px repeat-x; + height: 4px; } + +/* @end */ +/* @group current time and duration */ +.jp-current-time, .jp-duration { + width: 70px; + font-size: .5em; + color: #8c7a99; } + +.jp-current-time { + float: left; + cursor: default; } + +.jp-duration { + float: right; + text-align: right; + cursor: pointer; } + +.jp-video .jp-current-time { + padding-left: 20px; } + +.jp-video .jp-duration { + padding-right: 20px; } + +/* @end */ +/* @group playlist */ +.jp-details { + font-size: .7em; + margin: 0; + padding: 0; } + +.jp-details .jp-title { + padding: 0; + margin: 0; + overflow: hidden; + text-align: center; + cursor: default; } + +.jp-video .jp-details { + margin: 0 90px 10px; } + +.jp-playlist ul { + list-style-type: none; + font-size: .7em; + margin: 0; + padding: 0; } + +.jp-video .jp-playlist ul { + margin: 0 20px; } + +.jp-playlist li { + position: relative; + padding: 2px 0; + border-top: 1px solid #554461; + border-bottom: 1px solid #180a1f; + overflow: hidden; } + +/* Note that the first-child (IE6) and last-child (IE6/7/8) selectors do not work on IE */ +div.jp-type-playlist div.jp-playlist li:first-child { + border-top: none; + padding-top: 3px; } + +div.jp-type-playlist div.jp-playlist li:last-child { + border-bottom: none; + padding-bottom: 3px; } + +div.jp-type-playlist div.jp-playlist a { + color: #fff; + text-decoration: none; } + +div.jp-type-playlist div.jp-playlist a:hover { + color: #e892e9; } + +div.jp-type-playlist div.jp-playlist li.jp-playlist-current { + background-color: #26102e; + margin: 0 -20px; + padding: 2px 20px; + border-top: 1px solid #26102e; + border-bottom: 1px solid #26102e; } + +div.jp-type-playlist div.jp-playlist li.jp-playlist-current a { + color: #e892e9; } + +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove { + float: right; + display: inline; + text-align: right; + margin-left: 10px; + font-weight: bold; + color: #8C7A99; } + +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove:hover { + color: #E892E9; } + +div.jp-type-playlist div.jp-playlist span.jp-free-media { + float: right; + display: inline; + text-align: right; + color: #8C7A99; } + +div.jp-type-playlist div.jp-playlist span.jp-free-media a { + color: #8C7A99; } + +div.jp-type-playlist div.jp-playlist span.jp-free-media a:hover { + color: #E892E9; } + +span.jp-artist { + font-size: .8em; + color: #8C7A99; } + +/* @end */ +.jp-video .jp-video-play { + width: 100%; + overflow: hidden; + /* Important for nested negative margins to work in modern browsers */ } + +.jp-video-270p .jp-video-play { + margin-top: -270px; + height: 270px; } + +.jp-video-360p .jp-video-play { + margin-top: -360px; + height: 360px; } + +.jp-video-full .jp-video-play { + height: 100%; } + +.jp-video-play-icon { + position: relative; + display: block; + width: 112px; + height: 100px; + margin-left: -56px; + margin-top: -50px; + left: 50%; + top: 50%; + border: none; + cursor: pointer; + background: url("../image/jplayer.pink.flag.video.play.png") 0 0 no-repeat; + text-indent: -9999px; } + +.jp-video-play-icon:focus { + background: url("../image/jplayer.pink.flag.video.play.png") 0 -100px no-repeat; } + +.jp-jplayer audio, +.jp-jplayer { + width: 0px; + height: 0px; } + +.jp-jplayer { + background-color: #000000; } + +/* @group NO SOLUTION error feedback */ +.jp-no-solution { + padding: 5px; + font-size: .8em; + background-color: #3a2a45; + border-top: 2px solid #554461; + border-left: 2px solid #554461; + border-right: 2px solid #180a1f; + border-bottom: 2px solid #180a1f; + color: #FFF; + display: none; } + +.jp-no-solution a { + color: #FFF; } + +.jp-no-solution span { + font-size: 1em; + display: block; + text-align: center; + font-weight: bold; } + +/* @end */ diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.min.css b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.min.css new file mode 100755 index 00000000..7e0f6de6 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/css/jplayer.pink.flag.min.css @@ -0,0 +1 @@ +/*! Pink Flag Skin for jPlayer 2.9.2 ~ (c) 2009-2014 Happyworm Ltd ~ MIT License */.jp-audio :focus,.jp-audio-stream :focus,.jp-video :focus{outline:0}.jp-audio button::-moz-focus-inner,.jp-audio-stream button::-moz-focus-inner,.jp-video button::-moz-focus-inner{border:0}.jp-audio,.jp-audio-stream,.jp-video{font-size:16px;font-family:Verdana,Arial,sans-serif;line-height:1.6;color:#fff;border-top:1px solid #554461;border-left:1px solid #554461;border-right:1px solid #180a1f;border-bottom:1px solid #180a1f;background-color:#3a2a45}.jp-audio{width:201px;padding:20px}.jp-audio-stream{width:101px;padding:20px 20px 10px}.jp-video-270p{width:480px}.jp-video-360p{width:640px}.jp-video-full{width:480px;height:270px;position:static!important;position:relative}.jp-video-full div div{z-index:1000}.jp-video-full .jp-jplayer{top:0;left:0;position:fixed!important;position:relative;overflow:hidden}.jp-video-full .jp-gui{position:fixed!important;position:static;top:0;left:0;width:100%;height:100%;z-index:1001}.jp-video-full .jp-interface{position:absolute!important;position:relative;bottom:0;left:0}.jp-interface{position:relative;width:100%;background-color:#3a2a45}.jp-video .jp-controls-holder{clear:both;width:440px;margin:0 auto 10px;position:relative;overflow:hidden}.jp-audio .jp-controls-holder{height:80px}.jp-audio-stream .jp-controls-holder{height:50px}.jp-controls{background:url(../image/jplayer.pink.flag.jpg) no-repeat;padding:1px 0 2px 1px;overflow:hidden;width:201px;height:34px}.jp-audio .jp-controls,.jp-audio-stream .jp-controls{margin:0 auto}.jp-audio-stream .jp-controls{width:100px}.jp-video .jp-controls{margin:0 0 0 115px;float:left;display:inline}.jp-controls button{display:block;float:left;overflow:hidden;text-indent:-9999px;height:34px;margin:0 1px 2px 0;padding:0;border:none;cursor:pointer}.jp-type-single .jp-controls button{width:99px}.jp-type-single .jp-play{background:url(../image/jplayer.pink.flag.jpg) 0 -40px no-repeat}.jp-type-single .jp-play:focus{background:url(../image/jplayer.pink.flag.jpg) -100px -40px no-repeat}.jp-state-playing .jp-type-single .jp-play{background:url(../image/jplayer.pink.flag.jpg) 0 -120px no-repeat}.jp-state-playing .jp-type-single .jp-play:focus{background:url(../image/jplayer.pink.flag.jpg) -100px -120px no-repeat}.jp-audio-stream .jp-pause,.jp-audio-stream .jp-play{border-right:1px solid #180920}.jp-type-single .jp-stop{background:url(../image/jplayer.pink.flag.jpg) 0 -80px no-repeat}.jp-type-single .jp-stop:focus{background:url(../image/jplayer.pink.flag.jpg) -100px -80px no-repeat}.jp-type-playlist .jp-controls button{width:49px}.jp-type-playlist .jp-play{background:url(../image/jplayer.pink.flag.jpg) -24px -40px no-repeat}.jp-type-playlist .jp-play:focus{background:url(../image/jplayer.pink.flag.jpg) -124px -40px no-repeat}.jp-state-playing div.jp-type-playlist .jp-play{background:url(../image/jplayer.pink.flag.jpg) -24px -120px no-repeat}.jp-state-playing div.jp-type-playlist .jp-play:focus{background:url(../image/jplayer.pink.flag.jpg) -124px -120px no-repeat}.jp-type-playlist .jp-stop{background:url(../image/jplayer.pink.flag.jpg) -24px -80px no-repeat}.jp-type-playlist .jp-stop:focus{background:url(../image/jplayer.pink.flag.jpg) -124px -80px no-repeat}.jp-type-playlist .jp-previous{background:url(../image/jplayer.pink.flag.jpg) -24px -200px no-repeat}.jp-type-playlist .jp-previous:focus{background:url(../image/jplayer.pink.flag.jpg) -124px -200px no-repeat}.jp-type-playlist .jp-next{background:url(../image/jplayer.pink.flag.jpg) -24px -160px no-repeat}.jp-type-playlist .jp-next:focus{background:url(../image/jplayer.pink.flag.jpg) -124px -160px no-repeat}.jp-toggles{padding:0;margin:0 auto;overflow:hidden}.jp-audio .jp-toggles{width:55px}.jp-audio .jp-type-single .jp-toggles{width:25px}.jp-video .jp-toggles{float:left;width:105px;margin:10px 0 0 15px}.jp-toggles button{display:block;float:left;width:25px;height:18px;text-indent:-9999px;line-height:100%;border:none;cursor:pointer}.jp-full-screen{background:url(../image/jplayer.pink.flag.jpg) 0 -420px no-repeat;margin-left:15px}.jp-full-screen:focus{background:url(../image/jplayer.pink.flag.jpg) -30px -420px no-repeat}.jp-state-full-screen .jp-full-screen{background:url(../image/jplayer.pink.flag.jpg) -60px -420px no-repeat}.jp-state-full-screen .jp-full-screen:focus{background:url(../image/jplayer.pink.flag.jpg) -90px -420px no-repeat}.jp-repeat{background:url(../image/jplayer.pink.flag.jpg) 0 -440px no-repeat;margin-left:0}.jp-repeat:focus{background:url(../image/jplayer.pink.flag.jpg) -30px -440px no-repeat}.jp-state-looped .jp-repeat{background:url(../image/jplayer.pink.flag.jpg) -60px -440px no-repeat}.jp-state-looped .jp-repeat:focus{background:url(../image/jplayer.pink.flag.jpg) -90px -440px no-repeat}.jp-shuffle{background:url(../image/jplayer.pink.flag.jpg) 0 -460px no-repeat;margin-left:15px}.jp-shuffle:focus{background:url(../image/jplayer.pink.flag.jpg) -30px -460px no-repeat}.jp-state-shuffled .jp-shuffle{background:url(../image/jplayer.pink.flag.jpg) -60px -460px no-repeat}.jp-state-shuffled .jp-shuffle:focus{background:url(../image/jplayer.pink.flag.jpg) -90px -460px no-repeat}.jp-audio .jp-shuffle{margin-left:5px}div.jp-seeking-bg{background:url(../image/jplayer.pink.flag.seeking.gif)}.jp-progress{background:url(../image/jplayer.pink.flag.jpg) 0 -240px no-repeat;width:197px;height:13px;padding:0 2px 2px;margin-bottom:4px;overflow:hidden}div.jp-video .jp-progress{border-top:1px solid #180a1f;border-bottom:1px solid #554560;width:100%;background-image:none;padding:0}.jp-seek-bar{background:url(../image/jplayer.pink.flag.jpg) 0 -260px repeat-x;width:0;height:100%;overflow:hidden;cursor:pointer}.jp-play-bar{background:url(../image/jplayer.pink.flag.jpg) 0 -280px repeat-x;width:0;height:100%;overflow:hidden}.jp-state-no-volume .jp-volume-controls{display:none}.jp-audio .jp-volume-controls,.jp-audio-stream .jp-volume-controls{height:30px}.jp-volume-controls button{position:absolute;display:block;overflow:hidden;text-indent:-9999px;margin:0;padding:0;width:16px;height:11px;border:none;cursor:pointer}.jp-audio .jp-volume-controls .jp-mute,.jp-audio-stream .jp-volume-controls .jp-mute{top:-6px;left:0}.jp-audio .jp-volume-controls .jp-volume-max,.jp-audio-stream .jp-volume-controls .jp-volume-max{top:-6px;right:0}.jp-video .jp-volume-controls .jp-mute,.jp-video .jp-volume-controls .jp-unmute{left:0;top:14px}.jp-video .jp-volume-controls .jp-volume-max{left:84px;top:14px}.jp-volume-controls .jp-mute{background:url(../image/jplayer.pink.flag.jpg) 0 -330px no-repeat}.jp-volume-controls .jp-mute:focus{background:url(../image/jplayer.pink.flag.jpg) -25px -330px no-repeat}.jp-state-muted .jp-volume-controls .jp-mute{background:url(../image/jplayer.pink.flag.jpg) -60px -330px no-repeat}.jp-state-muted .jp-volume-controls .jp-mute:focus{background:url(../image/jplayer.pink.flag.jpg) -85px -330px no-repeat}.jp-volume-controls .jp-volume-max{background:url(../image/jplayer.pink.flag.jpg) 0 -350px no-repeat}.jp-volume-controls .jp-volume-max:focus{background:url(../image/jplayer.pink.flag.jpg) -25px -350px no-repeat}.jp-volume-bar{background:url(../image/jplayer.pink.flag.jpg) 0 -300px repeat-x;position:absolute;width:197px;height:4px;padding:2px 2px 1px;overflow:hidden;cursor:pointer}.jp-audio .jp-interface .jp-volume-bar,.jp-audio-stream .jp-interface .jp-volume-bar{top:10px;left:0}.jp-audio-stream .jp-interface .jp-volume-bar{width:97px;border-right:1px solid #180920;padding-right:1px}.jp-video .jp-volume-bar{top:0;left:0;width:95px;border-right:1px solid #180920;padding-right:1px;margin-top:30px}.jp-volume-bar-value{background:url(../image/jplayer.pink.flag.jpg) 0 -320px repeat-x;height:4px}.jp-current-time,.jp-duration{width:70px;font-size:.5em;color:#8c7a99}.jp-current-time{float:left;cursor:default}.jp-duration{float:right;text-align:right;cursor:pointer}.jp-video .jp-current-time{padding-left:20px}.jp-video .jp-duration{padding-right:20px}.jp-details{font-size:.7em;margin:0;padding:0}.jp-details .jp-title{padding:0;margin:0;overflow:hidden;text-align:center;cursor:default}.jp-video .jp-details{margin:0 90px 10px}.jp-playlist ul{list-style-type:none;font-size:.7em;margin:0;padding:0}.jp-video .jp-playlist ul{margin:0 20px}.jp-playlist li{position:relative;padding:2px 0;border-top:1px solid #554461;border-bottom:1px solid #180a1f;overflow:hidden}div.jp-type-playlist div.jp-playlist li:first-child{border-top:none;padding-top:3px}div.jp-type-playlist div.jp-playlist li:last-child{border-bottom:none;padding-bottom:3px}div.jp-type-playlist div.jp-playlist a{color:#fff;text-decoration:none}div.jp-type-playlist div.jp-playlist a:hover{color:#e892e9}div.jp-type-playlist div.jp-playlist li.jp-playlist-current{background-color:#26102e;margin:0 -20px;padding:2px 20px;border-top:1px solid #26102e;border-bottom:1px solid #26102e}div.jp-type-playlist div.jp-playlist li.jp-playlist-current a{color:#e892e9}div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove{float:right;display:inline;text-align:right;margin-left:10px;font-weight:700;color:#8C7A99}div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove:hover{color:#E892E9}div.jp-type-playlist div.jp-playlist span.jp-free-media{float:right;display:inline;text-align:right;color:#8C7A99}div.jp-type-playlist div.jp-playlist span.jp-free-media a{color:#8C7A99}div.jp-type-playlist div.jp-playlist span.jp-free-media a:hover{color:#E892E9}span.jp-artist{font-size:.8em;color:#8C7A99}.jp-video .jp-video-play{width:100%;overflow:hidden}.jp-video-270p .jp-video-play{margin-top:-270px;height:270px}.jp-video-360p .jp-video-play{margin-top:-360px;height:360px}.jp-video-full .jp-video-play{height:100%}.jp-video-play-icon{position:relative;display:block;width:112px;height:100px;margin-left:-56px;margin-top:-50px;left:50%;top:50%;border:none;cursor:pointer;background:url(../image/jplayer.pink.flag.video.play.png) no-repeat;text-indent:-9999px}.jp-video-play-icon:focus{background:url(../image/jplayer.pink.flag.video.play.png) 0 -100px no-repeat}.jp-jplayer,.jp-jplayer audio{width:0;height:0}.jp-jplayer{background-color:#000}.jp-no-solution{padding:5px;font-size:.8em;background-color:#3a2a45;border-top:2px solid #554461;border-left:2px solid #554461;border-right:2px solid #180a1f;border-bottom:2px solid #180a1f;color:#FFF;display:none}.jp-no-solution a{color:#FFF}.jp-no-solution span{font-size:1em;display:block;text-align:center;font-weight:700} \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/image/jplayer.pink.flag.jpg b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/image/jplayer.pink.flag.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0c084e298844644faab531e0bec15452795f14ed GIT binary patch literal 18426 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/image/jplayer.pink.flag.seeking.gif b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/image/jplayer.pink.flag.seeking.gif new file mode 100755 index 0000000000000000000000000000000000000000..754ceb167377fd304f0bd596d7458277fe47265f GIT binary patch literal 3284 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.playlist.html b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.playlist.html new file mode 100755 index 00000000..f64d5f9d --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.playlist.html @@ -0,0 +1,42 @@ + + diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.single.html b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.single.html new file mode 100755 index 00000000..83662d71 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.single.html @@ -0,0 +1,37 @@ + + diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.stream.html b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.stream.html new file mode 100755 index 00000000..f16c74f2 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.audio.stream.html @@ -0,0 +1,24 @@ + + diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.playlist.html b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.playlist.html new file mode 100755 index 00000000..1cd16cab --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.playlist.html @@ -0,0 +1,52 @@ + diff --git a/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.single.html b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.single.html new file mode 100755 index 00000000..519c147b --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin/pink.flag/mustache/jplayer.pink.flag.video.single.html @@ -0,0 +1,43 @@ + diff --git a/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.css b/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.css new file mode 100755 index 00000000..1a5da65e --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.css @@ -0,0 +1,640 @@ +/* + * Skin for jPlayer Plugin (jQuery JavaScript Library) + * http://www.jplayer.org + * + * Skin Name: Blue Monday + * + * Copyright (c) 2010-2012 Happyworm Ltd + * Dual licensed under the MIT and GPL licenses. + * - http://www.opensource.org/licenses/mit-license.php + * - http://www.gnu.org/copyleft/gpl.html + * + * Author: Silvia Benvenuti + * Skin Version: 4.3 (jPlayer 2.2.0) + * Date: 19th November 2012 + */ + +div.jp-audio, +div.jp-audio-stream, +div.jp-video { + + /* Edit the font-size to counteract inherited font sizing. + * Eg. 1.25em = 1 / 0.8em + */ + + font-size:1.25em; /* 1.25em for testing in site pages */ /* No parent CSS that can effect the size in the demos ZIP */ + + font-family:Verdana, Arial, sans-serif; + line-height:1.6; + color: #666; + border:1px solid #009be3; + background-color:#eee; +} +div.jp-audio { + width:420px; +} +div.jp-audio-stream { + width:182px; +} +div.jp-video-270p { + width:480px; +} +div.jp-video-360p { + width:640px; +} +div.jp-video-full { + /* Rules for IE6 (full-screen) */ + width:480px; + height:270px; + /* Rules for IE7 (full-screen) - Otherwise the relative container causes other page items that are not position:static (default) to appear over the video/gui. */ + position:static !important; position:relative; +} + +/* The z-index rule is defined in this manner to enable Popcorn plugins that add overlays to video area. EG. Subtitles. */ +div.jp-video-full div div { + z-index:1000; +} + +div.jp-video-full div.jp-jplayer { + top: 0; + left: 0; + position: fixed !important; position: relative; /* Rules for IE6 (full-screen) */ + overflow: hidden; +} + +div.jp-video-full div.jp-gui { + position: fixed !important; position: static; /* Rules for IE6 (full-screen) */ + top: 0; + left: 0; + width:100%; + height:100%; + z-index:1001; /* 1 layer above the others. */ +} + +div.jp-video-full div.jp-interface { + position: absolute !important; position: relative; /* Rules for IE6 (full-screen) */ + bottom: 0; + left: 0; +} + +div.jp-interface { + position: relative; + background-color:#eee; + width:100%; +} + +div.jp-audio div.jp-type-single div.jp-interface { + height:80px; +} +div.jp-audio div.jp-type-playlist div.jp-interface { + height:80px; +} + +div.jp-audio-stream div.jp-type-single div.jp-interface { + height:80px; +} + +div.jp-video div.jp-interface { + border-top:1px solid #009be3; +} + +/* @group CONTROLS */ + +div.jp-controls-holder { + clear: both; + width:440px; + margin:0 auto; + position: relative; + overflow:hidden; + top:-8px; /* This negative value depends on the size of the text in jp-currentTime and jp-duration */ +} + +div.jp-interface ul.jp-controls { + list-style-type:none; + margin:0; + padding: 0; + overflow:hidden; +} + +div.jp-audio ul.jp-controls { + width: 380px; + padding:20px 20px 0 20px; +} + +div.jp-audio-stream ul.jp-controls { + width: 142px; + padding:20px 20px 0 20px; +} + +div.jp-video div.jp-type-single ul.jp-controls { + width: 78px; + margin-left: 200px; +} + +div.jp-video div.jp-type-playlist ul.jp-controls { + width: 134px; + margin-left: 172px; +} +div.jp-video ul.jp-controls, +div.jp-interface ul.jp-controls li { + display:inline; + float: left; +} + +div.jp-interface ul.jp-controls a { + display:block; + overflow:hidden; + text-indent:-9999px; +} +a.jp-play, +a.jp-pause { + width:40px; + height:40px; +} + +a.jp-play { + background: url("jplayer.blue.monday.jpg") 0 0 no-repeat; +} +a.jp-play:hover { + background: url("jplayer.blue.monday.jpg") -41px 0 no-repeat; +} +a.jp-pause { + background: url("jplayer.blue.monday.jpg") 0 -42px no-repeat; + display: none; +} +a.jp-pause:hover { + background: url("jplayer.blue.monday.jpg") -41px -42px no-repeat; +} + +a.jp-stop, a.jp-previous, a.jp-next { + width:28px; + height:28px; + margin-top:6px; +} + +a.jp-stop { + background: url("jplayer.blue.monday.jpg") 0 -83px no-repeat; + margin-left:10px; +} + +a.jp-stop:hover { + background: url("jplayer.blue.monday.jpg") -29px -83px no-repeat; +} + +a.jp-previous { + background: url("jplayer.blue.monday.jpg") 0 -112px no-repeat; +} +a.jp-previous:hover { + background: url("jplayer.blue.monday.jpg") -29px -112px no-repeat; +} + +a.jp-next { + background: url("jplayer.blue.monday.jpg") 0 -141px no-repeat; +} +a.jp-next:hover { + background: url("jplayer.blue.monday.jpg") -29px -141px no-repeat; +} + +/* @end */ + +/* @group progress bar */ + +div.jp-progress { + overflow:hidden; + background-color: #ddd; +} +div.jp-audio div.jp-progress { + position: absolute; + top:32px; + height:15px; +} +div.jp-audio div.jp-type-single div.jp-progress { + left:110px; + width:186px; +} +div.jp-audio div.jp-type-playlist div.jp-progress { + left:166px; + width:130px; +} +div.jp-video div.jp-progress { + top:0px; + left:0px; + width:100%; + height:10px; +} +div.jp-seek-bar { + background: url("jplayer.blue.monday.jpg") 0 -202px repeat-x; + width:0px; + height:100%; + cursor: pointer; +} +div.jp-play-bar { + background: url("jplayer.blue.monday.jpg") 0 -218px repeat-x ; + width:0px; + height:100%; +} + +/* The seeking class is added/removed inside jPlayer */ +div.jp-seeking-bg { + background: url("jplayer.blue.monday.seeking.gif"); +} + +/* @end */ + +/* @group volume controls */ + + +a.jp-mute, +a.jp-unmute, +a.jp-volume-max { + width:18px; + height:15px; + margin-top:12px; +} + +div.jp-audio div.jp-type-single a.jp-mute, +div.jp-audio div.jp-type-single a.jp-unmute { + margin-left: 210px; +} +div.jp-audio div.jp-type-playlist a.jp-mute, +div.jp-audio div.jp-type-playlist a.jp-unmute { + margin-left: 154px; +} + +div.jp-audio-stream div.jp-type-single a.jp-mute, +div.jp-audio-stream div.jp-type-single a.jp-unmute { + margin-left:10px; +} + +div.jp-audio a.jp-volume-max, +div.jp-audio-stream a.jp-volume-max { + margin-left: 56px; +} + +div.jp-video a.jp-mute, +div.jp-video a.jp-unmute, +div.jp-video a.jp-volume-max { + position: absolute; + top:12px; + margin-top:0; +} + +div.jp-video a.jp-mute, +div.jp-video a.jp-unmute { + left: 50px; +} + +div.jp-video a.jp-volume-max { + left: 134px; +} + +a.jp-mute { + background: url("jplayer.blue.monday.jpg") 0 -170px no-repeat; +} +a.jp-mute:hover { + background: url("jplayer.blue.monday.jpg") -19px -170px no-repeat; +} +a.jp-unmute { + background: url("jplayer.blue.monday.jpg") -60px -170px no-repeat; + display: none; +} +a.jp-unmute:hover { + background: url("jplayer.blue.monday.jpg") -79px -170px no-repeat; +} +a.jp-volume-max { + background: url("jplayer.blue.monday.jpg") 0 -186px no-repeat; +} +a.jp-volume-max:hover { + background: url("jplayer.blue.monday.jpg") -19px -186px no-repeat; +} + +div.jp-volume-bar { + position: absolute; + overflow:hidden; + background: url("jplayer.blue.monday.jpg") 0 -250px repeat-x; + width:46px; + height:5px; + cursor: pointer; +} +div.jp-audio div.jp-volume-bar { + top:37px; + left:330px; +} +div.jp-audio-stream div.jp-volume-bar { + top:37px; + left:92px; +} +div.jp-video div.jp-volume-bar { + top:17px; + left:72px; +} +div.jp-volume-bar-value { + background: url("jplayer.blue.monday.jpg") 0 -256px repeat-x; + width:0px; + height:5px; +} + +/* @end */ + +/* @group current time and duration */ + +div.jp-audio div.jp-time-holder { + position:absolute; + top:50px; +} +div.jp-audio div.jp-type-single div.jp-time-holder { + left:110px; + width:186px; +} +div.jp-audio div.jp-type-playlist div.jp-time-holder { + left:166px; + width:130px; +} + +div.jp-current-time, +div.jp-duration { + width:60px; + font-size:.64em; + font-style:oblique; +} +div.jp-current-time { + float: left; + display:inline; +} +div.jp-duration { + float: right; + display:inline; + text-align: right; +} + +div.jp-video div.jp-current-time { + margin-left:20px; +} +div.jp-video div.jp-duration { + margin-right:20px; +} + +/* @end */ + +/* @group playlist */ + +div.jp-title { + font-weight:bold; + text-align:center; +} + +div.jp-title, +div.jp-playlist { + width:100%; + background-color:#ccc; + border-top:1px solid #009be3; +} +div.jp-type-single div.jp-title, +div.jp-type-playlist div.jp-title, +div.jp-type-single div.jp-playlist { + border-top:none; +} +div.jp-title ul, +div.jp-playlist ul { + list-style-type:none; + margin:0; + padding:0 20px; + font-size:.72em; +} + +div.jp-title li { + padding:5px 0; + font-weight:bold; +} +div.jp-playlist li { + padding:5px 0 4px 20px; + border-bottom:1px solid #eee; +} + +div.jp-playlist li div { + display:inline; +} + +/* Note that the first-child (IE6) and last-child (IE6/7/8) selectors do not work on IE */ + +div.jp-type-playlist div.jp-playlist li:last-child { + padding:5px 0 5px 20px; + border-bottom:none; +} +div.jp-type-playlist div.jp-playlist li.jp-playlist-current { + list-style-type:square; + list-style-position:inside; + padding-left:7px; +} +div.jp-type-playlist div.jp-playlist a { + color: #333; + text-decoration: none; +} +div.jp-type-playlist div.jp-playlist a:hover { + color:#0d88c1; +} +div.jp-type-playlist div.jp-playlist a.jp-playlist-current { + color:#0d88c1; +} + +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove { + float:right; + display:inline; + text-align:right; + margin-right:10px; + font-weight:bold; + color:#666; +} +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove:hover { + color:#0d88c1; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media { + float:right; + display:inline; + text-align:right; + margin-right:10px; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media a{ + color:#666; +} +div.jp-type-playlist div.jp-playlist span.jp-free-media a:hover{ + color:#0d88c1; +} +span.jp-artist { + font-size:.8em; + color:#666; +} + +/* @end */ + +div.jp-video-play { + width:100%; + overflow:hidden; /* Important for nested negative margins to work in modern browsers */ + cursor:pointer; + background-color:rgba(0,0,0,0); /* Makes IE9 work with the active area over the whole video area. IE6/7/8 only have the button as active area. */ +} +div.jp-video-270p div.jp-video-play { + margin-top:-270px; + height:270px; +} +div.jp-video-360p div.jp-video-play { + margin-top:-360px; + height:360px; +} +div.jp-video-full div.jp-video-play { + height:100%; +} +a.jp-video-play-icon { + position:relative; + display:block; + width: 112px; + height: 100px; + + margin-left:-56px; + margin-top:-50px; + left:50%; + top:50%; + + background: url("jplayer.blue.monday.video.play.png") 0 0 no-repeat; + text-indent:-9999px; +} +div.jp-video-play:hover a.jp-video-play-icon { + background: url("jplayer.blue.monday.video.play.png") 0 -100px no-repeat; +} + + + + + +div.jp-jplayer audio, +div.jp-jplayer { + width:0px; + height:0px; +} + +div.jp-jplayer { + background-color: #000000; +} + + + + + +/* @group TOGGLES */ + +/* The audio toggles are nested inside jp-time-holder */ + +ul.jp-toggles { + list-style-type:none; + padding:0; + margin:0 auto; + overflow:hidden; +} + +div.jp-audio .jp-type-single ul.jp-toggles { + width:25px; +} +div.jp-audio .jp-type-playlist ul.jp-toggles { + width:55px; + margin: 0; + position: absolute; + left: 325px; + top: 50px; +} + +div.jp-video ul.jp-toggles { + margin-top:10px; + width:100px; +} + +ul.jp-toggles li { + display:block; + float:right; +} + +ul.jp-toggles li a { + display:block; + width:25px; + height:18px; + text-indent:-9999px; + line-height:100%; /* need this for IE6 */ +} + +a.jp-full-screen { + background: url("jplayer.blue.monday.jpg") 0 -310px no-repeat; + margin-left: 20px; +} + +a.jp-full-screen:hover { + background: url("jplayer.blue.monday.jpg") -30px -310px no-repeat; +} + +a.jp-restore-screen { + background: url("jplayer.blue.monday.jpg") -60px -310px no-repeat; + margin-left: 20px; +} + +a.jp-restore-screen:hover { + background: url("jplayer.blue.monday.jpg") -90px -310px no-repeat; +} + +a.jp-repeat { + background: url("jplayer.blue.monday.jpg") 0 -290px no-repeat; +} + +a.jp-repeat:hover { + background: url("jplayer.blue.monday.jpg") -30px -290px no-repeat; +} + +a.jp-repeat-off { + background: url("jplayer.blue.monday.jpg") -60px -290px no-repeat; +} + +a.jp-repeat-off:hover { + background: url("jplayer.blue.monday.jpg") -90px -290px no-repeat; +} + +a.jp-shuffle { + background: url("jplayer.blue.monday.jpg") 0 -270px no-repeat; + margin-left: 5px; +} + +a.jp-shuffle:hover { + background: url("jplayer.blue.monday.jpg") -30px -270px no-repeat; +} + +a.jp-shuffle-off { + background: url("jplayer.blue.monday.jpg") -60px -270px no-repeat; + margin-left: 5px; +} + +a.jp-shuffle-off:hover { + background: url("jplayer.blue.monday.jpg") -90px -270px no-repeat; +} + + +/* @end */ + +/* @group NO SOLUTION error feedback */ + +.jp-no-solution { + padding:5px; + font-size:.8em; + background-color:#eee; + border:2px solid #009be3; + color:#000; + display:none; +} + +.jp-no-solution a { + color:#000; +} + +.jp-no-solution span { + font-size:1em; + display:block; + text-align:center; + font-weight:bold; +} + +/* @end */ diff --git a/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.jpg b/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.jpg new file mode 100755 index 0000000000000000000000000000000000000000..adab53ff7b6ea893972ce1f2c24323d319b8e5ea GIT binary patch literal 23189 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 I?Z5i}0Xq{#rvLx| literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.seeking.gif b/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/jplayer.blue.monday.seeking.gif new file mode 100755 index 0000000000000000000000000000000000000000..dbd2105ab933f0336e1f732e32a54c6d6a8e1441 GIT binary patch literal 3284 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/skin.handlebars b/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/skin.handlebars new file mode 100755 index 00000000..b8ec557f --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin_ol/blue.monday/skin.handlebars @@ -0,0 +1,40 @@ + + \ No newline at end of file diff --git a/core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.css b/core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.css new file mode 100755 index 00000000..bafe3ff8 --- /dev/null +++ b/core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.css @@ -0,0 +1,670 @@ +/* + * Skin for jPlayer Plugin (jQuery JavaScript Library) + * http://www.jplayer.org + * + * Skin Name: Pink Flag + * + * Copyright (c) 2012 Happyworm Ltd + * Dual licensed under the MIT and GPL licenses. + * - http://www.opensource.org/licenses/mit-license.php + * - http://www.gnu.org/copyleft/gpl.html + * + * Author: Silvia Benvenuti + * Skin Version: 1.2 (jPlayer 2.2.0) + * Date: 22nd October 2012 + */ + +div.jp-audio, +div.jp-audio-stream, +div.jp-video { + + /* Edit the font-size to counteract inherited font sizing. + * Eg. 1.25em = 1 / 0.8em + */ + + font-size:1.25em; /* 1.25em for testing in site pages */ /* No parent CSS that can effect the size in the demos ZIP */ + + font-family:Verdana, Arial, sans-serif; + line-height:1.6; + color: #fff; + border-top:1px solid #554461; + border-left:1px solid #554461; + border-right:1px solid #180a1f; + border-bottom:1px solid #180a1f; + background-color:#3a2a45; +} +div.jp-audio { + width:201px; + padding:20px; +} + +div.jp-audio-stream { + width:101px; + padding:20px 20px 10px 20px; +} + +div.jp-video-270p { + width:480px; +} +div.jp-video-360p { + width:640px; +} +div.jp-video-full { + /* Rules for IE6 (full-screen) */ + width:480px; + height:270px; + /* Rules for IE7 (full-screen) - Otherwise the relative container causes other page items that are not position:static (default) to appear over the video/gui. */ + position:static !important; position:relative; +} + +/* The z-index rule is defined in this manner to enable Popcorn plugins that add overlays to video area. EG. Subtitles. */ +div.jp-video-full div div { + z-index:1000; +} + +div.jp-video-full div.jp-jplayer { + top: 0; + left: 0; + position: fixed !important; position: relative; /* Rules for IE6 (full-screen) */ + overflow: hidden; +} + +div.jp-video-full div.jp-gui { + position: fixed !important; position: static; /* Rules for IE6 (full-screen) */ + top: 0; + left: 0; + width:100%; + height:100%; + z-index:1001; /* 1 layer above the others. */ +} +div.jp-video-full div.jp-interface { + position: absolute !important; position: relative; /* Rules for IE6 (full-screen) */ + bottom: 0; + left: 0; +} + +div.jp-interface { + position: relative; + width:100%; + background-color:#3a2a45; /* Required for the full screen */ +} + + +div.jp-audio .jp-interface { + height: 80px; + padding-top:30px; +} + +div.jp-audio-stream .jp-interface { + height: 50px; + padding-top:30px; +} + +/* @group CONTROLS */ + +div.jp-controls-holder { + clear: both; + width:440px; + margin:0 auto 10px auto; + position: relative; + overflow:hidden; +} + +div.jp-interface ul.jp-controls { + background: url("jplayer.pink.flag.jpg") 0 0 no-repeat; + list-style-type:none; + padding: 1px 0 2px 1px; + overflow:hidden; + width: 201px; + height: 34px; +} + +div.jp-audio ul.jp-controls, +div.jp-audio-stream ul.jp-controls { + margin:0 auto; +} + +div.jp-audio-stream ul.jp-controls { + width: 100px; +} + +div.jp-video ul.jp-controls { + margin:0 0 0 115px; + float:left; + display:inline; /* need this to fix IE6 double margin */ +} + +div.jp-interface ul.jp-controls li { + display:inline; + float: left; +} +div.jp-interface ul.jp-controls a { + display:block; + overflow:hidden; + text-indent:-9999px; + height: 34px; + margin: 0 1px 2px 0; + padding: 0; +} + + +/* @group single player controls */ + +div.jp-type-single .jp-controls li a{ + width: 99px; +} + +div.jp-type-single .jp-play { + background: url("jplayer.pink.flag.jpg") 0px -40px no-repeat; +} + +div.jp-type-single .jp-play:hover { + background: url("jplayer.pink.flag.jpg") -100px -40px no-repeat; +} + +div.jp-type-single .jp-pause { + background: url("jplayer.pink.flag.jpg") 0px -120px no-repeat; +} + +div.jp-type-single .jp-pause:hover { + background: url("jplayer.pink.flag.jpg") -100px -120px no-repeat; +} + +/* The right border is normally in the ul background image. */ +div.jp-audio-stream .jp-play, +div.jp-audio-stream .jp-pause { + border-right:1px solid #180920; +} + +div.jp-type-single .jp-stop { + background: url("jplayer.pink.flag.jpg") 0px -80px no-repeat; +} + +div.jp-type-single .jp-stop:hover { + background: url("jplayer.pink.flag.jpg") -100px -80px no-repeat; +} + +/* @end */ + +/* @group playlist player controls */ + +div.jp-type-playlist .jp-controls li a{ + width: 49px; +} + +div.jp-type-playlist .jp-play { + background: url("jplayer.pink.flag.jpg") -24px -40px no-repeat; +} + +div.jp-type-playlist .jp-play:hover { + background: url("jplayer.pink.flag.jpg") -124px -40px no-repeat; +} + +div.jp-type-playlist .jp-pause { + background: url("jplayer.pink.flag.jpg") -24px -120px no-repeat; +} + +div.jp-type-playlist .jp-pause:hover { + background: url("jplayer.pink.flag.jpg") -124px -120px no-repeat; +} + +div.jp-type-playlist .jp-stop { + background: url("jplayer.pink.flag.jpg") -24px -80px no-repeat; +} + +div.jp-type-playlist .jp-stop:hover { + background: url("jplayer.pink.flag.jpg") -124px -80px no-repeat; +} + +div.jp-type-playlist .jp-previous { + background: url("jplayer.pink.flag.jpg") -24px -200px no-repeat; +} + +div.jp-type-playlist .jp-previous:hover { + background: url("jplayer.pink.flag.jpg") -124px -200px no-repeat; +} + +div.jp-type-playlist .jp-next { + background: url("jplayer.pink.flag.jpg") -24px -160px no-repeat; +} + +div.jp-type-playlist .jp-next:hover { + background: url("jplayer.pink.flag.jpg") -124px -160px no-repeat; +} + +/* @end */ + +/* @end */ + + + + +/* @group TOGGLES */ + +ul.jp-toggles { + list-style-type:none; + padding:0; + margin:0 auto; + overflow:hidden; +} + +div.jp-audio ul.jp-toggles { + width:55px; +} + +div.jp-audio .jp-type-single ul.jp-toggles { + width:25px; +} + +div.jp-video ul.jp-toggles { + width:100px; + margin-top: 10px; +} + +ul.jp-toggles li{ + display:block; + float:right; +} + +ul.jp-toggles li a{ + display:block; + width:25px; + height:18px; + text-indent:-9999px; + line-height:100%; /* need this for IE6 */ +} + +.jp-full-screen { + background: url("jplayer.pink.flag.jpg") 0 -420px no-repeat; + margin-left: 20px; +} + +.jp-full-screen:hover { + background: url("jplayer.pink.flag.jpg") -30px -420px no-repeat; +} + +.jp-restore-screen { + background: url("jplayer.pink.flag.jpg") -60px -420px no-repeat; + margin-left: 20px; +} + +.jp-restore-screen:hover { + background: url("jplayer.pink.flag.jpg") -90px -420px no-repeat; +} + +.jp-repeat { + background: url("jplayer.pink.flag.jpg") 0 -440px no-repeat; +} + +.jp-repeat:hover { + background: url("jplayer.pink.flag.jpg") -30px -440px no-repeat; +} + +.jp-repeat-off { + background: url("jplayer.pink.flag.jpg") -60px -440px no-repeat; +} + +.jp-repeat-off:hover { + background: url("jplayer.pink.flag.jpg") -90px -440px no-repeat; +} + +.jp-shuffle { + background: url("jplayer.pink.flag.jpg") 0 -460px no-repeat; + margin-left: 5px; +} + +.jp-shuffle:hover { + background: url("jplayer.pink.flag.jpg") -30px -460px no-repeat; +} + +.jp-shuffle-off { + background: url("jplayer.pink.flag.jpg") -60px -460px no-repeat; + margin-left: 5px; +} + +.jp-shuffle-off:hover { + background: url("jplayer.pink.flag.jpg") -90px -460px no-repeat; +} + + +/* @end */ + +/* @group progress bar */ + +/* The seeking class is added/removed inside jPlayer */ +div.jp-seeking-bg { + background: url("jplayer.pink.flag.seeking.gif"); +} + +.jp-progress { + background: url("jplayer.pink.flag.jpg") 0px -240px no-repeat; + width: 197px; + height: 13px; + padding: 0 2px 2px 2px; + margin-bottom: 4px; + overflow:hidden; +} + +div.jp-video .jp-progress { + border-top:1px solid #180a1f; + border-bottom: 1px solid #554560; + width:100%; + background-image: none; + padding: 0; +} + +.jp-seek-bar { + background: url("jplayer.pink.flag.jpg") 0px -260px repeat-x; + width:0px; + height: 100%; + overflow:hidden; + cursor:pointer; +} + +.jp-play-bar { + background: url("jplayer.pink.flag.jpg") 0px -280px repeat-x; + width:0px; + height: 100%; + overflow:hidden; +} + + +/* @end */ + +/* @group volume controls */ + +div.jp-interface ul.jp-controls a.jp-mute, +div.jp-interface ul.jp-controls a.jp-unmute, +div.jp-interface ul.jp-controls a.jp-volume-max { + background: url("jplayer.pink.flag.jpg") 0px -330px no-repeat; + position: absolute; + width: 16px; + height: 11px; +} + +div.jp-audio ul.jp-controls a.jp-mute, +div.jp-audio ul.jp-controls a.jp-unmute, +div.jp-audio-stream ul.jp-controls a.jp-mute, +div.jp-audio-stream ul.jp-controls a.jp-unmute { + top:-6px; + left: 0; +} + +div.jp-audio ul.jp-controls a.jp-volume-max, +div.jp-audio-stream ul.jp-controls a.jp-volume-max { + top:-6px; + right: 0; +} + + +div.jp-video ul.jp-controls a.jp-mute, +div.jp-video ul.jp-controls a.jp-unmute { + left: 0; + top:14px; +} + +div.jp-video ul.jp-controls a.jp-volume-max { + left: 84px; + top:14px; +} + +div.jp-interface ul.jp-controls a.jp-mute:hover { + background: url("jplayer.pink.flag.jpg") -25px -330px no-repeat; +} + +div.jp-interface ul.jp-controls a.jp-unmute { + background: url("jplayer.pink.flag.jpg") -60px -330px no-repeat; +} + +div.jp-interface ul.jp-controls a.jp-unmute:hover { + background: url("jplayer.pink.flag.jpg") -85px -330px no-repeat; +} + +div.jp-interface ul.jp-controls a.jp-volume-max { + background: url("jplayer.pink.flag.jpg") 0px -350px no-repeat; +} + +div.jp-interface ul.jp-controls a.jp-volume-max:hover { + background: url("jplayer.pink.flag.jpg") -25px -350px no-repeat; +} + +.jp-volume-bar { + background: url("jplayer.pink.flag.jpg") 0px -300px repeat-x; + position: absolute; + width: 197px; + height: 4px; + padding: 2px 2px 1px 2px; + overflow: hidden; +} + +.jp-volume-bar:hover { + cursor: pointer; +} + + +div.jp-audio .jp-interface .jp-volume-bar, +div.jp-audio-stream .jp-interface .jp-volume-bar { + top:10px; + left: 0; +} + +div.jp-audio-stream .jp-interface .jp-volume-bar { + width: 97px; + border-right:1px solid #180920; + padding-right:1px; +} + +div.jp-video .jp-volume-bar { + top: 0; + left: 0; + width:95px; + border-right:1px solid #180920; + padding-right:1px; + margin-top: 30px; +} + +.jp-volume-bar-value { + background: url("jplayer.pink.flag.jpg") 0px -320px repeat-x; + height: 4px; +} + +/* @end */ + +/* @group current time and duration */ + +.jp-current-time, .jp-duration { + width:70px; + font-size:.5em; + color: #8c7a99; +} + +.jp-current-time { + float: left; +} + +.jp-duration { + float: right; + text-align:right; +} + +.jp-video .jp-current-time { + padding-left:20px; +} + +.jp-video .jp-duration { + padding-right:20px; +} + +/* @end */ + +/* @group playlist */ + +.jp-title ul, +.jp-playlist ul { + list-style-type:none; + font-size:.7em; + margin: 0; + padding: 0; +} + +.jp-video .jp-title ul { + margin: 0 20px 10px; +} + +.jp-video .jp-playlist ul { + margin: 0 20px; +} + +.jp-title li, +.jp-playlist li { + position: relative; + padding: 2px 0; + border-top:1px solid #554461; + border-bottom:1px solid #180a1f; + overflow: hidden; +} + +.jp-title li{ + border-bottom:none; + border-top:none; + padding:0; + text-align:center; +} + +/* Note that the first-child (IE6) and last-child (IE6/7/8) selectors do not work on IE */ + +div.jp-type-playlist div.jp-playlist li:first-child { + border-top:none; + padding-top:3px; +} + +div.jp-type-playlist div.jp-playlist li:last-child { + border-bottom:none; + padding-bottom:3px; +} + +div.jp-type-playlist div.jp-playlist a { + color: #fff; + text-decoration:none; +} + +div.jp-type-playlist div.jp-playlist a:hover { + color: #e892e9; +} + +div.jp-type-playlist div.jp-playlist li.jp-playlist-current { + background-color: #26102e; + margin: 0 -20px; + padding: 2px 20px; + border-top: 1px solid #26102e; + border-bottom: 1px solid #26102e; +} + +div.jp-type-playlist div.jp-playlist li.jp-playlist-current a{ + color: #e892e9; +} + +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove { + float:right; + display:inline; + text-align:right; + margin-left:10px; + font-weight:bold; + color:#8C7A99; +} +div.jp-type-playlist div.jp-playlist a.jp-playlist-item-remove:hover { + color:#E892E9; +} + +div.jp-type-playlist div.jp-playlist span.jp-free-media { + float: right; + display:inline; + text-align:right; + color:#8C7A99; +} + +div.jp-type-playlist div.jp-playlist span.jp-free-media a{ + color:#8C7A99; +} + +div.jp-type-playlist div.jp-playlist span.jp-free-media a:hover{ + color:#E892E9; +} +span.jp-artist { + font-size:.8em; + color:#8C7A99; +} + +/* @end */ + + +div.jp-video div.jp-video-play { + width:100%; + overflow:hidden; /* Important for nested negative margins to work in modern browsers */ + cursor:pointer; +} +div.jp-video-270p div.jp-video-play { + margin-top:-270px; + height:270px; +} +div.jp-video-360p div.jp-video-play { + margin-top:-360px; + height:360px; +} +div.jp-video-full div.jp-video-play { + height:100%; +} +a.jp-video-play-icon { + position:relative; + display:block; + width: 112px; + height: 100px; + + margin-left:-56px; + margin-top:-50px; + left:50%; + top:50%; + + background: url("jplayer.pink.flag.video.play.png") 0 0 no-repeat; + text-indent:-9999px; +} +div.jp-video-play:hover a.jp-video-play-icon { + background: url("jplayer.pink.flag.video.play.png") 0 -100px no-repeat; +} + + +div.jp-jplayer audio, +div.jp-jplayer { + width:0px; + height:0px; +} + +div.jp-jplayer { + background-color: #000000; +} + +/* @group NO SOLUTION error feedback */ + +.jp-no-solution { + padding:5px; + font-size:.8em; + background-color:#3a2a45; + border-top:2px solid #554461; + border-left:2px solid #554461; + border-right:2px solid #180a1f; + border-bottom:2px solid #180a1f; + color:#FFF; + display:none; +} + +.jp-no-solution a { + color:#FFF; +} + +.jp-no-solution span { + font-size:1em; + display:block; + text-align:center; + font-weight:bold; +} +/* @end */ diff --git a/core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.jpg b/core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.jpg new file mode 100755 index 0000000000000000000000000000000000000000..0c084e298844644faab531e0bec15452795f14ed GIT binary patch literal 18426 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.seeking.gif b/core/vendor/filemanager/js/jPlayer/skin_ol/pink.flag/jplayer.pink.flag.seeking.gif new file mode 100755 index 0000000000000000000000000000000000000000..754ceb167377fd304f0bd596d7458277fe47265f GIT binary patch literal 3284 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 literal 0 HcmV?d00001 diff --git a/core/vendor/filemanager/js/jquery.fileupload-angular.js b/core/vendor/filemanager/js/jquery.fileupload-angular.js new file mode 100755 index 00000000..1c205527 --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-angular.js @@ -0,0 +1,437 @@ +/* + * jQuery File Upload AngularJS Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, angular, require */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'angular', + './jquery.fileupload-image', + './jquery.fileupload-audio', + './jquery.fileupload-video', + './jquery.fileupload-validate' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('angular'), + require('./jquery.fileupload-image'), + require('./jquery.fileupload-audio'), + require('./jquery.fileupload-video'), + require('./jquery.fileupload-validate') + ); + } else { + factory(); + } +}(function () { + 'use strict'; + + angular.module('blueimp.fileupload', []) + + // The fileUpload service provides configuration options + // for the fileUpload directive and default handlers for + // File Upload events: + .provider('fileUpload', function () { + var scopeEvalAsync = function (expression) { + var scope = angular.element(this) + .fileupload('option', 'scope'); + // Schedule a new $digest cycle if not already inside of one + // and evaluate the given expression: + scope.$evalAsync(expression); + }, + addFileMethods = function (scope, data) { + var files = data.files, + file = files[0]; + angular.forEach(files, function (file, index) { + file._index = index; + file.$state = function () { + return data.state(); + }; + file.$processing = function () { + return data.processing(); + }; + file.$progress = function () { + return data.progress(); + }; + file.$response = function () { + return data.response(); + }; + }); + file.$submit = function () { + if (!file.error) { + return data.submit(); + } + }; + file.$cancel = function () { + return data.abort(); + }; + }, + $config; + $config = this.defaults = { + handleResponse: function (e, data) { + var files = data.result && data.result.files; + if (files) { + data.scope.replace(data.files, files); + } else if (data.errorThrown || + data.textStatus === 'error') { + data.files[0].error = data.errorThrown || + data.textStatus; + } + }, + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var scope = data.scope, + filesCopy = []; + angular.forEach(data.files, function (file) { + filesCopy.push(file); + }); + scope.$parent.$applyAsync(function () { + addFileMethods(scope, data); + var method = scope.option('prependFiles') ? + 'unshift' : 'push'; + Array.prototype[method].apply(scope.queue, data.files); + }); + data.process(function () { + return scope.process(data); + }).always(function () { + scope.$parent.$applyAsync(function () { + addFileMethods(scope, data); + scope.replace(filesCopy, data.files); + }); + }).then(function () { + if ((scope.option('autoUpload') || + data.autoUpload) && + data.autoUpload !== false) { + data.submit(); + } + }); + }, + done: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = this; + data.scope.$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + fail: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = this, + scope = data.scope; + if (data.errorThrown === 'abort') { + scope.clear(data.files); + return; + } + scope.$apply(function () { + data.handleResponse.call(that, e, data); + }); + }, + stop: scopeEvalAsync, + processstart: scopeEvalAsync, + processstop: scopeEvalAsync, + getNumberOfFiles: function () { + var scope = this.scope; + return scope.queue.length - scope.processing(); + }, + dataType: 'json', + autoUpload: false + }; + this.$get = [ + function () { + return { + defaults: $config + }; + } + ]; + }) + + // Format byte numbers to readable presentations: + .provider('formatFileSizeFilter', function () { + var $config = { + // Byte units following the IEC format + // http://en.wikipedia.org/wiki/Kilobyte + units: [ + {size: 1000000000, suffix: ' GB'}, + {size: 1000000, suffix: ' MB'}, + {size: 1000, suffix: ' KB'} + ] + }; + this.defaults = $config; + this.$get = function () { + return function (bytes) { + if (!angular.isNumber(bytes)) { + return ''; + } + var unit = true, + i = 0, + prefix, + suffix; + while (unit) { + unit = $config.units[i]; + prefix = unit.prefix || ''; + suffix = unit.suffix || ''; + if (i === $config.units.length - 1 || bytes >= unit.size) { + return prefix + (bytes / unit.size).toFixed(2) + suffix; + } + i += 1; + } + }; + }; + }) + + // The FileUploadController initializes the fileupload widget and + // provides scope methods to control the File Upload functionality: + .controller('FileUploadController', [ + '$scope', '$element', '$attrs', '$window', 'fileUpload','$q', + function ($scope, $element, $attrs, $window, fileUpload, $q) { + var uploadMethods = { + progress: function () { + return $element.fileupload('progress'); + }, + active: function () { + return $element.fileupload('active'); + }, + option: function (option, data) { + if (arguments.length === 1) { + return $element.fileupload('option', option); + } + $element.fileupload('option', option, data); + }, + add: function (data) { + return $element.fileupload('add', data); + }, + send: function (data) { + return $element.fileupload('send', data); + }, + process: function (data) { + return $element.fileupload('process', data); + }, + processing: function (data) { + return $element.fileupload('processing', data); + } + }; + $scope.disabled = !$window.jQuery.support.fileInput; + $scope.queue = $scope.queue || []; + $scope.clear = function (files) { + var queue = this.queue, + i = queue.length, + file = files, + length = 1; + if (angular.isArray(files)) { + file = files[0]; + length = files.length; + } + while (i) { + i -= 1; + if (queue[i] === file) { + return queue.splice(i, length); + } + } + }; + $scope.replace = function (oldFiles, newFiles) { + var queue = this.queue, + file = oldFiles[0], + i, + j; + for (i = 0; i < queue.length; i += 1) { + if (queue[i] === file) { + for (j = 0; j < newFiles.length; j += 1) { + queue[i + j] = newFiles[j]; + } + return; + } + } + }; + $scope.applyOnQueue = function (method) { + var list = this.queue.slice(0), + i, + file, + promises = []; + for (i = 0; i < list.length; i += 1) { + file = list[i]; + if (file[method]) { + promises.push(file[method]()); + } + } + return $q.all(promises); + }; + $scope.submit = function () { + return this.applyOnQueue('$submit'); + }; + $scope.cancel = function () { + return this.applyOnQueue('$cancel'); + }; + // Add upload methods to the scope: + angular.extend($scope, uploadMethods); + // The fileupload widget will initialize with + // the options provided via "data-"-parameters, + // as well as those given via options object: + $element.fileupload(angular.extend( + {scope: $scope}, + fileUpload.defaults + )).on('fileuploadadd', function (e, data) { + data.scope = $scope; + }).on('fileuploadfail', function (e, data) { + if (data.errorThrown === 'abort') { + return; + } + if (data.dataType && + data.dataType.indexOf('json') === data.dataType.length - 4) { + try { + data.result = angular.fromJson(data.jqXHR.responseText); + } catch (ignore) {} + } + }).on([ + 'fileuploadadd', + 'fileuploadsubmit', + 'fileuploadsend', + 'fileuploaddone', + 'fileuploadfail', + 'fileuploadalways', + 'fileuploadprogress', + 'fileuploadprogressall', + 'fileuploadstart', + 'fileuploadstop', + 'fileuploadchange', + 'fileuploadpaste', + 'fileuploaddrop', + 'fileuploaddragover', + 'fileuploadchunksend', + 'fileuploadchunkdone', + 'fileuploadchunkfail', + 'fileuploadchunkalways', + 'fileuploadprocessstart', + 'fileuploadprocess', + 'fileuploadprocessdone', + 'fileuploadprocessfail', + 'fileuploadprocessalways', + 'fileuploadprocessstop' + ].join(' '), function (e, data) { + $scope.$parent.$applyAsync(function () { + if ($scope.$emit(e.type, data).defaultPrevented) { + e.preventDefault(); + } + }); + }).on('remove', function () { + // Remove upload methods from the scope, + // when the widget is removed: + var method; + for (method in uploadMethods) { + if (uploadMethods.hasOwnProperty(method)) { + delete $scope[method]; + } + } + }); + // Observe option changes: + $scope.$watch( + $attrs.fileUpload, + function (newOptions) { + if (newOptions) { + $element.fileupload('option', newOptions); + } + } + ); + } + ]) + + // Provide File Upload progress feedback: + .controller('FileUploadProgressController', [ + '$scope', '$attrs', '$parse', + function ($scope, $attrs, $parse) { + var fn = $parse($attrs.fileUploadProgress), + update = function () { + var progress = fn($scope); + if (!progress || !progress.total) { + return; + } + $scope.num = Math.floor( + progress.loaded / progress.total * 100 + ); + }; + update(); + $scope.$watch( + $attrs.fileUploadProgress + '.loaded', + function (newValue, oldValue) { + if (newValue !== oldValue) { + update(); + } + } + ); + } + ]) + + // Display File Upload previews: + .controller('FileUploadPreviewController', [ + '$scope', '$element', '$attrs', + function ($scope, $element, $attrs) { + $scope.$watch( + $attrs.fileUploadPreview + '.preview', + function (preview) { + $element.empty(); + if (preview) { + $element.append(preview); + } + } + ); + } + ]) + + .directive('fileUpload', function () { + return { + controller: 'FileUploadController', + scope: true + }; + }) + + .directive('fileUploadProgress', function () { + return { + controller: 'FileUploadProgressController', + scope: true + }; + }) + + .directive('fileUploadPreview', function () { + return { + controller: 'FileUploadPreviewController' + }; + }) + + // Enhance the HTML5 download attribute to + // allow drag&drop of files to the desktop: + .directive('download', function () { + return function (scope, elm) { + elm.on('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [ + 'application/octet-stream', + elm.prop('download'), + elm.prop('href') + ].join(':') + ); + } catch (ignore) {} + }); + }; + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload-audio.js b/core/vendor/filemanager/js/jquery.fileupload-audio.js new file mode 100755 index 00000000..a2537761 --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-audio.js @@ -0,0 +1,113 @@ +/* + * jQuery File Upload Audio Preview Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadAudio', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + disabled: '@disableAudioPreview' + }, + { + action: 'setAudio', + name: '@audioPreviewName', + disabled: '@disableAudioPreview' + } + ); + + // The File Upload Audio Preview plugin extends the fileupload widget + // with audio preview functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of audio files to load, + // matched against the file type: + loadAudioFileTypes: /^audio\/.*$/ + }, + + _audioElement: document.createElement('audio'), + + processActions: { + + // Loads the audio file given via data.files and data.index + // as audio element if the browser supports playing it. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadAudio: function (data, options) { + if (options.disabled) { + return data; + } + var file = data.files[data.index], + url, + audio; + if (this._audioElement.canPlayType && + this._audioElement.canPlayType(file.type) && + ($.type(options.maxFileSize) !== 'number' || + file.size <= options.maxFileSize) && + (!options.fileTypes || + options.fileTypes.test(file.type))) { + url = loadImage.createObjectURL(file); + if (url) { + audio = this._audioElement.cloneNode(false); + audio.src = url; + audio.controls = true; + data.audio = audio; + return data; + } + } + return data; + }, + + // Sets the audio element as a property of the file object: + setAudio: function (data, options) { + if (data.audio && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.audio; + } + return data; + } + + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload-image.js b/core/vendor/filemanager/js/jquery.fileupload-image.js new file mode 100755 index 00000000..7e066a6e --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-image.js @@ -0,0 +1,326 @@ +/* + * jQuery File Upload Image Preview & Resize Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, Blob */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + 'load-image-meta', + 'load-image-scale', + 'load-image-exif', + 'canvas-to-blob', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('blueimp-load-image/js/load-image-meta'), + require('blueimp-load-image/js/load-image-scale'), + require('blueimp-load-image/js/load-image-exif'), + require('blueimp-canvas-to-blob'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadImageMetaData', + disableImageHead: '@', + disableExif: '@', + disableExifThumbnail: '@', + disableExifSub: '@', + disableExifGps: '@', + disabled: '@disableImageMetaDataLoad' + }, + { + action: 'loadImage', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + noRevoke: '@', + disabled: '@disableImageLoad' + }, + { + action: 'resizeImage', + // Use "image" as prefix for the "@" options: + prefix: 'image', + maxWidth: '@', + maxHeight: '@', + minWidth: '@', + minHeight: '@', + crop: '@', + orientation: '@', + forceResize: '@', + disabled: '@disableImageResize' + }, + { + action: 'saveImage', + quality: '@imageQuality', + type: '@imageType', + disabled: '@disableImageResize' + }, + { + action: 'saveImageMetaData', + disabled: '@disableImageMetaDataSave' + }, + { + action: 'resizeImage', + // Use "preview" as prefix for the "@" options: + prefix: 'preview', + maxWidth: '@', + maxHeight: '@', + minWidth: '@', + minHeight: '@', + crop: '@', + orientation: '@', + thumbnail: '@', + canvas: '@', + disabled: '@disableImagePreview' + }, + { + action: 'setImage', + name: '@imagePreviewName', + disabled: '@disableImagePreview' + }, + { + action: 'deleteImageReferences', + disabled: '@disableImageReferencesDeletion' + } + ); + + // The File Upload Resize plugin extends the fileupload widget + // with image resize functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of images to load: + // matched against the file type: + loadImageFileTypes: /^image\/(gif|jpeg|png|svg\+xml)$/, + // The maximum file size of images to load: + loadImageMaxFileSize: 10000000, // 10MB + // The maximum width of resized images: + imageMaxWidth: 1920, + // The maximum height of resized images: + imageMaxHeight: 1080, + // Defines the image orientation (1-8) or takes the orientation + // value from Exif data if set to true: + imageOrientation: false, + // Define if resized images should be cropped or only scaled: + imageCrop: false, + // Disable the resize image functionality by default: + disableImageResize: true, + // The maximum width of the preview images: + previewMaxWidth: 50, + // The maximum height of the preview images: + previewMaxHeight: 50, + // Defines the preview orientation (1-8) or takes the orientation + // value from Exif data if set to true: + previewOrientation: true, + // Create the preview using the Exif data thumbnail: + previewThumbnail: true, + // Define if preview images should be cropped or only scaled: + previewCrop: false, + // Define if preview images should be resized as canvas elements: + previewCanvas: true + }, + + processActions: { + + // Loads the image given via data.files and data.index + // as img element, if the browser supports the File API. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadImage: function (data, options) { + if (options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (($.type(options.maxFileSize) === 'number' && + file.size > options.maxFileSize) || + (options.fileTypes && + !options.fileTypes.test(file.type)) || + !loadImage( + file, + function (img) { + if (img.src) { + data.img = img; + } + dfd.resolveWith(that, [data]); + }, + options + )) { + return data; + } + return dfd.promise(); + }, + + // Resizes the image given as data.canvas or data.img + // and updates data.canvas or data.img with the resized image. + // Also stores the resized image as preview property. + // Accepts the options maxWidth, maxHeight, minWidth, + // minHeight, canvas and crop: + resizeImage: function (data, options) { + if (options.disabled || !(data.canvas || data.img)) { + return data; + } + options = $.extend({canvas: true}, options); + var that = this, + dfd = $.Deferred(), + img = (options.canvas && data.canvas) || data.img, + resolve = function (newImg) { + if (newImg && (newImg.width !== img.width || + newImg.height !== img.height || + options.forceResize)) { + data[newImg.getContext ? 'canvas' : 'img'] = newImg; + } + data.preview = newImg; + dfd.resolveWith(that, [data]); + }, + thumbnail; + if (data.exif) { + if (options.orientation === true) { + options.orientation = data.exif.get('Orientation'); + } + if (options.thumbnail) { + thumbnail = data.exif.get('Thumbnail'); + if (thumbnail) { + loadImage(thumbnail, resolve, options); + return dfd.promise(); + } + } + // Prevent orienting the same image twice: + if (data.orientation) { + delete options.orientation; + } else { + data.orientation = options.orientation; + } + } + if (img) { + resolve(loadImage.scale(img, options)); + return dfd.promise(); + } + return data; + }, + + // Saves the processed image given as data.canvas + // inplace at data.index of data.files: + saveImage: function (data, options) { + if (!data.canvas || options.disabled) { + return data; + } + var that = this, + file = data.files[data.index], + dfd = $.Deferred(); + if (data.canvas.toBlob) { + data.canvas.toBlob( + function (blob) { + if (!blob.name) { + if (file.type === blob.type) { + blob.name = file.name; + } else if (file.name) { + blob.name = file.name.replace( + /\.\w+$/, + '.' + blob.type.substr(6) + ); + } + } + // Don't restore invalid meta data: + if (file.type !== blob.type) { + delete data.imageHead; + } + // Store the created blob at the position + // of the original file in the files list: + data.files[data.index] = blob; + dfd.resolveWith(that, [data]); + }, + options.type || file.type, + options.quality + ); + } else { + return data; + } + return dfd.promise(); + }, + + loadImageMetaData: function (data, options) { + if (options.disabled) { + return data; + } + var that = this, + dfd = $.Deferred(); + loadImage.parseMetaData(data.files[data.index], function (result) { + $.extend(data, result); + dfd.resolveWith(that, [data]); + }, options); + return dfd.promise(); + }, + + saveImageMetaData: function (data, options) { + if (!(data.imageHead && data.canvas && + data.canvas.toBlob && !options.disabled)) { + return data; + } + var file = data.files[data.index], + blob = new Blob([ + data.imageHead, + // Resized images always have a head size of 20 bytes, + // including the JPEG marker and a minimal JFIF header: + this._blobSlice.call(file, 20) + ], {type: file.type}); + blob.name = file.name; + data.files[data.index] = blob; + return data; + }, + + // Sets the resized version of the image as a property of the + // file object, must be called after "saveImage": + setImage: function (data, options) { + if (data.preview && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.preview; + } + return data; + }, + + deleteImageReferences: function (data, options) { + if (!options.disabled) { + delete data.img; + delete data.canvas; + delete data.preview; + delete data.imageHead; + } + return data; + } + + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload-jquery-ui.js b/core/vendor/filemanager/js/jquery.fileupload-jquery-ui.js new file mode 100755 index 00000000..7b136b37 --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-jquery-ui.js @@ -0,0 +1,161 @@ +/* + * jQuery File Upload jQuery UI Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload-ui' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload-ui') + ); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + processdone: function (e, data) { + data.context.find('.start').button('enable'); + }, + progress: function (e, data) { + if (data.context) { + data.context.find('.progress').progressbar( + 'option', + 'value', + parseInt(data.loaded / data.total * 100, 10) + ); + } + }, + progressall: function (e, data) { + var $this = $(this); + $this.find('.fileupload-progress') + .find('.progress').progressbar( + 'option', + 'value', + parseInt(data.loaded / data.total * 100, 10) + ).end() + .find('.progress-extended').each(function () { + $(this).html( + ($this.data('blueimp-fileupload') || + $this.data('fileupload')) + ._renderExtendedProgress(data) + ); + }); + } + }, + + _renderUpload: function (func, files) { + var node = this._super(func, files), + showIconText = $(window).width() > 480; + node.find('.progress').empty().progressbar(); + node.find('.start').button({ + icons: {primary: 'ui-icon-circle-arrow-e'}, + text: showIconText + }); + node.find('.cancel').button({ + icons: {primary: 'ui-icon-cancel'}, + text: showIconText + }); + if (node.hasClass('fade')) { + node.hide(); + } + return node; + }, + + _renderDownload: function (func, files) { + var node = this._super(func, files), + showIconText = $(window).width() > 480; + node.find('.delete').button({ + icons: {primary: 'ui-icon-trash'}, + text: showIconText + }); + if (node.hasClass('fade')) { + node.hide(); + } + return node; + }, + + _startHandler: function (e) { + $(e.currentTarget).button('disable'); + this._super(e); + }, + + _transition: function (node) { + var deferred = $.Deferred(); + if (node.hasClass('fade')) { + node.fadeToggle( + this.options.transitionDuration, + this.options.transitionEasing, + function () { + deferred.resolveWith(node); + } + ); + } else { + deferred.resolveWith(node); + } + return deferred; + }, + + _create: function () { + this._super(); + this.element + .find('.fileupload-buttonbar') + .find('.fileinput-button').each(function () { + var input = $(this).find('input:file').detach(); + $(this) + .button({icons: {primary: 'ui-icon-plusthick'}}) + .append(input); + }) + .end().find('.start') + .button({icons: {primary: 'ui-icon-circle-arrow-e'}}) + .end().find('.cancel') + .button({icons: {primary: 'ui-icon-cancel'}}) + .end().find('.delete') + .button({icons: {primary: 'ui-icon-trash'}}) + .end().find('.progress').progressbar(); + }, + + _destroy: function () { + this.element + .find('.fileupload-buttonbar') + .find('.fileinput-button').each(function () { + var input = $(this).find('input:file').detach(); + $(this) + .button('destroy') + .append(input); + }) + .end().find('.start') + .button('destroy') + .end().find('.cancel') + .button('destroy') + .end().find('.delete') + .button('destroy') + .end().find('.progress').progressbar('destroy'); + this._super(); + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload-process.js b/core/vendor/filemanager/js/jquery.fileupload-process.js new file mode 100755 index 00000000..638f0d26 --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-process.js @@ -0,0 +1,178 @@ +/* + * jQuery File Upload Processing Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2012, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload') + ); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + var originalAdd = $.blueimp.fileupload.prototype.options.add; + + // The File Upload Processing plugin extends the fileupload widget + // with file processing functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The list of processing actions: + processQueue: [ + /* + { + action: 'log', + type: 'debug' + } + */ + ], + add: function (e, data) { + var $this = $(this); + data.process(function () { + return $this.fileupload('process', data); + }); + originalAdd.call(this, e, data); + } + }, + + processActions: { + /* + log: function (data, options) { + console[options.type]( + 'Processing "' + data.files[data.index].name + '"' + ); + } + */ + }, + + _processFile: function (data, originalData) { + var that = this, + dfd = $.Deferred().resolveWith(that, [data]), + chain = dfd.promise(); + this._trigger('process', null, data); + $.each(data.processQueue, function (i, settings) { + var func = function (data) { + if (originalData.errorThrown) { + return $.Deferred() + .rejectWith(that, [originalData]).promise(); + } + return that.processActions[settings.action].call( + that, + data, + settings + ); + }; + chain = chain.then(func, settings.always && func); + }); + chain + .done(function () { + that._trigger('processdone', null, data); + that._trigger('processalways', null, data); + }) + .fail(function () { + that._trigger('processfail', null, data); + that._trigger('processalways', null, data); + }); + return chain; + }, + + // Replaces the settings of each processQueue item that + // are strings starting with an "@", using the remaining + // substring as key for the option map, + // e.g. "@autoUpload" is replaced with options.autoUpload: + _transformProcessQueue: function (options) { + var processQueue = []; + $.each(options.processQueue, function () { + var settings = {}, + action = this.action, + prefix = this.prefix === true ? action : this.prefix; + $.each(this, function (key, value) { + if ($.type(value) === 'string' && + value.charAt(0) === '@') { + settings[key] = options[ + value.slice(1) || (prefix ? prefix + + key.charAt(0).toUpperCase() + key.slice(1) : key) + ]; + } else { + settings[key] = value; + } + + }); + processQueue.push(settings); + }); + options.processQueue = processQueue; + }, + + // Returns the number of files currently in the processsing queue: + processing: function () { + return this._processing; + }, + + // Processes the files given as files property of the data parameter, + // returns a Promise object that allows to bind callbacks: + process: function (data) { + var that = this, + options = $.extend({}, this.options, data); + if (options.processQueue && options.processQueue.length) { + this._transformProcessQueue(options); + if (this._processing === 0) { + this._trigger('processstart'); + } + $.each(data.files, function (index) { + var opts = index ? $.extend({}, options) : options, + func = function () { + if (data.errorThrown) { + return $.Deferred() + .rejectWith(that, [data]).promise(); + } + return that._processFile(opts, data); + }; + opts.index = index; + that._processing += 1; + that._processingQueue = that._processingQueue.then(func, func) + .always(function () { + that._processing -= 1; + if (that._processing === 0) { + that._trigger('processstop'); + } + }); + }); + } + return this._processingQueue; + }, + + _create: function () { + this._super(); + this._processing = 0; + this._processingQueue = $.Deferred().resolveWith(this) + .promise(); + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload-ui.js b/core/vendor/filemanager/js/jquery.fileupload-ui.js new file mode 100755 index 00000000..5058084b --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-ui.js @@ -0,0 +1,714 @@ +/* + * jQuery File Upload User Interface Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'blueimp-tmpl', + './jquery.fileupload-image', + './jquery.fileupload-audio', + './jquery.fileupload-video', + './jquery.fileupload-validate' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-tmpl'), + require('./jquery.fileupload-image'), + require('./jquery.fileupload-audio'), + require('./jquery.fileupload-video'), + require('./jquery.fileupload-validate') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.tmpl + ); + } +}(function ($, tmpl) { + 'use strict'; + + $.blueimp.fileupload.prototype._specialOptions.push( + 'filesContainer', + 'uploadTemplateId', + 'downloadTemplateId' + ); + + // The UI version extends the file upload widget + // and adds complete user interface interaction: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // By default, files added to the widget are uploaded as soon + // as the user clicks on the start buttons. To enable automatic + // uploads, set the following option to true: + autoUpload: false, + // The ID of the upload template: + uploadTemplateId: 'template-upload', + // The ID of the download template: + downloadTemplateId: 'template-download', + // The container for the list of files. If undefined, it is set to + // an element with class "files" inside of the widget element: + filesContainer: undefined, + // By default, files are appended to the files container. + // Set the following option to true, to prepend files instead: + prependFiles: false, + // The expected data type of the upload response, sets the dataType + // option of the $.ajax upload requests: + dataType: 'json', + + // Error and info messages: + messages: { + unknownError: 'Unknown error' + }, + + // Function returning the current number of files, + // used by the maxNumberOfFiles validation: + getNumberOfFiles: function () { + return this.filesContainer.children() + .not('.processing').length; + }, + + // Callback to retrieve the list of files from the server response: + getFilesFromResponse: function (data) { + if (data.result && $.isArray(data.result.files)) { + return data.result.files; + } + return []; + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop or add API call). + // See the basic file upload widget for more information: + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var $this = $(this), + that = $this.data('blueimp-fileupload') || + $this.data('fileupload'), + options = that.options; + data.context = that._renderUpload(data.files) + .data('data', data) + .addClass('processing'); + options.filesContainer[ + options.prependFiles ? 'prepend' : 'append' + ](data.context); + that._forceReflow(data.context); + that._transition(data.context); + data.process(function () { + return $this.fileupload('process', data); + }).always(function () { + data.context.each(function (index) { + $(this).find('.size').text( + that._formatFileSize(data.files[index].size) + ); + }).removeClass('processing'); + that._renderPreviews(data); + }).done(function () { + data.context.find('.start').prop('disabled', false); + if ((that._trigger('added', e, data) !== false) && + (options.autoUpload || data.autoUpload) && + data.autoUpload !== false) { + data.submit(); + } + }).fail(function () { + if (data.files.error) { + data.context.each(function (index) { + var error = data.files[index].error; + if (error) { + $(this).find('.error').text(error); + } + }); + } + }); + }, + // Callback for the start of each file upload request: + send: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + if (data.context && data.dataType && + data.dataType.substr(0, 6) === 'iframe') { + // Iframe Transport does not support progress events. + // In lack of an indeterminate progress bar, we set + // the progress to 100%, showing the full animated bar: + data.context + .find('.progress').addClass( + !$.support.transition && 'progress-animated' + ) + .attr('aria-valuenow', 100) + .children().first().css( + 'width', + '100%' + ); + } + return that._trigger('sent', e, data); + }, + // Callback for successful uploads: + done: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + getFilesFromResponse = data.getFilesFromResponse || + that.options.getFilesFromResponse, + files = getFilesFromResponse(data), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + var file = files[index] || + {error: 'Empty file upload result'}; + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + }); + } else { + template = that._renderDownload(files)[ + that.options.prependFiles ? 'prependTo' : 'appendTo' + ](that.options.filesContainer); + that._forceReflow(template); + deferred = that._addFinishedDeferreds(); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('completed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }, + // Callback for failed (abort or error) uploads: + fail: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + template, + deferred; + if (data.context) { + data.context.each(function (index) { + if (data.errorThrown !== 'abort') { + var file = data.files[index]; + file.error = file.error || data.errorThrown || + data.i18n('unknownError'); + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + var node = $(this); + template = that._renderDownload([file]) + .replaceAll(node); + that._forceReflow(template); + that._transition(template).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + ); + } else { + deferred = that._addFinishedDeferreds(); + that._transition($(this)).done( + function () { + $(this).remove(); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } + }); + } else if (data.errorThrown !== 'abort') { + data.context = that._renderUpload(data.files)[ + that.options.prependFiles ? 'prependTo' : 'appendTo' + ](that.options.filesContainer) + .data('data', data); + that._forceReflow(data.context); + deferred = that._addFinishedDeferreds(); + that._transition(data.context).done( + function () { + data.context = $(this); + that._trigger('failed', e, data); + that._trigger('finished', e, data); + deferred.resolve(); + } + ); + } else { + that._trigger('failed', e, data); + that._trigger('finished', e, data); + that._addFinishedDeferreds().resolve(); + } + }, + // Callback for upload progress events: + progress: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var progress = Math.floor(data.loaded / data.total * 100); + if (data.context) { + data.context.each(function () { + $(this).find('.progress') + .attr('aria-valuenow', progress) + .children().first().css( + 'width', + progress + '%' + ); + }); + } + }, + // Callback for global upload progress events: + progressall: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var $this = $(this), + progress = Math.floor(data.loaded / data.total * 100), + globalProgressNode = $this.find('.fileupload-progress'), + extendedProgressNode = globalProgressNode + .find('.progress-extended'); + if (extendedProgressNode.length) { + extendedProgressNode.html( + ($this.data('blueimp-fileupload') || $this.data('fileupload')) + ._renderExtendedProgress(data) + ); + } + globalProgressNode + .find('.progress') + .attr('aria-valuenow', progress) + .children().first().css( + 'width', + progress + '%' + ); + }, + // Callback for uploads start, equivalent to the global ajaxStart event: + start: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'); + that._resetFinishedDeferreds(); + that._transition($(this).find('.fileupload-progress')).done( + function () { + that._trigger('started', e); + } + ); + }, + // Callback for uploads stop, equivalent to the global ajaxStop event: + stop: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + deferred = that._addFinishedDeferreds(); + $.when.apply($, that._getFinishedDeferreds()) + .done(function () { + that._trigger('stopped', e); + }); + that._transition($(this).find('.fileupload-progress')).done( + function () { + $(this).find('.progress') + .attr('aria-valuenow', '0') + .children().first().css('width', '0%'); + $(this).find('.progress-extended').html(' '); + deferred.resolve(); + } + ); + }, + processstart: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + $(this).addClass('fileupload-processing'); + }, + processstop: function (e) { + if (e.isDefaultPrevented()) { + return false; + } + $(this).removeClass('fileupload-processing'); + }, + // Callback for file deletion: + destroy: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + var that = $(this).data('blueimp-fileupload') || + $(this).data('fileupload'), + removeNode = function () { + that._transition(data.context).done( + function () { + $(this).remove(); + that._trigger('destroyed', e, data); + } + ); + }; + if (data.url) { + data.dataType = data.dataType || that.options.dataType; + $.ajax(data).done(removeNode).fail(function () { + that._trigger('destroyfailed', e, data); + }); + } else { + removeNode(); + } + } + }, + + _resetFinishedDeferreds: function () { + this._finishedUploads = []; + }, + + _addFinishedDeferreds: function (deferred) { + if (!deferred) { + deferred = $.Deferred(); + } + this._finishedUploads.push(deferred); + return deferred; + }, + + _getFinishedDeferreds: function () { + return this._finishedUploads; + }, + + // Link handler, that allows to download files + // by drag & drop of the links to the desktop: + _enableDragToDesktop: function () { + var link = $(this), + url = link.prop('href'), + name = link.prop('download'), + type = 'application/octet-stream'; + link.bind('dragstart', function (e) { + try { + e.originalEvent.dataTransfer.setData( + 'DownloadURL', + [type, name, url].join(':') + ); + } catch (ignore) {} + }); + }, + + _formatFileSize: function (bytes) { + if (typeof bytes !== 'number') { + return ''; + } + if (bytes >= 1000000000) { + return (bytes / 1000000000).toFixed(2) + ' GB'; + } + if (bytes >= 1000000) { + return (bytes / 1000000).toFixed(2) + ' MB'; + } + return (bytes / 1000).toFixed(2) + ' KB'; + }, + + _formatBitrate: function (bits) { + if (typeof bits !== 'number') { + return ''; + } + if (bits >= 1000000000) { + return (bits / 1000000000).toFixed(2) + ' Gbit/s'; + } + if (bits >= 1000000) { + return (bits / 1000000).toFixed(2) + ' Mbit/s'; + } + if (bits >= 1000) { + return (bits / 1000).toFixed(2) + ' kbit/s'; + } + return bits.toFixed(2) + ' bit/s'; + }, + + _formatTime: function (seconds) { + var date = new Date(seconds * 1000), + days = Math.floor(seconds / 86400); + days = days ? days + 'd ' : ''; + return days + + ('0' + date.getUTCHours()).slice(-2) + ':' + + ('0' + date.getUTCMinutes()).slice(-2) + ':' + + ('0' + date.getUTCSeconds()).slice(-2); + }, + + _formatPercentage: function (floatValue) { + return (floatValue * 100).toFixed(2) + ' %'; + }, + + _renderExtendedProgress: function (data) { + return this._formatBitrate(data.bitrate) + ' | ' + + this._formatTime( + (data.total - data.loaded) * 8 / data.bitrate + ) + ' | ' + + this._formatPercentage( + data.loaded / data.total + ) + ' | ' + + this._formatFileSize(data.loaded) + ' / ' + + this._formatFileSize(data.total); + }, + + _renderTemplate: function (func, files) { + if (!func) { + return $(); + } + var result = func({ + files: files, + formatFileSize: this._formatFileSize, + options: this.options + }); + if (result instanceof $) { + return result; + } + return $(this.options.templatesContainer).html(result).children(); + }, + + _renderPreviews: function (data) { + data.context.find('.preview').each(function (index, elm) { + $(elm).append(data.files[index].preview); + }); + }, + + _renderUpload: function (files) { + return this._renderTemplate( + this.options.uploadTemplate, + files + ); + }, + + _renderDownload: function (files) { + return this._renderTemplate( + this.options.downloadTemplate, + files + ).find('a[download]').each(this._enableDragToDesktop).end(); + }, + + _startHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget), + template = button.closest('.template-upload'), + data = template.data('data'); + button.prop('disabled', true); + if (data && data.submit) { + data.submit(); + } + }, + + _cancelHandler: function (e) { + e.preventDefault(); + var template = $(e.currentTarget) + .closest('.template-upload,.template-download'), + data = template.data('data') || {}; + data.context = data.context || template; + if (data.abort) { + data.abort(); + } else { + data.errorThrown = 'abort'; + this._trigger('fail', e, data); + } + }, + + _deleteHandler: function (e) { + e.preventDefault(); + var button = $(e.currentTarget); + this._trigger('destroy', e, $.extend({ + context: button.closest('.template-download'), + type: 'DELETE' + }, button.data())); + }, + + _forceReflow: function (node) { + return $.support.transition && node.length && + node[0].offsetWidth; + }, + + _transition: function (node) { + var dfd = $.Deferred(); + if ($.support.transition && node.hasClass('fade') && node.is(':visible')) { + node.bind( + $.support.transition.end, + function (e) { + // Make sure we don't respond to other transitions events + // in the container element, e.g. from button elements: + if (e.target === node[0]) { + node.unbind($.support.transition.end); + dfd.resolveWith(node); + } + } + ).toggleClass('in'); + } else { + node.toggleClass('in'); + dfd.resolveWith(node); + } + return dfd; + }, + + _initButtonBarEventHandlers: function () { + var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'), + filesList = this.options.filesContainer; + this._on(fileUploadButtonBar.find('.start'), { + click: function (e) { + e.preventDefault(); + filesList.find('.start').click(); + } + }); + this._on(fileUploadButtonBar.find('.cancel'), { + click: function (e) { + e.preventDefault(); + filesList.find('.cancel').click(); + } + }); + this._on(fileUploadButtonBar.find('.delete'), { + click: function (e) { + e.preventDefault(); + filesList.find('.toggle:checked') + .closest('.template-download') + .find('.delete').click(); + fileUploadButtonBar.find('.toggle') + .prop('checked', false); + } + }); + this._on(fileUploadButtonBar.find('.toggle'), { + change: function (e) { + filesList.find('.toggle').prop( + 'checked', + $(e.currentTarget).is(':checked') + ); + } + }); + }, + + _destroyButtonBarEventHandlers: function () { + this._off( + this.element.find('.fileupload-buttonbar') + .find('.start, .cancel, .delete'), + 'click' + ); + this._off( + this.element.find('.fileupload-buttonbar .toggle'), + 'change.' + ); + }, + + _initEventHandlers: function () { + this._super(); + this._on(this.options.filesContainer, { + 'click .start': this._startHandler, + 'click .cancel': this._cancelHandler, + 'click .delete': this._deleteHandler + }); + this._initButtonBarEventHandlers(); + }, + + _destroyEventHandlers: function () { + this._destroyButtonBarEventHandlers(); + this._off(this.options.filesContainer, 'click'); + this._super(); + }, + + _enableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', false) + .parent().removeClass('disabled'); + }, + + _disableFileInputButton: function () { + this.element.find('.fileinput-button input') + .prop('disabled', true) + .parent().addClass('disabled'); + }, + + _initTemplates: function () { + var options = this.options; + options.templatesContainer = this.document[0].createElement( + options.filesContainer.prop('nodeName') + ); + if (tmpl) { + if (options.uploadTemplateId) { + options.uploadTemplate = tmpl(options.uploadTemplateId); + } + if (options.downloadTemplateId) { + options.downloadTemplate = tmpl(options.downloadTemplateId); + } + } + }, + + _initFilesContainer: function () { + var options = this.options; + if (options.filesContainer === undefined) { + options.filesContainer = this.element.find('.files'); + } else if (!(options.filesContainer instanceof $)) { + options.filesContainer = $(options.filesContainer); + } + }, + + _initSpecialOptions: function () { + this._super(); + this._initFilesContainer(); + this._initTemplates(); + }, + + _create: function () { + this._super(); + this._resetFinishedDeferreds(); + if (!$.support.fileInput) { + this._disableFileInputButton(); + } + }, + + enable: function () { + var wasDisabled = false; + if (this.options.disabled) { + wasDisabled = true; + } + this._super(); + if (wasDisabled) { + this.element.find('input, button').prop('disabled', false); + this._enableFileInputButton(); + } + }, + + disable: function () { + if (!this.options.disabled) { + this.element.find('input, button').prop('disabled', true); + this._disableFileInputButton(); + } + this._super(); + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload-validate.js b/core/vendor/filemanager/js/jquery.fileupload-validate.js new file mode 100755 index 00000000..eebeb373 --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-validate.js @@ -0,0 +1,125 @@ +/* + * jQuery File Upload Validation Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* global define, require, window */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery + ); + } +}(function ($) { + 'use strict'; + + // Append to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.push( + { + action: 'validate', + // Always trigger this action, + // even if the previous action was rejected: + always: true, + // Options taken from the global options map: + acceptFileTypes: '@', + maxFileSize: '@', + minFileSize: '@', + maxNumberOfFiles: '@', + disabled: '@disableValidation' + } + ); + + // The File Upload Validation plugin extends the fileupload widget + // with file validation functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + /* + // The regular expression for allowed file types, matches + // against either file type or file name: + acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i, + // The maximum allowed file size in bytes: + maxFileSize: 10000000, // 10 MB + // The minimum allowed file size in bytes: + minFileSize: undefined, // No minimal file size + // The limit of files to be uploaded: + maxNumberOfFiles: 10, + */ + + // Function returning the current number of files, + // has to be overriden for maxNumberOfFiles validation: + getNumberOfFiles: $.noop, + + // Error and info messages: + messages: { + maxNumberOfFiles: 'Maximum number of files exceeded', + acceptFileTypes: 'File type not allowed', + maxFileSize: 'File is too large', + minFileSize: 'File is too small' + } + }, + + processActions: { + + validate: function (data, options) { + if (options.disabled) { + return data; + } + var dfd = $.Deferred(), + settings = this.options, + file = data.files[data.index], + fileSize; + if (options.minFileSize || options.maxFileSize) { + fileSize = file.size; + } + if ($.type(options.maxNumberOfFiles) === 'number' && + (settings.getNumberOfFiles() || 0) + data.files.length > + options.maxNumberOfFiles) { + file.error = settings.i18n('maxNumberOfFiles'); + } else if (options.acceptFileTypes && + !(options.acceptFileTypes.test(file.type) || + options.acceptFileTypes.test(file.name))) { + file.error = settings.i18n('acceptFileTypes'); + } else if (fileSize > options.maxFileSize) { + file.error = settings.i18n('maxFileSize'); + } else if ($.type(fileSize) === 'number' && + fileSize < options.minFileSize) { + file.error = settings.i18n('minFileSize'); + } else { + delete file.error; + } + if (file.error || data.files.error) { + data.files.error = true; + dfd.rejectWith(this, [data]); + } else { + dfd.resolveWith(this, [data]); + } + return dfd.promise(); + } + + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload-video.js b/core/vendor/filemanager/js/jquery.fileupload-video.js new file mode 100755 index 00000000..aedcec2b --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload-video.js @@ -0,0 +1,113 @@ +/* + * jQuery File Upload Video Preview Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2013, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'load-image', + './jquery.fileupload-process' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('blueimp-load-image/js/load-image'), + require('./jquery.fileupload-process') + ); + } else { + // Browser globals: + factory( + window.jQuery, + window.loadImage + ); + } +}(function ($, loadImage) { + 'use strict'; + + // Prepend to the default processQueue: + $.blueimp.fileupload.prototype.options.processQueue.unshift( + { + action: 'loadVideo', + // Use the action as prefix for the "@" options: + prefix: true, + fileTypes: '@', + maxFileSize: '@', + disabled: '@disableVideoPreview' + }, + { + action: 'setVideo', + name: '@videoPreviewName', + disabled: '@disableVideoPreview' + } + ); + + // The File Upload Video Preview plugin extends the fileupload widget + // with video preview functionality: + $.widget('blueimp.fileupload', $.blueimp.fileupload, { + + options: { + // The regular expression for the types of video files to load, + // matched against the file type: + loadVideoFileTypes: /^video\/.*$/ + }, + + _videoElement: document.createElement('video'), + + processActions: { + + // Loads the video file given via data.files and data.index + // as video element if the browser supports playing it. + // Accepts the options fileTypes (regular expression) + // and maxFileSize (integer) to limit the files to load: + loadVideo: function (data, options) { + if (options.disabled) { + return data; + } + var file = data.files[data.index], + url, + video; + if (this._videoElement.canPlayType && + this._videoElement.canPlayType(file.type) && + ($.type(options.maxFileSize) !== 'number' || + file.size <= options.maxFileSize) && + (!options.fileTypes || + options.fileTypes.test(file.type))) { + url = loadImage.createObjectURL(file); + if (url) { + video = this._videoElement.cloneNode(false); + video.src = url; + video.controls = true; + data.video = video; + return data; + } + } + return data; + }, + + // Sets the video element as a property of the file object: + setVideo: function (data, options) { + if (data.video && !options.disabled) { + data.files[data.index][options.name || 'preview'] = data.video; + } + return data; + } + + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.fileupload.js b/core/vendor/filemanager/js/jquery.fileupload.js new file mode 100755 index 00000000..f20bc6d0 --- /dev/null +++ b/core/vendor/filemanager/js/jquery.fileupload.js @@ -0,0 +1,1482 @@ +/* + * jQuery File Upload Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2010, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* jshint nomen:false */ +/* global define, require, window, document, location, Blob, FormData */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define([ + 'jquery', + 'jquery-ui/ui/widget' + ], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory( + require('jquery'), + require('./vendor/jquery.ui.widget') + ); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Detect file input support, based on + // http://viljamis.com/blog/2012/file-upload-support-on-mobile/ + $.support.fileInput = !(new RegExp( + // Handle devices which give false positives for the feature detection: + '(Android (1\\.[0156]|2\\.[01]))' + + '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' + + '|(w(eb)?OSBrowser)|(webOS)' + + '|(Kindle/(1\\.0|2\\.[05]|3\\.0))' + ).test(window.navigator.userAgent) || + // Feature detection for all other devices: + $('').prop('disabled')); + + // The FileReader API is not actually used, but works as feature detection, + // as some Safari versions (5?) support XHR file uploads via the FormData API, + // but not non-multipart XHR file uploads. + // window.XMLHttpRequestUpload is not available on IE10, so we check for + // window.ProgressEvent instead to detect XHR2 file upload capability: + $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader); + $.support.xhrFormDataFileUpload = !!window.FormData; + + // Detect support for Blob slicing (required for chunked uploads): + $.support.blobSlice = window.Blob && (Blob.prototype.slice || + Blob.prototype.webkitSlice || Blob.prototype.mozSlice); + + // Helper function to create drag handlers for dragover/dragenter/dragleave: + function getDragHandler(type) { + var isDragOver = type === 'dragover'; + return function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var dataTransfer = e.dataTransfer; + if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 && + this._trigger( + type, + $.Event(type, {delegatedEvent: e}) + ) !== false) { + e.preventDefault(); + if (isDragOver) { + dataTransfer.dropEffect = 'copy'; + } + } + }; + } + + // The fileupload widget listens for change events on file input fields defined + // via fileInput setting and paste or drop events of the given dropZone. + // In addition to the default jQuery Widget methods, the fileupload widget + // exposes the "add" and "send" methods, to add or directly send files using + // the fileupload API. + // By default, files added via file input selection, paste, drag & drop or + // "add" method are uploaded immediately, but it is possible to override + // the "add" callback option to queue file uploads. + $.widget('blueimp.fileupload', { + + options: { + // The drop target element(s), by the default the complete document. + // Set to null to disable drag & drop support: + dropZone: $(document), + // The paste target element(s), by the default undefined. + // Set to a DOM node or jQuery object to enable file pasting: + pasteZone: undefined, + // The file input field(s), that are listened to for change events. + // If undefined, it is set to the file input fields inside + // of the widget element on plugin initialization. + // Set to null to disable the change listener. + fileInput: undefined, + // By default, the file input field is replaced with a clone after + // each input field change event. This is required for iframe transport + // queues and allows change events to be fired for the same file + // selection, but can be disabled by setting the following option to false: + replaceFileInput: true, + // The parameter name for the file form data (the request argument name). + // If undefined or empty, the name property of the file input field is + // used, or "files[]" if the file input name property is also empty, + // can be a string or an array of strings: + paramName: undefined, + // By default, each file of a selection is uploaded using an individual + // request for XHR type uploads. Set to false to upload file + // selections in one request each: + singleFileUploads: true, + // To limit the number of files uploaded with one XHR request, + // set the following option to an integer greater than 0: + limitMultiFileUploads: undefined, + // The following option limits the number of files uploaded with one + // XHR request to keep the request size under or equal to the defined + // limit in bytes: + limitMultiFileUploadSize: undefined, + // Multipart file uploads add a number of bytes to each uploaded file, + // therefore the following option adds an overhead for each file used + // in the limitMultiFileUploadSize configuration: + limitMultiFileUploadSizeOverhead: 512, + // Set the following option to true to issue all file upload requests + // in a sequential order: + sequentialUploads: false, + // To limit the number of concurrent uploads, + // set the following option to an integer greater than 0: + limitConcurrentUploads: undefined, + // Set the following option to true to force iframe transport uploads: + forceIframeTransport: false, + // Set the following option to the location of a redirect url on the + // origin server, for cross-domain iframe transport uploads: + redirect: undefined, + // The parameter name for the redirect url, sent as part of the form + // data and set to 'redirect' if this option is empty: + redirectParamName: undefined, + // Set the following option to the location of a postMessage window, + // to enable postMessage transport uploads: + postMessage: undefined, + // By default, XHR file uploads are sent as multipart/form-data. + // The iframe transport is always using multipart/form-data. + // Set to false to enable non-multipart XHR uploads: + multipart: true, + // To upload large files in smaller chunks, set the following option + // to a preferred maximum chunk size. If set to 0, null or undefined, + // or the browser does not support the required Blob API, files will + // be uploaded as a whole. + maxChunkSize: undefined, + // When a non-multipart upload or a chunked multipart upload has been + // aborted, this option can be used to resume the upload by setting + // it to the size of the already uploaded bytes. This option is most + // useful when modifying the options object inside of the "add" or + // "send" callbacks, as the options are cloned for each file upload. + uploadedBytes: undefined, + // By default, failed (abort or error) file uploads are removed from the + // global progress calculation. Set the following option to false to + // prevent recalculating the global progress data: + recalculateProgress: true, + // Interval in milliseconds to calculate and trigger progress events: + progressInterval: 100, + // Interval in milliseconds to calculate progress bitrate: + bitrateInterval: 500, + // By default, uploads are started automatically when adding files: + autoUpload: true, + + // Error and info messages: + messages: { + uploadedBytes: 'Uploaded bytes exceed file size' + }, + + // Translation function, gets the message key to be translated + // and an object with context specific data as arguments: + i18n: function (message, context) { + message = this.messages[message] || message.toString(); + if (context) { + $.each(context, function (key, value) { + message = message.replace('{' + key + '}', value); + }); + } + return message; + }, + + // Additional form data to be sent along with the file uploads can be set + // using this option, which accepts an array of objects with name and + // value properties, a function returning such an array, a FormData + // object (for XHR file uploads), or a simple object. + // The form of the first fileInput is given as parameter to the function: + formData: function (form) { + return form.serializeArray(); + }, + + // The add callback is invoked as soon as files are added to the fileupload + // widget (via file input selection, drag & drop, paste or add API call). + // If the singleFileUploads option is enabled, this callback will be + // called once for each file in the selection for XHR file uploads, else + // once for each file selection. + // + // The upload starts when the submit method is invoked on the data parameter. + // The data object contains a files property holding the added files + // and allows you to override plugin options as well as define ajax settings. + // + // Listeners for this callback can also be bound the following way: + // .bind('fileuploadadd', func); + // + // data.submit() returns a Promise object and allows to attach additional + // handlers using jQuery's Deferred callbacks: + // data.submit().done(func).fail(func).always(func); + add: function (e, data) { + if (e.isDefaultPrevented()) { + return false; + } + if (data.autoUpload || (data.autoUpload !== false && + $(this).fileupload('option', 'autoUpload'))) { + data.process().done(function () { + data.submit(); + }); + } + }, + + // Other callbacks: + + // Callback for the submit event of each file upload: + // submit: function (e, data) {}, // .bind('fileuploadsubmit', func); + + // Callback for the start of each file upload request: + // send: function (e, data) {}, // .bind('fileuploadsend', func); + + // Callback for successful uploads: + // done: function (e, data) {}, // .bind('fileuploaddone', func); + + // Callback for failed (abort or error) uploads: + // fail: function (e, data) {}, // .bind('fileuploadfail', func); + + // Callback for completed (success, abort or error) requests: + // always: function (e, data) {}, // .bind('fileuploadalways', func); + + // Callback for upload progress events: + // progress: function (e, data) {}, // .bind('fileuploadprogress', func); + + // Callback for global upload progress events: + // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func); + + // Callback for uploads start, equivalent to the global ajaxStart event: + // start: function (e) {}, // .bind('fileuploadstart', func); + + // Callback for uploads stop, equivalent to the global ajaxStop event: + // stop: function (e) {}, // .bind('fileuploadstop', func); + + // Callback for change events of the fileInput(s): + // change: function (e, data) {}, // .bind('fileuploadchange', func); + + // Callback for paste events to the pasteZone(s): + // paste: function (e, data) {}, // .bind('fileuploadpaste', func); + + // Callback for drop events of the dropZone(s): + // drop: function (e, data) {}, // .bind('fileuploaddrop', func); + + // Callback for dragover events of the dropZone(s): + // dragover: function (e) {}, // .bind('fileuploaddragover', func); + + // Callback for the start of each chunk upload request: + // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func); + + // Callback for successful chunk uploads: + // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func); + + // Callback for failed (abort or error) chunk uploads: + // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func); + + // Callback for completed (success, abort or error) chunk upload requests: + // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func); + + // The plugin options are used as settings object for the ajax calls. + // The following are jQuery ajax settings required for the file uploads: + processData: false, + contentType: false, + cache: false, + timeout: 0 + }, + + // A list of options that require reinitializing event listeners and/or + // special initialization code: + _specialOptions: [ + 'fileInput', + 'dropZone', + 'pasteZone', + 'multipart', + 'forceIframeTransport' + ], + + _blobSlice: $.support.blobSlice && function () { + var slice = this.slice || this.webkitSlice || this.mozSlice; + return slice.apply(this, arguments); + }, + + _BitrateTimer: function () { + this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime()); + this.loaded = 0; + this.bitrate = 0; + this.getBitrate = function (now, loaded, interval) { + var timeDiff = now - this.timestamp; + if (!this.bitrate || !interval || timeDiff > interval) { + this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8; + this.loaded = loaded; + this.timestamp = now; + } + return this.bitrate; + }; + }, + + _isXHRUpload: function (options) { + return !options.forceIframeTransport && + ((!options.multipart && $.support.xhrFileUpload) || + $.support.xhrFormDataFileUpload); + }, + + _getFormData: function (options) { + var formData; + if ($.type(options.formData) === 'function') { + return options.formData(options.form); + } + if ($.isArray(options.formData)) { + return options.formData; + } + if ($.type(options.formData) === 'object') { + formData = []; + $.each(options.formData, function (name, value) { + formData.push({name: name, value: value}); + }); + return formData; + } + return []; + }, + + _getTotal: function (files) { + var total = 0; + $.each(files, function (index, file) { + total += file.size || 1; + }); + return total; + }, + + _initProgressObject: function (obj) { + var progress = { + loaded: 0, + total: 0, + bitrate: 0 + }; + if (obj._progress) { + $.extend(obj._progress, progress); + } else { + obj._progress = progress; + } + }, + + _initResponseObject: function (obj) { + var prop; + if (obj._response) { + for (prop in obj._response) { + if (obj._response.hasOwnProperty(prop)) { + delete obj._response[prop]; + } + } + } else { + obj._response = {}; + } + }, + + _onProgress: function (e, data) { + if (e.lengthComputable) { + var now = ((Date.now) ? Date.now() : (new Date()).getTime()), + loaded; + if (data._time && data.progressInterval && + (now - data._time < data.progressInterval) && + e.loaded !== e.total) { + return; + } + data._time = now; + loaded = Math.floor( + e.loaded / e.total * (data.chunkSize || data._progress.total) + ) + (data.uploadedBytes || 0); + // Add the difference from the previously loaded state + // to the global loaded counter: + this._progress.loaded += (loaded - data._progress.loaded); + this._progress.bitrate = this._bitrateTimer.getBitrate( + now, + this._progress.loaded, + data.bitrateInterval + ); + data._progress.loaded = data.loaded = loaded; + data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate( + now, + loaded, + data.bitrateInterval + ); + // Trigger a custom progress event with a total data property set + // to the file size(s) of the current upload and a loaded data + // property calculated accordingly: + this._trigger( + 'progress', + $.Event('progress', {delegatedEvent: e}), + data + ); + // Trigger a global progress event for all current file uploads, + // including ajax calls queued for sequential file uploads: + this._trigger( + 'progressall', + $.Event('progressall', {delegatedEvent: e}), + this._progress + ); + } + }, + + _initProgressListener: function (options) { + var that = this, + xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr(); + // Accesss to the native XHR object is required to add event listeners + // for the upload progress event: + if (xhr.upload) { + $(xhr.upload).bind('progress', function (e) { + var oe = e.originalEvent; + // Make sure the progress event properties get copied over: + e.lengthComputable = oe.lengthComputable; + e.loaded = oe.loaded; + e.total = oe.total; + that._onProgress(e, options); + }); + options.xhr = function () { + return xhr; + }; + } + }, + + _isInstanceOf: function (type, obj) { + // Cross-frame instanceof check + return Object.prototype.toString.call(obj) === '[object ' + type + ']'; + }, + + _initXHRData: function (options) { + var that = this, + formData, + file = options.files[0], + // Ignore non-multipart setting if not supported: + multipart = options.multipart || !$.support.xhrFileUpload, + paramName = $.type(options.paramName) === 'array' ? + options.paramName[0] : options.paramName; + options.headers = $.extend({}, options.headers); + if (options.contentRange) { + options.headers['Content-Range'] = options.contentRange; + } + if (!multipart || options.blob || !this._isInstanceOf('File', file)) { + options.headers['Content-Disposition'] = 'attachment; filename="' + + encodeURI(file.name) + '"'; + } + if (!multipart) { + options.contentType = file.type || 'application/octet-stream'; + options.data = options.blob || file; + } else if ($.support.xhrFormDataFileUpload) { + if (options.postMessage) { + // window.postMessage does not allow sending FormData + // objects, so we just add the File/Blob objects to + // the formData array and let the postMessage window + // create the FormData object out of this array: + formData = this._getFormData(options); + if (options.blob) { + formData.push({ + name: paramName, + value: options.blob + }); + } else { + $.each(options.files, function (index, file) { + formData.push({ + name: ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + value: file + }); + }); + } + } else { + if (that._isInstanceOf('FormData', options.formData)) { + formData = options.formData; + } else { + formData = new FormData(); + $.each(this._getFormData(options), function (index, field) { + formData.append(field.name, field.value); + }); + } + if (options.blob) { + formData.append(paramName, options.blob, file.name); + } else { + $.each(options.files, function (index, file) { + // This check allows the tests to run with + // dummy objects: + if (that._isInstanceOf('File', file) || + that._isInstanceOf('Blob', file)) { + formData.append( + ($.type(options.paramName) === 'array' && + options.paramName[index]) || paramName, + file, + file.uploadName || file.name + ); + } + }); + } + } + options.data = formData; + } + // Blob reference is not needed anymore, free memory: + options.blob = null; + }, + + _initIframeSettings: function (options) { + var targetHost = $('').prop('href', options.url).prop('host'); + // Setting the dataType to iframe enables the iframe transport: + options.dataType = 'iframe ' + (options.dataType || ''); + // The iframe transport accepts a serialized array as form data: + options.formData = this._getFormData(options); + // Add redirect url to form data on cross-domain uploads: + if (options.redirect && targetHost && targetHost !== location.host) { + options.formData.push({ + name: options.redirectParamName || 'redirect', + value: options.redirect + }); + } + }, + + _initDataSettings: function (options) { + if (this._isXHRUpload(options)) { + if (!this._chunkedUpload(options, true)) { + if (!options.data) { + this._initXHRData(options); + } + this._initProgressListener(options); + } + if (options.postMessage) { + // Setting the dataType to postmessage enables the + // postMessage transport: + options.dataType = 'postmessage ' + (options.dataType || ''); + } + } else { + this._initIframeSettings(options); + } + }, + + _getParamName: function (options) { + var fileInput = $(options.fileInput), + paramName = options.paramName; + if (!paramName) { + paramName = []; + fileInput.each(function () { + var input = $(this), + name = input.prop('name') || 'files[]', + i = (input.prop('files') || [1]).length; + while (i) { + paramName.push(name); + i -= 1; + } + }); + if (!paramName.length) { + paramName = [fileInput.prop('name') || 'files[]']; + } + } else if (!$.isArray(paramName)) { + paramName = [paramName]; + } + return paramName; + }, + + _initFormSettings: function (options) { + // Retrieve missing options from the input field and the + // associated form, if available: + if (!options.form || !options.form.length) { + options.form = $(options.fileInput.prop('form')); + // If the given file input doesn't have an associated form, + // use the default widget file input's form: + if (!options.form.length) { + options.form = $(this.options.fileInput.prop('form')); + } + } + options.paramName = this._getParamName(options); + if (!options.url) { + options.url = options.form.prop('action') || location.href; + } + // The HTTP request method must be "POST" or "PUT": + options.type = (options.type || + ($.type(options.form.prop('method')) === 'string' && + options.form.prop('method')) || '' + ).toUpperCase(); + if (options.type !== 'POST' && options.type !== 'PUT' && + options.type !== 'PATCH') { + options.type = 'POST'; + } + if (!options.formAcceptCharset) { + options.formAcceptCharset = options.form.attr('accept-charset'); + } + }, + + _getAJAXSettings: function (data) { + var options = $.extend({}, this.options, data); + this._initFormSettings(options); + this._initDataSettings(options); + return options; + }, + + // jQuery 1.6 doesn't provide .state(), + // while jQuery 1.8+ removed .isRejected() and .isResolved(): + _getDeferredState: function (deferred) { + if (deferred.state) { + return deferred.state(); + } + if (deferred.isResolved()) { + return 'resolved'; + } + if (deferred.isRejected()) { + return 'rejected'; + } + return 'pending'; + }, + + // Maps jqXHR callbacks to the equivalent + // methods of the given Promise object: + _enhancePromise: function (promise) { + promise.success = promise.done; + promise.error = promise.fail; + promise.complete = promise.always; + return promise; + }, + + // Creates and returns a Promise object enhanced with + // the jqXHR methods abort, success, error and complete: + _getXHRPromise: function (resolveOrReject, context, args) { + var dfd = $.Deferred(), + promise = dfd.promise(); + context = context || this.options.context || promise; + if (resolveOrReject === true) { + dfd.resolveWith(context, args); + } else if (resolveOrReject === false) { + dfd.rejectWith(context, args); + } + promise.abort = dfd.promise; + return this._enhancePromise(promise); + }, + + // Adds convenience methods to the data callback argument: + _addConvenienceMethods: function (e, data) { + var that = this, + getPromise = function (args) { + return $.Deferred().resolveWith(that, args).promise(); + }; + data.process = function (resolveFunc, rejectFunc) { + if (resolveFunc || rejectFunc) { + data._processQueue = this._processQueue = + (this._processQueue || getPromise([this])).then( + function () { + if (data.errorThrown) { + return $.Deferred() + .rejectWith(that, [data]).promise(); + } + return getPromise(arguments); + } + ).then(resolveFunc, rejectFunc); + } + return this._processQueue || getPromise([this]); + }; + data.submit = function () { + if (this.state() !== 'pending') { + data.jqXHR = this.jqXHR = + (that._trigger( + 'submit', + $.Event('submit', {delegatedEvent: e}), + this + ) !== false) && that._onSend(e, this); + } + return this.jqXHR || that._getXHRPromise(); + }; + data.abort = function () { + if (this.jqXHR) { + return this.jqXHR.abort(); + } + this.errorThrown = 'abort'; + that._trigger('fail', null, this); + return that._getXHRPromise(false); + }; + data.state = function () { + if (this.jqXHR) { + return that._getDeferredState(this.jqXHR); + } + if (this._processQueue) { + return that._getDeferredState(this._processQueue); + } + }; + data.processing = function () { + return !this.jqXHR && this._processQueue && that + ._getDeferredState(this._processQueue) === 'pending'; + }; + data.progress = function () { + return this._progress; + }; + data.response = function () { + return this._response; + }; + }, + + // Parses the Range header from the server response + // and returns the uploaded bytes: + _getUploadedBytes: function (jqXHR) { + var range = jqXHR.getResponseHeader('Range'), + parts = range && range.split('-'), + upperBytesPos = parts && parts.length > 1 && + parseInt(parts[1], 10); + return upperBytesPos && upperBytesPos + 1; + }, + + // Uploads a file in multiple, sequential requests + // by splitting the file up in multiple blob chunks. + // If the second parameter is true, only tests if the file + // should be uploaded in chunks, but does not invoke any + // upload requests: + _chunkedUpload: function (options, testOnly) { + options.uploadedBytes = options.uploadedBytes || 0; + var that = this, + file = options.files[0], + fs = file.size, + ub = options.uploadedBytes, + mcs = options.maxChunkSize || fs, + slice = this._blobSlice, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + upload; + if (!(this._isXHRUpload(options) && slice && (ub || ($.type(mcs) === 'function' ? mcs(options) : mcs) < fs)) || + options.data) { + return false; + } + if (testOnly) { + return true; + } + if (ub >= fs) { + file.error = options.i18n('uploadedBytes'); + return this._getXHRPromise( + false, + options.context, + [null, 'error', file.error] + ); + } + // The chunk upload method: + upload = function () { + // Clone the options object for each chunk upload: + var o = $.extend({}, options), + currentLoaded = o._progress.loaded; + o.blob = slice.call( + file, + ub, + ub + ($.type(mcs) === 'function' ? mcs(o) : mcs), + file.type + ); + // Store the current chunk size, as the blob itself + // will be dereferenced after data processing: + o.chunkSize = o.blob.size; + // Expose the chunk bytes position range: + o.contentRange = 'bytes ' + ub + '-' + + (ub + o.chunkSize - 1) + '/' + fs; + // Process the upload data (the blob and potential form data): + that._initXHRData(o); + // Add progress listeners for this chunk upload: + that._initProgressListener(o); + jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) || + that._getXHRPromise(false, o.context)) + .done(function (result, textStatus, jqXHR) { + ub = that._getUploadedBytes(jqXHR) || + (ub + o.chunkSize); + // Create a progress event if no final progress event + // with loaded equaling total has been triggered + // for this chunk: + if (currentLoaded + o.chunkSize - o._progress.loaded) { + that._onProgress($.Event('progress', { + lengthComputable: true, + loaded: ub - o.uploadedBytes, + total: ub - o.uploadedBytes + }), o); + } + options.uploadedBytes = o.uploadedBytes = ub; + o.result = result; + o.textStatus = textStatus; + o.jqXHR = jqXHR; + that._trigger('chunkdone', null, o); + that._trigger('chunkalways', null, o); + if (ub < fs) { + // File upload not yet complete, + // continue with the next chunk: + upload(); + } else { + dfd.resolveWith( + o.context, + [result, textStatus, jqXHR] + ); + } + }) + .fail(function (jqXHR, textStatus, errorThrown) { + o.jqXHR = jqXHR; + o.textStatus = textStatus; + o.errorThrown = errorThrown; + that._trigger('chunkfail', null, o); + that._trigger('chunkalways', null, o); + dfd.rejectWith( + o.context, + [jqXHR, textStatus, errorThrown] + ); + }); + }; + this._enhancePromise(promise); + promise.abort = function () { + return jqXHR.abort(); + }; + upload(); + return promise; + }, + + _beforeSend: function (e, data) { + if (this._active === 0) { + // the start callback is triggered when an upload starts + // and no other uploads are currently running, + // equivalent to the global ajaxStart event: + this._trigger('start'); + // Set timer for global bitrate progress calculation: + this._bitrateTimer = new this._BitrateTimer(); + // Reset the global progress values: + this._progress.loaded = this._progress.total = 0; + this._progress.bitrate = 0; + } + // Make sure the container objects for the .response() and + // .progress() methods on the data object are available + // and reset to their initial state: + this._initResponseObject(data); + this._initProgressObject(data); + data._progress.loaded = data.loaded = data.uploadedBytes || 0; + data._progress.total = data.total = this._getTotal(data.files) || 1; + data._progress.bitrate = data.bitrate = 0; + this._active += 1; + // Initialize the global progress values: + this._progress.loaded += data.loaded; + this._progress.total += data.total; + }, + + _onDone: function (result, textStatus, jqXHR, options) { + var total = options._progress.total, + response = options._response; + if (options._progress.loaded < total) { + // Create a progress event if no final progress event + // with loaded equaling total has been triggered: + this._onProgress($.Event('progress', { + lengthComputable: true, + loaded: total, + total: total + }), options); + } + response.result = options.result = result; + response.textStatus = options.textStatus = textStatus; + response.jqXHR = options.jqXHR = jqXHR; + this._trigger('done', null, options); + }, + + _onFail: function (jqXHR, textStatus, errorThrown, options) { + var response = options._response; + if (options.recalculateProgress) { + // Remove the failed (error or abort) file upload from + // the global progress calculation: + this._progress.loaded -= options._progress.loaded; + this._progress.total -= options._progress.total; + } + response.jqXHR = options.jqXHR = jqXHR; + response.textStatus = options.textStatus = textStatus; + response.errorThrown = options.errorThrown = errorThrown; + this._trigger('fail', null, options); + }, + + _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) { + // jqXHRorResult, textStatus and jqXHRorError are added to the + // options object via done and fail callbacks + this._trigger('always', null, options); + }, + + _onSend: function (e, data) { + if (!data.submit) { + this._addConvenienceMethods(e, data); + } + var that = this, + jqXHR, + aborted, + slot, + pipe, + options = that._getAJAXSettings(data), + send = function () { + that._sending += 1; + // Set timer for bitrate progress calculation: + options._bitrateTimer = new that._BitrateTimer(); + jqXHR = jqXHR || ( + ((aborted || that._trigger( + 'send', + $.Event('send', {delegatedEvent: e}), + options + ) === false) && + that._getXHRPromise(false, options.context, aborted)) || + that._chunkedUpload(options) || $.ajax(options) + ).done(function (result, textStatus, jqXHR) { + that._onDone(result, textStatus, jqXHR, options); + }).fail(function (jqXHR, textStatus, errorThrown) { + that._onFail(jqXHR, textStatus, errorThrown, options); + }).always(function (jqXHRorResult, textStatus, jqXHRorError) { + that._onAlways( + jqXHRorResult, + textStatus, + jqXHRorError, + options + ); + that._sending -= 1; + that._active -= 1; + if (options.limitConcurrentUploads && + options.limitConcurrentUploads > that._sending) { + // Start the next queued upload, + // that has not been aborted: + var nextSlot = that._slots.shift(); + while (nextSlot) { + if (that._getDeferredState(nextSlot) === 'pending') { + nextSlot.resolve(); + break; + } + nextSlot = that._slots.shift(); + } + } + if (that._active === 0) { + // The stop callback is triggered when all uploads have + // been completed, equivalent to the global ajaxStop event: + that._trigger('stop'); + } + }); + return jqXHR; + }; + this._beforeSend(e, options); + if (this.options.sequentialUploads || + (this.options.limitConcurrentUploads && + this.options.limitConcurrentUploads <= this._sending)) { + if (this.options.limitConcurrentUploads > 1) { + slot = $.Deferred(); + this._slots.push(slot); + pipe = slot.then(send); + } else { + this._sequence = this._sequence.then(send, send); + pipe = this._sequence; + } + // Return the piped Promise object, enhanced with an abort method, + // which is delegated to the jqXHR object of the current upload, + // and jqXHR callbacks mapped to the equivalent Promise methods: + pipe.abort = function () { + aborted = [undefined, 'abort', 'abort']; + if (!jqXHR) { + if (slot) { + slot.rejectWith(options.context, aborted); + } + return send(); + } + return jqXHR.abort(); + }; + return this._enhancePromise(pipe); + } + return send(); + }, + + _onAdd: function (e, data) { + var that = this, + result = true, + options = $.extend({}, this.options, data), + files = data.files, + filesLength = files.length, + limit = options.limitMultiFileUploads, + limitSize = options.limitMultiFileUploadSize, + overhead = options.limitMultiFileUploadSizeOverhead, + batchSize = 0, + paramName = this._getParamName(options), + paramNameSet, + paramNameSlice, + fileSet, + i, + j = 0; + if (!filesLength) { + return false; + } + if (limitSize && files[0].size === undefined) { + limitSize = undefined; + } + if (!(options.singleFileUploads || limit || limitSize) || + !this._isXHRUpload(options)) { + fileSet = [files]; + paramNameSet = [paramName]; + } else if (!(options.singleFileUploads || limitSize) && limit) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i += limit) { + fileSet.push(files.slice(i, i + limit)); + paramNameSlice = paramName.slice(i, i + limit); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + } + } else if (!options.singleFileUploads && limitSize) { + fileSet = []; + paramNameSet = []; + for (i = 0; i < filesLength; i = i + 1) { + batchSize += files[i].size + overhead; + if (i + 1 === filesLength || + ((batchSize + files[i + 1].size + overhead) > limitSize) || + (limit && i + 1 - j >= limit)) { + fileSet.push(files.slice(j, i + 1)); + paramNameSlice = paramName.slice(j, i + 1); + if (!paramNameSlice.length) { + paramNameSlice = paramName; + } + paramNameSet.push(paramNameSlice); + j = i + 1; + batchSize = 0; + } + } + } else { + paramNameSet = paramName; + } + data.originalFiles = files; + $.each(fileSet || files, function (index, element) { + var newData = $.extend({}, data); + newData.files = fileSet ? element : [element]; + newData.paramName = paramNameSet[index]; + that._initResponseObject(newData); + that._initProgressObject(newData); + that._addConvenienceMethods(e, newData); + result = that._trigger( + 'add', + $.Event('add', {delegatedEvent: e}), + newData + ); + return result; + }); + return result; + }, + + _replaceFileInput: function (data) { + var input = data.fileInput, + inputClone = input.clone(true), + restoreFocus = input.is(document.activeElement); + // Add a reference for the new cloned file input to the data argument: + data.fileInputClone = inputClone; + $('
    ').append(inputClone)[0].reset(); + // Detaching allows to insert the fileInput on another form + // without loosing the file input value: + input.after(inputClone).detach(); + // If the fileInput had focus before it was detached, + // restore focus to the inputClone. + if (restoreFocus) { + inputClone.focus(); + } + // Avoid memory leaks with the detached file input: + $.cleanData(input.unbind('remove')); + // Replace the original file input element in the fileInput + // elements set with the clone, which has been copied including + // event handlers: + this.options.fileInput = this.options.fileInput.map(function (i, el) { + if (el === input[0]) { + return inputClone[0]; + } + return el; + }); + // If the widget has been initialized on the file input itself, + // override this.element with the file input clone: + if (input[0] === this.element[0]) { + this.element = inputClone; + } + }, + + _handleFileTreeEntry: function (entry, path) { + var that = this, + dfd = $.Deferred(), + entries = [], + dirReader, + errorHandler = function (e) { + if (e && !e.entry) { + e.entry = entry; + } + // Since $.when returns immediately if one + // Deferred is rejected, we use resolve instead. + // This allows valid files and invalid items + // to be returned together in one set: + dfd.resolve([e]); + }, + successHandler = function (entries) { + that._handleFileTreeEntries( + entries, + path + entry.name + '/' + ).done(function (files) { + dfd.resolve(files); + }).fail(errorHandler); + }, + readEntries = function () { + dirReader.readEntries(function (results) { + if (!results.length) { + successHandler(entries); + } else { + entries = entries.concat(results); + readEntries(); + } + }, errorHandler); + }; + path = path || ''; + if (entry.isFile) { + if (entry._file) { + // Workaround for Chrome bug #149735 + entry._file.relativePath = path; + dfd.resolve(entry._file); + } else { + entry.file(function (file) { + file.relativePath = path; + dfd.resolve(file); + }, errorHandler); + } + } else if (entry.isDirectory) { + dirReader = entry.createReader(); + readEntries(); + } else { + // Return an empy list for file system items + // other than files or directories: + dfd.resolve([]); + } + return dfd.promise(); + }, + + _handleFileTreeEntries: function (entries, path) { + var that = this; + return $.when.apply( + $, + $.map(entries, function (entry) { + return that._handleFileTreeEntry(entry, path); + }) + ).then(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _getDroppedFiles: function (dataTransfer) { + dataTransfer = dataTransfer || {}; + var items = dataTransfer.items; + if (items && items.length && (items[0].webkitGetAsEntry || + items[0].getAsEntry)) { + return this._handleFileTreeEntries( + $.map(items, function (item) { + var entry; + if (item.webkitGetAsEntry) { + entry = item.webkitGetAsEntry(); + if (entry) { + // Workaround for Chrome bug #149735: + entry._file = item.getAsFile(); + } + return entry; + } + return item.getAsEntry(); + }) + ); + } + return $.Deferred().resolve( + $.makeArray(dataTransfer.files) + ).promise(); + }, + + _getSingleFileInputFiles: function (fileInput) { + fileInput = $(fileInput); + var entries = fileInput.prop('webkitEntries') || + fileInput.prop('entries'), + files, + value; + if (entries && entries.length) { + return this._handleFileTreeEntries(entries); + } + files = $.makeArray(fileInput.prop('files')); + if (!files.length) { + value = fileInput.prop('value'); + if (!value) { + return $.Deferred().resolve([]).promise(); + } + // If the files property is not available, the browser does not + // support the File API and we add a pseudo File object with + // the input value as name with path information removed: + files = [{name: value.replace(/^.*\\/, '')}]; + } else if (files[0].name === undefined && files[0].fileName) { + // File normalization for Safari 4 and Firefox 3: + $.each(files, function (index, file) { + file.name = file.fileName; + file.size = file.fileSize; + }); + } + return $.Deferred().resolve(files).promise(); + }, + + _getFileInputFiles: function (fileInput) { + if (!(fileInput instanceof $) || fileInput.length === 1) { + return this._getSingleFileInputFiles(fileInput); + } + return $.when.apply( + $, + $.map(fileInput, this._getSingleFileInputFiles) + ).then(function () { + return Array.prototype.concat.apply( + [], + arguments + ); + }); + }, + + _onChange: function (e) { + var that = this, + data = { + fileInput: $(e.target), + form: $(e.target.form) + }; + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + if (that.options.replaceFileInput) { + that._replaceFileInput(data); + } + if (that._trigger( + 'change', + $.Event('change', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + }, + + _onPaste: function (e) { + var items = e.originalEvent && e.originalEvent.clipboardData && + e.originalEvent.clipboardData.items, + data = {files: []}; + if (items && items.length) { + $.each(items, function (index, item) { + var file = item.getAsFile && item.getAsFile(); + if (file) { + data.files.push(file); + } + }); + if (this._trigger( + 'paste', + $.Event('paste', {delegatedEvent: e}), + data + ) !== false) { + this._onAdd(e, data); + } + } + }, + + _onDrop: function (e) { + e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer; + var that = this, + dataTransfer = e.dataTransfer, + data = {}; + if (dataTransfer && dataTransfer.files && dataTransfer.files.length) { + e.preventDefault(); + this._getDroppedFiles(dataTransfer).always(function (files) { + data.files = files; + if (that._trigger( + 'drop', + $.Event('drop', {delegatedEvent: e}), + data + ) !== false) { + that._onAdd(e, data); + } + }); + } + }, + + _onDragOver: getDragHandler('dragover'), + + _onDragEnter: getDragHandler('dragenter'), + + _onDragLeave: getDragHandler('dragleave'), + + _initEventHandlers: function () { + if (this._isXHRUpload(this.options)) { + this._on(this.options.dropZone, { + dragover: this._onDragOver, + drop: this._onDrop, + // event.preventDefault() on dragenter is required for IE10+: + dragenter: this._onDragEnter, + // dragleave is not required, but added for completeness: + dragleave: this._onDragLeave + }); + this._on(this.options.pasteZone, { + paste: this._onPaste + }); + } + if ($.support.fileInput) { + this._on(this.options.fileInput, { + change: this._onChange + }); + } + }, + + _destroyEventHandlers: function () { + this._off(this.options.dropZone, 'dragenter dragleave dragover drop'); + this._off(this.options.pasteZone, 'paste'); + this._off(this.options.fileInput, 'change'); + }, + + _destroy: function () { + this._destroyEventHandlers(); + }, + + _setOption: function (key, value) { + var reinit = $.inArray(key, this._specialOptions) !== -1; + if (reinit) { + this._destroyEventHandlers(); + } + this._super(key, value); + if (reinit) { + this._initSpecialOptions(); + this._initEventHandlers(); + } + }, + + _initSpecialOptions: function () { + var options = this.options; + if (options.fileInput === undefined) { + options.fileInput = this.element.is('input[type="file"]') ? + this.element : this.element.find('input[type="file"]'); + } else if (!(options.fileInput instanceof $)) { + options.fileInput = $(options.fileInput); + } + if (!(options.dropZone instanceof $)) { + options.dropZone = $(options.dropZone); + } + if (!(options.pasteZone instanceof $)) { + options.pasteZone = $(options.pasteZone); + } + }, + + _getRegExp: function (str) { + var parts = str.split('/'), + modifiers = parts.pop(); + parts.shift(); + return new RegExp(parts.join('/'), modifiers); + }, + + _isRegExpOption: function (key, value) { + return key !== 'url' && $.type(value) === 'string' && + /^\/.*\/[igm]{0,3}$/.test(value); + }, + + _initDataAttributes: function () { + var that = this, + options = this.options, + data = this.element.data(); + // Initialize options set via HTML5 data-attributes: + $.each( + this.element[0].attributes, + function (index, attr) { + var key = attr.name.toLowerCase(), + value; + if (/^data-/.test(key)) { + // Convert hyphen-ated key to camelCase: + key = key.slice(5).replace(/-[a-z]/g, function (str) { + return str.charAt(1).toUpperCase(); + }); + value = data[key]; + if (that._isRegExpOption(key, value)) { + value = that._getRegExp(value); + } + options[key] = value; + } + } + ); + }, + + _create: function () { + this._initDataAttributes(); + this._initSpecialOptions(); + this._slots = []; + this._sequence = this._getXHRPromise(true); + this._sending = this._active = 0; + this._initProgressObject(this); + this._initEventHandlers(); + }, + + // This method is exposed to the widget API and allows to query + // the number of active uploads: + active: function () { + return this._active; + }, + + // This method is exposed to the widget API and allows to query + // the widget upload progress. + // It returns an object with loaded, total and bitrate properties + // for the running uploads: + progress: function () { + return this._progress; + }, + + // This method is exposed to the widget API and allows adding files + // using the fileupload API. The data parameter accepts an object which + // must have a files property and can contain additional options: + // .fileupload('add', {files: filesList}); + add: function (data) { + var that = this; + if (!data || this.options.disabled) { + return; + } + if (data.fileInput && !data.files) { + this._getFileInputFiles(data.fileInput).always(function (files) { + data.files = files; + that._onAdd(null, data); + }); + } else { + data.files = $.makeArray(data.files); + this._onAdd(null, data); + } + }, + + // This method is exposed to the widget API and allows sending files + // using the fileupload API. The data parameter accepts an object which + // must have a files or fileInput property and can contain additional options: + // .fileupload('send', {files: filesList}); + // The method returns a Promise object for the file upload call. + send: function (data) { + if (data && !this.options.disabled) { + if (data.fileInput && !data.files) { + var that = this, + dfd = $.Deferred(), + promise = dfd.promise(), + jqXHR, + aborted; + promise.abort = function () { + aborted = true; + if (jqXHR) { + return jqXHR.abort(); + } + dfd.reject(null, 'abort', 'abort'); + return promise; + }; + this._getFileInputFiles(data.fileInput).always( + function (files) { + if (aborted) { + return; + } + if (!files.length) { + dfd.reject(); + return; + } + data.files = files; + jqXHR = that._onSend(null, data); + jqXHR.then( + function (result, textStatus, jqXHR) { + dfd.resolve(result, textStatus, jqXHR); + }, + function (jqXHR, textStatus, errorThrown) { + dfd.reject(jqXHR, textStatus, errorThrown); + } + ); + } + ); + return this._enhancePromise(promise); + } + data.files = $.makeArray(data.files); + if (data.files.length) { + return this._onSend(null, data); + } + } + return this._getXHRPromise(false, data && data.context); + } + + }); + +})); diff --git a/core/vendor/filemanager/js/jquery.iframe-transport.js b/core/vendor/filemanager/js/jquery.iframe-transport.js new file mode 100755 index 00000000..8d25c464 --- /dev/null +++ b/core/vendor/filemanager/js/jquery.iframe-transport.js @@ -0,0 +1,224 @@ +/* + * jQuery Iframe Transport Plugin + * https://github.com/blueimp/jQuery-File-Upload + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + */ + +/* global define, require, window, document, JSON */ + +;(function (factory) { + 'use strict'; + if (typeof define === 'function' && define.amd) { + // Register as an anonymous AMD module: + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS: + factory(require('jquery')); + } else { + // Browser globals: + factory(window.jQuery); + } +}(function ($) { + 'use strict'; + + // Helper variable to create unique names for the transport iframes: + var counter = 0, + jsonAPI = $, + jsonParse = 'parseJSON'; + + if ('JSON' in window && 'parse' in JSON) { + jsonAPI = JSON; + jsonParse = 'parse'; + } + + // The iframe transport accepts four additional options: + // options.fileInput: a jQuery collection of file input fields + // options.paramName: the parameter name for the file form data, + // overrides the name property of the file input field(s), + // can be a string or an array of strings. + // options.formData: an array of objects with name and value properties, + // equivalent to the return data of .serializeArray(), e.g.: + // [{name: 'a', value: 1}, {name: 'b', value: 2}] + // options.initialIframeSrc: the URL of the initial iframe src, + // by default set to "javascript:false;" + $.ajaxTransport('iframe', function (options) { + if (options.async) { + // javascript:false as initial iframe src + // prevents warning popups on HTTPS in IE6: + /*jshint scripturl: true */ + var initialIframeSrc = options.initialIframeSrc || 'javascript:false;', + /*jshint scripturl: false */ + form, + iframe, + addParamChar; + return { + send: function (_, completeCallback) { + form = $('
    '); + form.attr('accept-charset', options.formAcceptCharset); + addParamChar = /\?/.test(options.url) ? '&' : '?'; + // XDomainRequest only supports GET and POST: + if (options.type === 'DELETE') { + options.url = options.url + addParamChar + '_method=DELETE'; + options.type = 'POST'; + } else if (options.type === 'PUT') { + options.url = options.url + addParamChar + '_method=PUT'; + options.type = 'POST'; + } else if (options.type === 'PATCH') { + options.url = options.url + addParamChar + '_method=PATCH'; + options.type = 'POST'; + } + // IE versions below IE8 cannot set the name property of + // elements that have already been added to the DOM, + // so we set the name along with the iframe HTML markup: + counter += 1; + iframe = $( + '' + ).bind('load', function () { + var fileInputClones, + paramNames = $.isArray(options.paramName) ? + options.paramName : [options.paramName]; + iframe + .unbind('load') + .bind('load', function () { + var response; + // Wrap in a try/catch block to catch exceptions thrown + // when trying to access cross-domain iframe contents: + try { + response = iframe.contents(); + // Google Chrome and Firefox do not throw an + // exception when calling iframe.contents() on + // cross-domain requests, so we unify the response: + if (!response.length || !response[0].firstChild) { + throw new Error(); + } + } catch (e) { + response = undefined; + } + // The complete callback returns the + // iframe content document as response object: + completeCallback( + 200, + 'success', + {'iframe': response} + ); + // Fix for IE endless progress bar activity bug + // (happens on form submits to iframe targets): + $('') + .appendTo(form); + window.setTimeout(function () { + // Removing the form in a setTimeout call + // allows Chrome's developer tools to display + // the response result + form.remove(); + }, 0); + }); + form + .prop('target', iframe.prop('name')) + .prop('action', options.url) + .prop('method', options.type); + if (options.formData) { + $.each(options.formData, function (index, field) { + $('') + .prop('name', field.name) + .val(field.value) + .appendTo(form); + }); + } + if (options.fileInput && options.fileInput.length && + options.type === 'POST') { + fileInputClones = options.fileInput.clone(); + // Insert a clone for each file input field: + options.fileInput.after(function (index) { + return fileInputClones[index]; + }); + if (options.paramName) { + options.fileInput.each(function (index) { + $(this).prop( + 'name', + paramNames[index] || options.paramName + ); + }); + } + // Appending the file input fields to the hidden form + // removes them from their original location: + form + .append(options.fileInput) + .prop('enctype', 'multipart/form-data') + // enctype must be set as encoding for IE: + .prop('encoding', 'multipart/form-data'); + // Remove the HTML5 form attribute from the input(s): + options.fileInput.removeAttr('form'); + } + form.submit(); + // Insert the file input fields at their original location + // by replacing the clones with the originals: + if (fileInputClones && fileInputClones.length) { + options.fileInput.each(function (index, input) { + var clone = $(fileInputClones[index]); + // Restore the original name and form properties: + $(input) + .prop('name', clone.prop('name')) + .attr('form', clone.attr('form')); + clone.replaceWith(input); + }); + } + }); + form.append(iframe).appendTo(document.body); + }, + abort: function () { + if (iframe) { + // javascript:false as iframe src aborts the request + // and prevents warning popups on HTTPS in IE6. + // concat is used to avoid the "Script URL" JSLint error: + iframe + .unbind('load') + .prop('src', initialIframeSrc); + } + if (form) { + form.remove(); + } + } + }; + } + }); + + // The iframe transport returns the iframe content document as response. + // The following adds converters from iframe to text, json, html, xml + // and script. + // Please note that the Content-Type for JSON responses has to be text/plain + // or text/html, if the browser doesn't include application/json in the + // Accept header, else IE will show a download dialog. + // The Content-Type for XML responses on the other hand has to be always + // application/xml or text/xml, so IE properly parses the XML response. + // See also + // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation + $.ajaxSetup({ + converters: { + 'iframe text': function (iframe) { + return iframe && $(iframe[0].body).text(); + }, + 'iframe json': function (iframe) { + return iframe && jsonAPI[jsonParse]($(iframe[0].body).text()); + }, + 'iframe html': function (iframe) { + return iframe && $(iframe[0].body).html(); + }, + 'iframe xml': function (iframe) { + var xmlDoc = iframe && iframe[0]; + return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc : + $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) || + $(xmlDoc.body).html()); + }, + 'iframe script': function (iframe) { + return iframe && $.globalEval($(iframe[0].body).text()); + } + } + }); + +})); diff --git a/core/vendor/filemanager/js/modernizr.custom.js b/core/vendor/filemanager/js/modernizr.custom.js new file mode 100755 index 00000000..02b3137b --- /dev/null +++ b/core/vendor/filemanager/js/modernizr.custom.js @@ -0,0 +1 @@ +window.Modernizr=function(e,t,n){function r(e){b.cssText=e}function o(e,t){return r(w.join(e+";")+(t||""))}function i(e,t){return typeof e===t}function a(e,t){return!!~(""+e).indexOf(t)}function c(e,t){for(var r in e){var o=e[r];if(!a(o,"-")&&b[o]!==n)return"pfx"!=t||o}return!1}function s(e,t,r){for(var o in e){var a=t[e[o]];if(a!==n)return r===!1?e[o]:i(a,"function")?a.bind(r||t):a}return!1}function l(e,t,n){var r=e.charAt(0).toUpperCase()+e.slice(1),o=(e+" "+k.join(r+" ")+r).split(" ");return i(t,"string")||i(t,"undefined")?c(o,t):(o=(e+" "+S.join(r+" ")+r).split(" "),s(o,t,n))}function u(){m.input=function(n){for(var r=0,o=n.length;r',e,""].join(""),l.id=y,(u?l:f).innerHTML+=i,f.appendChild(l),u||(f.style.background="",f.style.overflow="hidden",s=g.style.overflow,g.style.overflow="hidden",g.appendChild(f)),a=n(l,e),u?l.parentNode.removeChild(l):(f.parentNode.removeChild(f),g.style.overflow=s),!!a},$=function(){function e(e,o){o=o||t.createElement(r[e]||"div"),e="on"+e;var a=e in o;return a||(o.setAttribute||(o=t.createElement("div")),o.setAttribute&&o.removeAttribute&&(o.setAttribute(e,""),a=i(o[e],"function"),i(o[e],"undefined")||(o[e]=n),o.removeAttribute(e))),o=null,a}var r={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return e}(),F={}.hasOwnProperty;d=i(F,"undefined")||i(F.call,"undefined")?function(e,t){return t in e&&i(e.constructor.prototype[t],"undefined")}:function(e,t){return F.call(e,t)},Function.prototype.bind||(Function.prototype.bind=function(e){var t=this;if("function"!=typeof t)throw new TypeError;var n=N.call(arguments,1),r=function(){if(this instanceof r){var o=function(){};o.prototype=t.prototype;var i=new o,a=t.apply(i,n.concat(N.call(arguments)));return Object(a)===a?a:i}return t.apply(e,n.concat(N.call(arguments)))};return r}),T.flexbox=function(){return l("flexWrap")},T.flexboxlegacy=function(){return l("boxDirection")},T.canvas=function(){var e=t.createElement("canvas");return!!e.getContext&&!!e.getContext("2d")},T.canvastext=function(){return!!m.canvas&&!!i(t.createElement("canvas").getContext("2d").fillText,"function")},T.postmessage=function(){return!!e.postMessage},T.websqldatabase=function(){return!!e.openDatabase},T.indexedDB=function(){return!!l("indexedDB",e)},T.hashchange=function(){return $("hashchange",e)&&(t.documentMode===n||t.documentMode>7)},T.history=function(){return!!e.history&&!!history.pushState},T.draganddrop=function(){var e=t.createElement("div");return"draggable"in e||"ondragstart"in e&&"ondrop"in e},T.websockets=function(){return"WebSocket"in e||"MozWebSocket"in e},T.rgba=function(){return r("background-color:rgba(150,255,150,.5)"),a(b.backgroundColor,"rgba")},T.hsla=function(){return r("background-color:hsla(120,40%,100%,.5)"),a(b.backgroundColor,"rgba")||a(b.backgroundColor,"hsla")},T.multiplebgs=function(){return r("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(b.background)},T.backgroundsize=function(){return l("backgroundSize")},T.borderimage=function(){return l("borderImage")},T.borderradius=function(){return l("borderRadius")},T.boxshadow=function(){return l("boxShadow")},T.textshadow=function(){return""===t.createElement("div").style.textShadow},T.opacity=function(){return o("opacity:.55"),/^0.55$/.test(b.opacity)},T.cssanimations=function(){return l("animationName")},T.csscolumns=function(){return l("columnCount")},T.cssgradients=function(){var e="background-image:",t="gradient(linear,left top,right bottom,from(#9f9),to(white));",n="linear-gradient(left top,#9f9, white);";return r((e+"-webkit- ".split(" ").join(t+e)+w.join(n+e)).slice(0,-e.length)),a(b.backgroundImage,"gradient")},T.cssreflections=function(){return l("boxReflect")},T.csstransforms=function(){return!!l("transform")},T.csstransforms3d=function(){var e=!!l("perspective");return e&&"webkitPerspective"in g.style&&A("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(t,n){e=9===t.offsetLeft&&3===t.offsetHeight}),e},T.csstransitions=function(){return l("transition")},T.fontface=function(){var e;return A('@font-face {font-family:"font";src:url("https://")}',function(n,r){var o=t.getElementById("smodernizr"),i=o.sheet||o.styleSheet,a=i?i.cssRules&&i.cssRules[0]?i.cssRules[0].cssText:i.cssText||"":"";e=/src/i.test(a)&&0===a.indexOf(r.split(" ")[0])}),e},T.generatedcontent=function(){var e;return A(["#",y,"{font:0/0 a}#",y,':after{content:"',x,'";visibility:hidden;font:3px/1 a}'].join(""),function(t){e=t.offsetHeight>=3}),e},T.video=function(){var e=t.createElement("video"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),n.h264=e.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),n.webm=e.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,""))}catch(r){}return n},T.audio=function(){var e=t.createElement("audio"),n=!1;try{(n=!!e.canPlayType)&&(n=new Boolean(n),n.ogg=e.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),n.mp3=e.canPlayType("audio/mpeg;").replace(/^no$/,""),n.wav=e.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),n.m4a=(e.canPlayType("audio/x-m4a;")||e.canPlayType("audio/aac;")).replace(/^no$/,""))}catch(r){}return n},T.localstorage=function(){try{return localStorage.setItem(y,y),localStorage.removeItem(y),!0}catch(e){return!1}},T.sessionstorage=function(){try{return sessionStorage.setItem(y,y),sessionStorage.removeItem(y),!0}catch(e){return!1}},T.webworkers=function(){return!!e.Worker},T.applicationcache=function(){return!!e.applicationCache};for(var z in T)d(T,z)&&(f=z.toLowerCase(),m[f]=T[z](),M.push((m[f]?"":"no-")+f));return m.input||u(),m.addTest=function(e,t){if("object"==typeof e)for(var r in e)d(e,r)&&m.addTest(r,e[r]);else{if(e=e.toLowerCase(),m[e]!==n)return m;t="function"==typeof t?t():t,"undefined"!=typeof h&&h&&(g.className+=" "+(t?"":"no-")+e),m[e]=t}return m},r(""),v=E=null,function(e,t){function n(e,t){var n=e.createElement("p"),r=e.getElementsByTagName("head")[0]||e.documentElement;return n.innerHTML="x",r.insertBefore(n.lastChild,r.firstChild)}function r(){var e=v.elements;return"string"==typeof e?e.split(" "):e}function o(e){var t=y[e[h]];return t||(t={},g++,e[h]=g,y[g]=t),t}function i(e,n,r){if(n||(n=t),u)return n.createElement(e);r||(r=o(n));var i;return i=r.cache[e]?r.cache[e].cloneNode():m.test(e)?(r.cache[e]=r.createElem(e)).cloneNode():r.createElem(e),!i.canHaveChildren||p.test(e)||i.tagUrn?i:r.frag.appendChild(i)}function a(e,n){if(e||(e=t),u)return e.createDocumentFragment();n=n||o(e);for(var i=n.frag.cloneNode(),a=0,c=r(),s=c.length;a",l="hidden"in e,u=1==e.childNodes.length||function(){t.createElement("a");var e=t.createDocumentFragment();return"undefined"==typeof e.cloneNode||"undefined"==typeof e.createDocumentFragment||"undefined"==typeof e.createElement}()}catch(n){l=!0,u=!0}}();var v={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:f,shivCSS:d.shivCSS!==!1,supportsUnknownElements:u,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:s,createElement:i,createDocumentFragment:a};e.html5=v,s(t)}(this,t),m._version=p,m._prefixes=w,m._domPrefixes=S,m._cssomPrefixes=k,m.hasEvent=$,m.testProp=function(e){return c([e])},m.testAllProps=l,m.testStyles=A,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(h?" js "+M.join(" "):""),m}(this,this.document),function(e,t,n){function r(e){return"[object Function]"==g.call(e)}function o(e){return"string"==typeof e}function i(){}function a(e){return!e||"loaded"==e||"complete"==e||"uninitialized"==e}function c(){var e=y.shift();v=1,e?e.t?m(function(){("c"==e.t?d.injectCss:d.injectJs)(e.s,0,e.a,e.x,e.e,1)},0):(e(),c()):v=0}function s(e,n,r,o,i,s,l){function u(t){if(!p&&a(f.readyState)&&(b.r=p=1,!v&&c(),f.onload=f.onreadystatechange=null,t)){"img"!=e&&m(function(){x.removeChild(f)},50);for(var r in T[n])T[n].hasOwnProperty(r)&&T[n][r].onload()}}var l=l||d.errorTimeout,f=t.createElement(e),p=0,g=0,b={t:r,s:n,e:i,a:s,x:l};1===T[n]&&(g=1,T[n]=[]),"object"==e?f.data=n:(f.src=n,f.type=e),f.width=f.height="0",f.onerror=f.onload=f.onreadystatechange=function(){u.call(this,g)},y.splice(o,0,b),"img"!=e&&(g||2===T[n]?(x.insertBefore(f,E?null:h),m(u,l)):T[n].push(f))}function l(e,t,n,r,i){return v=0,t=t||"j",o(e)?s("c"==t?C:w,e,t,this.i++,n,r,i):(y.splice(this.i++,0,e),1==y.length&&c()),this}function u(){var e=d;return e.loader={load:l,i:0},e}var f,d,p=t.documentElement,m=e.setTimeout,h=t.getElementsByTagName("script")[0],g={}.toString,y=[],v=0,b="MozAppearance"in p.style,E=b&&!!t.createRange().compareNode,x=E?p:h.parentNode,p=e.opera&&"[object Opera]"==g.call(e.opera),p=!!t.attachEvent&&!p,w=b?"object":p?"script":"img",C=p?"script":w,k=Array.isArray||function(e){return"[object Array]"==g.call(e)},S=[],T={},j={timeout:function(e,t){return t.length&&(e.timeout=t[0]),e}};d=function(e){function t(e){var t,n,r,e=e.split("!"),o=S.length,i=e.pop(),a=e.length,i={url:i,origUrl:i,prefixes:e};for(n=0;n=n-s?"bottom":null!=r&&o<=r&&"top"),this.affixed!==e&&(this.affixed=e,this.unpin="bottom"==e?i.top-o:null,this.$element.removeClass(l).addClass("affix"+(e?"-"+e:"")))}};var n=t.fn.affix;t.fn.affix=function(n){return this.each(function(){var o=t(this),i=o.data("affix"),a="object"==typeof n&&n;i||o.data("affix",i=new e(this,a)),"string"==typeof n&&i[n]()})},t.fn.affix.Constructor=e,t.fn.affix.defaults={offset:0},t.fn.affix.noConflict=function(){return t.fn.affix=n,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var e=t(this),n=e.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),e.affix(n)})})}(window.jQuery),!function(t){"use strict";function e(){t(o).each(function(){n(t(this)).removeClass("open")})}function n(e){var n,o=e.attr("data-target");return o||(o=e.attr("href"),o=o&&/#/.test(o)&&o.replace(/.*(?=#[^\s]*$)/,"")),n=o&&t(o),n&&n.length||(n=e.parent()),n}var o="[data-toggle=dropdown]",i=function(e){var n=t(e).on("click.dropdown.data-api",this.toggle);t("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};i.prototype={constructor:i,toggle:function(o){var i,a,s=t(this);if(!s.is(".disabled, :disabled"))return i=n(s),a=i.hasClass("open"),e(),a||i.toggleClass("open"),s.focus(),!1},keydown:function(e){var i,a,s,r,l;if(/(38|40|27)/.test(e.keyCode)&&(i=t(this),e.preventDefault(),e.stopPropagation(),!i.is(".disabled, :disabled"))){if(s=n(i),r=s.hasClass("open"),!r||r&&27==e.keyCode)return 27==e.which&&s.find(o).focus(),i.click();a=t("[role=menu] li:not(.divider):visible a",s),a.length&&(l=a.index(a.filter(":focus")),38==e.keyCode&&l>0&&l--,40==e.keyCode&&l .accordion-group > .in"),o&&o.length){if(i=o.data("collapse"),i&&i.transitioning)return;o.collapse("hide"),i||o.data("collapse",null)}this.$element[e](0),this.transition("addClass",t.Event("show"),"shown"),t.support.transition&&this.$element[e](this.$element[0][n])}},hide:function(){var e;!this.transitioning&&this.$element.hasClass("in")&&(e=this.dimension(),this.reset(this.$element[e]()),this.transition("removeClass",t.Event("hide"),"hidden"),this.$element[e](0))},reset:function(t){var e=this.dimension();return this.$element.removeClass("collapse")[e](t||"auto")[0].offsetWidth,this.$element[null!==t?"addClass":"removeClass"]("collapse"),this},transition:function(e,n,o){var i=this,a=function(){"show"==n.type&&i.reset(),i.transitioning=0,i.$element.trigger(o)};this.$element.trigger(n),n.isDefaultPrevented()||(this.transitioning=1,this.$element[e]("in"),t.support.transition&&this.$element.hasClass("collapse")?this.$element.one(t.support.transition.end,a):a())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=t.fn.collapse;t.fn.collapse=function(n){return this.each(function(){var o=t(this),i=o.data("collapse"),a=t.extend({},t.fn.collapse.defaults,o.data(),"object"==typeof n&&n);i||o.data("collapse",i=new e(this,a)),"string"==typeof n&&i[n]()})},t.fn.collapse.defaults={toggle:!0},t.fn.collapse.Constructor=e,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.collapse.data-api","[data-toggle=collapse]",function(e){var n,o=t(this),i=o.attr("data-target")||e.preventDefault()||(n=o.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,""),a=t(i).data("collapse")?"toggle":o.data();o[t(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),t(i).collapse(a)})}(window.jQuery),!function(t){"use strict";var e=function(e,n){this.options=n,this.$element=t(e).delegate('[data-dismiss="modal"]',"click.dismiss.modal",t.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};e.prototype={constructor:e,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var e=this,n=t.Event("show");this.$element.trigger(n),this.isShown||n.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var n=t.support.transition&&e.$element.hasClass("fade");e.$element.parent().length||e.$element.appendTo(document.body),e.$element.show(),n&&e.$element[0].offsetWidth,e.$element.addClass("in").attr("aria-hidden",!1),e.enforceFocus(),n?e.$element.one(t.support.transition.end,function(){e.$element.focus().trigger("shown")}):e.$element.focus().trigger("shown")}))},hide:function(e){e&&e.preventDefault();e=t.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),t(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),t.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var e=this;t(document).on("focusin.modal",function(t){e.$element[0]===t.target||e.$element.has(t.target).length||e.$element.focus()})},escape:function(){var t=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&t.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var e=this,n=setTimeout(function(){e.$element.off(t.support.transition.end),e.hideModal()},500);this.$element.one(t.support.transition.end,function(){clearTimeout(n),e.hideModal()})},hideModal:function(){var t=this;this.$element.hide(),this.backdrop(function(){t.removeBackdrop(),t.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(e){var n=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var o=t.support.transition&&n;if(this.$backdrop=t('