From e80d096a2905a0b045433e904f4c2bc9abe5979f Mon Sep 17 00:00:00 2001 From: Jan Date: Fri, 6 Mar 2015 11:34:32 +0100 Subject: [PATCH] 3.0.6 --- access.xml | 12 + config.xml | 534 ++++++++++ controller.php | 56 + controllers/index.html | 1 + controllers/phocadownloadcat.php | 56 + controllers/phocadownloadcats.php | 42 + controllers/phocadownloaddownloads.php | 46 + controllers/phocadownloadfile.php | 79 ++ controllers/phocadownloadfiles.php | 81 ++ controllers/phocadownloadinfo.php | 25 + controllers/phocadownloadinstall.php | 993 ++++++++++++++++++ controllers/phocadownloadlayout.php | 110 ++ controllers/phocadownloadlayouts.php | 18 + controllers/phocadownloadlic.php | 45 + controllers/phocadownloadlics.php | 36 + controllers/phocadownloadlinkfile.php | 18 + controllers/phocadownloadlogs.php | 32 + controllers/phocadownloadm.php | 56 + controllers/phocadownloadrafile.php | 33 + controllers/phocadownloadset.php | 67 ++ controllers/phocadownloadstat.php | 44 + controllers/phocadownloadstyle.php | 43 + controllers/phocadownloadstyles.php | 37 + controllers/phocadownloadtag.php | 45 + controllers/phocadownloadtags.php | 34 + controllers/phocadownloaduninstall.php | 37 + controllers/phocadownloadupload.php | 116 ++ controllers/phocadownloaduploads.php | 30 + help/en-GB/index.html | 1 + help/en-GB/logo-phoca.png | Bin 0 -> 6474 bytes help/en-GB/screen.phocadownload.html | 31 + help/index.html | 1 + help/logo-phoca.png | Bin 0 -> 6474 bytes help/screen.phocadownload.html | 31 + helpers/index.html | 1 + helpers/phocadownloadcats.php | 29 + helpers/phocadownloadcp.php | 24 + helpers/phocadownloaddownloads.php | 30 + helpers/phocadownloadfiles.php | 29 + helpers/phocadownloadlayouts.php | 51 + helpers/phocadownloadlics.php | 29 + helpers/phocadownloadlogs.php | 30 + helpers/phocadownloadmanager.php | 36 + helpers/phocadownloadrafile.php | 36 + helpers/phocadownloadrate.php | 313 ++++++ helpers/phocadownloadstat.php | 29 + helpers/phocadownloadstyles.php | 29 + helpers/phocadownloadtags.php | 29 + helpers/phocadownloaduploads.php | 29 + helpers/phocauserstat.php | 62 ++ index.html | 1 + install/index.html | 1 + install/script.php | 140 +++ install/sql/index.html | 1 + install/sql/mysql/index.html | 1 + install/sql/mysql/install.utf8.sql | 277 +++++ install/sql/mysql/uninstall.utf8.sql | 10 + language/en-GB/en-GB.com_phocadownload.ini | 768 ++++++++++++++ .../en-GB/en-GB.com_phocadownload.sys.ini | 59 ++ language/en-GB/index.html | 1 + language/index.html | 1 + libraries/index.html | 1 + libraries/loader.php | 78 ++ libraries/phocadownload/access/access.php | 156 +++ libraries/phocadownload/access/index.html | 1 + libraries/phocadownload/category/category.php | 137 +++ libraries/phocadownload/category/index.html | 1 + libraries/phocadownload/download/download.php | 564 ++++++++++ libraries/phocadownload/download/index.html | 1 + libraries/phocadownload/file/file.php | 422 ++++++++ libraries/phocadownload/file/fileupload.php | 694 ++++++++++++ .../phocadownload/file/fileuploadmultiple.php | 288 +++++ .../phocadownload/file/fileuploadsingle.php | 39 + libraries/phocadownload/file/index.html | 1 + libraries/phocadownload/html/batch.php | 60 ++ libraries/phocadownload/html/grid.php | 30 + libraries/phocadownload/html/index.html | 1 + libraries/phocadownload/html/jgrid.php | 37 + libraries/phocadownload/index.html | 1 + libraries/phocadownload/log/index.html | 1 + libraries/phocadownload/log/log.php | 68 ++ libraries/phocadownload/mail/index.html | 1 + libraries/phocadownload/mail/mail.php | 82 ++ libraries/phocadownload/ordering/index.html | 1 + libraries/phocadownload/ordering/ordering.php | 66 ++ libraries/phocadownload/pagination/index.html | 1 + .../phocadownload/pagination/pagination.php | 40 + libraries/phocadownload/path/index.html | 1 + libraries/phocadownload/path/path.php | 88 ++ libraries/phocadownload/path/route.php | 308 ++++++ libraries/phocadownload/rate/index.html | 1 + libraries/phocadownload/rate/rate.php | 313 ++++++ libraries/phocadownload/render/layout.php | 256 +++++ .../phocadownload/render/renderadmin.php | 104 ++ .../phocadownload/render/renderadminview.php | 80 ++ .../phocadownload/render/renderadminviews.php | 355 +++++++ .../phocadownload/render/renderfront.php | 241 +++++ libraries/phocadownload/stat/index.html | 1 + libraries/phocadownload/stat/stat.php | 84 ++ libraries/phocadownload/tag/index.html | 1 + libraries/phocadownload/tag/tag.php | 101 ++ libraries/phocadownload/user/index.html | 1 + libraries/phocadownload/user/user.php | 134 +++ libraries/phocadownload/utils/exception.php | 25 + libraries/phocadownload/utils/external.php | 24 + libraries/phocadownload/utils/index.html | 1 + libraries/phocadownload/utils/settings.php | 126 +++ libraries/phocadownload/utils/utils.php | 119 +++ media/css/administrator/index.html | 1 + media/css/administrator/phocadownload.css | 608 +++++++++++ .../administrator/phocadownloadoptions.css | 41 + media/css/administrator/rating.css | 268 +++++ media/css/custom/default.css | 5 + media/css/custom/index.html | 1 + media/css/index.html | 1 + media/css/main/bootstrap.min.css | 9 + media/css/main/button.css | 102 ++ media/css/main/buttonrc.css | 18 + media/css/main/index.html | 1 + media/css/main/phocadownload.css | 684 ++++++++++++ media/css/main/rating.css | 268 +++++ media/images/administrator/b-prm.png | Bin 0 -> 21641 bytes media/images/administrator/bg-install.png | Bin 0 -> 2164 bytes media/images/administrator/bg-upgrade.png | Bin 0 -> 2394 bytes media/images/administrator/btn.png | Bin 0 -> 135 bytes .../images/administrator/icon-12-approve.png | Bin 0 -> 702 bytes .../administrator/icon-12-authorizeall.png | Bin 0 -> 669 bytes media/images/administrator/icon-12-back.png | Bin 0 -> 350 bytes .../administrator/icon-12-disapprove.png | Bin 0 -> 682 bytes .../images/administrator/icon-12-multiple.png | Bin 0 -> 621 bytes media/images/administrator/icon-12-reset.png | Bin 0 -> 640 bytes .../images/administrator/icon-16-edb-back.png | Bin 0 -> 758 bytes .../administrator/icon-16-edb-categories.png | Bin 0 -> 637 bytes .../administrator/icon-16-edb-category.png | Bin 0 -> 557 bytes .../images/administrator/icon-16-edb-file.png | Bin 0 -> 869 bytes .../images/administrator/icon-16-edb-play.png | Bin 0 -> 907 bytes .../administrator/icon-16-edb-preview.png | Bin 0 -> 588 bytes .../administrator/icon-16-edb-section.png | Bin 0 -> 541 bytes .../administrator/icon-16-edb-sections.png | Bin 0 -> 642 bytes .../administrator/icon-16-folder-small.png | Bin 0 -> 395 bytes media/images/administrator/icon-16-folder.png | Bin 0 -> 537 bytes .../icon-16-pdl-control-panel.png | Bin 0 -> 670 bytes .../icon-16-pdl-menu-category.png | Bin 0 -> 557 bytes .../icon-16-pdl-menu-downloads.png | Bin 0 -> 759 bytes .../administrator/icon-16-pdl-menu-files.png | Bin 0 -> 869 bytes .../administrator/icon-16-pdl-menu-info.png | Bin 0 -> 777 bytes .../administrator/icon-16-pdl-menu-layout.png | Bin 0 -> 512 bytes .../administrator/icon-16-pdl-menu-lic.png | Bin 0 -> 747 bytes .../icon-16-pdl-menu-section.png | Bin 0 -> 541 bytes .../icon-16-pdl-menu-settings.png | Bin 0 -> 871 bytes .../administrator/icon-16-pdl-menu-stat.png | Bin 0 -> 605 bytes .../administrator/icon-16-pdl-menu-styles.png | Bin 0 -> 887 bytes .../administrator/icon-16-pdl-menu-tags.png | Bin 0 -> 710 bytes .../administrator/icon-16-pdl-menu-upload.png | Bin 0 -> 756 bytes .../administrator/icon-16-pdl-menu-users.png | Bin 0 -> 654 bytes .../icon-16-pdl-menu-vote-file.png | Bin 0 -> 719 bytes .../images/administrator/icon-16-pdl-menu.png | Bin 0 -> 859 bytes media/images/administrator/icon-16-up.png | Bin 0 -> 576 bytes .../administrator/icon-16-upload-multiple.png | Bin 0 -> 821 bytes media/images/administrator/icon-16-upload.png | Bin 0 -> 887 bytes .../administrator/icon-16-user-stat.png | Bin 0 -> 711 bytes .../images/administrator/icon-32-approve.png | Bin 0 -> 1838 bytes .../administrator/icon-32-authorizeall.png | Bin 0 -> 1748 bytes .../administrator/icon-32-disapprove.png | Bin 0 -> 1776 bytes .../images/administrator/icon-32-multiple.png | Bin 0 -> 1584 bytes media/images/administrator/icon-32-reset.png | Bin 0 -> 2196 bytes media/images/administrator/icon-48-cat.png | Bin 0 -> 1348 bytes media/images/administrator/icon-48-cats.png | Bin 0 -> 1348 bytes .../administrator/icon-48-downloads.png | Bin 0 -> 2194 bytes media/images/administrator/icon-48-file.png | Bin 0 -> 3234 bytes media/images/administrator/icon-48-files.png | Bin 0 -> 3234 bytes media/images/administrator/icon-48-info.png | Bin 0 -> 2430 bytes .../images/administrator/icon-48-layouts.png | Bin 0 -> 932 bytes media/images/administrator/icon-48-lic.png | Bin 0 -> 3961 bytes media/images/administrator/icon-48-lics.png | Bin 0 -> 3961 bytes media/images/administrator/icon-48-logs.png | Bin 0 -> 3762 bytes .../administrator/icon-48-pd-multiple.png | Bin 0 -> 2710 bytes media/images/administrator/icon-48-phoca.png | Bin 0 -> 4373 bytes .../administrator/icon-48-phocadownload.png | Bin 0 -> 2984 bytes media/images/administrator/icon-48-rafile.png | Bin 0 -> 2592 bytes media/images/administrator/icon-48-sec.png | Bin 0 -> 1305 bytes media/images/administrator/icon-48-set.png | Bin 0 -> 3568 bytes media/images/administrator/icon-48-stat.png | Bin 0 -> 1190 bytes media/images/administrator/icon-48-styles.png | Bin 0 -> 3085 bytes media/images/administrator/icon-48-tags.png | Bin 0 -> 2082 bytes .../images/administrator/icon-48-uploads.png | Bin 0 -> 2234 bytes .../administrator/icon-48-user-stat.png | Bin 0 -> 2047 bytes media/images/administrator/icon-48-users.png | Bin 0 -> 2029 bytes .../administrator/icon-48-vote-file.png | Bin 0 -> 2592 bytes media/images/administrator/icon-box-pc.png | Bin 0 -> 10813 bytes media/images/administrator/icon-box-pcm.png | Bin 0 -> 10657 bytes media/images/administrator/icon-box-pd.png | Bin 0 -> 10690 bytes media/images/administrator/icon-box-pdc.png | Bin 0 -> 10344 bytes media/images/administrator/icon-box-pe.png | Bin 0 -> 10585 bytes media/images/administrator/icon-box-pf.png | Bin 0 -> 10594 bytes media/images/administrator/icon-box-pfv.png | Bin 0 -> 10578 bytes media/images/administrator/icon-box-pg.png | Bin 0 -> 10763 bytes media/images/administrator/icon-box-pgb.png | Bin 0 -> 10614 bytes media/images/administrator/icon-box-ph.png | Bin 0 -> 10488 bytes media/images/administrator/icon-box-pi.png | Bin 0 -> 10562 bytes media/images/administrator/icon-box-pm.png | Bin 0 -> 10581 bytes media/images/administrator/icon-box-pp.png | Bin 0 -> 11402 bytes media/images/administrator/icon-box-ppdf.png | Bin 0 -> 10606 bytes media/images/administrator/icon-box-prm.png | Bin 0 -> 11053 bytes media/images/administrator/icon-box-psef.png | Bin 0 -> 10647 bytes media/images/administrator/icon-box-pt.png | Bin 0 -> 10340 bytes media/images/administrator/icon-file.png | Bin 0 -> 408 bytes media/images/administrator/icon-folder.png | Bin 0 -> 598 bytes .../images/administrator/icon-phoca-logo.png | Bin 0 -> 2121 bytes media/images/administrator/icon-up.png | Bin 0 -> 856 bytes .../administrator/icon-voting-small.png | Bin 0 -> 1940 bytes media/images/administrator/icon-voting.png | Bin 0 -> 2506 bytes media/images/administrator/index.html | 1 + media/images/administrator/line.png | Bin 0 -> 1597 bytes media/images/administrator/logo-phoca.png | Bin 0 -> 24438 bytes media/images/administrator/logo.png | Bin 0 -> 7953 bytes media/images/administrator/spacer.gif | Bin 0 -> 43 bytes media/images/administrator/white-space.png | Bin 0 -> 378 bytes media/images/bg-details.png | Bin 0 -> 262 bytes media/images/bg-download.png | Bin 0 -> 257 bytes media/images/bg-play.png | Bin 0 -> 244 bytes media/images/bg-preview.png | Bin 0 -> 246 bytes media/images/bl.png | Bin 0 -> 275 bytes media/images/blue-bg.png | Bin 0 -> 217 bytes media/images/br.png | Bin 0 -> 3157 bytes media/images/btn.png | Bin 0 -> 135 bytes media/images/button-detail-l.png | Bin 0 -> 1563 bytes media/images/button-detail-r.png | Bin 0 -> 572 bytes media/images/button-download-l.png | Bin 0 -> 1352 bytes media/images/button-download-r.png | Bin 0 -> 582 bytes media/images/button-play-l.png | Bin 0 -> 1877 bytes media/images/button-play-r.png | Bin 0 -> 568 bytes media/images/button-preview-l.png | Bin 0 -> 1415 bytes media/images/button-preview-r.png | Bin 0 -> 572 bytes media/images/category.png | Bin 0 -> 932 bytes media/images/document.png | Bin 0 -> 754 bytes media/images/folder.png | Bin 0 -> 395 bytes media/images/grey-bg.png | Bin 0 -> 208 bytes media/images/htl.png | Bin 0 -> 213 bytes media/images/htr.png | Bin 0 -> 216 bytes media/images/icon-details.png | Bin 0 -> 554 bytes media/images/icon-document-16.png | Bin 0 -> 682 bytes media/images/icon-document-32.png | Bin 0 -> 1464 bytes media/images/icon-document-48.png | Bin 0 -> 2372 bytes media/images/icon-document-64.png | Bin 0 -> 3459 bytes media/images/icon-download.png | Bin 0 -> 775 bytes media/images/icon-extlink1.png | Bin 0 -> 895 bytes media/images/icon-extlink2.png | Bin 0 -> 907 bytes media/images/icon-hot.png | Bin 0 -> 948 bytes media/images/icon-loading.gif | Bin 0 -> 8787 bytes media/images/icon-loading2.gif | Bin 0 -> 1569 bytes media/images/icon-new.png | Bin 0 -> 882 bytes media/images/icon-phoca-logo.png | Bin 0 -> 2121 bytes media/images/icon-play.png | Bin 0 -> 899 bytes media/images/icon-preview.png | Bin 0 -> 749 bytes media/images/icon-publish-g.png | Bin 0 -> 643 bytes media/images/icon-publish.png | Bin 0 -> 1003 bytes media/images/icon-trash-g.png | Bin 0 -> 761 bytes media/images/icon-trash.png | Bin 0 -> 854 bytes media/images/icon-unpublish-g.png | Bin 0 -> 600 bytes media/images/icon-unpublish.png | Bin 0 -> 891 bytes media/images/icon-voting-small.png | Bin 0 -> 1401 bytes media/images/icon-voting.png | Bin 0 -> 1735 bytes media/images/index.html | 1 + media/images/mime/16/icon-7zip.png | Bin 0 -> 551 bytes media/images/mime/16/icon-audio.png | Bin 0 -> 554 bytes media/images/mime/16/icon-document.png | Bin 0 -> 535 bytes media/images/mime/16/icon-drawing.png | Bin 0 -> 679 bytes media/images/mime/16/icon-empty.png | Bin 0 -> 311 bytes media/images/mime/16/icon-folder-open.png | Bin 0 -> 431 bytes media/images/mime/16/icon-folder.png | Bin 0 -> 395 bytes media/images/mime/16/icon-gzip.png | Bin 0 -> 551 bytes media/images/mime/16/icon-html.png | Bin 0 -> 770 bytes media/images/mime/16/icon-img.png | Bin 0 -> 671 bytes media/images/mime/16/icon-jar.png | Bin 0 -> 551 bytes media/images/mime/16/icon-pdf.png | Bin 0 -> 799 bytes media/images/mime/16/icon-php.png | Bin 0 -> 757 bytes media/images/mime/16/icon-presentation.png | Bin 0 -> 629 bytes media/images/mime/16/icon-rar.png | Bin 0 -> 621 bytes media/images/mime/16/icon-source.png | Bin 0 -> 586 bytes media/images/mime/16/icon-spreadsheet.png | Bin 0 -> 506 bytes media/images/mime/16/icon-sql.png | Bin 0 -> 510 bytes media/images/mime/16/icon-tar.png | Bin 0 -> 406 bytes media/images/mime/16/icon-txt.png | Bin 0 -> 463 bytes media/images/mime/16/icon-video.png | Bin 0 -> 739 bytes media/images/mime/16/icon-xml.png | Bin 0 -> 585 bytes media/images/mime/16/icon-zip.png | Bin 0 -> 617 bytes media/images/mime/16/index.html | 1 + media/images/mime/32/icon-7zip.png | Bin 0 -> 1310 bytes media/images/mime/32/icon-audio.png | Bin 0 -> 1251 bytes media/images/mime/32/icon-document.png | Bin 0 -> 1843 bytes media/images/mime/32/icon-drawing.png | Bin 0 -> 1153 bytes media/images/mime/32/icon-empty.png | Bin 0 -> 678 bytes media/images/mime/32/icon-folder-open.png | Bin 0 -> 1042 bytes media/images/mime/32/icon-folder.png | Bin 0 -> 995 bytes media/images/mime/32/icon-gzip.png | Bin 0 -> 1183 bytes media/images/mime/32/icon-html.png | Bin 0 -> 1819 bytes media/images/mime/32/icon-img.png | Bin 0 -> 1468 bytes media/images/mime/32/icon-jar.png | Bin 0 -> 1411 bytes media/images/mime/32/icon-pdf.png | Bin 0 -> 1756 bytes media/images/mime/32/icon-php.png | Bin 0 -> 1891 bytes media/images/mime/32/icon-presentation.png | Bin 0 -> 1525 bytes media/images/mime/32/icon-rar.png | Bin 0 -> 1384 bytes media/images/mime/32/icon-source.png | Bin 0 -> 1459 bytes media/images/mime/32/icon-spreadsheet.png | Bin 0 -> 1351 bytes media/images/mime/32/icon-sql.png | Bin 0 -> 933 bytes media/images/mime/32/icon-tar.png | Bin 0 -> 704 bytes media/images/mime/32/icon-txt.png | Bin 0 -> 1516 bytes media/images/mime/32/icon-video.png | Bin 0 -> 2058 bytes media/images/mime/32/icon-xml.png | Bin 0 -> 1628 bytes media/images/mime/32/icon-zip.png | Bin 0 -> 1347 bytes media/images/mime/32/index.html | 1 + media/images/mime/48/icon-7zip.png | Bin 0 -> 1955 bytes media/images/mime/48/icon-audio.png | Bin 0 -> 2062 bytes media/images/mime/48/icon-document.png | Bin 0 -> 3298 bytes media/images/mime/48/icon-drawing.png | Bin 0 -> 1833 bytes media/images/mime/48/icon-empty.png | Bin 0 -> 997 bytes media/images/mime/48/icon-folder-open.png | Bin 0 -> 1577 bytes media/images/mime/48/icon-folder.png | Bin 0 -> 1516 bytes media/images/mime/48/icon-gzip.png | Bin 0 -> 1836 bytes media/images/mime/48/icon-html.png | Bin 0 -> 3352 bytes media/images/mime/48/icon-img.png | Bin 0 -> 2556 bytes media/images/mime/48/icon-jar.png | Bin 0 -> 2246 bytes media/images/mime/48/icon-pdf.png | Bin 0 -> 2806 bytes media/images/mime/48/icon-php.png | Bin 0 -> 3358 bytes media/images/mime/48/icon-presentation.png | Bin 0 -> 2586 bytes media/images/mime/48/icon-rar.png | Bin 0 -> 2309 bytes media/images/mime/48/icon-source.png | Bin 0 -> 2443 bytes media/images/mime/48/icon-spreadsheet.png | Bin 0 -> 2007 bytes media/images/mime/48/icon-sql.png | Bin 0 -> 1286 bytes media/images/mime/48/icon-tar.png | Bin 0 -> 1013 bytes media/images/mime/48/icon-txt.png | Bin 0 -> 2754 bytes media/images/mime/48/icon-video.png | Bin 0 -> 3265 bytes media/images/mime/48/icon-xml.png | Bin 0 -> 2954 bytes media/images/mime/48/icon-zip.png | Bin 0 -> 2232 bytes media/images/mime/48/index.html | 1 + media/images/mime/64/icon-7zip.png | Bin 0 -> 2976 bytes media/images/mime/64/icon-audio.png | Bin 0 -> 3019 bytes media/images/mime/64/icon-document.png | Bin 0 -> 5273 bytes media/images/mime/64/icon-drawing.png | Bin 0 -> 2736 bytes media/images/mime/64/icon-empty.png | Bin 0 -> 1385 bytes media/images/mime/64/icon-folder-open.png | Bin 0 -> 2339 bytes media/images/mime/64/icon-folder.png | Bin 0 -> 2174 bytes media/images/mime/64/icon-gzip.png | Bin 0 -> 2810 bytes media/images/mime/64/icon-html.png | Bin 0 -> 5152 bytes media/images/mime/64/icon-img.png | Bin 0 -> 3832 bytes media/images/mime/64/icon-jar.png | Bin 0 -> 3463 bytes media/images/mime/64/icon-pdf.png | Bin 0 -> 4032 bytes media/images/mime/64/icon-php.png | Bin 0 -> 5146 bytes media/images/mime/64/icon-presentation.png | Bin 0 -> 3775 bytes media/images/mime/64/icon-rar.png | Bin 0 -> 3596 bytes media/images/mime/64/icon-source.png | Bin 0 -> 3739 bytes media/images/mime/64/icon-spreadsheet.png | Bin 0 -> 2832 bytes media/images/mime/64/icon-sql.png | Bin 0 -> 1979 bytes media/images/mime/64/icon-tar.png | Bin 0 -> 2210 bytes media/images/mime/64/icon-txt.png | Bin 0 -> 4107 bytes media/images/mime/64/icon-video.png | Bin 0 -> 5220 bytes media/images/mime/64/icon-xml.png | Bin 0 -> 4367 bytes media/images/mime/64/icon-zip.png | Bin 0 -> 3378 bytes media/images/mime/64/index.html | 1 + media/images/mime/AUTHORS | 5 + media/images/mime/COPYING | 674 ++++++++++++ media/images/mime/index.html | 1 + media/images/next-grey.png | Bin 0 -> 750 bytes media/images/next.png | Bin 0 -> 835 bytes media/images/phoca-download.png | Bin 0 -> 9257 bytes media/images/prev-grey.png | Bin 0 -> 741 bytes media/images/prev.png | Bin 0 -> 835 bytes media/images/tl.png | Bin 0 -> 235 bytes media/images/tr.png | Bin 0 -> 308 bytes media/images/up.png | Bin 0 -> 827 bytes media/images/white-space.png | Bin 0 -> 378 bytes media/index.html | 1 + media/js/index.html | 1 + models/fields/index.html | 1 + models/fields/phocaaccesslevel.php | 103 ++ models/fields/phocacolortext.php | 90 ++ models/fields/phocadownloadcategory.php | 64 ++ models/fields/phocadownloadeditor.php | 128 +++ models/fields/phocadownloadfile.php | 42 + models/fields/phocadownloadlicense.php | 37 + models/fields/phocadownloadordering.php | 88 ++ models/fields/phocadownloadtoken.php | 51 + models/fields/phocahead.php | 48 + models/fields/phocaheadexpert.php | 48 + models/fields/phocainfotext.php | 33 + models/fields/phocalongtext.php | 83 ++ models/fields/phocaselectfilename.php | 87 ++ models/fields/phocatags.php | 34 + models/fields/phocatext.php | 75 ++ models/fields/phocatextarea.php | 81 ++ models/fields/phocausers.php | 28 + models/forms/index.html | 1 + models/forms/phocadownloadcat.xml | 88 ++ models/forms/phocadownloadfile.xml | 157 +++ models/forms/phocadownloadlayout.xml | 22 + models/forms/phocadownloadlic.xml | 33 + models/forms/phocadownloadmanager.xml | 33 + models/forms/phocadownloadstyle.xml | 32 + models/forms/phocadownloadtag.xml | 37 + models/index.html | 1 + models/phocadownloadcat.php | 627 +++++++++++ models/phocadownloadcats.php | 237 +++++ models/phocadownloaddownloads.php | 211 ++++ models/phocadownloadfile.php | 662 ++++++++++++ models/phocadownloadfiles.php | 201 ++++ models/phocadownloadlayout.php | 50 + models/phocadownloadlic.php | 93 ++ models/phocadownloadlics.php | 152 +++ models/phocadownloadlinkcat.php | 81 ++ models/phocadownloadlinkfile.php | 123 +++ models/phocadownloadlog.php | 28 + models/phocadownloadlogs.php | 192 ++++ models/phocadownloadm.php | 513 +++++++++ models/phocadownloadmanager.php | 168 +++ models/phocadownloadrafile.php | 250 +++++ models/phocadownloadstat.php | 248 +++++ models/phocadownloadstyle.php | 278 +++++ models/phocadownloadstyles.php | 249 +++++ models/phocadownloadtag.php | 93 ++ models/phocadownloadtags.php | 151 +++ models/phocadownloadupload.php | 30 + models/phocadownloaduploads.php | 217 ++++ phocadownload.php | 42 + phocadownload.xml | 98 ++ site/assets/index.html | 1 + site/assets/jquery/index.html | 1 + site/assets/jquery/jquery-1.6.4.min.js | 4 + site/controller.php | 39 + site/controllers/index.html | 1 + site/controllers/user.php | 147 +++ site/helpers/index.html | 1 + site/index.html | 1 + site/models/categories.php | 260 +++++ site/models/category.php | 235 +++++ site/models/download.php | 80 ++ site/models/file.php | 170 +++ site/models/index.html | 1 + site/models/phocadownloadlinkcat.php | 81 ++ site/models/phocadownloadlinkfile.php | 214 ++++ site/models/play.php | 169 +++ site/models/ratingfilea.php | 53 + site/models/user.php | 580 ++++++++++ site/phocadownload.php | 54 + site/router.php | 228 ++++ site/views/categories/index.html | 1 + site/views/categories/metadata.xml | 6 + site/views/categories/tmpl/default.php | 204 ++++ site/views/categories/tmpl/default.xml | 30 + site/views/categories/tmpl/index.html | 1 + site/views/categories/view.html.php | 112 ++ site/views/category/index.html | 1 + site/views/category/metadata.xml | 6 + site/views/category/tmpl/default.php | 126 +++ site/views/category/tmpl/default.xml | 32 + .../category/tmpl/default_comments-fb.php | 42 + site/views/category/tmpl/default_files.php | 441 ++++++++ .../category/tmpl/default_pagination.php | 33 + site/views/category/tmpl/index.html | 1 + site/views/category/view.html.php | 301 ++++++ site/views/download/index.html | 1 + site/views/download/metadata.xml | 6 + site/views/download/tmpl/default.php | 429 ++++++++ site/views/download/tmpl/default.xml | 13 + site/views/download/tmpl/index.html | 1 + site/views/download/view.html.php | 223 ++++ site/views/feed/index.html | 1 + site/views/feed/metadata.xml | 4 + site/views/feed/tmpl/index.html | 1 + site/views/feed/view.feed.php | 147 +++ site/views/file/index.html | 1 + site/views/file/metadata.xml | 6 + site/views/file/tmpl/default.php | 366 +++++++ site/views/file/tmpl/default.xml | 40 + site/views/file/tmpl/default_comments-fb.php | 42 + site/views/file/tmpl/index.html | 1 + site/views/file/view.html.php | 231 ++++ site/views/index.html | 1 + site/views/phocadownloadlinkcat/index.html | 1 + .../phocadownloadlinkcat/tmpl/default.php | 95 ++ .../phocadownloadlinkcat/tmpl/index.html | 1 + site/views/phocadownloadlinkcat/view.html.php | 61 ++ site/views/phocadownloadlinkcats/index.html | 1 + .../phocadownloadlinkcats/tmpl/default.php | 65 ++ .../phocadownloadlinkcats/tmpl/index.html | 1 + .../views/phocadownloadlinkcats/view.html.php | 71 ++ site/views/phocadownloadlinkfile/index.html | 1 + .../phocadownloadlinkfile/tmpl/default.php | 398 +++++++ .../phocadownloadlinkfile/tmpl/index.html | 1 + .../views/phocadownloadlinkfile/view.html.php | 128 +++ site/views/phocadownloadlinks/index.html | 1 + .../views/phocadownloadlinks/tmpl/default.php | 20 + site/views/phocadownloadlinks/tmpl/index.html | 1 + site/views/phocadownloadlinks/view.html.php | 49 + site/views/phocadownloadlinkytb/index.html | 1 + .../phocadownloadlinkytb/tmpl/default.php | 56 + .../phocadownloadlinkytb/tmpl/index.html | 1 + site/views/phocadownloadlinkytb/view.html.php | 40 + site/views/play/index.html | 1 + site/views/play/metadata.xml | 4 + site/views/play/tmpl/default.php | 73 ++ site/views/play/tmpl/default.xml | 3 + site/views/play/tmpl/index.html | 1 + site/views/play/view.html.php | 70 ++ site/views/ratingfilea/index.html | 1 + site/views/ratingfilea/metadata.xml | 4 + site/views/ratingfilea/tmpl/default.php | 1 + site/views/ratingfilea/tmpl/default.xml | 3 + site/views/ratingfilea/tmpl/index.html | 1 + site/views/ratingfilea/view.json.php | 148 +++ site/views/user/index.html | 1 + site/views/user/metadata.xml | 6 + site/views/user/tmpl/default.php | 43 + site/views/user/tmpl/default.xml | 22 + site/views/user/tmpl/default_files.php | 332 ++++++ site/views/user/tmpl/index.html | 1 + site/views/user/view.html.php | 312 ++++++ tables/index.html | 1 + tables/phocadownload.php | 113 ++ tables/phocadownloadcat.php | 37 + tables/phocadownloadfilevotes.php | 21 + tables/phocadownloadfilevotesstatistics.php | 21 + tables/phocadownloadlayout.php | 21 + tables/phocadownloadlic.php | 20 + tables/phocadownloadlogging.php | 18 + tables/phocadownloadstyle.php | 29 + tables/phocadownloadtag.php | 31 + tables/phocadownloaduserstats.php | 20 + update/index.html | 1 + update/sql/index.html | 1 + update/sql/mysql/3.0.2.sql | 23 + update/sql/mysql/index.html | 1 + views/index.html | 1 + views/phocadownloadcat/index.html | 1 + views/phocadownloadcat/tmpl/edit.php | 61 ++ views/phocadownloadcat/tmpl/edit_metadata.php | 31 + views/phocadownloadcat/tmpl/index.html | 1 + views/phocadownloadcat/view.html.php | 89 ++ views/phocadownloadcats/index.html | 1 + views/phocadownloadcats/tmpl/default.php | 134 +++ .../phocadownloadcats/tmpl/default_batch.php | 48 + views/phocadownloadcats/tmpl/index.html | 1 + views/phocadownloadcats/view.html.php | 183 ++++ views/phocadownloadcp/index.html | 1 + views/phocadownloadcp/tmpl/default.php | 49 + views/phocadownloadcp/tmpl/index.html | 1 + views/phocadownloadcp/view.html.php | 62 ++ views/phocadownloaddownloads/index.html | 1 + views/phocadownloaddownloads/tmpl/default.php | 133 +++ views/phocadownloaddownloads/tmpl/index.html | 1 + views/phocadownloaddownloads/view.html.php | 78 ++ views/phocadownloadfile/index.html | 1 + views/phocadownloadfile/tmpl/edit.php | 188 ++++ .../phocadownloadfile/tmpl/edit_metadata.php | 31 + views/phocadownloadfile/tmpl/edit_text.php | 66 ++ views/phocadownloadfile/tmpl/index.html | 1 + views/phocadownloadfile/view.html.php | 71 ++ views/phocadownloadfiles/index.html | 1 + views/phocadownloadfiles/tmpl/default.php | 395 +++++++ .../phocadownloadfiles/tmpl/default_batch.php | 48 + views/phocadownloadfiles/tmpl/index.html | 1 + views/phocadownloadfiles/view.html.php | 108 ++ views/phocadownloadinfo/index.html | 1 + views/phocadownloadinfo/tmpl/default.php | 53 + views/phocadownloadinfo/tmpl/index.html | 1 + views/phocadownloadinfo/view.html.php | 46 + views/phocadownloadlayout/index.html | 1 + views/phocadownloadlayout/tmpl/edit.php | 99 ++ views/phocadownloadlayout/tmpl/index.html | 1 + views/phocadownloadlayout/view.html.php | 55 + views/phocadownloadlayouts/index.html | 1 + views/phocadownloadlayouts/tmpl/default.php | 1 + views/phocadownloadlayouts/tmpl/index.html | 1 + views/phocadownloadlayouts/view.html.php | 26 + views/phocadownloadlic/index.html | 1 + views/phocadownloadlic/tmpl/edit.php | 55 + views/phocadownloadlic/tmpl/index.html | 1 + views/phocadownloadlic/view.html.php | 62 ++ views/phocadownloadlics/index.html | 1 + views/phocadownloadlics/tmpl/default.php | 119 +++ views/phocadownloadlics/tmpl/index.html | 1 + views/phocadownloadlics/view.html.php | 81 ++ views/phocadownloadlinkcat/index.html | 1 + views/phocadownloadlinkcat/tmpl/default.php | 94 ++ views/phocadownloadlinkcat/tmpl/index.html | 1 + views/phocadownloadlinkcat/view.html.php | 63 ++ views/phocadownloadlinkcats/index.html | 1 + views/phocadownloadlinkcats/tmpl/default.php | 65 ++ views/phocadownloadlinkcats/tmpl/index.html | 1 + views/phocadownloadlinkcats/view.html.php | 71 ++ views/phocadownloadlinkfile/index.html | 1 + views/phocadownloadlinkfile/tmpl/default.php | 398 +++++++ views/phocadownloadlinkfile/tmpl/index.html | 1 + views/phocadownloadlinkfile/view.html.php | 129 +++ views/phocadownloadlinks/index.html | 1 + views/phocadownloadlinks/tmpl/default.php | 20 + views/phocadownloadlinks/tmpl/index.html | 1 + views/phocadownloadlinks/view.html.php | 45 + views/phocadownloadlinkytb/index.html | 1 + views/phocadownloadlinkytb/tmpl/default.php | 54 + views/phocadownloadlinkytb/tmpl/index.html | 1 + views/phocadownloadlinkytb/view.html.php | 40 + views/phocadownloadlogs/index.html | 1 + views/phocadownloadlogs/tmpl/default.php | 143 +++ views/phocadownloadlogs/tmpl/index.html | 1 + views/phocadownloadlogs/view.html.php | 82 ++ views/phocadownloadmanager/index.html | 1 + views/phocadownloadmanager/tmpl/default.php | 192 ++++ .../tmpl/default_file.php | 53 + .../tmpl/default_folder.php | 36 + .../tmpl/default_multipleupload.php | 13 + .../phocadownloadmanager/tmpl/default_up.php | 11 + .../tmpl/default_upload.php | 12 + views/phocadownloadmanager/tmpl/index.html | 1 + views/phocadownloadmanager/view.html.php | 185 ++++ views/phocadownloadrafile/index.html | 1 + views/phocadownloadrafile/tmpl/default.php | 141 +++ views/phocadownloadrafile/tmpl/index.html | 1 + views/phocadownloadrafile/view.html.php | 70 ++ views/phocadownloadset/index.html | 1 + views/phocadownloadset/tmpl/default.php | 66 ++ views/phocadownloadset/tmpl/index.html | 1 + views/phocadownloadset/view.html.php | 42 + views/phocadownloadstat/index.html | 1 + views/phocadownloadstat/tmpl/default.php | 148 +++ views/phocadownloadstat/tmpl/index.html | 1 + views/phocadownloadstat/view.html.php | 66 ++ views/phocadownloadstyle/index.html | 1 + views/phocadownloadstyle/tmpl/edit.php | 81 ++ views/phocadownloadstyle/tmpl/edit_ftp.php | 41 + views/phocadownloadstyle/tmpl/index.html | 1 + views/phocadownloadstyle/view.html.php | 89 ++ views/phocadownloadstyles/index.html | 1 + views/phocadownloadstyles/tmpl/default.php | 144 +++ views/phocadownloadstyles/tmpl/index.html | 1 + views/phocadownloadstyles/view.html.php | 88 ++ views/phocadownloadtag/index.html | 1 + views/phocadownloadtag/tmpl/edit.php | 56 + views/phocadownloadtag/tmpl/index.html | 1 + views/phocadownloadtag/view.html.php | 64 ++ views/phocadownloadtags/index.html | 1 + views/phocadownloadtags/tmpl/default.php | 124 +++ views/phocadownloadtags/tmpl/index.html | 1 + views/phocadownloadtags/view.html.php | 83 ++ views/phocadownloaduploads/index.html | 1 + views/phocadownloaduploads/tmpl/default.php | 135 +++ views/phocadownloaduploads/tmpl/index.html | 1 + views/phocadownloaduploads/view.html.php | 78 ++ 648 files changed, 32382 insertions(+) create mode 100644 access.xml create mode 100644 config.xml create mode 100644 controller.php create mode 100644 controllers/index.html create mode 100644 controllers/phocadownloadcat.php create mode 100644 controllers/phocadownloadcats.php create mode 100644 controllers/phocadownloaddownloads.php create mode 100644 controllers/phocadownloadfile.php create mode 100644 controllers/phocadownloadfiles.php create mode 100644 controllers/phocadownloadinfo.php create mode 100644 controllers/phocadownloadinstall.php create mode 100644 controllers/phocadownloadlayout.php create mode 100644 controllers/phocadownloadlayouts.php create mode 100644 controllers/phocadownloadlic.php create mode 100644 controllers/phocadownloadlics.php create mode 100644 controllers/phocadownloadlinkfile.php create mode 100644 controllers/phocadownloadlogs.php create mode 100644 controllers/phocadownloadm.php create mode 100644 controllers/phocadownloadrafile.php create mode 100644 controllers/phocadownloadset.php create mode 100644 controllers/phocadownloadstat.php create mode 100644 controllers/phocadownloadstyle.php create mode 100644 controllers/phocadownloadstyles.php create mode 100644 controllers/phocadownloadtag.php create mode 100644 controllers/phocadownloadtags.php create mode 100644 controllers/phocadownloaduninstall.php create mode 100644 controllers/phocadownloadupload.php create mode 100644 controllers/phocadownloaduploads.php create mode 100644 help/en-GB/index.html create mode 100644 help/en-GB/logo-phoca.png create mode 100644 help/en-GB/screen.phocadownload.html create mode 100644 help/index.html create mode 100644 help/logo-phoca.png create mode 100644 help/screen.phocadownload.html create mode 100644 helpers/index.html create mode 100644 helpers/phocadownloadcats.php create mode 100644 helpers/phocadownloadcp.php create mode 100644 helpers/phocadownloaddownloads.php create mode 100644 helpers/phocadownloadfiles.php create mode 100644 helpers/phocadownloadlayouts.php create mode 100644 helpers/phocadownloadlics.php create mode 100644 helpers/phocadownloadlogs.php create mode 100644 helpers/phocadownloadmanager.php create mode 100644 helpers/phocadownloadrafile.php create mode 100644 helpers/phocadownloadrate.php create mode 100644 helpers/phocadownloadstat.php create mode 100644 helpers/phocadownloadstyles.php create mode 100644 helpers/phocadownloadtags.php create mode 100644 helpers/phocadownloaduploads.php create mode 100644 helpers/phocauserstat.php create mode 100644 index.html create mode 100644 install/index.html create mode 100644 install/script.php create mode 100644 install/sql/index.html create mode 100644 install/sql/mysql/index.html create mode 100644 install/sql/mysql/install.utf8.sql create mode 100644 install/sql/mysql/uninstall.utf8.sql create mode 100644 language/en-GB/en-GB.com_phocadownload.ini create mode 100644 language/en-GB/en-GB.com_phocadownload.sys.ini create mode 100644 language/en-GB/index.html create mode 100644 language/index.html create mode 100644 libraries/index.html create mode 100644 libraries/loader.php create mode 100644 libraries/phocadownload/access/access.php create mode 100644 libraries/phocadownload/access/index.html create mode 100644 libraries/phocadownload/category/category.php create mode 100644 libraries/phocadownload/category/index.html create mode 100644 libraries/phocadownload/download/download.php create mode 100644 libraries/phocadownload/download/index.html create mode 100644 libraries/phocadownload/file/file.php create mode 100644 libraries/phocadownload/file/fileupload.php create mode 100644 libraries/phocadownload/file/fileuploadmultiple.php create mode 100644 libraries/phocadownload/file/fileuploadsingle.php create mode 100644 libraries/phocadownload/file/index.html create mode 100644 libraries/phocadownload/html/batch.php create mode 100644 libraries/phocadownload/html/grid.php create mode 100644 libraries/phocadownload/html/index.html create mode 100644 libraries/phocadownload/html/jgrid.php create mode 100644 libraries/phocadownload/index.html create mode 100644 libraries/phocadownload/log/index.html create mode 100644 libraries/phocadownload/log/log.php create mode 100644 libraries/phocadownload/mail/index.html create mode 100644 libraries/phocadownload/mail/mail.php create mode 100644 libraries/phocadownload/ordering/index.html create mode 100644 libraries/phocadownload/ordering/ordering.php create mode 100644 libraries/phocadownload/pagination/index.html create mode 100644 libraries/phocadownload/pagination/pagination.php create mode 100644 libraries/phocadownload/path/index.html create mode 100644 libraries/phocadownload/path/path.php create mode 100644 libraries/phocadownload/path/route.php create mode 100644 libraries/phocadownload/rate/index.html create mode 100644 libraries/phocadownload/rate/rate.php create mode 100644 libraries/phocadownload/render/layout.php create mode 100644 libraries/phocadownload/render/renderadmin.php create mode 100644 libraries/phocadownload/render/renderadminview.php create mode 100644 libraries/phocadownload/render/renderadminviews.php create mode 100644 libraries/phocadownload/render/renderfront.php create mode 100644 libraries/phocadownload/stat/index.html create mode 100644 libraries/phocadownload/stat/stat.php create mode 100644 libraries/phocadownload/tag/index.html create mode 100644 libraries/phocadownload/tag/tag.php create mode 100644 libraries/phocadownload/user/index.html create mode 100644 libraries/phocadownload/user/user.php create mode 100644 libraries/phocadownload/utils/exception.php create mode 100644 libraries/phocadownload/utils/external.php create mode 100644 libraries/phocadownload/utils/index.html create mode 100644 libraries/phocadownload/utils/settings.php create mode 100644 libraries/phocadownload/utils/utils.php create mode 100644 media/css/administrator/index.html create mode 100644 media/css/administrator/phocadownload.css create mode 100644 media/css/administrator/phocadownloadoptions.css create mode 100644 media/css/administrator/rating.css create mode 100644 media/css/custom/default.css create mode 100644 media/css/custom/index.html create mode 100644 media/css/index.html create mode 100644 media/css/main/bootstrap.min.css create mode 100644 media/css/main/button.css create mode 100644 media/css/main/buttonrc.css create mode 100644 media/css/main/index.html create mode 100644 media/css/main/phocadownload.css create mode 100644 media/css/main/rating.css create mode 100644 media/images/administrator/b-prm.png create mode 100644 media/images/administrator/bg-install.png create mode 100644 media/images/administrator/bg-upgrade.png create mode 100644 media/images/administrator/btn.png create mode 100644 media/images/administrator/icon-12-approve.png create mode 100644 media/images/administrator/icon-12-authorizeall.png create mode 100644 media/images/administrator/icon-12-back.png create mode 100644 media/images/administrator/icon-12-disapprove.png create mode 100644 media/images/administrator/icon-12-multiple.png create mode 100644 media/images/administrator/icon-12-reset.png create mode 100644 media/images/administrator/icon-16-edb-back.png create mode 100644 media/images/administrator/icon-16-edb-categories.png create mode 100644 media/images/administrator/icon-16-edb-category.png create mode 100644 media/images/administrator/icon-16-edb-file.png create mode 100644 media/images/administrator/icon-16-edb-play.png create mode 100644 media/images/administrator/icon-16-edb-preview.png create mode 100644 media/images/administrator/icon-16-edb-section.png create mode 100644 media/images/administrator/icon-16-edb-sections.png create mode 100644 media/images/administrator/icon-16-folder-small.png create mode 100644 media/images/administrator/icon-16-folder.png create mode 100644 media/images/administrator/icon-16-pdl-control-panel.png create mode 100644 media/images/administrator/icon-16-pdl-menu-category.png create mode 100644 media/images/administrator/icon-16-pdl-menu-downloads.png create mode 100644 media/images/administrator/icon-16-pdl-menu-files.png create mode 100644 media/images/administrator/icon-16-pdl-menu-info.png create mode 100644 media/images/administrator/icon-16-pdl-menu-layout.png create mode 100644 media/images/administrator/icon-16-pdl-menu-lic.png create mode 100644 media/images/administrator/icon-16-pdl-menu-section.png create mode 100644 media/images/administrator/icon-16-pdl-menu-settings.png create mode 100644 media/images/administrator/icon-16-pdl-menu-stat.png create mode 100644 media/images/administrator/icon-16-pdl-menu-styles.png create mode 100644 media/images/administrator/icon-16-pdl-menu-tags.png create mode 100644 media/images/administrator/icon-16-pdl-menu-upload.png create mode 100644 media/images/administrator/icon-16-pdl-menu-users.png create mode 100644 media/images/administrator/icon-16-pdl-menu-vote-file.png create mode 100644 media/images/administrator/icon-16-pdl-menu.png create mode 100644 media/images/administrator/icon-16-up.png create mode 100644 media/images/administrator/icon-16-upload-multiple.png create mode 100644 media/images/administrator/icon-16-upload.png create mode 100644 media/images/administrator/icon-16-user-stat.png create mode 100644 media/images/administrator/icon-32-approve.png create mode 100644 media/images/administrator/icon-32-authorizeall.png create mode 100644 media/images/administrator/icon-32-disapprove.png create mode 100644 media/images/administrator/icon-32-multiple.png create mode 100644 media/images/administrator/icon-32-reset.png create mode 100644 media/images/administrator/icon-48-cat.png create mode 100644 media/images/administrator/icon-48-cats.png create mode 100644 media/images/administrator/icon-48-downloads.png create mode 100644 media/images/administrator/icon-48-file.png create mode 100644 media/images/administrator/icon-48-files.png create mode 100644 media/images/administrator/icon-48-info.png create mode 100644 media/images/administrator/icon-48-layouts.png create mode 100644 media/images/administrator/icon-48-lic.png create mode 100644 media/images/administrator/icon-48-lics.png create mode 100644 media/images/administrator/icon-48-logs.png create mode 100644 media/images/administrator/icon-48-pd-multiple.png create mode 100644 media/images/administrator/icon-48-phoca.png create mode 100644 media/images/administrator/icon-48-phocadownload.png create mode 100644 media/images/administrator/icon-48-rafile.png create mode 100644 media/images/administrator/icon-48-sec.png create mode 100644 media/images/administrator/icon-48-set.png create mode 100644 media/images/administrator/icon-48-stat.png create mode 100644 media/images/administrator/icon-48-styles.png create mode 100644 media/images/administrator/icon-48-tags.png create mode 100644 media/images/administrator/icon-48-uploads.png create mode 100644 media/images/administrator/icon-48-user-stat.png create mode 100644 media/images/administrator/icon-48-users.png create mode 100644 media/images/administrator/icon-48-vote-file.png create mode 100644 media/images/administrator/icon-box-pc.png create mode 100644 media/images/administrator/icon-box-pcm.png create mode 100644 media/images/administrator/icon-box-pd.png create mode 100644 media/images/administrator/icon-box-pdc.png create mode 100644 media/images/administrator/icon-box-pe.png create mode 100644 media/images/administrator/icon-box-pf.png create mode 100644 media/images/administrator/icon-box-pfv.png create mode 100644 media/images/administrator/icon-box-pg.png create mode 100644 media/images/administrator/icon-box-pgb.png create mode 100644 media/images/administrator/icon-box-ph.png create mode 100644 media/images/administrator/icon-box-pi.png create mode 100644 media/images/administrator/icon-box-pm.png create mode 100644 media/images/administrator/icon-box-pp.png create mode 100644 media/images/administrator/icon-box-ppdf.png create mode 100644 media/images/administrator/icon-box-prm.png create mode 100644 media/images/administrator/icon-box-psef.png create mode 100644 media/images/administrator/icon-box-pt.png create mode 100644 media/images/administrator/icon-file.png create mode 100644 media/images/administrator/icon-folder.png create mode 100644 media/images/administrator/icon-phoca-logo.png create mode 100644 media/images/administrator/icon-up.png create mode 100644 media/images/administrator/icon-voting-small.png create mode 100644 media/images/administrator/icon-voting.png create mode 100644 media/images/administrator/index.html create mode 100644 media/images/administrator/line.png create mode 100644 media/images/administrator/logo-phoca.png create mode 100644 media/images/administrator/logo.png create mode 100644 media/images/administrator/spacer.gif create mode 100644 media/images/administrator/white-space.png create mode 100644 media/images/bg-details.png create mode 100644 media/images/bg-download.png create mode 100644 media/images/bg-play.png create mode 100644 media/images/bg-preview.png create mode 100644 media/images/bl.png create mode 100644 media/images/blue-bg.png create mode 100644 media/images/br.png create mode 100644 media/images/btn.png create mode 100644 media/images/button-detail-l.png create mode 100644 media/images/button-detail-r.png create mode 100644 media/images/button-download-l.png create mode 100644 media/images/button-download-r.png create mode 100644 media/images/button-play-l.png create mode 100644 media/images/button-play-r.png create mode 100644 media/images/button-preview-l.png create mode 100644 media/images/button-preview-r.png create mode 100644 media/images/category.png create mode 100644 media/images/document.png create mode 100644 media/images/folder.png create mode 100644 media/images/grey-bg.png create mode 100644 media/images/htl.png create mode 100644 media/images/htr.png create mode 100644 media/images/icon-details.png create mode 100644 media/images/icon-document-16.png create mode 100644 media/images/icon-document-32.png create mode 100644 media/images/icon-document-48.png create mode 100644 media/images/icon-document-64.png create mode 100644 media/images/icon-download.png create mode 100644 media/images/icon-extlink1.png create mode 100644 media/images/icon-extlink2.png create mode 100644 media/images/icon-hot.png create mode 100644 media/images/icon-loading.gif create mode 100644 media/images/icon-loading2.gif create mode 100644 media/images/icon-new.png create mode 100644 media/images/icon-phoca-logo.png create mode 100644 media/images/icon-play.png create mode 100644 media/images/icon-preview.png create mode 100644 media/images/icon-publish-g.png create mode 100644 media/images/icon-publish.png create mode 100644 media/images/icon-trash-g.png create mode 100644 media/images/icon-trash.png create mode 100644 media/images/icon-unpublish-g.png create mode 100644 media/images/icon-unpublish.png create mode 100644 media/images/icon-voting-small.png create mode 100644 media/images/icon-voting.png create mode 100644 media/images/index.html create mode 100644 media/images/mime/16/icon-7zip.png create mode 100644 media/images/mime/16/icon-audio.png create mode 100644 media/images/mime/16/icon-document.png create mode 100644 media/images/mime/16/icon-drawing.png create mode 100644 media/images/mime/16/icon-empty.png create mode 100644 media/images/mime/16/icon-folder-open.png create mode 100644 media/images/mime/16/icon-folder.png create mode 100644 media/images/mime/16/icon-gzip.png create mode 100644 media/images/mime/16/icon-html.png create mode 100644 media/images/mime/16/icon-img.png create mode 100644 media/images/mime/16/icon-jar.png create mode 100644 media/images/mime/16/icon-pdf.png create mode 100644 media/images/mime/16/icon-php.png create mode 100644 media/images/mime/16/icon-presentation.png create mode 100644 media/images/mime/16/icon-rar.png create mode 100644 media/images/mime/16/icon-source.png create mode 100644 media/images/mime/16/icon-spreadsheet.png create mode 100644 media/images/mime/16/icon-sql.png create mode 100644 media/images/mime/16/icon-tar.png create mode 100644 media/images/mime/16/icon-txt.png create mode 100644 media/images/mime/16/icon-video.png create mode 100644 media/images/mime/16/icon-xml.png create mode 100644 media/images/mime/16/icon-zip.png create mode 100644 media/images/mime/16/index.html create mode 100644 media/images/mime/32/icon-7zip.png create mode 100644 media/images/mime/32/icon-audio.png create mode 100644 media/images/mime/32/icon-document.png create mode 100644 media/images/mime/32/icon-drawing.png create mode 100644 media/images/mime/32/icon-empty.png create mode 100644 media/images/mime/32/icon-folder-open.png create mode 100644 media/images/mime/32/icon-folder.png create mode 100644 media/images/mime/32/icon-gzip.png create mode 100644 media/images/mime/32/icon-html.png create mode 100644 media/images/mime/32/icon-img.png create mode 100644 media/images/mime/32/icon-jar.png create mode 100644 media/images/mime/32/icon-pdf.png create mode 100644 media/images/mime/32/icon-php.png create mode 100644 media/images/mime/32/icon-presentation.png create mode 100644 media/images/mime/32/icon-rar.png create mode 100644 media/images/mime/32/icon-source.png create mode 100644 media/images/mime/32/icon-spreadsheet.png create mode 100644 media/images/mime/32/icon-sql.png create mode 100644 media/images/mime/32/icon-tar.png create mode 100644 media/images/mime/32/icon-txt.png create mode 100644 media/images/mime/32/icon-video.png create mode 100644 media/images/mime/32/icon-xml.png create mode 100644 media/images/mime/32/icon-zip.png create mode 100644 media/images/mime/32/index.html create mode 100644 media/images/mime/48/icon-7zip.png create mode 100644 media/images/mime/48/icon-audio.png create mode 100644 media/images/mime/48/icon-document.png create mode 100644 media/images/mime/48/icon-drawing.png create mode 100644 media/images/mime/48/icon-empty.png create mode 100644 media/images/mime/48/icon-folder-open.png create mode 100644 media/images/mime/48/icon-folder.png create mode 100644 media/images/mime/48/icon-gzip.png create mode 100644 media/images/mime/48/icon-html.png create mode 100644 media/images/mime/48/icon-img.png create mode 100644 media/images/mime/48/icon-jar.png create mode 100644 media/images/mime/48/icon-pdf.png create mode 100644 media/images/mime/48/icon-php.png create mode 100644 media/images/mime/48/icon-presentation.png create mode 100644 media/images/mime/48/icon-rar.png create mode 100644 media/images/mime/48/icon-source.png create mode 100644 media/images/mime/48/icon-spreadsheet.png create mode 100644 media/images/mime/48/icon-sql.png create mode 100644 media/images/mime/48/icon-tar.png create mode 100644 media/images/mime/48/icon-txt.png create mode 100644 media/images/mime/48/icon-video.png create mode 100644 media/images/mime/48/icon-xml.png create mode 100644 media/images/mime/48/icon-zip.png create mode 100644 media/images/mime/48/index.html create mode 100644 media/images/mime/64/icon-7zip.png create mode 100644 media/images/mime/64/icon-audio.png create mode 100644 media/images/mime/64/icon-document.png create mode 100644 media/images/mime/64/icon-drawing.png create mode 100644 media/images/mime/64/icon-empty.png create mode 100644 media/images/mime/64/icon-folder-open.png create mode 100644 media/images/mime/64/icon-folder.png create mode 100644 media/images/mime/64/icon-gzip.png create mode 100644 media/images/mime/64/icon-html.png create mode 100644 media/images/mime/64/icon-img.png create mode 100644 media/images/mime/64/icon-jar.png create mode 100644 media/images/mime/64/icon-pdf.png create mode 100644 media/images/mime/64/icon-php.png create mode 100644 media/images/mime/64/icon-presentation.png create mode 100644 media/images/mime/64/icon-rar.png create mode 100644 media/images/mime/64/icon-source.png create mode 100644 media/images/mime/64/icon-spreadsheet.png create mode 100644 media/images/mime/64/icon-sql.png create mode 100644 media/images/mime/64/icon-tar.png create mode 100644 media/images/mime/64/icon-txt.png create mode 100644 media/images/mime/64/icon-video.png create mode 100644 media/images/mime/64/icon-xml.png create mode 100644 media/images/mime/64/icon-zip.png create mode 100644 media/images/mime/64/index.html create mode 100644 media/images/mime/AUTHORS create mode 100644 media/images/mime/COPYING create mode 100644 media/images/mime/index.html create mode 100644 media/images/next-grey.png create mode 100644 media/images/next.png create mode 100644 media/images/phoca-download.png create mode 100644 media/images/prev-grey.png create mode 100644 media/images/prev.png create mode 100644 media/images/tl.png create mode 100644 media/images/tr.png create mode 100644 media/images/up.png create mode 100644 media/images/white-space.png create mode 100644 media/index.html create mode 100644 media/js/index.html create mode 100644 models/fields/index.html create mode 100644 models/fields/phocaaccesslevel.php create mode 100644 models/fields/phocacolortext.php create mode 100644 models/fields/phocadownloadcategory.php create mode 100644 models/fields/phocadownloadeditor.php create mode 100644 models/fields/phocadownloadfile.php create mode 100644 models/fields/phocadownloadlicense.php create mode 100644 models/fields/phocadownloadordering.php create mode 100644 models/fields/phocadownloadtoken.php create mode 100644 models/fields/phocahead.php create mode 100644 models/fields/phocaheadexpert.php create mode 100644 models/fields/phocainfotext.php create mode 100644 models/fields/phocalongtext.php create mode 100644 models/fields/phocaselectfilename.php create mode 100644 models/fields/phocatags.php create mode 100644 models/fields/phocatext.php create mode 100644 models/fields/phocatextarea.php create mode 100644 models/fields/phocausers.php create mode 100644 models/forms/index.html create mode 100644 models/forms/phocadownloadcat.xml create mode 100644 models/forms/phocadownloadfile.xml create mode 100644 models/forms/phocadownloadlayout.xml create mode 100644 models/forms/phocadownloadlic.xml create mode 100644 models/forms/phocadownloadmanager.xml create mode 100644 models/forms/phocadownloadstyle.xml create mode 100644 models/forms/phocadownloadtag.xml create mode 100644 models/index.html create mode 100644 models/phocadownloadcat.php create mode 100644 models/phocadownloadcats.php create mode 100644 models/phocadownloaddownloads.php create mode 100644 models/phocadownloadfile.php create mode 100644 models/phocadownloadfiles.php create mode 100644 models/phocadownloadlayout.php create mode 100644 models/phocadownloadlic.php create mode 100644 models/phocadownloadlics.php create mode 100644 models/phocadownloadlinkcat.php create mode 100644 models/phocadownloadlinkfile.php create mode 100644 models/phocadownloadlog.php create mode 100644 models/phocadownloadlogs.php create mode 100644 models/phocadownloadm.php create mode 100644 models/phocadownloadmanager.php create mode 100644 models/phocadownloadrafile.php create mode 100644 models/phocadownloadstat.php create mode 100644 models/phocadownloadstyle.php create mode 100644 models/phocadownloadstyles.php create mode 100644 models/phocadownloadtag.php create mode 100644 models/phocadownloadtags.php create mode 100644 models/phocadownloadupload.php create mode 100644 models/phocadownloaduploads.php create mode 100644 phocadownload.php create mode 100644 phocadownload.xml create mode 100644 site/assets/index.html create mode 100644 site/assets/jquery/index.html create mode 100644 site/assets/jquery/jquery-1.6.4.min.js create mode 100644 site/controller.php create mode 100644 site/controllers/index.html create mode 100644 site/controllers/user.php create mode 100644 site/helpers/index.html create mode 100644 site/index.html create mode 100644 site/models/categories.php create mode 100644 site/models/category.php create mode 100644 site/models/download.php create mode 100644 site/models/file.php create mode 100644 site/models/index.html create mode 100644 site/models/phocadownloadlinkcat.php create mode 100644 site/models/phocadownloadlinkfile.php create mode 100644 site/models/play.php create mode 100644 site/models/ratingfilea.php create mode 100644 site/models/user.php create mode 100644 site/phocadownload.php create mode 100644 site/router.php create mode 100644 site/views/categories/index.html create mode 100644 site/views/categories/metadata.xml create mode 100644 site/views/categories/tmpl/default.php create mode 100644 site/views/categories/tmpl/default.xml create mode 100644 site/views/categories/tmpl/index.html create mode 100644 site/views/categories/view.html.php create mode 100644 site/views/category/index.html create mode 100644 site/views/category/metadata.xml create mode 100644 site/views/category/tmpl/default.php create mode 100644 site/views/category/tmpl/default.xml create mode 100644 site/views/category/tmpl/default_comments-fb.php create mode 100644 site/views/category/tmpl/default_files.php create mode 100644 site/views/category/tmpl/default_pagination.php create mode 100644 site/views/category/tmpl/index.html create mode 100644 site/views/category/view.html.php create mode 100644 site/views/download/index.html create mode 100644 site/views/download/metadata.xml create mode 100644 site/views/download/tmpl/default.php create mode 100644 site/views/download/tmpl/default.xml create mode 100644 site/views/download/tmpl/index.html create mode 100644 site/views/download/view.html.php create mode 100644 site/views/feed/index.html create mode 100644 site/views/feed/metadata.xml create mode 100644 site/views/feed/tmpl/index.html create mode 100644 site/views/feed/view.feed.php create mode 100644 site/views/file/index.html create mode 100644 site/views/file/metadata.xml create mode 100644 site/views/file/tmpl/default.php create mode 100644 site/views/file/tmpl/default.xml create mode 100644 site/views/file/tmpl/default_comments-fb.php create mode 100644 site/views/file/tmpl/index.html create mode 100644 site/views/file/view.html.php create mode 100644 site/views/index.html create mode 100644 site/views/phocadownloadlinkcat/index.html create mode 100644 site/views/phocadownloadlinkcat/tmpl/default.php create mode 100644 site/views/phocadownloadlinkcat/tmpl/index.html create mode 100644 site/views/phocadownloadlinkcat/view.html.php create mode 100644 site/views/phocadownloadlinkcats/index.html create mode 100644 site/views/phocadownloadlinkcats/tmpl/default.php create mode 100644 site/views/phocadownloadlinkcats/tmpl/index.html create mode 100644 site/views/phocadownloadlinkcats/view.html.php create mode 100644 site/views/phocadownloadlinkfile/index.html create mode 100644 site/views/phocadownloadlinkfile/tmpl/default.php create mode 100644 site/views/phocadownloadlinkfile/tmpl/index.html create mode 100644 site/views/phocadownloadlinkfile/view.html.php create mode 100644 site/views/phocadownloadlinks/index.html create mode 100644 site/views/phocadownloadlinks/tmpl/default.php create mode 100644 site/views/phocadownloadlinks/tmpl/index.html create mode 100644 site/views/phocadownloadlinks/view.html.php create mode 100644 site/views/phocadownloadlinkytb/index.html create mode 100644 site/views/phocadownloadlinkytb/tmpl/default.php create mode 100644 site/views/phocadownloadlinkytb/tmpl/index.html create mode 100644 site/views/phocadownloadlinkytb/view.html.php create mode 100644 site/views/play/index.html create mode 100644 site/views/play/metadata.xml create mode 100644 site/views/play/tmpl/default.php create mode 100644 site/views/play/tmpl/default.xml create mode 100644 site/views/play/tmpl/index.html create mode 100644 site/views/play/view.html.php create mode 100644 site/views/ratingfilea/index.html create mode 100644 site/views/ratingfilea/metadata.xml create mode 100644 site/views/ratingfilea/tmpl/default.php create mode 100644 site/views/ratingfilea/tmpl/default.xml create mode 100644 site/views/ratingfilea/tmpl/index.html create mode 100644 site/views/ratingfilea/view.json.php create mode 100644 site/views/user/index.html create mode 100644 site/views/user/metadata.xml create mode 100644 site/views/user/tmpl/default.php create mode 100644 site/views/user/tmpl/default.xml create mode 100644 site/views/user/tmpl/default_files.php create mode 100644 site/views/user/tmpl/index.html create mode 100644 site/views/user/view.html.php create mode 100644 tables/index.html create mode 100644 tables/phocadownload.php create mode 100644 tables/phocadownloadcat.php create mode 100644 tables/phocadownloadfilevotes.php create mode 100644 tables/phocadownloadfilevotesstatistics.php create mode 100644 tables/phocadownloadlayout.php create mode 100644 tables/phocadownloadlic.php create mode 100644 tables/phocadownloadlogging.php create mode 100644 tables/phocadownloadstyle.php create mode 100644 tables/phocadownloadtag.php create mode 100644 tables/phocadownloaduserstats.php create mode 100644 update/index.html create mode 100644 update/sql/index.html create mode 100644 update/sql/mysql/3.0.2.sql create mode 100644 update/sql/mysql/index.html create mode 100644 views/index.html create mode 100644 views/phocadownloadcat/index.html create mode 100644 views/phocadownloadcat/tmpl/edit.php create mode 100644 views/phocadownloadcat/tmpl/edit_metadata.php create mode 100644 views/phocadownloadcat/tmpl/index.html create mode 100644 views/phocadownloadcat/view.html.php create mode 100644 views/phocadownloadcats/index.html create mode 100644 views/phocadownloadcats/tmpl/default.php create mode 100644 views/phocadownloadcats/tmpl/default_batch.php create mode 100644 views/phocadownloadcats/tmpl/index.html create mode 100644 views/phocadownloadcats/view.html.php create mode 100644 views/phocadownloadcp/index.html create mode 100644 views/phocadownloadcp/tmpl/default.php create mode 100644 views/phocadownloadcp/tmpl/index.html create mode 100644 views/phocadownloadcp/view.html.php create mode 100644 views/phocadownloaddownloads/index.html create mode 100644 views/phocadownloaddownloads/tmpl/default.php create mode 100644 views/phocadownloaddownloads/tmpl/index.html create mode 100644 views/phocadownloaddownloads/view.html.php create mode 100644 views/phocadownloadfile/index.html create mode 100644 views/phocadownloadfile/tmpl/edit.php create mode 100644 views/phocadownloadfile/tmpl/edit_metadata.php create mode 100644 views/phocadownloadfile/tmpl/edit_text.php create mode 100644 views/phocadownloadfile/tmpl/index.html create mode 100644 views/phocadownloadfile/view.html.php create mode 100644 views/phocadownloadfiles/index.html create mode 100644 views/phocadownloadfiles/tmpl/default.php create mode 100644 views/phocadownloadfiles/tmpl/default_batch.php create mode 100644 views/phocadownloadfiles/tmpl/index.html create mode 100644 views/phocadownloadfiles/view.html.php create mode 100644 views/phocadownloadinfo/index.html create mode 100644 views/phocadownloadinfo/tmpl/default.php create mode 100644 views/phocadownloadinfo/tmpl/index.html create mode 100644 views/phocadownloadinfo/view.html.php create mode 100644 views/phocadownloadlayout/index.html create mode 100644 views/phocadownloadlayout/tmpl/edit.php create mode 100644 views/phocadownloadlayout/tmpl/index.html create mode 100644 views/phocadownloadlayout/view.html.php create mode 100644 views/phocadownloadlayouts/index.html create mode 100644 views/phocadownloadlayouts/tmpl/default.php create mode 100644 views/phocadownloadlayouts/tmpl/index.html create mode 100644 views/phocadownloadlayouts/view.html.php create mode 100644 views/phocadownloadlic/index.html create mode 100644 views/phocadownloadlic/tmpl/edit.php create mode 100644 views/phocadownloadlic/tmpl/index.html create mode 100644 views/phocadownloadlic/view.html.php create mode 100644 views/phocadownloadlics/index.html create mode 100644 views/phocadownloadlics/tmpl/default.php create mode 100644 views/phocadownloadlics/tmpl/index.html create mode 100644 views/phocadownloadlics/view.html.php create mode 100644 views/phocadownloadlinkcat/index.html create mode 100644 views/phocadownloadlinkcat/tmpl/default.php create mode 100644 views/phocadownloadlinkcat/tmpl/index.html create mode 100644 views/phocadownloadlinkcat/view.html.php create mode 100644 views/phocadownloadlinkcats/index.html create mode 100644 views/phocadownloadlinkcats/tmpl/default.php create mode 100644 views/phocadownloadlinkcats/tmpl/index.html create mode 100644 views/phocadownloadlinkcats/view.html.php create mode 100644 views/phocadownloadlinkfile/index.html create mode 100644 views/phocadownloadlinkfile/tmpl/default.php create mode 100644 views/phocadownloadlinkfile/tmpl/index.html create mode 100644 views/phocadownloadlinkfile/view.html.php create mode 100644 views/phocadownloadlinks/index.html create mode 100644 views/phocadownloadlinks/tmpl/default.php create mode 100644 views/phocadownloadlinks/tmpl/index.html create mode 100644 views/phocadownloadlinks/view.html.php create mode 100644 views/phocadownloadlinkytb/index.html create mode 100644 views/phocadownloadlinkytb/tmpl/default.php create mode 100644 views/phocadownloadlinkytb/tmpl/index.html create mode 100644 views/phocadownloadlinkytb/view.html.php create mode 100644 views/phocadownloadlogs/index.html create mode 100644 views/phocadownloadlogs/tmpl/default.php create mode 100644 views/phocadownloadlogs/tmpl/index.html create mode 100644 views/phocadownloadlogs/view.html.php create mode 100644 views/phocadownloadmanager/index.html create mode 100644 views/phocadownloadmanager/tmpl/default.php create mode 100644 views/phocadownloadmanager/tmpl/default_file.php create mode 100644 views/phocadownloadmanager/tmpl/default_folder.php create mode 100644 views/phocadownloadmanager/tmpl/default_multipleupload.php create mode 100644 views/phocadownloadmanager/tmpl/default_up.php create mode 100644 views/phocadownloadmanager/tmpl/default_upload.php create mode 100644 views/phocadownloadmanager/tmpl/index.html create mode 100644 views/phocadownloadmanager/view.html.php create mode 100644 views/phocadownloadrafile/index.html create mode 100644 views/phocadownloadrafile/tmpl/default.php create mode 100644 views/phocadownloadrafile/tmpl/index.html create mode 100644 views/phocadownloadrafile/view.html.php create mode 100644 views/phocadownloadset/index.html create mode 100644 views/phocadownloadset/tmpl/default.php create mode 100644 views/phocadownloadset/tmpl/index.html create mode 100644 views/phocadownloadset/view.html.php create mode 100644 views/phocadownloadstat/index.html create mode 100644 views/phocadownloadstat/tmpl/default.php create mode 100644 views/phocadownloadstat/tmpl/index.html create mode 100644 views/phocadownloadstat/view.html.php create mode 100644 views/phocadownloadstyle/index.html create mode 100644 views/phocadownloadstyle/tmpl/edit.php create mode 100644 views/phocadownloadstyle/tmpl/edit_ftp.php create mode 100644 views/phocadownloadstyle/tmpl/index.html create mode 100644 views/phocadownloadstyle/view.html.php create mode 100644 views/phocadownloadstyles/index.html create mode 100644 views/phocadownloadstyles/tmpl/default.php create mode 100644 views/phocadownloadstyles/tmpl/index.html create mode 100644 views/phocadownloadstyles/view.html.php create mode 100644 views/phocadownloadtag/index.html create mode 100644 views/phocadownloadtag/tmpl/edit.php create mode 100644 views/phocadownloadtag/tmpl/index.html create mode 100644 views/phocadownloadtag/view.html.php create mode 100644 views/phocadownloadtags/index.html create mode 100644 views/phocadownloadtags/tmpl/default.php create mode 100644 views/phocadownloadtags/tmpl/index.html create mode 100644 views/phocadownloadtags/view.html.php create mode 100644 views/phocadownloaduploads/index.html create mode 100644 views/phocadownloaduploads/tmpl/default.php create mode 100644 views/phocadownloaduploads/tmpl/index.html create mode 100644 views/phocadownloaduploads/view.html.php diff --git a/access.xml b/access.xml new file mode 100644 index 0000000..82dd641 --- /dev/null +++ b/access.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + +
+ +
\ No newline at end of file diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..f5e3d8b --- /dev/null +++ b/config.xml @@ -0,0 +1,534 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+ +
+
\ No newline at end of file diff --git a/controller.php b/controller.php new file mode 100644 index 0000000..19b28ab --- /dev/null +++ b/controller.php @@ -0,0 +1,56 @@ +input->get('option'); + +$l['cp'] = array('COM_PHOCADOWNLOAD_CONTROL_PANEL', ''); +$l['f'] = array('COM_PHOCADOWNLOAD_FILES', 'phocadownloadfiles'); +$l['c'] = array('COM_PHOCADOWNLOAD_CATEGORIES', 'phocadownloadcats'); +$l['l'] = array('COM_PHOCADOWNLOAD_LICENSES', 'phocadownloadlics'); +$l['st'] = array('COM_PHOCADOWNLOAD_STATISTICS', 'phocadownloadstat'); +$l['d'] = array('COM_PHOCADOWNLOAD_DOWNLOADS', 'phocadownloaddownloads'); +$l['u'] = array('COM_PHOCADOWNLOAD_UPLOADS', 'phocadownloaduploads'); +$l['fr'] = array('COM_PHOCADOWNLOAD_FILE_RATING', 'phocadownloadrafile'); +$l['t'] = array('COM_PHOCADOWNLOAD_TAGS', 'phocadownloadtags'); +$l['ly'] = array('COM_PHOCADOWNLOAD_LAYOUT', 'phocadownloadlayouts'); +$l['sty'] = array('COM_PHOCADOWNLOAD_STYLES', 'phocadownloadstyles'); +$l['log'] = array('COM_PHOCADOWNLOAD_LOGGING', 'phocadownloadlogs'); +$l['in'] = array('COM_PHOCADOWNLOAD_INFO', 'phocadownloadinfo'); + +// Submenu view +//$view = JRequest::getVar( 'view', '', '', 'string', JREQUEST_ALLOWRAW ); +//$layout = JRequest::getVar( 'layout', '', '', 'string', JREQUEST_ALLOWRAW ); +$view = JFactory::getApplication()->input->get('view'); +$layout = JFactory::getApplication()->input->get('layout'); + +if ($layout == 'edit') { +} else { + foreach ($l as $k => $v) { + + if ($v[1] == '') { + $link = 'index.php?option='.$option; + } else { + $link = 'index.php?option='.$option.'&view='; + } + + if ($view == $v[1]) { + JHtmlSidebar::addEntry(JText::_($v[0]), $link.$v[1], true ); + } else { + JHtmlSidebar::addEntry(JText::_($v[0]), $link.$v[1]); + } + } +} + +class PhocadownloadCpController extends JControllerLegacy { + function display($cachable = false, $urlparams = array()) { + parent::display($cachable , $urlparams); + } +} +?> diff --git a/controllers/index.html b/controllers/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/controllers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/controllers/phocadownloadcat.php b/controllers/phocadownloadcat.php new file mode 100644 index 0000000..f03d0c0 --- /dev/null +++ b/controllers/phocadownloadcat.php @@ -0,0 +1,56 @@ +authorise('core.create', 'com_phocadownload'); + if ($allow === null) { + return parent::allowAdd($data); + } else { + return $allow; + } + } + + protected function allowEdit($data = array(), $key = 'id') { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.edit', 'com_phocadownload'); + if ($allow === null) { + return parent::allowEdit($data, $key); + } else { + return $allow; + } + } + + public function batch($model = null) { + JRequest::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + $model = $this->getModel('phocadownloadcat', '', array()); + + // Preset the redirect + $this->setRedirect(JRoute::_('index.php?option=com_phocadownload&view=phocadownloadcats'.$this->getRedirectToListAppend(), false)); + + return parent::batch($model); + } +} +?> diff --git a/controllers/phocadownloadcats.php b/controllers/phocadownloadcats.php new file mode 100644 index 0000000..a46a3e6 --- /dev/null +++ b/controllers/phocadownloadcats.php @@ -0,0 +1,42 @@ + true)); + return $model; + } + + public function saveOrderAjax() { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + JArrayHelper::toInteger($pks); + JArrayHelper::toInteger($order); + $model = $this->getModel(); + $return = $model->saveorder($pks, $order); + if ($return) { echo "1";} + JFactory::getApplication()->close(); + } + +} +?> \ No newline at end of file diff --git a/controllers/phocadownloaddownloads.php b/controllers/phocadownloaddownloads.php new file mode 100644 index 0000000..888c4c5 --- /dev/null +++ b/controllers/phocadownloaddownloads.php @@ -0,0 +1,46 @@ + true)); + return $model; + } + + function cancel($key = NULL) { + $model = $this->getModel( 'phocadownload' ); + $this->setRedirect( 'index.php?option=com_phocadownload&view=phocadownloaddownloads' ); + } + + function reset() { + + $post = JRequest::get('post'); + $cid = JRequest::getVar( 'cid', array(0), 'post', 'array' ); + $idFile = JRequest::getVar( 'idfile', 0, 'post', 'int' ); + + $model = $this->getModel( 'phocadownloaddownloads' ); + + if ($model->reset($cid)) { + $msg = JText::_( 'COM_PHOCADOWNLOAD_SUCCESS_RESET_USER_STAT' ); + } else { + $msg = JText::_( 'COM_PHOCADOWNLOAD_ERROR_RESET_USER_STAT' ); + } + + $link = 'index.php?option=com_phocadownload&view=phocadownloaddownloads&id='.(int)$idFile; + $this->setRedirect($link, $msg); + } +} +?> diff --git a/controllers/phocadownloadfile.php b/controllers/phocadownloadfile.php new file mode 100644 index 0000000..197d063 --- /dev/null +++ b/controllers/phocadownloadfile.php @@ -0,0 +1,79 @@ +authorise('core.create', 'com_phocadownload'); + if ($allow === null) { + return parent::allowAdd($data); + } else { + return $allow; + } + } + + protected function allowEdit($data = array(), $key = 'id') { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.edit', 'com_phocadownload'); + if ($allow === null) { + return parent::allowEdit($data, $key); + } else { + return $allow; + } + } + + public function batch($model = null) { + JRequest::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Set the model + $model = $this->getModel('phocadownloadfile', '', array()); + + // Preset the redirect + $this->setRedirect(JRoute::_('index.php?option=com_phocadownload&view=phocadownloadfiles'.$this->getRedirectToListAppend(), false)); + + return parent::batch($model); + } + + /* + function copyquick() { + $cid = JRequest::getVar( 'cid', array(0), 'post', 'array' ); + $model = $this->getModel( 'phocadownloadfile' ); + if ($model->copyQuick($cid)) { + $msg = JText::_( 'COM_PHOCADOWNLOAD_SUCCESS_COPY_FILE' ); + } else { + $msg = JText::_( 'COM_PHOCADOWNLOAD_ERROR_COPY_FILE' ); + } + $link = 'index.php?option=com_phocadownload&view=phocadownloadfiles'; + $this->setRedirect($link, $msg); + }*/ + +} +?> diff --git a/controllers/phocadownloadfiles.php b/controllers/phocadownloadfiles.php new file mode 100644 index 0000000..b97d862 --- /dev/null +++ b/controllers/phocadownloadfiles.php @@ -0,0 +1,81 @@ +registerTask('disapprove', 'approve'); + + } + + public function &getModel($name = 'PhocaDownloadFile', $prefix = 'PhocaDownloadCpModel') + { + $model = parent::getModel($name, $prefix, array('ignore_request' => true)); + return $model; + } + + + function approve() + { + // Check for request forgeries + JRequest::checkToken() or die(JText::_('JINVALID_TOKEN')); + + // Get items to publish from the request. + $cid = JRequest::getVar('cid', array(), '', 'array'); + $data = array('approve' => 1, 'disapprove' => 0); + $task = $this->getTask(); + $value = JArrayHelper::getValue($data, $task, 0, 'int'); + + if (empty($cid)) { + JError::raiseWarning(500, JText::_($this->text_prefix.'_NO_ITEM_SELECTED')); + } else { + // Get the model. + $model = $this->getModel(); + + // Make sure the item ids are integers + JArrayHelper::toInteger($cid); + + // Publish the items. + + if (!$model->approve($cid, $value)) { + JError::raiseWarning(500, $model->getError()); + } else { + if ($value == 1) { + $ntext = $this->text_prefix.'_N_ITEMS_APPROVED'; + } else if ($value == 0) { + $ntext = $this->text_prefix.'_N_ITEMS_DISAPPROVED'; + } + $this->setMessage(JText::plural($ntext, count($cid))); + } + } + + $this->setRedirect(JRoute::_('index.php?option='.$this->option.'&view='.$this->view_list, false)); + } + + public function saveOrderAjax() { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + JArrayHelper::toInteger($pks); + JArrayHelper::toInteger($order); + $model = $this->getModel(); + $return = $model->saveorder($pks, $order); + if ($return) { echo "1";} + JFactory::getApplication()->close(); + } + +} +?> \ No newline at end of file diff --git a/controllers/phocadownloadinfo.php b/controllers/phocadownloadinfo.php new file mode 100644 index 0000000..7dd43c5 --- /dev/null +++ b/controllers/phocadownloadinfo.php @@ -0,0 +1,25 @@ +setRedirect( 'index.php?option=com_phocadownload' ); + } +} +?> diff --git a/controllers/phocadownloadinstall.php b/controllers/phocadownloadinstall.php new file mode 100644 index 0000000..56d8ac9 --- /dev/null +++ b/controllers/phocadownloadinstall.php @@ -0,0 +1,993 @@ +registerTask( 'install' , 'install' ); + $this->registerTask( 'upgrade' , 'upgrade' ); + } + + function install() { + $db = JFactory::getDBO(); + $msgSQL = ''; + $msgFile = ''; + $msgError = ''; + + // -------------------------------------------------------------------------- + + $query =' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_categories').' ;'; + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + $query ='CREATE TABLE '.$db->quoteName('#__phocadownload_categories').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('parent_id').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('section').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('name').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('alias').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image_position').' varchar(30) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('description').' text,'."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('editor').' varchar(50) default NULL,'."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('access').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('uploaduserid').' text,'."\n"; + $query.=' '.$db->quoteName('accessuserid').' text,'."\n"; + $query.=' '.$db->quoteName('deleteuserid').' text,'."\n"; + $query.=' '.$db->quoteName('date').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('count').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' '.$db->quoteName('hits').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('metakey').' text,'."\n"; + $query.=' '.$db->quoteName('metadesc').' text,'."\n"; + $query.=' '.$db->quoteName('metadata').' text,'."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').'),'."\n"; + $query.=' KEY '.$db->quoteName('cat_idx').' ('.$db->quoteName('section').', '. $db->quoteName('published').', '. $db->quoteName('access').'),'."\n"; + $query.=' KEY '.$db->quoteName('idx_access').' ('.$db->quoteName('access').'),'."\n"; + $query.=' KEY '.$db->quoteName('idx_checkout').' ('.$db->quoteName('checked_out').')'."\n"; + $query.=') default CHARSET=utf8;'; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + // -------------------------------------------------------------------------- + /* + $query=' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_sections').' ;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query ='CREATE TABLE '.$db->quoteName('#__phocadownload_sections').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('name').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('alias').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image').' text,'."\n"; + $query.=' '.$db->quoteName('scope').' varchar(50) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image_position').' varchar(30) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('description').' text,'."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('access').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('date').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('count').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' '.$db->quoteName('metakey').' text,'."\n"; + $query.=' '.$db->quoteName('metadesc').' text,'."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').'),'."\n"; + $query.=' KEY '.$db->quoteName('idx_scope').' ('.$db->quoteName('scope').')'."\n"; + $query.=') TYPE=MyISAM CHARACTER SET '.$db->quoteName('utf8').' ;'; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + */ + // -------------------------------------------------------------------------- + + $query=' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload').' ;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query ='CREATE TABLE '.$db->quoteName('#__phocadownload').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) unsigned NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('catid').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('sectionid').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('owner_id').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('sid').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('title').' varchar(250) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('alias').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('filename').' varchar(250) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('filesize').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('filename_play').' varchar(250) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('filename_preview').' varchar(250) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('author').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('author_email').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('author_url').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('license').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('license_url').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('video_filename').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image_filename').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image_filename_spec1').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image_filename_spec2').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('image_download').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('link_external').' varchar(255) NOT NULL default \'\','."\n"; + + $query.=' '.$db->quoteName('mirror1link').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('mirror1title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('mirror1target').' varchar(10) NOT NULL default \'\','."\n"; + + $query.=' '.$db->quoteName('mirror2link').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('mirror2title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('mirror2target').' varchar(10) NOT NULL default \'\','."\n"; + + $query.=' '.$db->quoteName('description').' text,'."\n"; + $query.=' '.$db->quoteName('features').' text,'."\n"; + $query.=' '.$db->quoteName('changelog').' text,'."\n"; + $query.=' '.$db->quoteName('notes').' text,'."\n"; + $query.=' '.$db->quoteName('userid').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('version').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('directlink').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('date').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('publish_up').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('publish_down').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('hits').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('textonly').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('approved').' tinyint(3) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('access').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('confirm_license').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('unaccessible_file').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' '.$db->quoteName('metakey').' text,'."\n"; + $query.=' '.$db->quoteName('metadesc').' text,'."\n"; + $query.=' '.$db->quoteName('metadata').' text,'."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').'),'."\n"; + $query.=' KEY '.$db->quoteName('catid').' ('.$db->quoteName('catid').', '. $db->quoteName('published').')'."\n"; + $query.=') default CHARSET=utf8;'; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + // -------------------------------------------------------------------------- + /* + $query=' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_settings').' ;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query =' CREATE TABLE '.$db->quoteName('#__phocadownload_settings').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) unsigned NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('title').' varchar(250) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('value').' text,'."\n"; + $query.=' '.$db->quoteName('values').' text,'."\n"; + $query.=' '.$db->quoteName('type').' varchar(50) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') TYPE=MyISAM CHARACTER SET '.$db->quoteName('utf8').' ;'; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + // VALUES + + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'download_folder', 'phocadownload','', 'text');"."\n"; + + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'allowed_file_types', '{hqx=application/mac-binhex40}\n{cpt=application/mac-compactpro}\n{csv=text/x-comma-separated-values}\n{bin=application/macbinary}\n{dms=application/octet-stream}\n{lha=application/octet-stream}\n{lzh=application/octet-stream}\n{exe=application/octet-stream}\n{class=application/octet-stream}\n{psd=application/x-photoshop}\n{so=application/octet-stream}\n{sea=application/octet-stream}\n{dll=application/octet-stream}\n{oda=application/oda}\n{pdf=application/pdf}\n{ai=application/postscript}\n{eps=application/postscript}\n{ps=application/postscript}\n{smi=application/smil}\n{smil=application/smil}\n{mif=application/vnd.mif}\n{xls=application/vnd.ms-excel}\n{ppt=application/powerpoint}\n{wbxml=application/wbxml}\n{wmlc=application/wmlc}\n{dcr=application/x-director}\n{dir=application/x-director}\n{dxr=application/x-director}\n{dvi=application/x-dvi}\n{gtar=application/x-gtar}\n{gz=application/x-gzip}\n{php=application/x-httpd-php}\n{php4=application/x-httpd-php}\n{php3=application/x-httpd-php}\n{phtml=application/x-httpd-php}\n{phps=application/x-httpd-php-source}\n{js=application/x-javascript}\n{swf=application/x-shockwave-flash}\n{sit=application/x-stuffit}\n{tar=application/x-tar}\n{tgz=application/x-tar}\n{xhtml=application/xhtml+xml}\n{xht=application/xhtml+xml}\n{zip=application/x-zip}\n{mid=audio/midi}\n{midi=audio/midi}\n{mpga=audio/mpeg}\n{mp2=audio/mpeg}\n{mp3=audio/mpeg}\n{aif=audio/x-aiff}\n{aiff=audio/x-aiff}\n{aifc=audio/x-aiff}\n{ram=audio/x-pn-realaudio}\n{rm=audio/x-pn-realaudio}\n{rpm=audio/x-pn-realaudio-plugin}\n{ra=audio/x-realaudio}\n{rv=video/vnd.rn-realvideo}\n{wav=audio/x-wav}\n{bmp=image/bmp}\n{gif=image/gif}\n{jpeg=image/jpeg}\n{jpg=image/jpeg}\n{jpe=image/jpeg}\n{png=image/png}\n{tiff=image/tiff}\n{tif=image/tiff}\n{css=text/css}\n{html=text/html}\n{htm=text/html}\n{shtml=text/html}\n{txt=text/plain}\n{text=text/plain}\n{log=text/plain}\n{rtx=text/richtext}\n{rtf=text/rtf}\n{xml=text/xml}\n{xsl=text/xml}\n{mpeg=video/mpeg}\n{mpg=video/mpeg}\n{mpe=video/mpeg}\n{qt=video/quicktime}\n{mov=video/quicktime}\n{avi=video/x-msvideo}\n{flv=video/x-flv}\n{movie=video/x-sgi-movie}\n{doc=application/msword}\n{xl=application/excel}\n{eml=message/rfc822}', '', 'textarea');"."\n"; + + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'disallowed_file_types', '','', 'textarea');"."\n"; + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'upload_maxsize', '3145728','', 'text');"."\n"; + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'enable_flash', 0,'{0=No}{1=Yes}', 'select');"."\n"; + + // Version 1.0.6 + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'enable_user_statistics', 1,'{0=No}{1=Yes}', 'select');"."\n"; + // Version 1.1.0 + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'absolute_path', '','', 'text');"."\n"; + // Version 1.3.4 + $queries[] = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'description', '','', 'textareaeditor');"."\n"; + + foreach ($queries as $valueQuery) { + $db->setQuery( $valueQuery ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + } +*/ + // -------------------------------------------------------------------------- + + $query=' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_user_stat').' ;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query='CREATE TABLE '.$db->quoteName('#__phocadownload_user_stat').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('fileid').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('userid').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('count').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('date').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + // -------------------------------------------------------------------------- + + $query=' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_licenses').' ;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query ='CREATE TABLE '.$db->quoteName('#__phocadownload_licenses').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('alias').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('description').' text,'."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + // ------------------------------------------ + // PHOCADOWNLOAD FILE VOTES (2.0.0 RC2) + // ------------------------------------------ + $query ='DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_file_votes').';'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query =' CREATE TABLE '.$db->quoteName('#__phocadownload_file_votes').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('fileid').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('userid').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('date').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('rating').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + // ------------------------------------------ + // PHOCADOWNLOAD FILE VOTES STATISTICS (2.0.0 RC2) + // ------------------------------------------ + $query ='DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_file_votes_statistics').';'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query =' CREATE TABLE '.$db->quoteName('#__phocadownload_file_votes_statistics').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('fileid').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('count').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('average').' float(8,6) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + // ------------------------------------------ + // PHOCADOWNLOAD TAGS (2.1.0) + // ------------------------------------------ + + $query =' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_tags').' ;'; + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query ='CREATE TABLE '.$db->quoteName('#__phocadownload_tags').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('alias').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('link_cat').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('link_ext').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('description').' text,'."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + + $query =' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_tags_ref').' ;'; + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query ='CREATE TABLE '.$db->quoteName('#__phocadownload_tags_ref').' ('."\n"; + $query.=' '.$db->quoteName('id').' SERIAL,'."\n"; + $query.=' '.$db->quoteName('fileid').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('tagid').' int(11) NOT NULL default 0,'."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').'),'."\n"; + $query.=' UNIQUE KEY '.$db->quoteName('i_fileid').' ('.$db->quoteName('fileid').','.$db->quoteName('tagid').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + + $query =' DROP TABLE IF EXISTS '.$db->quoteName('#__phocadownload_layout').' ;'; + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + $query ='CREATE TABLE '.$db->quoteName('#__phocadownload_layout').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('categories').' text,'."\n"; + $query.=' '.$db->quoteName('category').' text,'."\n"; + $query.=' '.$db->quoteName('file').' text,'."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + $query ='INSERT INTO '.$db->quoteName('#__phocadownload_layout').' ('."\n"; + $query.=' '.$db->quoteName('id').' ,'."\n"; + $query.=' '.$db->quoteName('categories').' ,'."\n"; + $query.=' '.$db->quoteName('category').' ,'."\n"; + $query.=' '.$db->quoteName('file').' ,'."\n"; + $query.=' '.$db->quoteName('checked_out').' ,'."\n"; + $query.=' '.$db->quoteName('checked_out_time').' ,'."\n"; + $query.=' '.$db->quoteName('params').' )'."\n"; + $query.=' VALUES ('."\n"; + $query.=' NULL,'."\n"; + + $query.=' '.$db->Quote('
+
{pdtitle}
+{pdsubcategories} +{pdclear} +
').','."\n"; + $query.=' '.$db->Quote('
+{pdfiledesctop} +{pdfile} +
{pdbuttondownload}
+
{pdbuttondetails}
+
{pdbuttonpreview}
+
{pdbuttonplay}
+
{pdmirrorlink2} {pdmirrorlink1}
+
{pdrating}
+
{pdtags}
+{pdfiledescbottom} +
+
').','."\n"; + $query.=' '.$db->Quote('
+{pdimage} +{pdfile} +{pdfilesize} +{pdversion} +{pdlicense} +{pdauthor} +{pdauthoremail} +{pdfiledate} +{pddownloads} +{pddescription} +{pdfeatures} +{pdchangelog} +{pdnotes} +
{pdmirrorlink2} {pdmirrorlink1}
+
{pdreportlink}
+
{pdrating}
+
{pdtags}
+
+
').','."\n"; + $query.=' '.$db->Quote('0').','."\n"; + $query.=' '.$db->Quote('0000-00-00 00:00:00').','."\n"; + $query.=' NULL'."\n"; + $query.=' );'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + // END ------------------------------------------------------------------------------- + + + + // Error + if ($msgSQL !='') { + $msgError .= '
' . $msgSQL; + } + if ($msgFile !='') { + $msgError .= '
' . $msgFile; + } + + // End Message + if ($msgError !='') { + $msg = JText::_( 'Phoca Download not successfully installed' ) . ': ' . $msgError; + } else { + $msg = JText::_( 'Phoca Download successfully installed' ); + } + + + $link = 'index.php?option=com_phocadownload'; + $this->setRedirect($link, $msg); + } + + + + + + + + + + + + + function upgrade() + { + $db = JFactory::getDBO(); + $dbPref = $db->getPrefix(); + $msgSQL = ''; + $msgFile = ''; + $msgError = ''; + + + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) + { + $msgSQL .= $db->getErrorMsg(). '
'; + } + + + $query=' SELECT * FROM '.$db->quoteName('#__phocadownload_categories').' LIMIT 1;'."\n"; + + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) + { + $msgSQL .= $db->getErrorMsg(). '
'; + } + /* + $query=' SELECT * FROM '.$db->quoteName('#__phocadownload_sections').' LIMIT 1;'."\n"; + + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) + { + $msgSQL .= $db->getErrorMsg(). '
'; + } + */ + // UPGRADE PHOCA DOWNLOAD 2.1.0 VERSION + // ------------------------------------------ + // PHOCADOWNLOAD TAGS + // ------------------------------------------ + + $query ='CREATE TABLE IF NOT EXISTS '.$db->quoteName('#__phocadownload_tags').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('alias').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('link_cat').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('link_ext').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('description').' text,'."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' '.$db->quoteName('language').' char(7) NOT NULL default \'\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + $query ='CREATE TABLE IF NOT EXISTS'.$db->quoteName('#__phocadownload_tags_ref').' ('."\n"; + $query.=' '.$db->quoteName('id').' SERIAL,'."\n"; + $query.=' '.$db->quoteName('fileid').' int(11) NOT NULL default 0,'."\n"; + $query.=' '.$db->quoteName('tagid').' int(11) NOT NULL default 0,'."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').'),'."\n"; + $query.=' UNIQUE KEY '.$db->quoteName('i_fileid').' ('.$db->quoteName('fileid').','.$db->quoteName('tagid').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + $query ='CREATE TABLE IF NOT EXISTS '.$db->quoteName('#__phocadownload_layout').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('categories').' text,'."\n"; + $query.=' '.$db->quoteName('category').' text,'."\n"; + $query.=' '.$db->quoteName('file').' text,'."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('params').' text,'."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') default CHARSET=utf8;'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + + $update0 = false; + $errorMsg = ''; + $update0 = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "features", "text", "description" ); + if (!$update0) { + $msgSQL .= 'Error while updating Features column'; + } + $update1 = false; + $errorMsg = ''; + $update1 = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "changelog", "text", "description" ); + if (!$update1) { + $msgSQL .= 'Error while updating Changelog column'; + } + $update2 = false; + $errorMsg = ''; + $update2 = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "notes", "text", "description" ); + if (!$update2) { + $msgSQL .= 'Error while updating Notes column'; + } + + /* + $query=' SELECT title FROM '.$db->quoteName('#__phocadownload_settings').' WHERE title = \'enable_user_statistics\' LIMIT 1;'."\n"; + $db->setQuery($query); + + if (!$result = $db->loadObject()) { + $query = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'enable_user_statistics', 1,'{0=No}{1=Yes}', 'select');"."\n"; + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + } + + // -------------------------------------------------------------------------- + + // UPGRADE PHOCA DOWNLOAD 1.1.0 VERSION + // ------------------------------------------ + // PHOCADOWNLOAD USER STAT + // ------------------------------------------ + + $query='CREATE TABLE IF NOT EXISTS '.$db->quoteName('#__phocadownload_licenses').' ('."\n"; + $query.=' '.$db->quoteName('id').' int(11) NOT NULL auto_increment,'."\n"; + $query.=' '.$db->quoteName('title').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('alias').' varchar(255) NOT NULL default \'\','."\n"; + $query.=' '.$db->quoteName('description').' text,'."\n"; + $query.=' '.$db->quoteName('checked_out').' int(11) unsigned NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('checked_out_time').' datetime NOT NULL default \'0000-00-00 00:00:00\','."\n"; + $query.=' '.$db->quoteName('published').' tinyint(1) NOT NULL default \'0\','."\n"; + $query.=' '.$db->quoteName('ordering').' int(11) NOT NULL default \'0\','."\n"; + $query.=' PRIMARY KEY ('.$db->quoteName('id').')'."\n"; + $query.=') TYPE=MyISAM CHARACTER SET '.$db->quoteName('utf8').' ;'; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + + // -------------------------------------------------------------------------- + + // ------------------------------------------ + // PHOCADOWNLOAD UPDATE confirm_license + // ------------------------------------------ + $updateCL = false; + $updateCL = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "confirm_license", "int(11) NOT NULL default '0'", "access" ); + if (!$updateCL) { + $msgSQL .= 'Error while updating Confirm License column
'; + } + + // ------------------------------------------ + // PHOCADOWNLOAD UPDATE confirm_license + // ------------------------------------------ + $updateUF = false; + $updateUF = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "unaccessible_file", "int(11) NOT NULL default '0'", "access" ); + if (!$updateUF) { + $msgSQL .= 'Error while updating Display Unaccessible Files column
'; + } + + // ------------------------------------------ + // PHOCADOWNLOAD CATEGORIES UPDATE date + // ------------------------------------------ + $updateCD = false; + $updateCD = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload_categories", "date", "datetime NOT NULL default '0000-00-00 00:00:00'", "access" ); + if (!$updateCD) { + $msgSQL .= 'Error while updating Date column (categories)
'; + } + + // ------------------------------------------ + // PHOCADOWNLOAD SECTIONS UPDATE date + // ------------------------------------------ + $updateSD = false; + $updateSD = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload_sections", "date", "datetime NOT NULL default '0000-00-00 00:00:00'", "access" ); + if (!$updateSD) { + $msgSQL .= 'Error while updating Date column (sections)
'; + } + // ------------------------------------------ + // PHOCADOWNLOAD SETTINGS UPDATE absolute_path + // ------------------------------------------ + + $query=' SELECT title FROM '.$db->quoteName('#__phocadownload_settings').' WHERE title = \'absolute_path\' LIMIT 1;'."\n"; + $db->setQuery($query); + + if (!$result = $db->loadObject()) { + $query = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'absolute_path', '','', 'text');"."\n"; + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + } + + // ------------------------------------------ + // PHOCA DOWNLOAD UPDATE 1.2.0 + // ------------------------------------------ + + // Filename_preview + $updateFPR = false; + $updateFPR = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "filename_preview", "varchar(250) NOT NULL default ''", "filename" ); + if (!$updateFPR) { + $msgSQL .= 'Error while updating Filename Preview column
'; + } + + // Filename_play + $updateFPL = false; + $updateFPL = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "filename_play", "varchar(250) NOT NULL default ''", "filename" ); + if (!$updateFPL) { + $msgSQL .= 'Error while updating Filename Play column
'; + } + + $updateIFS1 = false; + $updateIFS1 = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "image_filename_spec1", "varchar(250) NOT NULL default ''", "filename" ); + if (!$updateIFS1) { + $msgSQL .= 'Error while updating Image Filename Spec1 column
'; + } + + $updateIFS2 = false; + $updateIFS2 = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "image_filename_spec2", "varchar(250) NOT NULL default ''", "filename" ); + if (!$updateIFS2) { + $msgSQL .= 'Error while updating Image Filename Spec2 column
'; + } + + // ------------------------------------------ + // PHOCA DOWNLOAD UPDATE 1.3.0 + // ------------------------------------------ + + // Approved + $updateApr = false; + $updateApr = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "approved", "tinyint(1) NOT NULL default '0'", "published" ); + if (!$updateApr) { + $msgSQL .= 'Error while updating Approved column
'; + } + + // Upload + $updateUpl = false; + $updateUpl = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload_categories", "uploaduserid", "text", "access" ); + if (!$updateUpl) { + $msgSQL .= 'Error while updating Upload User ID column
'; + } + + // Owner ID + $updateOid = false; + $updateOid = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "owner_id", "int(11) NOT NULL default '0'", "id" ); + if (!$updateOid) { + $msgSQL .= 'Error while updating Owner ID column
'; + } + + // Owner ID + $fileSize = false; + $fileSize = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload", "filesize", "int(11) NOT NULL default '0'", "filename" ); + if (!$fileSize) { + $msgSQL .= 'Error while updating File Size column
'; + } + + // ------------------------------------------ + // PHOCA DOWNLOAD UPDATE 1.3.2 + // ------------------------------------------ + + $updateMK = false; + $errorMsg = ''; + $updateMK = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "metakey", "text", "params" ); + if (!$updateMK) { + $msgSQL .= 'Error while updating Metakey (File) column'; + } + $updateMKC = false; + $errorMsg = ''; + $updateMKC = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload_categories", "metakey", "text", "params" ); + if (!$updateMKC) { + $msgSQL .= 'Error while updating Metakey (Category) column'; + } + $updateMKS = false; + $errorMsg = ''; + $updateMKS = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload_sections", "metakey", "text", "params" ); + if (!$updateMKS) { + $msgSQL .= 'Error while updating Metakey (Section) column'; + } + $updateMD = false; + $errorMsg = ''; + $updateMD = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "metadesc", "text", "params" ); + if (!$updateMD) { + $msgSQL .= 'Error while updating Metadesc (File) column'; + } + $updateMDC = false; + $errorMsg = ''; + $updateMDC = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload_categories", "metadesc", "text", "params" ); + if (!$updateMDC) { + $msgSQL .= 'Error while updating Metadesc (Category) column'; + } + $updateMDS = false; + $errorMsg = ''; + $updateMDS = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload_sections", "metadesc", "text", "params" ); + if (!$updateMDS) { + $msgSQL .= 'Error while updating Metadesc (Section) column'; + } + + // ------------------------------------------ + // PHOCA DOWNLOAD UPDATE 1.3.4 + // ------------------------------------------ + + $query=' SELECT title FROM '.$db->quoteName('#__phocadownload_settings').' WHERE title = \'description\' LIMIT 1;'."\n"; + $db->setQuery($query); + + if (!$result = $db->loadObject()) { + $query = "INSERT INTO ".$db->quoteName('#__phocadownload_settings')." VALUES (null, 'description', '','', 'textareaeditor');"."\n"; + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + } + + $updatePU = false; + $errorMsg = ''; + $updatePU = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "publish_up", "datetime NOT NULL default '0000-00-00 00:00:00'", "date" ); + if (!$updatePU) { + $msgSQL .= 'Error while updating Publish Up column'; + } + + $updatePD = false; + $errorMsg = ''; + $updatePD = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "publish_down", "datetime NOT NULL default '0000-00-00 00:00:00'", "date" ); + if (!$updatePD) { + $msgSQL .= 'Error while updating Publish Down column'; + } + + + // ------------------------------------------ + // PHOCA DOWNLOAD UPDATE 1.3.4 + // ------------------------------------------ + + // Access User ID + $updateAid = false; + $updateAid = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload_categories", "accessuserid", "text", "access" ); + if (!$updateAid) { + $msgSQL .= 'Error while updating Access User ID column
'; + } + + // Delete User ID + $updateDid = false; + $updateDid = $this->AddColumnIfNotExists($errorMsg, "#__phocadownload_categories", "deleteuserid", "text", "access" ); + if (!$updateDid) { + $msgSQL .= 'Error while updating Delete User ID column
'; + } + + */ + // CHECK TABLES + + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload_categories').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + /* + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload_sections').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload_settings').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + */ + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload_user_stat').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload_licenses').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload_tags').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadResult(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + + $query =' SELECT * FROM '.$db->quoteName('#__phocadownload_layout').' LIMIT 1;'; + $db->setQuery( $query ); + $result = $db->loadObjectList(); + if ($db->getErrorNum()) { + $msgSQL .= $db->getErrorMsg(). '
'; + } + + if ((!isset($result->categories) && !isset($result->category) && !isset($result->file)) || + (isset($result->categories) && $result->category == '' && isset($result->category) && $result->category == '' && isset($result->file) && $result->file == '') + ) { + + $query ='INSERT INTO '.$db->quoteName('#__phocadownload_layout').' ('."\n"; + $query.=' '.$db->quoteName('id').' ,'."\n"; + $query.=' '.$db->quoteName('categories').' ,'."\n"; + $query.=' '.$db->quoteName('category').' ,'."\n"; + $query.=' '.$db->quoteName('file').' ,'."\n"; + $query.=' '.$db->quoteName('checked_out').' ,'."\n"; + $query.=' '.$db->quoteName('checked_out_time').' ,'."\n"; + $query.=' '.$db->quoteName('params').' )'."\n"; + $query.=' VALUES ('."\n"; + $query.=' NULL,'."\n"; + + $query.=' '.$db->Quote('
+
{pdtitle}
+{pdsubcategories} +{pdclear} +
').','."\n"; + $query.=' '.$db->Quote('
+{pdfiledesctop} +{pdfile} +
{pdbuttondownload}
+
{pdbuttondetails}
+
{pdbuttonpreview}
+
{pdbuttonplay}
+
{pdmirrorlink2} {pdmirrorlink1}
+
{pdrating}
+
{pdtags}
+{pdfiledescbottom} +
+
').','."\n"; + $query.=' '.$db->Quote('
+{pdimage} +{pdfile} +{pdfilesize} +{pdversion} +{pdlicense} +{pdauthor} +{pdauthoremail} +{pdfiledate} +{pddownloads} +{pddescription} +{pdfeatures} +{pdchangelog} +{pdnotes} +
{pdmirrorlink2} {pdmirrorlink1}
+
{pdreportlink}
+
{pdrating}
+
{pdtags}
+
+
').','."\n"; + $query.=' '.$db->Quote('0').','."\n"; + $query.=' '.$db->Quote('0000-00-00 00:00:00').','."\n"; + $query.=' NULL'."\n"; + $query.=' );'."\n"; + + $db->setQuery( $query ); + if (!$result = $db->query()){$msgSQL .= $db->stderr() . '
';} + } + // - - - - - - - - - - - - - - - - + + + // ------------------------------------------ + // PHOCA DOWNLOAD UPDATE 2.1.1 + // ------------------------------------------ + + $updateVL = false; + $errorMsg = ''; + $updateVL = $this->AddColumnIfNotExists( $errorMsg, "#__phocadownload", "video_filename", "varchar(255) NOT NULL default ''", "params" ); + if (!$updateVL) { + $msgSQL .= 'Error while updating Video Filename column'; + } + + + + // Error + if ($msgSQL !='') { + $msgError .= '
' . $msgSQL; + } + if ($msgFile !='') { + $msgError .= '
' . $msgFile; + } + + // End Message + if ($msgError !='') { + $msg = JText::_( 'Phoca Download not successfully upgraded' ) . ': ' . $msgError; + } else { + $msg = JText::_( 'Phoca Download successfully upgraded' ); + } + + $link = 'index.php?option=com_phocadownload'; + $this->setRedirect($link, $msg); + } + + function AddColumnIfNotExists(&$errorMsg, $table, $column, $attributes = "INT( 11 ) NOT NULL default '0'", $after = '' ) { + + + $db = JFactory::getDBO(); + $columnExists = false; + + $query = 'SHOW COLUMNS FROM '.$table; + $db->setQuery( $query ); + if (!$result = $db->query()){return false;} + $columnData = $db->loadObjectList(); + + foreach ($columnData as $valueColumn) { + if ($valueColumn->Field == $column) { + $columnExists = true; + break; + } + } + + if (!$columnExists) { + if ($after != '') { + $query = 'ALTER TABLE '.$db->quoteName($table).' ADD '.$db->quoteName($column).' '.$attributes.' AFTER '.$db->quoteName($after).';'; + } else { + $query = 'ALTER TABLE '.$db->quoteName($table).' ADD '.$db->quoteName($column).' '.$attributes.';'; + } + $db->setQuery( $query ); + if (!$result = $db->query()){return false;} + $errorMsg = 'notexistcreated'; + } + + return true; + } +} +// utf-8 test: ä,ö,ü,ø,ž +?> \ No newline at end of file diff --git a/controllers/phocadownloadlayout.php b/controllers/phocadownloadlayout.php new file mode 100644 index 0000000..5a854b7 --- /dev/null +++ b/controllers/phocadownloadlayout.php @@ -0,0 +1,110 @@ +clean(); + } + } + + protected function allowAdd($data = array()) { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.create', 'com_phocadownload'); + if ($allow === null) { + return parent::allowAdd($data); + } else { + return $allow; + } + } + + protected function allowEdit($data = array(), $key = 'id') { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.edit', 'com_phocadownload'); + if ($allow === null) { + return parent::allowEdit($data, $key); + } else { + return $allow; + } + } + + public function back($key = null) { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + + // Initialise variables. + $app = JFactory::getApplication(); + $model = $this->getModel(); + $table = $model->getTable(); + $checkin = property_exists($table, 'checked_out'); + $context = "$this->option.edit.$this->context"; + + if (empty($key)) + { + $key = $table->getKeyName(); + } + + $recordId = JRequest::getInt($key); + + + // Attempt to check-in the current record. + if ($recordId) + { + // Check we are holding the id in the edit list. + if (!$this->checkEditId($context, $recordId)) + { + // Somehow the person just went to the form - we don't allow that. + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_UNHELD_ID', $recordId)); + $this->setMessage($this->getError(), 'error'); + $this->setRedirect(JRoute::_('index.php?option=' . $this->option, false)); + + return false; + } + + if ($checkin) + { + if ($model->checkin($recordId) === false) + { + // Check-in failed, go back to the record and display a notice. + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_CHECKIN_FAILED', $model->getError())); + $this->setMessage($this->getError(), 'error'); + $this->setRedirect(JRoute::_('index.php?option=' . $this->option, false)); + + return false; + } + } + } + + // Clean the session data and redirect. + $this->releaseEditId($context, $recordId); + $app->setUserState($context . '.data', null); + $this->setRedirect(JRoute::_('index.php?option=' . $this->option, false)); + + return true; + } +} \ No newline at end of file diff --git a/controllers/phocadownloadlayouts.php b/controllers/phocadownloadlayouts.php new file mode 100644 index 0000000..50e3084 --- /dev/null +++ b/controllers/phocadownloadlayouts.php @@ -0,0 +1,18 @@ + diff --git a/controllers/phocadownloadlic.php b/controllers/phocadownloadlic.php new file mode 100644 index 0000000..06b7462 --- /dev/null +++ b/controllers/phocadownloadlic.php @@ -0,0 +1,45 @@ +authorise('core.create', 'com_phocadownload'); + if ($allow === null) { + return parent::allowAdd($data); + } else { + return $allow; + } + } + + protected function allowEdit($data = array(), $key = 'id') { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.edit', 'com_phocadownload'); + if ($allow === null) { + return parent::allowEdit($data, $key); + } else { + return $allow; + } + } + +} +?> diff --git a/controllers/phocadownloadlics.php b/controllers/phocadownloadlics.php new file mode 100644 index 0000000..ee5d42c --- /dev/null +++ b/controllers/phocadownloadlics.php @@ -0,0 +1,36 @@ + true)); + return $model; + } + + public function saveOrderAjax() { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + JArrayHelper::toInteger($pks); + JArrayHelper::toInteger($order); + $model = $this->getModel(); + $return = $model->saveorder($pks, $order); + if ($return) { echo "1";} + JFactory::getApplication()->close(); + } +} +?> \ No newline at end of file diff --git a/controllers/phocadownloadlinkfile.php b/controllers/phocadownloadlinkfile.php new file mode 100644 index 0000000..67a4725 --- /dev/null +++ b/controllers/phocadownloadlinkfile.php @@ -0,0 +1,18 @@ + diff --git a/controllers/phocadownloadlogs.php b/controllers/phocadownloadlogs.php new file mode 100644 index 0000000..4baae69 --- /dev/null +++ b/controllers/phocadownloadlogs.php @@ -0,0 +1,32 @@ +registerTask( 'reset', 'reset'); + } + + function reset() { + + $model = $this->getModel( 'phocadownloadlog' ); + + if ($model->reset($cid)) { + $msg = JText::_( 'COM_PHOCADOWNLOAD_SUCCESS_RESET_LOG_STAT' ); + } else { + $msg = JText::_( 'COM_PHOCADOWNLOAD_ERROR_RESET_LOG_STAT' ); + } + + $link = 'index.php?option=com_phocadownload&view=phocadownloadlogs'; + $this->setRedirect($link, $msg); + } +} +?> diff --git a/controllers/phocadownloadm.php b/controllers/phocadownloadm.php new file mode 100644 index 0000000..7d6c198 --- /dev/null +++ b/controllers/phocadownloadm.php @@ -0,0 +1,56 @@ +layout = 'edit'; + } + + protected function allowAdd($data = array()) { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.create', 'com_phocadownload'); + if ($allow === null) { + return parent::allowAdd($data); + } else { + return $allow; + } + } + + protected function allowEdit($data = array(), $key = 'id') { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.edit', 'com_phocadownload'); + if ($allow === null) { + return parent::allowEdit($data, $key); + } else { + return $allow; + } + } + + function edit($key = NULL, $urlVar = NULL) { + $this->setRedirect(JRoute::_('index.php?option='.$this->option.'&view='.$this->view_list.'&layout='.$this->layout.'&manager=filemultiple', false)); + } + + function cancel($key = NULL) { + $this->setRedirect( 'index.php?option=com_phocadownload&view=phocadownloadfiles' ); + } +} +?> diff --git a/controllers/phocadownloadrafile.php b/controllers/phocadownloadrafile.php new file mode 100644 index 0000000..a5c4fbf --- /dev/null +++ b/controllers/phocadownloadrafile.php @@ -0,0 +1,33 @@ + true)); + return $model; + } + + public function saveOrderAjax() { + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + JArrayHelper::toInteger($pks); + JArrayHelper::toInteger($order); + $model = $this->getModel(); + $return = $model->saveorder($pks, $order); + if ($return) { echo "1";} + JFactory::getApplication()->close(); + } +} +?> \ No newline at end of file diff --git a/controllers/phocadownloadset.php b/controllers/phocadownloadset.php new file mode 100644 index 0000000..c9c7fbb --- /dev/null +++ b/controllers/phocadownloadset.php @@ -0,0 +1,67 @@ +registerTask( 'apply' , 'save' ); + } + + function save() { + $post = JRequest::get('post'); + $phocaSet = JRequest::getVar( 'phocaset', array(0), 'post', 'array' ); + + $model = $this->getModel( 'phocadownloadset' ); + $errorMsg = ''; + switch ( JRequest::getCmd('task') ) { + case 'apply': + + if ($model->store($phocaSet, $errorMsg)) { + $msg = JText::_( 'Changes to Phoca Download Settings Saved' ); + if ($errorMsg != '') { + $msg .= '
'.JText::_($errorMsg); + } + } else { + $msg = JText::_( 'Error Saving Phoca Download Settings' ); + } + $this->setRedirect( 'index.php?option=com_phocadownload&view=phocadownloadset', $msg ); + break; + + case 'save': + default: + if ($model->store($phocaSet, $errorMsg)) { + $msg = JText::_( 'Phoca Download Settings Saved' ); + if ($errorMsg != '') { + $msg .= '
'.JText::_($errorMsg); + } + } else { + $msg = JText::_( 'Error Saving Phoca Download Settings' ); + } + $this->setRedirect( 'index.php?option=com_phocadownload', $msg ); + break; + } + // Check the table in so it can be edited.... we are done with it anyway + $model->checkin(); + } + + + function cancel($key = NULL) { + $model = $this->getModel( 'phocadownload' ); + $model->checkin(); + + $this->setRedirect( 'index.php?option=com_phocadownload' ); + } +} +?> diff --git a/controllers/phocadownloadstat.php b/controllers/phocadownloadstat.php new file mode 100644 index 0000000..901379f --- /dev/null +++ b/controllers/phocadownloadstat.php @@ -0,0 +1,44 @@ +getModel( 'phocadownload' ); + $model->checkin(); + + $this->setRedirect( 'index.php?option=com_phocadownload' ); + }*/ + + public function back($key = null) { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + $this->setRedirect(JRoute::_('index.php?option=com_phocadownload', false)); + + return true; + } + + public function saveOrderAjax() { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + JArrayHelper::toInteger($pks); + JArrayHelper::toInteger($order); + $model = $this->getModel(); + $return = $model->saveorder($pks, $order); + if ($return) { echo "1";} + JFactory::getApplication()->close(); + } +} +?> diff --git a/controllers/phocadownloadstyle.php b/controllers/phocadownloadstyle.php new file mode 100644 index 0000000..e82a414 --- /dev/null +++ b/controllers/phocadownloadstyle.php @@ -0,0 +1,43 @@ +authorise('core.create', 'com_phocadownload'); + if ($allow === null) { + return parent::allowAdd($data); + } else { + return $allow; + } + } + + protected function allowEdit($data = array(), $key = 'id') { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.edit', 'com_phocadownload'); + if ($allow === null) { + return parent::allowEdit($data, $key); + } else { + return $allow; + } + } +} +?> diff --git a/controllers/phocadownloadstyles.php b/controllers/phocadownloadstyles.php new file mode 100644 index 0000000..e891d82 --- /dev/null +++ b/controllers/phocadownloadstyles.php @@ -0,0 +1,37 @@ +registerTask('apply', 'save'); + } + + public function &getModel($name = 'PhocaDownloadStyle', $prefix = 'PhocaDownloadCpModel') { + $model = parent::getModel($name, $prefix, array('ignore_request' => true)); + return $model; + } + + public function saveOrderAjax() { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + JArrayHelper::toInteger($pks); + JArrayHelper::toInteger($order); + $model = $this->getModel(); + $return = $model->saveorder($pks, $order); + if ($return) { echo "1";} + JFactory::getApplication()->close(); + } +} +?> \ No newline at end of file diff --git a/controllers/phocadownloadtag.php b/controllers/phocadownloadtag.php new file mode 100644 index 0000000..5a4ccfc --- /dev/null +++ b/controllers/phocadownloadtag.php @@ -0,0 +1,45 @@ +authorise('core.create', 'com_phocadownload'); + if ($allow === null) { + return parent::allowAdd($data); + } else { + return $allow; + } + } + + protected function allowEdit($data = array(), $key = 'id') { + $user = JFactory::getUser(); + $allow = null; + $allow = $user->authorise('core.edit', 'com_phocadownload'); + if ($allow === null) { + return parent::allowEdit($data, $key); + } else { + return $allow; + } + } + +} +?> diff --git a/controllers/phocadownloadtags.php b/controllers/phocadownloadtags.php new file mode 100644 index 0000000..590b681 --- /dev/null +++ b/controllers/phocadownloadtags.php @@ -0,0 +1,34 @@ + true)); + return $model; + } + + public function saveOrderAjax() { + JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN')); + $pks = $this->input->post->get('cid', array(), 'array'); + $order = $this->input->post->get('order', array(), 'array'); + JArrayHelper::toInteger($pks); + JArrayHelper::toInteger($order); + $model = $this->getModel(); + $return = $model->saveorder($pks, $order); + if ($return) { echo "1";} + JFactory::getApplication()->close(); + } +} +?> \ No newline at end of file diff --git a/controllers/phocadownloaduninstall.php b/controllers/phocadownloaduninstall.php new file mode 100644 index 0000000..a93d277 --- /dev/null +++ b/controllers/phocadownloaduninstall.php @@ -0,0 +1,37 @@ +registerTask( 'remove' , 'remove' ); + $this->registerTask( 'keep' , 'keep' ); + } + + + + function remove() + { + + } + + function keep() + { + + } +} \ No newline at end of file diff --git a/controllers/phocadownloadupload.php b/controllers/phocadownloadupload.php new file mode 100644 index 0000000..db45dd2 --- /dev/null +++ b/controllers/phocadownloadupload.php @@ -0,0 +1,116 @@ +get( 'folder_permissions', 0755 ); + //$folder_permissions = octdec((int)$folder_permissions); + + + $folderNew = JRequest::getCmd( 'foldername', ''); + $folderCheck = JRequest::getVar( 'foldername', null, '', 'string', JREQUEST_ALLOWRAW); + $parent = JRequest::getVar( 'folderbase', '', '', 'path' ); + $tab = JRequest::getVar( 'tab', 0, '', 'string' ); + $field = JRequest::getVar( 'field'); + $viewBack = JRequest::getVar( 'viewback', '', '', 'phocadownloadmanager' ); + $manager = JRequest::getVar( 'manager', 'file', '', 'string' ); + + + $link = ''; + if ($manager != '') { + $group = PhocaDownloadSettings::getManagerGroup($manager); + $link = 'index.php?option=com_phocadownload&view='.(string)$viewBack.'&manager='.(string)$manager + .str_replace('&', '&', $group['c']).'&folder='.$parent.'&tab='.(string)$tab.'&field='.$field; + $path = PhocaDownloadPath::getPathSet($manager);// we use viewback to get right path + } else { + + $app->enqueueMessage( JText::_('COM_PHOCADOWNLOAD_ERROR_CONTROLLER_MANAGER_NOT_SET')); + $app->redirect('index.php?option=com_phocadownload'); + exit; + } + + JRequest::setVar('folder', $parent); + + if (($folderCheck !== null) && ($folderNew !== $folderCheck)) { + $app->enqueueMessage( JText::_('COM_PHOCADOWNLOAD_WARNING_DIRNAME')); + $app->redirect($link); + } + + if (strlen($folderNew) > 0) { + $folder = JPath::clean($path['orig_abs_ds'].$parent.DS.$folderNew); + + if (!JFolder::exists($folder) && !JFile::exists($folder)) { + //JFolder::create($path, $folder_permissions ); + + switch((int)$folder_permissions) { + case 777: + JFolder::create($folder, 0777 ); + break; + case 705: + JFolder::create($folder, 0705 ); + break; + case 666: + JFolder::create($folder, 0666 ); + break; + case 644: + JFolder::create($folder, 0644 ); + break; + case 755: + Default: + JFolder::create($folder, 0755 ); + break; + } + if (isset($folder)) { + $data = "\n\n\n"; + JFile::write($folder.DS."index.html", $data); + } else { + $app->redirect($link, JText::_('COM_PHOCADOWNLOAD_ERROR_FOLDER_CREATING')); + } + + $app->redirect($link, JText::_('COM_PHOCADOWNLOAD_SUCCESS_FOLDER_CREATING')); + } else { + $app->redirect($link, JText::_('COM_PHOCADOWNLOAD_ERROR_FOLDER_CREATING_EXISTS')); + } + //JRequest::setVar('folder', ($parent) ? $parent.'/'.$folder : $folder); + } + $app->redirect($link); + } + + function multipleupload() { + $result = PhocaDownloadFileUpload::realMultipleUpload(); + return true; + } + + function upload() { + $result = PhocaDownloadFileUpload::realSingleUpload(); + return true; + } + + +} \ No newline at end of file diff --git a/controllers/phocadownloaduploads.php b/controllers/phocadownloaduploads.php new file mode 100644 index 0000000..6283872 --- /dev/null +++ b/controllers/phocadownloaduploads.php @@ -0,0 +1,30 @@ +registerTask( 'approveall', 'approveall'); + } + + function approveall() { + + $model = $this->getModel('phocadownloadupload'); + if(!$model->approveall()) { + $msg = JText::_( 'COM_PHOCADOWNLOAD_ERROR_APPROVE_ALL' ); + } else { + $msg = JText::_( 'COM_PHOCADOWNLOAD_ALL_APPROVED' ); + } + + $this->setRedirect( 'index.php?option=com_phocadownload&view=phocadownloaduploads' , $msg); + } +} +?> diff --git a/help/en-GB/index.html b/help/en-GB/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/help/en-GB/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/help/en-GB/logo-phoca.png b/help/en-GB/logo-phoca.png new file mode 100644 index 0000000000000000000000000000000000000000..07de88231795227d6b53985c4d332bf0a76e4a4b GIT binary patch literal 6474 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 literal 0 HcmV?d00001 diff --git a/help/en-GB/screen.phocadownload.html b/help/en-GB/screen.phocadownload.html new file mode 100644 index 0000000..c73d426 --- /dev/null +++ b/help/en-GB/screen.phocadownload.html @@ -0,0 +1,31 @@ + + + + +Phoca Download + + + + +

Phoca Download

+
+ +
+

 

+

 

+

+Phoca Download Main Site
+Phoca Download User Manual
+Phoca Download Forum
+

+

 

+

 

+

 

+Close window + + \ No newline at end of file diff --git a/help/index.html b/help/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/help/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/help/logo-phoca.png b/help/logo-phoca.png new file mode 100644 index 0000000000000000000000000000000000000000..07de88231795227d6b53985c4d332bf0a76e4a4b GIT binary patch literal 6474 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 literal 0 HcmV?d00001 diff --git a/help/screen.phocadownload.html b/help/screen.phocadownload.html new file mode 100644 index 0000000..c73d426 --- /dev/null +++ b/help/screen.phocadownload.html @@ -0,0 +1,31 @@ + + + + +Phoca Download + + + + +

Phoca Download

+
+ +
+

 

+

 

+

+Phoca Download Main Site
+Phoca Download User Manual
+Phoca Download Forum
+

+

 

+

 

+

 

+Close window + + \ No newline at end of file diff --git a/helpers/index.html b/helpers/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/helpers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/helpers/phocadownloadcats.php b/helpers/phocadownloadcats.php new file mode 100644 index 0000000..19c7f22 --- /dev/null +++ b/helpers/phocadownloadcats.php @@ -0,0 +1,29 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadcp.php b/helpers/phocadownloadcp.php new file mode 100644 index 0000000..d45ed77 --- /dev/null +++ b/helpers/phocadownloadcp.php @@ -0,0 +1,24 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloaddownloads.php b/helpers/phocadownloaddownloads.php new file mode 100644 index 0000000..b5fc034 --- /dev/null +++ b/helpers/phocadownloaddownloads.php @@ -0,0 +1,30 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadfiles.php b/helpers/phocadownloadfiles.php new file mode 100644 index 0000000..3e74516 --- /dev/null +++ b/helpers/phocadownloadfiles.php @@ -0,0 +1,29 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadlayouts.php b/helpers/phocadownloadlayouts.php new file mode 100644 index 0000000..7f5014c --- /dev/null +++ b/helpers/phocadownloadlayouts.php @@ -0,0 +1,51 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } + + public static function getTableId() { + + $idString = ''; + $db = JFactory::getDBO(); + $query = ' SELECT a.id' + .' FROM #__phocadownload_layout AS a'; + $db->setQuery($query, 0,1); + + if (!$db->query()) { + $this->setError('Database Error - Getting Layout ID'); + return false; + } + $idO = $db->loadObject(); + + //First autoincrement line can be different + if (isset($idO->id) && $idO->id > 0) { + $idString = '&id='.(int)$idO->id; + } + return $idString; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadlics.php b/helpers/phocadownloadlics.php new file mode 100644 index 0000000..b191f52 --- /dev/null +++ b/helpers/phocadownloadlics.php @@ -0,0 +1,29 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadlogs.php b/helpers/phocadownloadlogs.php new file mode 100644 index 0000000..5a2a519 --- /dev/null +++ b/helpers/phocadownloadlogs.php @@ -0,0 +1,30 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadmanager.php b/helpers/phocadownloadmanager.php new file mode 100644 index 0000000..6e2a456 --- /dev/null +++ b/helpers/phocadownloadmanager.php @@ -0,0 +1,36 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadrafile.php b/helpers/phocadownloadrafile.php new file mode 100644 index 0000000..60ad878 --- /dev/null +++ b/helpers/phocadownloadrafile.php @@ -0,0 +1,36 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadrate.php b/helpers/phocadownloadrate.php new file mode 100644 index 0000000..2e97e4a --- /dev/null +++ b/helpers/phocadownloadrate.php @@ -0,0 +1,313 @@ +setQuery($query, 0, 1); + $votesStatistics = $db->loadObject(); + // if no count, set the average to 0 + if($votesStatistics->count == 0) { + $votesStatistics->count = (int)0; + $votesStatistics->average = (float)0; + } + + if (isset($votesStatistics->count) && isset($votesStatistics->average)) { + // Insert or update + $query = 'SELECT vs.id AS id' + .' FROM #__phocadownload_file_votes_statistics AS vs' + .' WHERE vs.fileid = '.(int) $fileid; + $db->setQuery($query, 0, 1); + $votesStatisticsId = $db->loadObject(); + + // Yes, there is id (UPDATE) x No, there isn't (INSERT) + if (!empty($votesStatisticsId->id)) { + + $query = 'UPDATE #__phocadownload_file_votes_statistics' + .' SET count = ' .(int)$votesStatistics->count + .' , average = ' .(float)$votesStatistics->average + .' WHERE fileid = '.(int) $fileid; + $db->setQuery($query); + + if (!$db->query()) { + $this->setError('Database Error Voting 1'); + return false; + } + + } else { + + $query = 'INSERT into #__phocadownload_file_votes_statistics' + .' (id, fileid, count, average)' + .' VALUES (null, '.(int)$fileid + .' , '.(int)$votesStatistics->count + .' , '.(float)$votesStatistics->average + .')'; + $db->setQuery($query); + + if (!$db->query()) { + $this->setError('Database Error Voting 2'); + return false; + } + + } + } else { + return false; + } + return true; + } + + function getVotesStatisticsFile($id) { + + $db = JFactory::getDBO(); + $query = 'SELECT vs.count AS count, vs.average AS average' + .' FROM #__phocadownload_file_votes_statistics AS vs' + .' WHERE vs.fileid = '.(int) $id; + $db->setQuery($query, 0, 1); + $votesStatistics = $db->loadObject(); + + return $votesStatistics; + } + + function checkUserVoteFile($fileid, $userid) { + + $db = JFactory::getDBO(); + $query = 'SELECT v.id AS id' + .' FROM #__phocadownload_file_votes AS v' + .' WHERE v.fileid = '. (int)$fileid + .' AND v.userid = '. (int)$userid; + $db->setQuery($query, 0, 1); + $checkUserVote = $db->loadObject(); + if ($checkUserVote) { + return true; + } + return false; + } + + + public function renderRateFile($id, $displayRating, $small = 1, $refresh = false) { + + $user = JFactory::getUser(); + $neededAccessLevels = PhocaDownloadAccess::getNeededAccessLevels(); + $access = PhocaDownloadAccess::isAccess($user->getAuthorisedViewLevels(), $neededAccessLevels); + + + if ($small == 1) { + $smallO = '-small'; + $ratio = 18; + } else { + $smallO = ''; + $ratio = 22; + } + + $o = ''; + + //.$rating['urlvote'].$amp.'controller=detail&task=rate&rating=1 + //$amp = PhocaDownloadUtils::setQuestionmarkOrAmp($rating['urlvote']); + $href = 'javascript:void(0);'; + + if ((int)$displayRating != 1) { + return ''; + } else { + + $rating['alreadyratedfile'] = self::checkUserVoteFile( (int)$id, (int)$user->id ); + + $rating['notregisteredfile'] = true; + //$rating['usernamefile'] = ''; + if ($access > 0) { + $rating['notregisteredfile'] = false; + $rating['usernamefile'] = $user->name; + } + + $rating['votescountfile'] = 0; + $rating['votesaveragefile'] = 0; + $rating['voteswidthfile'] = 0; + $votesStatistics = self::getVotesStatisticsFile((int)$id); + if (!empty($votesStatistics->count)) { + $rating['votescountfile'] = $votesStatistics->count; + } + if (!empty($votesStatistics->average)) { + $rating['votesaveragefile'] = $votesStatistics->average; + if ($rating['votesaveragefile'] > 0) { + $rating['votesaveragefile'] = round(((float)$rating['votesaveragefile'] / 0.5)) * 0.5; + $rating['voteswidthfile'] = $ratio * $rating['votesaveragefile']; + } else { + $rating['votesaveragefile'] = (int)0;// not float displaying + } + } + + // Leave message for already voted images + //$vote = JRequest::getVar('vote', 0, '', 'int'); + $voteMsg = JText::_('COM_PHOCADOWNLOAD_RATING_ALREADY_RATED_FILE'); + //if ($vote == 1) { + // $voteMsg = JText::_('COM_PHOCADOWNLOAD_ALREADY_RATED_FILE_THANKS'); + //} + + $rating['votestextimg'] = 'VOTE'; + if ((int)$rating['votescountfile'] > 1) { + $rating['votestextimg'] = 'VOTES'; + } + + $o .= '
' + . JText::_('COM_PHOCADOWNLOAD_RATING'). ': ' . $rating['votesaveragefile'] .' / ' + .$rating['votescountfile'] . ' ' . JText::_('COM_PHOCADOWNLOAD_'.$rating['votestextimg']). '  
'; + + if ($rating['alreadyratedfile']) { + $o .= '
    ' + .'
  • ' + .'
  • '; + + for ($i = 2;$i < 6;$i++) { + $o .= '
  • '; + } + $o .= '
'; + + $or ='
'.JText::_('COM_PHOCADOWNLOAD_RATING_ALREADY_RATED_FILE').'
'; + + } else if ($rating['notregisteredfile']) { + + $o .= '
    ' + .'
  • ' + .'
  • '; + + for ($i = 2;$i < 6;$i++) { + $o .= '
  • '; + } + $o .= '
'; + + $or ='
'.JText::_('COM_PHOCADOWNLOAD_ONLY_REGISTERED_LOGGED_RATE_FILE').'
'; + + } else { + + $o .= '
    ' + .'
  • ' + .'
  • 1
  • '; + + for ($i = 2;$i < 6;$i++) { + $o .= '
  • '.$i.'
  • '; + } + $o .= '
'; + + $or ='
'; + } + + + + } + + if ($refresh == true) { + return $o;//we are in Ajax, return only content of pdvoting div + } else { + return '
'.$o.'
' .$or ;//not in ajax, return the contend in div + } + + + } + + public function renderRateFileJS($small = 1) { + + $document = JFactory::getDocument(); + $url = 'index.php?option=com_phocadownload&view=ratingfilea&task=rate&format=json&'.JSession::getFormToken().'=1'; + $urlRefresh = 'index.php?option=com_phocadownload&view=ratingfilea&task=refreshrate&small='.$small.'&format=json&'.JSession::getFormToken().'=1'; + $imgLoadingUrl = JURI::base(). 'components/com_phocadownload/assets/images/icon-loading2.gif'; + $imgLoadingHTML = ''; + $js = ''; + $document->addCustomTag($js); + + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadstat.php b/helpers/phocadownloadstat.php new file mode 100644 index 0000000..79ab1be --- /dev/null +++ b/helpers/phocadownloadstat.php @@ -0,0 +1,29 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadstyles.php b/helpers/phocadownloadstyles.php new file mode 100644 index 0000000..057a5d9 --- /dev/null +++ b/helpers/phocadownloadstyles.php @@ -0,0 +1,29 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloadtags.php b/helpers/phocadownloadtags.php new file mode 100644 index 0000000..d404577 --- /dev/null +++ b/helpers/phocadownloadtags.php @@ -0,0 +1,29 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocadownloaduploads.php b/helpers/phocadownloaduploads.php new file mode 100644 index 0000000..24b4b90 --- /dev/null +++ b/helpers/phocadownloaduploads.php @@ -0,0 +1,29 @@ +set($action, $user->authorise($action, $assetName)); + } + return $result; + } +} +?> \ No newline at end of file diff --git a/helpers/phocauserstat.php b/helpers/phocauserstat.php new file mode 100644 index 0000000..5af96a9 --- /dev/null +++ b/helpers/phocauserstat.php @@ -0,0 +1,62 @@ +quoteName('#__phocadownload_user_stat') + .' WHERE '. $db->quoteName('userid') + .' = ' + .$db->Quote((int)$user->id) + .' AND '. $db->quoteName('fileid') + .' = ' + .$db->Quote((int)$downloadId); + + $db->setQuery($query); + $results = $db->loadObjectList(); + + $date = gmdate('Y-m-d H:i:s'); + if ($results) { + // Update count + $query = 'UPDATE '.$db->quoteName('#__phocadownload_user_stat') + .' SET count = (count + 1),' + .' date = '.$db->Quote($date) + .' WHERE userid = '.$db->Quote((int)$user->id) + .' AND fileid = '.$db->Quote((int)$downloadId); + + $db->setQuery($query); + $db->query(); + } else { + + $query = 'INSERT INTO '.$db->quoteName('#__phocadownload_user_stat') + .' ('.$db->quoteName('count').',' + .' '.$db->quoteName('userid').',' + .' '.$db->quoteName('fileid').',' + .' '.$db->quoteName('date').')' + .' VALUES ('.$db->Quote(1).',' + .' '.$db->Quote((int)$user->id).',' + .' '.$db->Quote((int)$downloadId).',' + .' '.$db->Quote($date).')'; + $db->setQuery($query); + $db->query(); + } + return true; + } +} +?> \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/install/index.html b/install/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/install/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/install/script.php b/install/script.php new file mode 100644 index 0000000..740abad --- /dev/null +++ b/install/script.php @@ -0,0 +1,140 @@ +' . JText::_('COM_PHOCAGALLLERY_INSTALL_TEXT') . '

'; + + + $folder[0][0] = 'phocadownload' ; + $folder[0][1] = JPATH_ROOT . DS . $folder[0][0]; + + $folder[1][0] = 'images' . DS . 'phocadownload' ; + $folder[1][1] = JPATH_ROOT . DS . $folder[1][0]; + + $folder[2][0] = 'phocadownload' . DS .'userupload'; + $folder[2][1] = JPATH_ROOT . DS . $folder[2][0]; + + $folder[3][0] = 'phocadownloadpap'; + $folder[3][1] = JPATH_ROOT . DS . $folder[3][0]; + + $folder[4][0] = 'phocadownloadpap' . DS .'userupload'; + $folder[4][1] = JPATH_ROOT . DS . $folder[4][0]; + + $message = ''; + $error = array(); + foreach ($folder as $key => $value) + { + if (!JFolder::exists( $value[1])) + { + if (JFolder::create( $value[1], 0755 )) + { + + $data = "\n\n\n"; + JFile::write($value[1].DS."index.html", $data); + $message .= '
Folder ' . $value[0] + .' created!
'; + $error[] = 0; + } + else + { + $message .= '
Folder ' . $value[0] + .' creation failed! Please create it manually.
'; + $error[] = 1; + } + } + else//Folder exist + { + $message .= '
Folder ' . $value[0] + .' exists!
'; + $error[] = 0; + } + } + + + JFactory::getApplication()->enqueueMessage($message, 'message'); + //$app = JFactory::getApplication(); + //$app->redirect(JRoute::_('index.php?option=com_phocadownload'), $message); + $parent->getParent()->setRedirectURL('index.php?option=com_phocadownload'); + } + function uninstall($parent) { + //echo '

' . JText::_('COM_PHOCAGALLLERY_UNINSTALL_TEXT') . '

'; + } + + function update($parent) { + //echo '

' . JText::sprintf('COM_PHOCADOWNLOAD_UPDATE_TEXT', $parent->get('manifest')->version) . '

'; + + $folder[0][0] = 'phocadownload' ; + $folder[0][1] = JPATH_ROOT . DS . $folder[0][0]; + + $folder[1][0] = 'images' . DS . 'phocadownload' ; + $folder[1][1] = JPATH_ROOT . DS . $folder[1][0]; + + $folder[2][0] = 'phocadownload' . DS .'userupload'; + $folder[2][1] = JPATH_ROOT . DS . $folder[2][0]; + + $folder[3][0] = 'phocadownloadpap'; + $folder[3][1] = JPATH_ROOT . DS . $folder[3][0]; + + $folder[4][0] = 'phocadownloadpap' . DS .'userupload'; + $folder[4][1] = JPATH_ROOT . DS . $folder[4][0]; + + $message = ''; + $error = array(); + foreach ($folder as $key => $value) + { + if (!JFolder::exists( $value[1])) + { + if (JFolder::create( $value[1], 0755 )) + { + + $data = "\n\n\n"; + JFile::write($value[1].DS."index.html", $data); + $message .= '
Folder ' . $value[0] + .' created!
'; + $error[] = 0; + } + else + { + $message .= '
Folder ' . $value[0] + .' creation failed! Please create it manually.
'; + $error[] = 1; + } + } + else//Folder exist + { + $message .= '
Folder ' . $value[0] + .' exists!
'; + $error[] = 0; + } + } + + $msg = JText::_('COM_PHOCADOWNLOAD_UPDATE_TEXT'); + $msg .= ' (' . JText::_('COM_PHOCADOWNLOAD_VERSION'). ': ' . $parent->get('manifest')->version . ')'; + + $msg .= '
'. $message; + //$parent->getParent()->setRedirectURL('index.php?option=com_phocadownload'); + $app = JFactory::getApplication(); + $app->enqueueMessage($msg); + $app->redirect(JRoute::_('index.php?option=com_phocadownload')); + } + + function preflight($type, $parent) { + //echo '

' . JText::_('COM_PHOCADOWNLOAD_PREFLIGHT_' . $type . '_TEXT') . '

'; + } + + function postflight($type, $parent) { + //echo '

' . JText::_('COM_PHOCADOWNLOAD_POSTFLIGHT_' . $type . '_TEXT') . '

'; + } +} \ No newline at end of file diff --git a/install/sql/index.html b/install/sql/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/install/sql/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/install/sql/mysql/index.html b/install/sql/mysql/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/install/sql/mysql/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/install/sql/mysql/install.utf8.sql b/install/sql/mysql/install.utf8.sql new file mode 100644 index 0000000..443c398 --- /dev/null +++ b/install/sql/mysql/install.utf8.sql @@ -0,0 +1,277 @@ +-- -------------------------------------------------------------------- -- +-- Phoca Download manual installation -- +-- -------------------------------------------------------------------- -- +-- See documentation on http://www.phoca.cz/ -- +-- -- +-- Change all prefixes #__ to prefix which is set in your Joomla! site -- +-- (e.g. from #__phocadownload to jos_phocadownload) -- +-- Run this SQL queries in your database tool, e.g. in phpMyAdmin -- +-- If you have questions, just ask in Phoca Forum -- +-- http://www.phoca.cz/forum/ -- +-- -------------------------------------------------------------------- -- + +CREATE TABLE IF NOT EXISTS `#__phocadownload_categories` ( + `id` int(11) NOT NULL auto_increment, + `parent_id` int(11) NOT NULL default 0, + `section` int(11) NOT NULL default 0, + `title` varchar(255) NOT NULL default '', + `name` varchar(255) NOT NULL default '', + `alias` varchar(255) NOT NULL default '', + `image` varchar(255) NOT NULL default '', + `image_position` varchar(30) NOT NULL default '', + `description` text, + `published` tinyint(1) NOT NULL default '0', + `checked_out` int(11) unsigned NOT NULL default '0', + `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', + `editor` varchar(50) default NULL, + `ordering` int(11) NOT NULL default '0', + `access` int(11) unsigned NOT NULL default '0', + `uploaduserid` text, + `accessuserid` text, + `deleteuserid` text, + `date` datetime NOT NULL default '0000-00-00 00:00:00', + `count` int(11) NOT NULL default '0', + `hits` int(11) NOT NULL default '0', + `params` text, + `metakey` text, + `metadesc` text, + `metadata` text, + `language` char(7) NOT NULL default '', + PRIMARY KEY (`id`), + KEY `cat_idx` (`section`,`published`,`access`), + KEY `idx_access` (`access`), + KEY `idx_checkout` (`checked_out`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload` ( + `id` int(11) unsigned NOT NULL auto_increment, + `catid` int(11) NOT NULL default '0', + `sectionid` int(11) NOT NULL default '0', + `sid` int(11) NOT NULL default '0', + `owner_id` int(11) NOT NULL default 0, + `title` varchar(250) NOT NULL default '', + `alias` varchar(255) NOT NULL default '', + `filename` varchar(250) NOT NULL default '', + `filename_play` varchar(250) NOT NULL default '', + `filename_preview` varchar(250) NOT NULL default '', + `filesize` int(11) NOT NULL default 0, + `author` varchar(255) NOT NULL default '', + `author_email` varchar(255) NOT NULL default '', + `author_url` varchar(255) NOT NULL default '', + `license` varchar(255) NOT NULL default '', + `license_url` varchar(255) NOT NULL default '', + `image_filename` varchar(255) NOT NULL default '', + `image_filename_spec1` varchar(255) NOT NULL default '', + `image_filename_spec2` varchar(255) NOT NULL default '', + `image_download` varchar(255) NOT NULL default '', + `video_filename` varchar(255) NOT NULL default '', + `link_external` varchar(255) NOT NULL default '', + `mirror1link` varchar(255) NOT NULL default '', + `mirror1title` varchar(255) NOT NULL default '', + `mirror1target` varchar(10) NOT NULL default '', + `mirror2link` varchar(255) NOT NULL default '', + `mirror2title` varchar(255) NOT NULL default '', + `mirror2target` varchar(10) NOT NULL default '', + `description` text, + `features` text, + `changelog` text, + `notes` text, + `userid` int(11) NOT NULL default '0', + `version` varchar(255) NOT NULL default '', + `directlink` tinyint(1) NOT NULL default '0', + `date` datetime NOT NULL default '0000-00-00 00:00:00', + `publish_up` datetime NOT NULL default '0000-00-00 00:00:00', + `publish_down` datetime NOT NULL default '0000-00-00 00:00:00', + `hits` int(11) NOT NULL default '0', + `textonly` tinyint(1) NOT NULL default '0', + `published` tinyint(1) NOT NULL default '0', + `approved` tinyint(1) NOT NULL default '0', + `checked_out` int(11) NOT NULL default '0', + `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', + `ordering` int(11) NOT NULL default '0', + `access` int(11) unsigned NOT NULL default '0', + `confirm_license` int(11) NOT NULL default '0', + `unaccessible_file` int(11) NOT NULL default '0', + `token` char(64) default NULL, + `tokenhits` int(11) NOT NULL default 0, + `params` text, + `metakey` text, + `metadesc` text, + `metadata` text, + `language` char(7) NOT NULL default '', + PRIMARY KEY (`id`), + KEY `catid` (`catid`,`published`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload_user_stat` ( + `id` int(11) NOT NULL auto_increment, + `fileid` int(11) NOT NULL default '0', + `userid` int(11) NOT NULL default '0', + `count` int(11) NOT NULL default '0', + `date` datetime NOT NULL default '0000-00-00 00:00:00', + `published` tinyint(1) NOT NULL default '0', + `ordering` int(11) NOT NULL default '0', + `language` char(7) NOT NULL default '', + PRIMARY KEY (`id`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload_licenses` ( + `id` int(11) NOT NULL auto_increment, + `title` varchar(255) NOT NULL default '', + `alias` varchar(255) NOT NULL default '', + `description` text, + `checked_out` int(11) unsigned NOT NULL default '0', + `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', + `published` tinyint(1) NOT NULL default '0', + `ordering` int(11) NOT NULL default '0', + `language` char(7) NOT NULL default '', + PRIMARY KEY (`id`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload_file_votes` ( + `id` int(11) NOT NULL auto_increment, + `fileid` int(11) NOT NULL default 0, + `userid` int(11) NOT NULL default 0, + `date` datetime NOT NULL default '0000-00-00 00:00:00', + `rating` tinyint(1) NOT NULL default '0', + `published` tinyint(1) NOT NULL default '0', + `checked_out` int(11) unsigned NOT NULL default '0', + `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', + `ordering` int(11) NOT NULL default '0', + `params` text, + `language` char(7) NOT NULL default '', + PRIMARY KEY (`id`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload_file_votes_statistics` ( + `id` int(11) NOT NULL auto_increment, + `fileid` int(11) NOT NULL default 0, + `count` int(11) NOT NULL default '0', + `average` float(8,6) NOT NULL default '0', + `language` char(7) NOT NULL default '', + PRIMARY KEY (`id`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload_tags` ( + `id` int(11) NOT NULL auto_increment, + `title` varchar(255) NOT NULL default '', + `alias` varchar(255) NOT NULL default '', + `link_ext` varchar(255) NOT NULL default '', + `link_cat` int(11) unsigned NOT NULL default '0', + `description` text, + `published` tinyint(1) NOT NULL default '0', + `checked_out` int(11) unsigned NOT NULL default '0', + `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', + `ordering` int(11) NOT NULL default '0', + `params` text, + `language` char(7) NOT NULL default '', + PRIMARY KEY (`id`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload_tags_ref` ( + `id` SERIAL, + `fileid` int(11) NOT NULL default 0, + `tagid` int(11) NOT NULL default 0, + PRIMARY KEY (`id`), + UNIQUE KEY `i_fileid` (`fileid`,`tagid`) +) default CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `#__phocadownload_layout` ( + `id` int(11) NOT NULL auto_increment, + `categories` text, + `category` text, + `file` text, + `checked_out` int(11) unsigned NOT NULL default '0', + `checked_out_time` datetime NOT NULL default '0000-00-00 00:00:00', + `params` text, + PRIMARY KEY (`id`) +) default CHARSET=utf8; + +INSERT INTO `#__phocadownload_layout` ( +`id` , +`categories` , +`category` , +`file` , +`checked_out` , +`checked_out_time` , +`params` +) +VALUES ( +NULL , '
+
{pdtitle}
+{pdsubcategories} +{pdclear} +
', + +'
+{pdfiledesctop} +{pdfile} +
{pdbuttondownload}
+
{pdbuttondetails}
+
{pdbuttonpreview}
+
{pdbuttonplay}
+
{pdmirrorlink2} {pdmirrorlink1}
+
{pdrating}
+
{pdtags}
+{pdfiledescbottom} +
+
' + +, '
+{pdimage} +{pdfile} +{pdfilesize} +{pdversion} +{pdlicense} +{pdauthor} +{pdauthoremail} +{pdfiledate} +{pddownloads} +{pddescription} +{pdfeatures} +{pdchangelog} +{pdnotes} +
{pdmirrorlink2} {pdmirrorlink1}
+
{pdreportlink}
+
{pdrating}
+
{pdtags}
+
+
' , '0', '0000-00-00 00:00:00', NULL +); + +CREATE TABLE IF NOT EXISTS `#__phocadownload_styles` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL DEFAULT '', + `alias` varchar(255) NOT NULL DEFAULT '', + `filename` varchar(255) NOT NULL DEFAULT '', + `menulink` text, + `type` tinyint(1) NOT NULL DEFAULT '0', + `published` tinyint(1) NOT NULL DEFAULT '0', + `checked_out` int(11) unsigned NOT NULL DEFAULT '0', + `checked_out_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `ordering` int(11) NOT NULL DEFAULT '0', + `params` text, + `language` char(7) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) DEFAULT CHARSET=utf8 ; + +INSERT INTO `#__phocadownload_styles` (`id`, `title`, `alias`, `filename`, `menulink`, `type`, `published`, `checked_out`, `checked_out_time`, `ordering`, `params`, `language`) VALUES +(1, 'Phocadownload', 'phocadownload', 'phocadownload.css', NULL, 1, 1, 0, '0000-00-00 00:00:00', 1, NULL, '*'), +(2, 'Rating', 'rating', 'rating.css', NULL, 1, 1, 0, '0000-00-00 00:00:00', 2, NULL, '*'), +(3, 'Button', 'button', 'button.css', NULL, 1, 0, 0, '0000-00-00 00:00:00', 3, NULL, '*'), +(4, 'Button (Rounded Corners)', '', 'buttonrc.css', NULL, 1, 0, 0, '0000-00-00 00:00:00', 4, NULL, '*'), +(5, 'Default', 'default', 'default.css', NULL, 2, 1, 0, '0000-00-00 00:00:00', 1, NULL, '*'), +(6, 'Bootstrap', '', 'bootstrap.min.css', NULL, 1, 0, 0, '0000-00-00 00:00:00', 5, NULL, '*'); + +CREATE TABLE IF NOT EXISTS `#__phocadownload_logging` ( + `id` int(11) unsigned NOT NULL auto_increment, + `fileid` int(11) NOT NULL default '0', + `catid` int(11) NOT NULL default '0', + `userid` int(11) NOT NULL default '0', + `ip` varchar(20) NOT NULL default '', + `page` varchar(255) NOT NULL, + `date` datetime NOT NULL default '0000-00-00 00:00:00', + `type` tinyint(1) NOT NULL DEFAULT '0', + `params` text NOT NULL, + PRIMARY KEY (`id`) +) DEFAULT CHARSET=utf8 ; \ No newline at end of file diff --git a/install/sql/mysql/uninstall.utf8.sql b/install/sql/mysql/uninstall.utf8.sql new file mode 100644 index 0000000..232e43e --- /dev/null +++ b/install/sql/mysql/uninstall.utf8.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS `#__phocadownload`; +DROP TABLE IF EXISTS `#__phocadownload_categories`; +DROP TABLE IF EXISTS `#__phocadownload_user_stat`; +DROP TABLE IF EXISTS `#__phocadownload_licenses`; +DROP TABLE IF EXISTS `#__phocadownload_file_votes`; +DROP TABLE IF EXISTS `#__phocadownload_file_votes_statistics`; +DROP TABLE IF EXISTS `#__phocadownload_tags`; +DROP TABLE IF EXISTS `#__phocadownload_tags_ref`; +DROP TABLE IF EXISTS `#__phocadownload_layout`; +DROP TABLE IF EXISTS `#__phocadownload_styles`; diff --git a/language/en-GB/en-GB.com_phocadownload.ini b/language/en-GB/en-GB.com_phocadownload.ini new file mode 100644 index 0000000..d73d36f --- /dev/null +++ b/language/en-GB/en-GB.com_phocadownload.ini @@ -0,0 +1,768 @@ +; @package Joomla.Framework +; @copyright Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved. +; @license GNU General Public License version 2 or later; see LICENSE.txt +; +; @component Phoca Component +; @copyright Copyright (C) Jan Pavelka www.phoca.cz +; @license http://www.gnu.org/copyleft/gpl.html GNU General Public License version 2 or later; +; +; @test utf-8 ä, ö, ü +; + +;[3.0.6] +COM_PHOCADOWNLOAD_FILENAME_ASC="File Name Ascending" +COM_PHOCADOWNLOAD_FILENAME_DESC="File Name Descending" + +;[3.0.3] +COM_PHOCADOWNLOAD_BROWSER_DOES_NOT_SUPPORT_AUDIO_VIDEO_TAG="Your browser does not support the audio/video tag" +COM_PHOCADOWNLOAD_FIELD_HTML5_AUDIO_VIDEO_LABEL="HTML5 Audio/Video" +COM_PHOCADOWNLOAD_FIELD_HTML5_AUDIO_VIDEO_DESC="Set yes to enable HTML 5 player for audio and video" +;[3.0.2] +COM_PHOCADOWNLOAD_FIELD_ENABLE_TOKEN_DOWNLOAD_LABEL="Enable Unique Download Link" +COM_PHOCADOWNLOAD_FIELD_ENABLE_TOKEN_DOWNLOAD_DESC="Enable or disable unique download link feature (download with token)" +COM_PHOCADOWNLOAD_MAX_LIMIT_DOWNLOAD_TOKEN_REACHED="File cannot be downloaded. Maximum download limit of this file reached." +COM_PHOCADOWNLOAD_FIELD_MAX_COUNT_TOKEN_DOWNLOADS_DESC="Set maximum count of files user can download through unique download link. Be aware, 0 (Zero) means, there is no limit. This limit only takes effect for unique download link" +COM_PHOCADOWNLOAD_FIELD_MAX_COUNT_TOKEN_DOWNLOADS_LABEL="Maximum Count of downloads per file (Unique Download Link)" +COM_PHOCADOWNLOAD_URL_FORMAT_DEPENDS_ON_SEF="This Link may take different formats. Its format depends on your SEF Settings" +COM_PHOCADOWNLOAD_UNIQUE_DOWNLOAD_URL="Unique Download Link" +COM_PHOCADOWNLOAD_DOWNLOAD_FILE="Download file" +COM_PHOCADOWNLOAD_FILE_NOT_FOUND="File Not Found" +COM_PHOCADOWNLOAD_SET_TOKEN="Set Token" +COM_PHOCADOWNLOAD_FIELD_TOKEN_LABEL="Token (Unique Download Link)" +COM_PHOCADOWNLOAD_FIELD_TOKEN_DESC="Set token - unique download link of the file" +COM_PHOCADOWNLOAD_FIELD_TOKENHITS_LABEL="Token Downloads" +COM_PHOCADOWNLOAD_FIELD_TOKENHITS_DESC="How many times the file was downloaded by unique download link" +COM_PHOCADOWNLOAD_YES_FRONTEND="Yes (Frontend Only)" +COM_PHOCADOWNLOAD_YES_BACKEND="Yes (Backend Only)" +COM_PHOCADOWNLOAD_YES_FRONTEND_BACKEND="Yes (Frontend, Backend)" +;[3.0.1] +COM_PHOCADOWNLOAD_FIELD_ALIAS_M_DESC="Alias for all added images can be set. If empty, Alias will be created from Filename" +COM_PHOCADOWNLOAD_FIELD_TITLE_M_DESC="Title for all added images can be set. If empty, Title will be created from Filename" +COM_PHOCADOWNLOAD_FIELD_LANGUAGE_FILE_DESC="The language that the file is assigned to." +;[3.0.0] +COM_PHOCADOWNLOAD_FIELD_COPY_PAP_LABEL="Copy Play and Preview" +COM_PHOCADOWNLOAD_FIELD_COPY_PAP_DESC="Set if files of added items will be copied to play and preview folder (in case they can be played or previewed). Items then will be downloadable and previewable or playable." +;[3.0.0 Beta] +COM_PHOCADOWNLOAD_HOT="Hot" +COM_PHOCADOWNLOAD_WILL_BE_CREATED_FROM_TITLE="Will be created from title" +;[3.0.0] +COM_PHOCADOWNLOAD_MAX_LIMIT_DOWNLOAD_PER_FILE_REACHED="You have reached maximum limit of downloads allowed per this file." +COM_PHOCADOWNLOAD_NOT_LOGGED_IN_USERS_NOT_ALLOWED_DOWNLOAD="Please login. Not logged in users are not allowed to download." +COM_PHOCADOWNLOAD_FIELD_MAX_COUNT_USER_DOWNLOADS_DESC="Set maximum count of files user can download. Be aware, 0 (Zero) means, there is no limit. It is limit per file NOT for all downloads. If you set some limit here, anonymous users (guests) are not able to download any file." +COM_PHOCADOWNLOAD_FIELD_MAX_COUNT_USER_DOWNLOADS_LABEL="Maximum Count of downloads per file" +COM_PHOCADOWNLOAD_LOGGING_NOT_ENABLED="Warning! Logging is not enabled at the moment!" +COM_PHOCADOWNLOAD_FIELD_PLAY_OR_PREVIEW_COPY_LABEL="Play or Preview Copy" +COM_PHOCADOWNLOAD_FIELD_PLAY_OR_PREVIEW_COPY_DESC="If yes (Frontend), file which is uploaded by user in fronted will be copied to phocadownloadpap folder so it can be played or previewed. If yes (Backend), then file which is added in File Add feature or in Multiple Add feature in Administration will be copied to phocadownloadpap folder too." +COM_PHOCADOWNLOAD_FIELD_ENABLE_LOGGING_LABEL="Enable Logging" +COM_PHOCADOWNLOAD_FIELD_ENABLE_LOGGING_DESC="Enable or disable logging for downloads, uploads or both. Be aware, logging of downloads and uploads can take a lot of memory in case a lot of downloads or uploads is done on your site. It is recommended to enable it only for short testing period" +COM_PHOCADOWNLOAD_YES_UPLOADS_ONLY="Yes (Uploads only)" +COM_PHOCADOWNLOAD_YES_DOWNLOADS_ONLY="Yes (Downloads only)" +COM_PHOCADOWNLOAD_YES_UPLOADS_DOWNLOADS="Yes (Uploads and Downloads)" +COM_PHOCADOWNLOAD_FIELD_FILE_ICON_MIME_LABEL="File Icon (Extension Mime Type)" +COM_PHOCADOWNLOAD_FIELD_FILE_ICON_MIME_DESC="Enable or disable displaying of file icon by extension mime type (for example: PDF icon will be displayed next to PDF documents). Be aware not all extension mime type icons are available." +COM_PHOCADOWNLOAD_YES_DOWNLOAD_UPLOAD_PARAM="Yes (download and upload parameters)" +COM_PHOCADOWNLOAD_YES_DOWNLOAD_UPLOAD_PARAM_ADMIN="Yes (download and upload parameter in administration only)" +COM_PHOCADOWNLOAD_YES_UPLOAD_PARAM_ADMIN="Yes (only upload parameters in administration)" +COM_PHOCADOWNLOAD_YES_UPLOAD_PARAM="Yes (only upload parameters)" +COM_PHOCADOWNLOAD_YES_DOWNLOAD_PARAM="Yes (only download parameters)" +COM_PHOCADOWNLOAD_IGNORE_FILE_TYPES_CHECK_LABEL="Ignore File Types Checking" +COM_PHOCADOWNLOAD_IGNORE_FILE_TYPES_CHECK_DESC="Set if checking of file types will be ignored. If yes: Allowed File Types (Download), Allowed File Types (Upload), Disallowed File Types (Download), Disallowed File Types (Upload) will be ignored." +COM_PHOCADOWNLOAD_CONFIG_HEAD_DOWNLOADS_LABEL="Downloads" +COM_PHOCADOWNLOAD_CONFIG_HEAD_UPLOADS_LABEL="Uploads" +COM_PHOCADOWNLOAD_FILE_VIEW_LABEL="File View" +COM_PHOCADOWNLOAD_CONFIG_CATEGORY_CATEGORIES_VIEW_LABEL="Categories and Category View" +COM_PHOCADOWNLOAD_IP="IP" +COM_PHOCADOWNLOAD_PAGE="Page" +COM_PHOCADOWNLOAD_RESET_LOG="Reset Log" +COM_PHOCADOWNLOAD_WARNING_RESET_LOG="Are you sure you want to reset (clear) the log?" +COM_PHOCADOWNLOAD_SUCCESS_RESET_LOG_STAT="Log cleared" +COM_PHOCADOWNLOAD_ERROR_RESET_LOG_STAT="Error while clearing log" +COM_PHOCADOWNLOAD_ERROR_SERVER_NOT_ABLE_TO_STORE_FILE_TEMP_FOLDER="Error while uploading file. Server is not able to store this file to Temp folder." +COM_PHOCADOWNLOAD_COUNT="Count" +COM_PHOCADOWNLOAD_LOGGING="Logging" +COM_PHOCADOWNLOAD_UPLOADS="Uploads" +COM_PHOCADOWNLOAD_EDIT_CSS_FILES="Edit CSS Files" +COM_PHOCADOWNLOAD_FIELD_CSS_MENULINK_ID_DESC="Set ID or IDs of menu link (Itemid) where the style will be displayed. Separate each parent ID with comma (,)" +COM_PHOCADOWNLOAD_FIELD_CSS_MENULINK_ID_LABEL="Menu Link ID" +COM_PHOCADOWNLOAD_ERROR_FAILED_TO_SAVE_FILENAME="Error while saving the filename" +COM_PHOCADOWNLOAD_ERROR_SOURCE_FILE_NOT_UNWRITABLE="Error while making the source file unwritable" +COM_PHOCADOWNLOAD_ERROR_SOURCE_FILE_NOT_WRITABLE="Error while saving the file. Source File is not writable." +COM_PHOCADOWNLOAD_STYLE="Style" +COM_PHOCADOWNLOAD_FIELD_CSS_LABEL="Style (CSS Source)" +COM_PHOCADOWNLOAD_FIELD_CSS_DESC="Edit source of the style" +COM_PHOCADOWNLOAD_FIELD_TYPE_DESC="Type of the style" +COM_PHOCADOWNLOAD_FIELD_TYPE_LABEL="Type" +COM_PHOCADOWNLOAD_MAIN="Main" +COM_PHOCADOWNLOAD_FILE_EXISTS="File exists" +COM_PHOCADOWNLOAD_FILE_DOES_NOT_EXIST="File does not exist" +COM_PHOCADOWNLOAD_TYPE="Type" +COM_PHOCADOWNLOAD_CUSTOM_CSS="Custom" +COM_PHOCADOWNLOAD_MAIN_CSS="Main" +COM_PHOCADOWNLOAD_FILTER_SELECT_TYPE="- Select Type -" +COM_PHOCADOWNLOAD_STYLES="Styles" +COM_PHOCADOWNLOAD_FOLDER_NOT_FOUND="Folder not found" +COM_PHOCADOWNLOAD_EDIT_CSS="Edit CSS" +COM_PHOCADOWNLOAD_ERROR_CSS_FOLDER_NOT_FOUND="Custom CSS Folder Not Found" + +COM_PHOCADOWNLOAD_MIRROR_DETAILS="Mirror Details" +COM_PHOCADOWNLOAD_YOUTUBE_OPTIONS="YouTube Options" +COM_PHOCADOWNLOAD_GENERAL_OPTIONS="General Options" +COM_PHOCADOWNLOAD_PUBLISHING_OPTIONS="Publishing Options" +COM_PHOCADOWNLOAD_METADATA_OPTIONS="Metadata Options" +COM_PHOCADOWNLOAD_FILTER_SEARCH_LABEL="Search" +COM_PHOCADOWNLOAD_FILTER_SEARCH_DESC="Search the items" +COM_PHOCADOWNLOAD_LICENCE="Licence" +COM_PHOCADOWNLOAD_PHOCA_NEEDS_YOUR_HELP="Phoca Needs Your Help" +COM_PHOCADOWNLOAD_PLEASE_READ="Please Read" +COM_PHOCADOWNLOAD_USEFUL_TIPS="Useful Tips (Extensions)" +COM_PHOCADOWNLOAD_USEFUL_LINKS="Useful Links" +;[2.1.5] +COM_PHOCADOWNLOAD_UPLOADED_BY_LABEL="Uploaded By" +COM_PHOCADOWNLOAD_UPLOADED_BY_DESC="Set Uploaded By" +COM_PHOCADOWNLOAD_OWNER_LABEL="Owner" +COM_PHOCADOWNLOAD_OWNER_DESC="Set Owner" +;[2.1.2] +COM_PHOCADOWNLOAD_BATCH_OPTIONS_CATEGORIES="Batch process the selected categories" +COM_PHOCADOWNLOAD_PHOCA_DOWNLOAD="Phoca Download" +COM_PHOCADOWNLOAD_INFORMATION="Information" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_LINK_LABEL="Select Category Link" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_LINK_DESC="Select category to link it" +COM_PHOCADOWNLOAD_FIELD_DOWNLOAD_FOLDER_PAP_LABEL="Download Folder (Play, Preview)" +COM_PHOCADOWNLOAD_FIELD_DOWNLOAD_FOLDER_PAP_DESC="Set download folder for play and preview files" +;[2.1.1] +COM_PHOCADOWNLOAD_FIELD_VIDEO_HEIGHT_DV_LABEL="Youtube Height (Detail View)" +COM_PHOCADOWNLOAD_FIELD_VIDEO_HEIGHT_DV_DESC="Set Youtube height for Detail View" +COM_PHOCADOWNLOAD_FIELD_VIDEO_WIDTH_DV_LABEL="Youtube Width (Detail View)" +COM_PHOCADOWNLOAD_FIELD_VIDEO_WIDTH_DV_DESC="Set Youtube width for Detail View" +COM_PHOCADOWNLOAD_FIELD_VIDEO_HEIGHT_CV_LABEL="Youtube Height (Category View)" +COM_PHOCADOWNLOAD_FIELD_VIDEO_HEIGHT_CV_DESC="Set Youtube height for Category View" +COM_PHOCADOWNLOAD_FIELD_VIDEO_WIDTH_CV_LABEL="Youtube Width (Category View)" +COM_PHOCADOWNLOAD_FIELD_VIDEO_WIDTH_CV_DESC="Set Youtube width for Category View" +COM_PHOCADOWNLOAD_GROUP_LABEL_YOUTUBE_DETAILS="Youtube" +COM_PHOCADOWNLOAD_VIDEO_LINK_LABEL="Youtube Link" +COM_PHOCADOWNLOAD_VIDEO_LINK_DESC="Set Youtube link" +COM_PHOCADOWNLOAD_YES_ONLY_MODALBOX="Yes (Only Modalbox - Category View)" +;[2.1.0 Stable] +COM_PHOCADOWNLOAD_SELECT_FILE="Select file" +COM_PHOCADOWNLOAD_FIELD_SELECT_FILE_LABEL="Select file" +COM_PHOCADOWNLOAD_FIELD_SELECT_FILE_DESC="Select display file" +COM_PHOCADOWNLOAD_OVERLIB_WIDTH_DETAIL="Overlib with detail" +;[2.1.0 Beta] +COM_PHOCADOWNLOAD_FILE_VIEW="File View" +COM_PHOCADOWNLOAD_CATEGORY_VIEW="Category View" +COM_PHOCADOWNLOAD_CATEGORIES_VIEW="Categories View" +COM_PHOCADOWNLOAD_PARAMETERS="Parameters" +COM_PHOCADOWNLOAD_STYLES="Styles (CSS)" +COM_PHOCADOWNLOAD_LAYOUT_WARNING="Warning: Parameters are mostly styled by CSS, here you can add or remove different parts of the view. For stylizing them, just check the Phoca Download CSS. Edit the HTML source (HTML source can be displayed by editor feature) Displaying specific layout must be enabled in parameters." +COM_PHOCADOWNLOAD_DISPLAY_SPEC_LAYOUT_LABEL="Display Specific Layout" +COM_PHOCADOWNLOAD_DISPLAY_SPEC_LAYOUT_DESC="Display specific layout - set in Phoca Download administration. Be aware, some parts of the layout needs to be changed in CSS too to display properly." +COM_PHOCADOWNLOAD_CLEAN="Clean" +COM_PHOCADOWNLOAD_YES_OVERLIB="Yes (Overlib)" +COM_PHOCADOWNLOAD_YES_MODAL="Yes (Modal Box)" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_TAGS_LINKS_LABEL="Display Tags" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_TAGS_LINKS_DESC="Display or hide tags" +COM_PHOCADOWNLOAD_YES_CATEGORY_VIEW_BUTTON="Yes (Caetgory View) as Button" +COM_PHOCADOWNLOAD_YES_FILE_VIEW_BUTTON="Yes (File View) as Button" +COM_PHOCADOWNLOAD_YES_CATEGORY_FILE_VIEW_BUTTON="Yes (Category And File View) as Button" +COM_PHOCADOWNLOAD_EXTERNAL_LINK="External Link" +COM_PHOCADOWNLOAD_CATEGORY_LINK="Category Link" +COM_PHOCADOWNLOAD_SEARCH_OUTCOME="Search Outcome" +COM_PHOCADOWNLOAD_FIELD_TAGS_LINKS_LABEL="Tags (Links)" +COM_PHOCADOWNLOAD_FIELD_TAGS_LINKS_DESC="Set if the tags will include a link. If yes, set type of this link" +COM_PHOCADOWNLOAD_AT="at" +COM_PHOCADOWNLOAD_FEATURES="Features" +COM_PHOCADOWNLOAD_CHANGELOG="Changelog" +COM_PHOCADOWNLOAD_NOTES="Notes" +COM_PHOCADOWNLOAD_ERROR_DELETING_ITEM="Error while deleting item" +COM_PHOCADOWNLOAD_SUCCESS_DELETING_ITEM="Item deleted" +COM_PHOCADOWNLOAD_ERROR_UNPUBLISHING_ITEM="Error while unpublishing item" +COM_PHOCADOWNLOAD_ERROR_PUBLISHING_ITEM="Error while publishing item" +COM_PHOCADOWNLOAD_SUCCESS_UNPUBLISHING_ITEM="Item unpublished" +COM_PHOCADOWNLOAD_SUCCESS_PUBLISHING_ITEM="Item published" +COM_PHOCADOWNLOAD_FIELD_DELETE_RIGHTS_LABEL="Delete Rights" +COM_PHOCADOWNLOAD_FIELD_DELETE_RIGHTS_DESC="Set delete rights" +COM_PHOCADOWNLOAD_ERROR_DELETE_CONTAIN_FILE="Category(ies): '%s' cannot be removed as it contains (they contain) Items. There may currently be File(s) within the Category which you must delete first." +COM_PHOCADOWNLOAD_ERROR_DELETE_CONTAIN_CAT="Category(ies): '%s' cannot be removed as it contains (they contain) Subcategories. There may currently be Subcategory(ies) within the Category which you must delete first." +COM_PHOCADOWNLOAD_CATEGORIES_ADDED="Category(ies) added" +COM_PHOCADOWNLOAD_FILES_ADDED="File(s) added" +COM_PHOCADOWNLOAD_CHECK_ALL="Check All" +COM_PHOCADOWNLOAD_WARNING_FILE_SELECTED_SELECT_CATEGORY="File(s) are selected. Category needs to be selected also" +COM_PHOCADOWNLOAD_WARNING_SELECT_FILENAME_OR_FOLDER="Select File or Folder" +COM_PHOCADOWNLOAD_MULTIPLE_ADD="Multiple Add" +COM_PHOCADOWNLOAD_BATCH_OPTIONS_FILES="Batch process the selected files" +;COM_PHOCADOWNLOAD_SUCCESS_COPY_FILE="File(s) copied" +;COM_PHOCADOWNLOAD_ERROR_COPY_FILE="Error while copying file(s)" +COM_PHOCADOWNLOAD_QUICK_COPY="Quick Copy" +COM_PHOCADOWNLOAD_COPY="Copy" +COM_PHOCADOWNLOAD_FORM_SELECT_IMAGE="Select Image" +COM_PHOCADOWNLOAD_FIELD_IMAGE_DOWNLOAD_LABEL="Image" +COM_PHOCADOWNLOAD_FIELD_IMAGE_DOWNLOAD_DESC="Set image for the file" +COM_PHOCADOWNLOAD_FIELD_CATEGORIES_LAYOUT_LABEL="Categories View Layout" +COM_PHOCADOWNLOAD_FIELD_CATEGORIES_LAYOUT_DESC="Set layout for Categories View" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_LAYOUT_LABEL="Category View Layout" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_LAYOUT_DESC="Set layout for Category View" +COM_PHOCADOWNLOAD_FIELD_FILE_LAYOUT_LABEL="File View Layout" +COM_PHOCADOWNLOAD_FIELD_FILE_LAYOUT_DESC="Set layout for File View" +COM_PHOCADOWNLOOAD_CONTROL_PANEL="Control Panel" +COM_PHOCADOWNLOAD_FIELD_FEATURES_DESC="Set Features Text" +COM_PHOCADOWNLOAD_FIELD_FEATURES_LABEL="Features" +COM_PHOCADOWNLOAD_FIELD_CHANGELOG_DESC="Set Changelog Text" +COM_PHOCADOWNLOAD_FIELD_CHANGELOG_LABEL="Changelog" +COM_PHOCADOWNLOAD_FIELD_NOTES_DESC="Set Notes Text" +COM_PHOCADOWNLOAD_FIELD_NOTES_LABEL="Notes" +COM_PHOCADOWNLOAD_FIELD_TAGS_LABEL="Tags" +COM_PHOCADOWNLOAD_FIELD_TAGS_DESC="Select tags" +COM_PHOCADOWNLOAD_NEW_TAG="New Tag" +COM_PHOCADOWNLOAD_EDIT_TAG="Edit Tag" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_LABEL="Link To Category" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_DES="Select category if you want to link this tag to category" +COM_PHOCADOWNLOAD_FIELD_EXT_LINK_TAG_LABEL="Link To External Site" +COM_PHOCADOWNLOAD_FIELD_EXT_LINK_TAG_DESC="Set link to external site if you want to link this tag to some site (include http://)" +COM_PHOCADOWNLOAD_TAG="Tag" +COM_PHOCADOWNLOAD_TAGS="Tags" +COM_PHOCADOWNLOAD_LAYOUT="Layout" +;[2.0.0] +COM_PHOCADOWNLOAD_NUM="Num" +COM_PHOCADOWNLOAD_LIMIT="Limit" +COM_PHOCADOWNLOAD_YOUTUBE_URL="Youtube URL" +COM_PHOCADOWNLOAD_WARNING_SET_YOUTUBE_URL="You must set URL of Youtube video" +COM_PHOCADOWNLOAD_PLAYER_WIDTH="Player Width" +COM_PHOCADOWNLOAD_PLAYER_HEIGHT="Player Height" +COM_PHOCADOWNLOAD_PLAYER_HEIGHT_MP3="Player Height (MP3)" +COM_PHOCADOWNLOAD_WARNING_PLAYER_SIZE="Only size of Popup Window (Modal Box) can be set here, size of player needs to be set in Parameters of Phoca Download Component" +COM_PHOCADOWNLOAD_PREVIEW_WIDTH="Preview Width" +COM_PHOCADOWNLOAD_PREVIEW_HEIGHT="Preview Height" +COM_PHOCADOWNLOAD_YOU_MUST_SELECT_FILE="You must select a file" +COM_PHOCADOWNLOAD_YOU_MUST_SELECT_CATEGORY="You must select a category" +COM_PHOCADOWNLOAD_TARGET="Target" +COM_PHOCADOWNLOAD_TARGET_SELF="Target _self" +COM_PHOCADOWNLOAD_TARGET_BLANK="Target _blank" +COM_PHOCADOWNLOAD_TARGET_TOP="Target _top" +COM_PHOCADOWNLOAD_TARGET_PARENT="Target _parent" +COM_PHOCADOWNLOAD_INSERT_CODE="Insert Code" +COM_PHOCADOWNLOAD_BACK="Back" +COM_PHOCADOWNLOAD_FILELIST="File List" +COM_PHOCADOWNLOAD_YOUTUBE_VIDEO="Youtube Video" +COM_PHOCADOWNLOAD_PLAY_FILE_LINK="Play File (Link)" +COM_PHOCADOWNLOAD_PLAY_FILE_DIRECT="Play File (Direct)" +COM_PHOCADOWNLOAD_PREVIEW_FILE_LINK="Preview File (Link)" +COM_PHOCADOWNLOAD_LINK_TO_FILE="Link To File" +COM_PHOCADOWNLOAD_LINK_TO_CATEGORY="Link To Category" +COM_PHOCADOWNLOAD_LINK_TO_CATEGORIES="Link To Categories" +COM_PHOCADOWNLOAD_SELECT_TYPE="Select Type" +COM_PHOCADOWNLOAD_UPLOADED_BY="Uploaded by" +COM_PHOCADOWNLOAD_FIELD_ENABLE_CACHE_LABEL="Enable Cache" +COM_PHOCADOWNLOAD_FIELD_ENABLE_CACHE_DESC="Enable cache if it is enabled in Joomla! Global Configuration" +;[2.0.0RC3] +COM_PHOCADOWNLOAD_USER_LANG="User's Language" +COM_PHOCADOWNLOAD_SITE_LANG="Site's Language" +COM_PHOCADOWNLOAD_FIELD_USER_UCP_LANG_LABEL="User Language" +COM_PHOCADOWNLOAD_FIELD_USER_UCP_LANG_DESC="Set which language will be set while creating category or uploading image in UCP" +COM_PHOCADOWNLOAD_NO_RIGHTS_ACCESS_CATEGORY_FILE="You have no rights to access file in this category" +COM_PHOCADOWNLOAD_FIELD_SELECT_CATEGORY_LABEL="Select Category" +COM_PHOCADOWNLOAD_FIELD_SELECT_CATEGORY_DESC="Select category" +COM_PHOCADOWNLOAD_ERROR_FB_APP_ID_EMPTY="Facebook Application ID is empty" +COM_PHOCADOWNLOAD_FIELD_FB_COMMENT_APP_ID_LABEL="Facebook comments application ID" +COM_PHOCADOWNLOAD_FIELD_FB_COMMENT_APP_ID_DESC="Set Facebook Comments Application ID (ID of your created application in Facebook)" +COM_PHOCADOWNLOAD_FACEBOOK_COMMENTS_WIDTH_LABEL="Facebook Comments Width" +COM_PHOCADOWNLOAD_FACEBOOK_COMMENTS_WIDTH_DESC="Set Facebook comments box width" +COM_PHOCADOWNLOAD_FACEBOOK_FIELD_COMMENT_LANG_LABEL="Facebook Language" +COM_PHOCADOWNLOAD_FACEBOOK_FIELD_COMMENT_LANG_DESC="Set Facebook language" +COM_PHOCADOWNLOAD_FACEBOOK_FIELD_COMMENT_COUNT_LABEL="Comments Count" +COM_PHOCADOWNLOAD_FACEBOOK_FIELD_COMMENT_COUNT_DESC="Set count of comments displayed in comment box" +COM_PHOCADOWNLOAD_FACEBOOK="Facebook" +COM_PHOCADOWNLOAD_STARS_OUT_OF="stars out of" +COM_PHOCADOWNLOAD_FIELD_LANGUAGE_FILE_DESC="The language that the file is assigned to." +COM_PHOCADOWNLOAD_FIELD_LANGUAGE_CATEGORY_DESC="The language that the category is assigned to." +;[2.0.0RC2] +COM_PHOCADOWNLOAD_FIELD_DELETE_EXISTING_FILES_DESC="If yes then the file stored on server will be deleted in case the file will be deleted from Phoca Download" +COM_PHOCADOWNLOAD_FIELD_DELETE_EXISTING_FILES_LABEL="Delete Existing Files" +COM_PHOCADOWNLOAD_FIELD_OVERWRITE_EXISTING_FILES_DESC="Set if uploaded files should overwrite existing files on the server" +COM_PHOCADOWNLOAD_FIELD_OVERWRITE_EXISTING_FILES_LABEL="Overwrite Existing Files" +COM_PHOCADOWNLOAD_REPORT="Report" +COM_PHOCADOWNLOAD_FIELD_REPORT_LINK_GUESTBOOK_ID_LABEL="Guestbook ID (Report)" +COM_PHOCADOWNLOAD_FIELD_REPORT_LINK_GUESTBOOK_ID_DESC="Set guestbook id (guestbook from Phoca Guestbook component) in case the report function is active" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_REPORT_LINK_LABEL="Display Report Link" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_REPORT_LINK_DESC="Display or hide report link. This link will run Phoca Guestbook in Report Mode. There users can report files. Phoca Guestbook needs to be installed and the report function enabled in guestbook settings to run this feature." +COM_PHOCADOWNLOAD_FIELD_DISPLAY_MIRROR_LINKS_LABEL="Display Mirror Links" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_MIRROR_LINKS_DESC="Display or hide mirror links" +COM_PHOCADOWNLOAD_GROUP_LABEL_MIRROR_DETAILS="Mirror Details" +COM_PHOCADOWNLOAD_OPEN_WINDOW_BLANK="Open in new window (_blank)" +COM_PHOCADOWNLOAD_OPEN_WINDOW_PARENT="Open in parent window/frame (_parent)" +COM_PHOCADOWNLOAD_OPEN_WINDOW_SELF="Open in this window/frame (_self)" +COM_PHOCADOWNLOAD_OPEN_WINDOW_TOP="Open in top frame (replaces all frames) (_top)" +COM_PHOCADOWNLOAD_MIRROR_LINK_LINK_LABEL="Link" +COM_PHOCADOWNLOAD_MIRROR_LINK_TARGET_LABEL="Target" +COM_PHOCADOWNLOAD_MIRROR_LINK_TITLE_LABEL="Title (Link 1)" +COM_PHOCADOWNLOAD_FIELD_MIRROR_LINK_LINK_DESC="Set first mirror link" +COM_PHOCADOWNLOAD_FIELD_MIRROR_LINK_TARGET_DESC="Set target for first mirror link" +COM_PHOCADOWNLOAD_FIELD_MIRROR_LINK_TITLE_DESC="Set title for first mirror link" +COM_PHOCADOWNLOAD_MIRROR_LINK_LINK2_LABEL="Link 2" +COM_PHOCADOWNLOAD_MIRROR_LINK_TARGET2_LABEL="Target" +COM_PHOCADOWNLOAD_MIRROR_LINK_TITLE2_LABEL="Title (Link 2)" +COM_PHOCADOWNLOAD_FIELD_MIRROR_LINK_LINK2_DESC="Set second mirror link" +COM_PHOCADOWNLOAD_FIELD_MIRROR_LINK_TARGET2_DESC="Set target for second mirror link" +COM_PHOCADOWNLOAD_FIELD_MIRROR_LINK_TITLE2_DESC="Set title for second mirror link" +COM_PHOCADOWNLOAD_YES_CATEGORY_VIEW="Yes (Caetgory View)" +COM_PHOCADOWNLOAD_YES_FILE_VIEW="Yes (FileView)" +COM_PHOCADOWNLOAD_YES_CATEGORY_FILE_VIEW="Yes (Category And File View)" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_RATING_FILE_DESC="Display or hide rating for files" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_RATING_FILE_LABEL="Display Rating (File)" +COM_PHOCADOWNLOAD_CONFIG_RATING_SETTINGS_LABEL="Rating Settings" +COM_PHOCADOWNLOAD_ERROR_FILE_NOT_EXISTS="File does not exist" +COM_PHOCADOWNLOAD_RATING_ALREADY_RATED_FILE="You have already rated this file" +COM_PHOCADOWNLOAD_SUCCESS_RATING_FILE="Thank you for your rating" +COM_PHOCADOWNLOAD_ERROR_RATING_FILE="Error while rating the file" +COM_PHOCADOWNLOAD_ERROR_WRONG_RATING="Error while rating - wrong format added" +COM_PHOCADOWNLOAD_ERROR_REQUESTING_RATING="Error while requesting rating" +COM_PHOCADOWNLOAD_VOTE="vote" +COM_PHOCADOWNLOAD_VOTES="votes" +COM_PHOCADOWNLOAD_FILE_RATING="File Rating" +COM_PHOCADOWNLOAD_RATING="Rating" +COM_PHOCADOWNLOAD_STAR_OUT_OF="star out of" +COM_PHOCADOWNLOAD_ONLY_REGISTERED_LOGGED_RATE_FILE="Only registered and logged in users can rate this file" +;[2.0.0 RC] +COM_PHOCADOWNLOAD_FIELD_DISALLOWED_FILE_TYPES_UPLOAD_DESC="Set disallowed file types for frontend upload." +COM_PHOCADOWNLOAD_FIELD_ALLOWED_FILE_TYPES_UPLOAD_DESC="Set allowed file types for frontend upload. Default list of filetypes is not complete and should be modified to fit your needs." +COM_PHOCADOWNLOAD_FIELD_SHOW_PAGINATION_LABEL="Display Pagination" +COM_PHOCADOWNLOAD_FIELD_SHOW_PAGINATION_DESC="Display or hide pagination" +COM_PHOCADOWNLOAD_FIELD_SHOW_PAGINATION_LIMIT_LABEL="Display Select Box - Pagination" +COM_PHOCADOWNLOAD_FIELD_SHOW_PAGINATION_LIMIT_DESC="Display or hide select box for pagination" +COM_PHOCADOWNLOAD_HIDE="Hide" +COM_PHOCADOWNLOAD_DISPLAY="Display" +;[2.0.0 BETA1] +COM_PHOCADOWNLOAD_FIELD_DISPLAY_MAIN_CAT_DESC_LABEL="Display Main Category Description" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_MAIN_CAT_DESC_DESC="Set if category description should be displayed in Categories View - Description will be displayed instead of subcategories" +COM_PHOCADOWNLOAD_ERROR_CATEGORY_NOT_SELECTED="Category was not selected" +COM_PHOCADOWNLOAD_FIELD_REGISTERED_ACCESS_LEVEL_LABEL="Access Level - Registered Users" +COM_PHOCADOWNLOAD_FIELD_REGISTERED_ACCESS_LEVEL_DESC="Set access levels for registered users. Some actions in frontend can be done by registered users only. Set which access level group will be regarded as registered group." +COM_PHOCADOWNLOAD_FIELD_ENABLE_ICONV_ALIAS_LABEL="Iconv Alias" +COM_PHOCADOWNLOAD_FIELD_ENABLE_ICONV_ALIAS_DESC="Enable or disable creating of alias with help of iconv function" +COM_PHOCADOWNLOAD_UPGRADE="Upgrade" +COM_PHOCADOWNLOAD_INSTALL="Install" +; For Translaters - set your own data here +COM_PHOCADOWNLOAD_TRANSLATION="Translation" +COM_PHOCADOWNLOAD_TRANSLATION_LANGUAGE_TAG="English" +COM_PHOCADOWNLOAD_TRANSLATER="Jan Pavelka" +COM_PHOCADOWNLOAD_TRANSLATION_SUPPORT_URL="www.phoca.cz" +; End Translaters section - - - - - - - - +COM_PHOCADOWNLOAD_ACCESS="Access" +COM_PHOCADOWNLOAD_ACTIVE="Active" +COM_PHOCADOWNLOAD_ADD_FILES="Add Files" +COM_PHOCADOWNLOAD_ADD_FILES_TO_UPLOAD_QUEUE_AND_CLICK_START_BUTTON="Add files to the upload queue and click the start button." +COM_PHOCADOWNLOAD_ADD_TEXT="Text" +COM_PHOCADOWNLOAD_ALL="All" +COM_PHOCADOWNLOAD_ALL_APPROVED="All files authorized" +COM_PHOCADOWNLOAD_ALL_REGISTERED_USERS="All registered users" +COM_PHOCADOWNLOAD_ALWAYS="Always" +COM_PHOCADOWNLOAD_AND_LEFT_FOR_DESCRIPTION="and left for description" +COM_PHOCADOWNLOAD_APPROVE="Authorize" +COM_PHOCADOWNLOAD_APPROVED="Authorized" +COM_PHOCADOWNLOAD_APPROVE_ALL="Authorize All" +COM_PHOCADOWNLOAD_APPROVE_ALL_ERROR="Error while authorizing all files" +COM_PHOCADOWNLOAD_APPROVE_ITEM="Authorize item" +COM_PHOCADOWNLOAD_AUTHOR="Author" +COM_PHOCADOWNLOAD_AUTHOR_EMAIL="Author's Email" +COM_PHOCADOWNLOAD_AUTHOR_WEBSITE="Author's Website" +COM_PHOCADOWNLOAD_BLANK="Blank" +COM_PHOCADOWNLOAD_GREY2="Grey 2" +COM_PHOCADOWNLOAD_BOTTOM="Bottom" +COM_PHOCADOWNLOAD_BOTTOM_AND_OVERLIB="Bottom and Overlib" +COM_PHOCADOWNLOAD_BOTTOM_WITH_DETAIL_AND_OVERLIB="Bottom with detail and Overlib" +COM_PHOCADOWNLOAD_CATEGORIES="Categories" +COM_PHOCADOWNLOAD_CATEGORY="Category" +COM_PHOCADOWNLOAD_CHARACTERS_WRITTEN="Characters written" +COM_PHOCADOWNLOAD_CHECK_FOR_UPDATE="Check For Update" +COM_PHOCADOWNLOAD_CHECK_PERMISSIONS_OWNERSHIP="Check permissions and ownership of files and folders" +COM_PHOCADOWNLOAD_CLOSE="Close" +COM_PHOCADOWNLOAD_CONFIGURATION="Phoca Download Configuration" +COM_PHOCADOWNLOAD_CONFIG_COMMENTS_SETTINGS_LABEL="Comments Settings" +COM_PHOCADOWNLOAD_CONFIG_GENERAL_SETTINGS_LABEL="General Settings" +COM_PHOCADOWNLOAD_CONFIG_HEAD_DISPLAY_LABEL="Display" +COM_PHOCADOWNLOAD_CONFIG_HEAD_GENERAL_LABEL="General" +COM_PHOCADOWNLOAD_CONFIG_HEAD_USER_UPLOAD_LABEL="User Upload" +COM_PHOCADOWNLOAD_CONFIG_THEME_SETTINGS_LABEL="Theme Settings" +COM_PHOCADOWNLOAD_CONTROL_PANEL="Control Panel" +COM_PHOCADOWNLOAD_COPYRIGHT="Copyright" +COM_PHOCADOWNLOAD_COUNT_NOT_UPLOADED_FILE="Count of not uploaded (failed) files" +COM_PHOCADOWNLOAD_COUNT_UPLOADED_FILE="Count of uploaded files" +COM_PHOCADOWNLOAD_COUNT_USER_FILES_APPROVED="Count (authorized files)" +COM_PHOCADOWNLOAD_COUNT_USER_FILES_NOT_APPROVED="Count (not authorized files)" +COM_PHOCADOWNLOAD_CREATE_FOLDER="Create Folder" +COM_PHOCADOWNLOAD_DATABASE_TIME="Database" +COM_PHOCADOWNLOAD_DATE="Date" +COM_PHOCADOWNLOAD_DATE_ASC="Date Ascending" +COM_PHOCADOWNLOAD_DATE_DESC="Date Descending" +COM_PHOCADOWNLOAD_DATE_UPLOAD="Upload Date" +COM_PHOCADOWNLOAD_DEFAULT="Default" +COM_PHOCADOWNLOAD_DELETE="Delete" +COM_PHOCADOWNLOAD_DESCRIPTION="Description" +COM_PHOCADOWNLOAD_DETAILS="Details" +COM_PHOCADOWNLOAD_DISPLAY_NUM="Display Num" +COM_PHOCADOWNLOAD_DOT="dot" +COM_PHOCADOWNLOAD_DOWNLOAD="Download" +COM_PHOCADOWNLOAD_DOWNLOADS="Downloads" +COM_PHOCADOWNLOAD_DRAG_FILES_HERE="Drag Files Here" +COM_PHOCADOWNLOAD_EDIT="Edit" +COM_PHOCADOWNLOAD_EDIT_CATEGORY="Edit Category" +COM_PHOCADOWNLOAD_EDIT_FILE="Edit File" +COM_PHOCADOWNLOAD_EMAIL="Email" +COM_PHOCADOWNLOAD_ERROR="Error" +COM_PHOCADOWNLOAD_ERROR_APPROVE_ALL="Error while authorizing all files" +COM_PHOCADOWNLOAD_ERROR_CONTROLLER_MANAGER_NOT_SET="Error while creating folder - Manager not set" +COM_PHOCADOWNLOAD_ERROR_FILE_UPLOADED="File not uploaded" +COM_PHOCADOWNLOAD_ERROR_FOLDER_CREATING="Error while creating folder" +COM_PHOCADOWNLOAD_ERROR_FOLDER_UPLOAD_NOT_EXISTS="Folder does not exist or it is not accessible" +COM_PHOCADOWNLOAD_ERROR_MOVE_UPLOADED_FILE="Failed to move uploaded file" +COM_PHOCADOWNLOAD_ERROR_NO_ABS_FILE="File not found on server" +COM_PHOCADOWNLOAD_ERROR_NO_CORRECT_FILE_TO_PLAY_FOUND="No correct file for playing found" +COM_PHOCADOWNLOAD_ERROR_NO_DB_FILE="File info not found in database" +COM_PHOCADOWNLOAD_ERROR_NO_DB_RESULT="Problems with database" +COM_PHOCADOWNLOAD_ERROR_NO_FILE_TO_PLAY_FOUND="No file for playing found" +COM_PHOCADOWNLOAD_ERROR_OPEN_INPUT_STREAM="Failed to open input stream" +COM_PHOCADOWNLOAD_ERROR_OPEN_OUTPUT_STREAM="Failed to open output stream" +COM_PHOCADOWNLOAD_ERROR_RESET_USER_STAT="Error while resetting user statistics" +COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_MOVE_FILE="Unable to move file" +COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_UPLOAD_FILE="Unable to upload file" +COM_PHOCADOWNLOAD_ERROR_UPLOAD_MANAGER_NOT_SET="Error while uploading - Manager not set" +COM_PHOCADOWNLOAD_ERROR_WHILE_DOWNLOADING_FILE="Error while downloading file" +COM_PHOCADOWNLOAD_EXPERTS_ONLY_LABEL="Experts Only!" +COM_PHOCADOWNLOAD_EXPIRED="Expired" +COM_PHOCADOWNLOAD_FIELD_ABSOLUTE_PATH_DESC="Set absolute path of Phoca Download folder (this can be path outside the public_html). Be aware, this path must exist and the folder and possible subfolders need to be created manually. If the path is outside the public_html the files cannot be previewed or played in browser." +COM_PHOCADOWNLOAD_FIELD_ABSOLUTE_PATH_LABEL="Absolute Path" +COM_PHOCADOWNLOAD_FIELD_ACCESS_RIGHTS_DESC="Set access rights" +COM_PHOCADOWNLOAD_FIELD_ACCESS_RIGHTS_LABEL="Access Rights" +COM_PHOCADOWNLOAD_FIELD_ALIAS_DESC="Set alias" +COM_PHOCADOWNLOAD_FIELD_ALIAS_LABEL="Alias" +COM_PHOCADOWNLOAD_FIELD_ALLOWED_FILE_TYPES_DOWNLOAD_DESC="Set allowed file types for frontend download. Default list of filetypes is not complete and should be modified to fit your needs." +COM_PHOCADOWNLOAD_FIELD_ALLOWED_FILE_TYPES_DOWNLOAD_LABEL="Allowed File Types (Download)" +COM_PHOCADOWNLOAD_FIELD_ALLOWED_FILE_TYPES_UPLOAD_LABEL="Allowed File Types (Upload)" +COM_PHOCADOWNLOAD_FIELD_APPROVED_DESC="Set if the file will be authorized or unathorized" +COM_PHOCADOWNLOAD_FIELD_APPROVED_LABEL="Authorized" +COM_PHOCADOWNLOAD_FIELD_AUTHOR_DESC="Set Author of the file" +COM_PHOCADOWNLOAD_FIELD_AUTHOR_EMAIL_DESC="Set Author's email" +COM_PHOCADOWNLOAD_FIELD_AUTHOR_EMAIL_LABEL="Author's Email" +COM_PHOCADOWNLOAD_FIELD_AUTHOR_LABEL="Author" +COM_PHOCADOWNLOAD_FIELD_AUTHOR_URL_DESC="Set Author's webstie" +COM_PHOCADOWNLOAD_FIELD_AUTHOR_URL_LABEL="Author's Website" +COM_PHOCADOWNLOAD_FIELD_BUTTON_STYLE_DESC="Set button style" +COM_PHOCADOWNLOAD_FIELD_BUTTON_STYLE_LABEL="Button Style" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_DESC="Select Category" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_LABEL="Category" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_ORDERING_DESC="Set category ordering" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_ORDERING_LABEL="Category Ordering" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_VIEW_PAGINATION_DESC="Set pagination values for Category View (file list). Separate each pagination value with comma (,)" +COM_PHOCADOWNLOAD_FIELD_CATEGORY_VIEW_PAGINATION_LABEL="Pagination (Category View)" +COM_PHOCADOWNLOAD_FIELD_CONFIRM_LICENSE_DESC="Select license for this file. If some license will be selected, file will be not downloaded after clicking on Download button, but the license text will be displayed. This text must be confirmed by user who wants to dowload the file." +COM_PHOCADOWNLOAD_FIELD_CONFIRM_LICENSE_LABEL="Confirm license" +COM_PHOCADOWNLOAD_FIELD_DATE_DESC="Set date" +COM_PHOCADOWNLOAD_FIELD_DATE_LABEL="Date" +COM_PHOCADOWNLOAD_FIELD_DEFAULT_VALUE_PAGINATION_DESC="Set default value for pagination which can be displayed in Category View (file list)" +COM_PHOCADOWNLOAD_FIELD_DEFAULT_VALUE_PAGINATION_LABEL="Pagination Default Value" +COM_PHOCADOWNLOAD_FIELD_DESCRIPTION_DESC="Set description. This will be displayed in Categories View" +COM_PHOCADOWNLOAD_FIELD_DESCRIPTION_LABEL="Description" +COM_PHOCADOWNLOAD_FIELD_DIRECT_LINK_DESC="If direct link will be checked, Downlod button will link directly to the file. It means the file will be handled by browser (e.g. MP3 will be not downloaded but played). This option should be selected in case there are problems with downloading files from the server." +COM_PHOCADOWNLOAD_FIELD_DIRECT_LINK_LABEL="Direct Link" +COM_PHOCADOWNLOAD_FIELD_DISALLOWED_FILE_TYPES_DOWNLOAD_DESC="Set disallowed file types for frontend download." +COM_PHOCADOWNLOAD_FIELD_DISALLOWED_FILE_TYPES_DOWNLOAD_LABEL="Disallowed File Types (Download)" +COM_PHOCADOWNLOAD_FIELD_DISALLOWED_FILE_TYPES_UPLOAD_LABEL="Disallowed File Types (Upload)" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_CATEGORY_COMMENTS_DESC="Set if category comments should be displayed or not" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_CATEGORY_COMMENTS_LABEL="Display Category Comments" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DATE_TYPE_DESC="Set date type" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DATE_TYPE_LABEL="Display Date Type" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DESCRIPTION_DESC="Display or hide description" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DESCRIPTION_LABEL="Display Description" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DETAIL_BUTTON_DESC="Display or hide detail button" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DETAIL_BUTTON_LABEL="Display Detail Button" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DOWNLOADS_DESC="Display or hide the count of downloads" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_DOWNLOADS_LABEL="Display Downloads" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_FILE_COMMENTS_DESC="Set if file comments should be displayed or not" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_FILE_COMMENTS_LABEL="Display File Comments" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_FILE_VIEW_DESC="Enable or disable File View before download a file" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_FILE_VIEW_LABEL="Display File View" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_HOT_ICON_DESC="Set the number of hits (downloads). After reaching this number of downloads HOT icon will be displayed for the file, use zero for not displaying the icon" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_HOT_ICON_LABEL="Display Hot Icon" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_INACCESSIBLE_FILE_DESC="If the file will be inaccessible for e.g. not logged in users, it can be displayed for them. It means users will see the file but by clicking on the download button they will be redirected to login form." +COM_PHOCADOWNLOAD_FIELD_DISPLAY_INACCESSIBLE_FILE_LABEL="Display Inaccessible file" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_MOST_DOWNLOAD_FILES_DESC="Display Most Download Files in Categories View" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_MOST_DOWNLOAD_FILES_LABEL="Display Most Download Files" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_NEW_ICON_DESC="Set the number of days. During these days NEW icon will be displayed for the file, use zero for not displaying the icon" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_NEW_ICON_LABEL="Display New Icon" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_NUM_FILES_CATEGORIES_VIEW_DESC="Display or hide number of files (Categories View)" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_NUM_FILES_CATEGORIES_VIEW_HEADER_DESC="Display or hide number of files (Categories View - Header)" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_NUM_FILES_CATEGORIES_VIEW_HEADER_LABEL="Display Number of Files (Categories View - Header)" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_NUM_FILES_CATEGORIES_VIEW_LABEL="Display Number of Files (Categories View)" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_PLAY_BUTTON_DESC="Display or hide play button" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_PLAY_BUTTON_LABEL="Display Play Button" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_PREVIEW_BUTTON_DESC="Display or hide preview button" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_PREVIEW_BUTTON_LABEL="Display Preview Button" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_UP_ICON_DESC="Display or hide up icon - icon back to category or back to categories view" +COM_PHOCADOWNLOAD_FIELD_DISPLAY_UP_ICON_LABEL="Display Up Icon" +COM_PHOCADOWNLOAD_FIELD_DOWNLOADS_DESC="Set Dowloads" +COM_PHOCADOWNLOAD_FIELD_DOWNLOADS_LABEL="Downloads" +COM_PHOCADOWNLOAD_FIELD_DOWNLOAD_FOLDER_DESC="Set download folder. If absolute path will be set, this parameter will be ignored. Be aware, the folder set in the parameter must exist on the server." +COM_PHOCADOWNLOAD_FIELD_DOWNLOAD_FOLDER_LABEL="Download Folder" +COM_PHOCADOWNLOAD_FIELD_ENABLE_APPROVE_USERFILE_DESC="If Yes, files will be uploaded as not authorized and must be authorized by administrator. If No, files will be uploaded as authorized" +COM_PHOCADOWNLOAD_FIELD_ENABLE_APPROVE_USERFILE_LABEL="Enable User File Authorization" +COM_PHOCADOWNLOAD_FIELD_ENABLE_MU_ADMIN_DESC="Enable or disable multiple upload feature for administration" +COM_PHOCADOWNLOAD_FIELD_ENABLE_MU_ADMIN_LABEL="Enable Multiple Upload (Administration)" +COM_PHOCADOWNLOAD_FIELD_ENABLE_PLUGIN_QUERY_DESC="Set if Plugin can modify SQL query (Experts only!)" +COM_PHOCADOWNLOAD_FIELD_ENABLE_PLUGIN_QUERY_LABEL="Enable Plugin Query" +COM_PHOCADOWNLOAD_FIELD_ENABLE_USER_STAT_DESC="Enable or disable user statistics" +COM_PHOCADOWNLOAD_FIELD_ENABLE_USER_STAT_LABEL="Enable User Statistics" +COM_PHOCADOWNLOAD_FIELD_EXTERNAL_DOWNLOAD_LINK_DESC="Select if the external download link will have attribute TARGET=_self or TARGET=_blank" +COM_PHOCADOWNLOAD_FIELD_EXTERNAL_DOWNLOAD_LINK_LABEL="External Download Link" +COM_PHOCADOWNLOAD_FIELD_EXTERNAL_LINK_DESC="If the file is stored on external server, paste the external link here. The form field 'Filename' must also be filled (paste the whole link to the file into the form field 'External file' and only the name of the file into the form field 'Filename'). If you set the form field 'Direct Link' (see above) to 'Yes', the external link will be directly accessed (without checking the rights or saving statistics). If you set the form field 'Direct Link' to 'No', internal site will be accessed - statistics will be saved, file will be checked for access rights and then the site will be redirected to the external link (be aware, if the file is public on external server, it cannot be protected by Phoca Download there). Be aware, internal site will be not accessed in File View while clicking on Submit (Download) button." +COM_PHOCADOWNLOAD_FIELD_EXTERNAL_LINK_LABEL="External Link" +COM_PHOCADOWNLOAD_FIELD_FILENAME_DESC="Set or select filename" +COM_PHOCADOWNLOAD_FIELD_FILENAME_LABEL="Filename" +COM_PHOCADOWNLOAD_FIELD_FILENAME_OR_NAME_LABEL="Filename or Title" +COM_PHOCADOWNLOAD_FIELD_FILENAME_OR_NAME_LABEL_DESC="Display Filename or Title" +COM_PHOCADOWNLOAD_FIELD_FILEPLAY_DESC="Set or select file which will be played." +COM_PHOCADOWNLOAD_FIELD_FILEPLAY_LABEL="File - Play" +COM_PHOCADOWNLOAD_FIELD_FILEPREVIEW_DESC="Set or select file which will be previewed" +COM_PHOCADOWNLOAD_FIELD_FILEPREVIEW_LABEL="File - Preview" +COM_PHOCADOWNLOAD_FIELD_FILE_ICON_SIZE_DESC="Set size of file icon" +COM_PHOCADOWNLOAD_FIELD_FILE_ICON_SIZE_LABEL="File Icon Size" +COM_PHOCADOWNLOAD_FIELD_FILE_ICON_SIZE_MD_DESC="Set size of file icon for most downloaded files" +COM_PHOCADOWNLOAD_FIELD_FILE_ICON_SIZE_MD_LABEL="File Icon Size (Most Downloaded Files)" +COM_PHOCADOWNLOAD_FIELD_FILE_ORDERING_DESC="Set file ordering" +COM_PHOCADOWNLOAD_FIELD_FILE_ORDERING_LABEL="File Ordering" +COM_PHOCADOWNLOAD_FIELD_FINISH_PUBLISHING_DESC="Set finish publishing date" +COM_PHOCADOWNLOAD_FIELD_FINISH_PUBLISHING_LABEL="Finish Publishing" +COM_PHOCADOWNLOAD_FIELD_HITS="Hits" +COM_PHOCADOWNLOAD_FIELD_HITS_DESC="Hits" +COM_PHOCADOWNLOAD_FIELD_ICON_DESC="Set icon for the file" +COM_PHOCADOWNLOAD_FIELD_ICON_LABEL="Icon" +COM_PHOCADOWNLOAD_FIELD_ICON_SPEC1_DESC="Set first specific icon for the file, will be displayed after filename" +COM_PHOCADOWNLOAD_FIELD_ICON_SPEC1_LABEL="Specific Icon (1)" +COM_PHOCADOWNLOAD_FIELD_ICON_SPEC2_DESC="Set first specific icon for the file, will be displayed after filename" +COM_PHOCADOWNLOAD_FIELD_ICON_SPEC2_LABEL="Specific Icon (2)" +COM_PHOCADOWNLOAD_FIELD_JCONFIG_PERMISSIONS_DESC="Permissions" +COM_PHOCADOWNLOAD_FIELD_JCONFIG_PERMISSIONS_LABEL="Permissions" +COM_PHOCADOWNLOAD_FIELD_LICENSE_BOX_HEIGHT_DESC="Set height of license box" +COM_PHOCADOWNLOAD_FIELD_LICENSE_BOX_HEIGHT_LABEL="License Box Height" +COM_PHOCADOWNLOAD_FIELD_LICENSE_DESC="Set license of the file, this is only information about the license, if you want that license text needs to be confirmed, you should fill the form field 'Confirm License'" +COM_PHOCADOWNLOAD_FIELD_LICENSE_LABEL="License" +COM_PHOCADOWNLOAD_FIELD_LICENSE_TEXT_DESC="Set license text" +COM_PHOCADOWNLOAD_FIELD_LICENSE_TEXT_LABEL="License Text" +COM_PHOCADOWNLOAD_FIELD_LICENSE_URL_DESC="Set URL to license. URL to site where is described the license of the file" +COM_PHOCADOWNLOAD_FIELD_LICENSE_URL_LABEL="License link" +COM_PHOCADOWNLOAD_FIELD_MAX_COUNT_USER_FILES_DESC="Set maximum count of files user can upload" +COM_PHOCADOWNLOAD_FIELD_MAX_COUNT_USER_FILES_LABEL="Maximum Count of uploaded user's files" +COM_PHOCADOWNLOAD_FIELD_MAX_SIZE_USER_FILES_DESC="Set maximum size of all files user can upload" +COM_PHOCADOWNLOAD_FIELD_MAX_SIZE_USER_FILES_LABEL="Maximum Size of all user's files" +COM_PHOCADOWNLOAD_FIELD_METADESC_DESC="Set meta description for Phoca Download" +COM_PHOCADOWNLOAD_FIELD_METADESC_LABEL="Meta Description" +COM_PHOCADOWNLOAD_FIELD_METAKEY_DESC="Set meta keywords for Phoca Download" +COM_PHOCADOWNLOAD_FIELD_METAKEY_LABEL="Meta Keywords" +COM_PHOCADOWNLOAD_FIELD_ORDERING_DESC="Set ordering" +COM_PHOCADOWNLOAD_FIELD_ORDERING_LABEL="Ordering" +COM_PHOCADOWNLOAD_FIELD_PARENT_CATEGORY_DESC="Set parent category" +COM_PHOCADOWNLOAD_FIELD_PARENT_CATEGORY_LABEL="Parent Category" +COM_PHOCADOWNLOAD_FIELD_PLAYER_HEIGHT_DESC="Set player height (in px)" +COM_PHOCADOWNLOAD_FIELD_PLAYER_HEIGHT_LABEL="Player Height" +COM_PHOCADOWNLOAD_FIELD_PLAYER_MP3_HEIGHT_DESC="Set player height (MP3, OGG Audio)" +COM_PHOCADOWNLOAD_FIELD_PLAYER_MP3_HEIGHT_LABEL="Player Height (MP3, OGG Audio)" +COM_PHOCADOWNLOAD_FIELD_PLAYER_WIDTH_DESC="Set player width (in px)" +COM_PHOCADOWNLOAD_FIELD_PLAYER_WIDTH_LABEL="Player Width" +COM_PHOCADOWNLOAD_FIELD_PLAY_POPUP_WINDOW_DESC="Select play popup window" +COM_PHOCADOWNLOAD_FIELD_PLAY_POPUP_WINDOW_LABEL="Play Popup Window" +COM_PHOCADOWNLOAD_FIELD_PREVIEW_HEIGHT_DESC="Set preview height (in px)" +COM_PHOCADOWNLOAD_FIELD_PREVIEW_HEIGHT_LABEL="Preview Height" +COM_PHOCADOWNLOAD_FIELD_PREVIEW_POPUP_WINDOW_DESC="Select preview popup window" +COM_PHOCADOWNLOAD_FIELD_PREVIEW_POPUP_WINDOW_LABEL="Preview Popup Window" +COM_PHOCADOWNLOAD_FIELD_PREVIEW_WIDTH_DESC="Set preview width (in px)" +COM_PHOCADOWNLOAD_FIELD_PREVIEW_WIDTH_LABEL="Preview Width" +COM_PHOCADOWNLOAD_FIELD_PUBLISHED_DESC="Publish or unpublish" +COM_PHOCADOWNLOAD_FIELD_PUBLISHED_LABEL="Published" +COM_PHOCADOWNLOAD_FIELD_SEND_EMAIL_DOWNLOAD_DESC="Send email if user will download a file" +COM_PHOCADOWNLOAD_FIELD_SEND_EMAIL_DOWNLOAD_LABEL="Send Email (Download)" +COM_PHOCADOWNLOAD_FIELD_SEND_EMAIL_UPLOAD_DESC="Send email if user will upload a file" +COM_PHOCADOWNLOAD_FIELD_SEND_EMAIL_UPLOAD_LABEL="Send Email (Upload)" +COM_PHOCADOWNLOAD_FIELD_START_PUBLISHING_DESC="Set start publishing date" +COM_PHOCADOWNLOAD_FIELD_START_PUBLISHING_LABEL="Start Publishing" +COM_PHOCADOWNLOAD_FIELD_THEME_DESC="Set theme" +COM_PHOCADOWNLOAD_FIELD_THEME_LABEL="Theme" +COM_PHOCADOWNLOAD_FIELD_TITLE_DESC="Set title" +COM_PHOCADOWNLOAD_FIELD_TITLE_LABEL="Title" +COM_PHOCADOWNLOAD_FIELD_UPLOAD_MAX_SIZE_ADMIN_DESC="Set the maximum size for an upload in administration. Use zero for no limit. Do not forget, that the upload size can be limited by the server settings (in bytes)" +COM_PHOCADOWNLOAD_FIELD_UPLOAD_MAX_SIZE_ADMIN_LABEL="Maximum Upload Size (Administration)" +COM_PHOCADOWNLOAD_FIELD_UPLOAD_RIGHTS_DESC="Set upload rights" +COM_PHOCADOWNLOAD_FIELD_UPLOAD_RIGHTS_LABEL="Upload Rights" +COM_PHOCADOWNLOAD_FIELD_USER_FILE_UPLOAD_SIZE_DESC="Set maximum size of file which can be uploaded by user in frontend" +COM_PHOCADOWNLOAD_FIELD_USER_FILE_UPLOAD_SIZE_LABEL="User File Upload Size" +COM_PHOCADOWNLOAD_FIELD_USER_UPLOAD_ENABLE_DESC="Enable or disable user upload" +COM_PHOCADOWNLOAD_FIELD_USER_UPLOAD_ENABLE_LABEL="Enable User Upload" +COM_PHOCADOWNLOAD_FIELD_VERSION_DESC="Set version" +COM_PHOCADOWNLOAD_FIELD_VERSION_LABEL="Version" +COM_PHOCADOWNLOAD_FILE="File" +COM_PHOCADOWNLOAD_FILENAME="Filename" +COM_PHOCADOWNLOAD_FILENAME_AND_TITLE="Filename and Title" +COM_PHOCADOWNLOAD_FILES="Files" +COM_PHOCADOWNLOAD_FILESIZE="File Size" +COM_PHOCADOWNLOAD_FILES_UPLOADED="Files Uploaded" +COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS="File already exists" +COM_PHOCADOWNLOAD_FILE_FILEATIME="File (access time)" +COM_PHOCADOWNLOAD_FILE_FILECTIME="File (inode change time)" +COM_PHOCADOWNLOAD_FILE_FILEMTIME="File (modification time)" +COM_PHOCADOWNLOAD_FILE_SETTINGS_LABEL="File Settings" +COM_PHOCADOWNLOAD_FILE_SIZE_EMPTY="File Size is empty" +COM_PHOCADOWNLOAD_FILE_TITLE="File Title" +COM_PHOCADOWNLOAD_FILTER="Filter" +COM_PHOCADOWNLOAD_FINISH="Finish" +COM_PHOCADOWNLOAD_FINISH_PUBLISHING="Finish Publishing" +COM_PHOCADOWNLOAD_FOLDER="Folder" +COM_PHOCADOWNLOAD_FORM_SELECT_FILENAME="Select Filename" +COM_PHOCADOWNLOAD_FORM_SELECT_ICON="Select Icon" +COM_PHOCADOWNLOAD_FTP_LOGIN_DESC="For uploading files (images, themes), Joomla! will most likely need your FTP account details. Please enter them in the form fields below." +COM_PHOCADOWNLOAD_FTP_LOGIN_LABEL="FTP Login Details" +COM_PHOCADOWNLOAD_GREY="Grey" +COM_PHOCADOWNLOAD_GROUP_LABEL_PUBLISHING_DETAILS="Publishing Details" +COM_PHOCADOWNLOAD_GUEST="Guest" +COM_PHOCADOWNLOAD_HELP="Help" +COM_PHOCADOWNLOAD_HITS="Hits" +COM_PHOCADOWNLOAD_ID="ID" +COM_PHOCADOWNLOAD_ID_ASC="ID Ascending" +COM_PHOCADOWNLOAD_ID_DESC="ID Descending" +COM_PHOCADOWNLOAD_INFO="Info" +COM_PHOCADOWNLOAD_INSERT="Insert" +COM_PHOCADOWNLOAD_INSERT_FILENAME="Insert Filename" +COM_PHOCADOWNLOAD_INSERT_ICON="Insert Icon" +COM_PHOCADOWNLOAD_INVALID_TOKEN="Invalid Token" +COM_PHOCADOWNLOAD_I_AGREE_TO_TERMS_LISTED_ABOVE="I agree to the terms listed above" +COM_PHOCADOWNLOAD_JCOMMENTS="JComments" +COM_PHOCADOWNLOAD_LICENSE="License" +COM_PHOCADOWNLOAD_LICENSES="Licenses" +COM_PHOCADOWNLOAD_LICENSE_AGREEMENT="License Agreement" +COM_PHOCADOWNLOAD_LOADING="Loading" +COM_PHOCADOWNLOAD_MAX_LIMIT_CHARS_REACHED="You have reached maximum limit of characters allowed" +COM_PHOCADOWNLOAD_MAX_SIZE="Max Size" +COM_PHOCADOWNLOAD_MODAL_BOX="Modal Box" +COM_PHOCADOWNLOAD_MOST_DOWNLOADED_FILES="Most downloaded files" +COM_PHOCADOWNLOAD_MULTIPLE_UPLOAD="Multiple Upload" +COM_PHOCADOWNLOAD_NEW="New" +COM_PHOCADOWNLOAD_NEW_CATEGORY="New Category" +COM_PHOCADOWNLOAD_NEW_FILE="New File" +COM_PHOCADOWNLOAD_NO="No" +COM_PHOCADOWNLOAD_NOBODY="Nobody" +COM_PHOCADOWNLOAD_NONE="None" +COM_PHOCADOWNLOAD_NOT_APPROVE="Unauthorize" +COM_PHOCADOWNLOAD_NOT_APPROVED="Not Authorized" +COM_PHOCADOWNLOAD_NOT_APPROVED_FILES_COUNT="Count of not authorized file(s)" +COM_PHOCADOWNLOAD_NOT_APPROVE_ITEM="Unauthorize item" +COM_PHOCADOWNLOAD_NOT_AUTHORISED_ACTION="You are not authorized to do this action" +COM_PHOCADOWNLOAD_NOT_AUTHORISED_TO_UPLOAD="You are not authorized to upload file" +COM_PHOCADOWNLOAD_NOT_INSTALLED_BROWSERPLUS="You browser doesn't have BrowserPlus installed." +COM_PHOCADOWNLOAD_NOT_INSTALLED_FLASH="You browser doesn't have Flash installed." +COM_PHOCADOWNLOAD_NOT_INSTALLED_GEARS="You browser doesn't have Gears installed." +COM_PHOCADOWNLOAD_NOT_INSTALLED_SILVERLIGHT="You browser doesn't have Silverlight installed." +COM_PHOCADOWNLOAD_NOT_SUPPORTED_HTML4="You browser doesn't have HTML 4 support." +COM_PHOCADOWNLOAD_NOT_SUPPORTED_HTML5="You browser doesn't have HTML 5 support." +COM_PHOCADOWNLOAD_NO_EXPIRY="No Expiry" +COM_PHOCADOWNLOAD_NO_RIGHTS_ACCESS_CATEGORY="You have no rights to access this category" +COM_PHOCADOWNLOAD_NO_SUBCATEGORIES="No Subcategories" +COM_PHOCADOWNLOAD_N_ITEMS_APPROVED="%d items successfully authorized" +COM_PHOCADOWNLOAD_N_ITEMS_APPROVED_1="%d item successfully authorized" +COM_PHOCADOWNLOAD_N_ITEMS_CHECKED_IN_0="No item successfully checked in" +COM_PHOCADOWNLOAD_N_ITEMS_CHECKED_IN_1="%d item successfully checked in" +COM_PHOCADOWNLOAD_N_ITEMS_CHECKED_IN_MORE="%d items successfully checked in" +COM_PHOCADOWNLOAD_N_ITEMS_DELETED="%d items successfully deleted" +COM_PHOCADOWNLOAD_N_ITEMS_DELETED_1="%d item successfully deleted" +COM_PHOCADOWNLOAD_N_ITEMS_DISAPPROVED="%d items successfully unauthorized" +COM_PHOCADOWNLOAD_N_ITEMS_DISAPPROVED_1="%d item successfully unauthorized" +COM_PHOCADOWNLOAD_N_ITEMS_PUBLISHED="%d items successfully published" +COM_PHOCADOWNLOAD_N_ITEMS_PUBLISHED_1="%d item successfully published" +COM_PHOCADOWNLOAD_N_ITEMS_UNPUBLISHED="%d items successfully unpublished" +COM_PHOCADOWNLOAD_N_ITEMS_UNPUBLISHED_1="%d item successfully unpublished" +COM_PHOCADOWNLOAD_OPEN="Open" +COM_PHOCADOWNLOAD_ORDER="Order" +COM_PHOCADOWNLOAD_ORDERING="Ordering" +COM_PHOCADOWNLOAD_ORDERING_ASC="Ordering Ascending" +COM_PHOCADOWNLOAD_ORDERING_DESC="Ordering Descending" +COM_PHOCADOWNLOAD_OVERLIB="Overlib" +COM_PHOCADOWNLOAD_OWNER="Owner" +COM_PHOCADOWNLOAD_PARENT_CATEGORY="Parent Category" +COM_PHOCADOWNLOAD_PATH="Path" +COM_PHOCADOWNLOAD_PD_CONTROL_PANEL="Phoca Download Control Panel" +COM_PHOCADOWNLOAD_PD_INFO="Phoca Download Info" +COM_PHOCADOWNLOAD_PENDING="Pending" +COM_PHOCADOWNLOAD_PLAY="Play" +COM_PHOCADOWNLOAD_PLAY_SETTINGS_LABEL="Play Settings" +COM_PHOCADOWNLOAD_PLEASE_ADD_FILE="Please add a file" +COM_PHOCADOWNLOAD_PLEASE_ENTER_VALID_EMAIL_ADDRESS="Please enter a valid email address" +COM_PHOCADOWNLOAD_PLEASE_ENTER_VALID_WEBSITE="Please enter a valid website (format: http://your_site.com)" +COM_PHOCADOWNLOAD_PLEASE_LOGIN_DOWNLOAD_FILE="Please login to download the file" +COM_PHOCADOWNLOAD_PLEASE_SELECT_CATEGORY="Please select category" +COM_PHOCADOWNLOAD_PREVIEW="Preview" +COM_PHOCADOWNLOAD_PREVIEW_SETTINGS_LABEL="Preview Settings" +COM_PHOCADOWNLOAD_PUBLISHED="Published" +COM_PHOCADOWNLOAD_PUBLISH_INFORMATION="Publish Information" +COM_PHOCADOWNLOAD_RESET="Reset" +COM_PHOCADOWNLOAD_ROUNDED_CORNERS="Rounded Corners" +COM_PHOCADOWNLOAD_SEARCH="Search" +COM_PHOCADOWNLOAD_SEARCH_IN_TITLE="Search" +COM_PHOCADOWNLOAD_SELECT_CATEGORY="Select Category" +COM_PHOCADOWNLOAD_SELECT_FILES="Select Files" +COM_PHOCADOWNLOAD_SELECT_ITEM_RESET="Select an item to reset" +COM_PHOCADOWNLOAD_SELECT_LICENSE="Select License" +COM_PHOCADOWNLOAD_SELF="Self" +COM_PHOCADOWNLOAD_SIZE="Size" +COM_PHOCADOWNLOAD_STANDARD_POPUP_WINDOW="Standard Popup Window" +COM_PHOCADOWNLOAD_START="Start" +COM_PHOCADOWNLOAD_START_PUBLISHING="Start Publishing" +COM_PHOCADOWNLOAD_START_UPLOAD="Start Upload" +COM_PHOCADOWNLOAD_START_UPLOADING_QUEUE="Start Uploading Queue" +COM_PHOCADOWNLOAD_STATISTICS="Statistics" +COM_PHOCADOWNLOAD_STATUS="Status" +COM_PHOCADOWNLOAD_STOP_CURRENT_UPLOAD="Stop Current Upload" +COM_PHOCADOWNLOAD_SUCCESS="Success" +COM_PHOCADOWNLOAD_SUCCESS_FILE_UPLOAD="File uploaded" +COM_PHOCADOWNLOAD_SUCCESS_FILE_UPLOADED="File uploaded" +COM_PHOCADOWNLOAD_SUCCESS_FOLDER_CREATING="Folder created" +COM_PHOCADOWNLOAD_SUCCESS_RESET_USER_STAT="User Statistics reset" +COM_PHOCADOWNLOAD_THERE_IS_NO_FILE="There is no file" +COM_PHOCADOWNLOAD_TITLE="Title" +COM_PHOCADOWNLOAD_TITLE_ASC="Title Ascending" +COM_PHOCADOWNLOAD_TITLE_DESC="Title Descending" +COM_PHOCADOWNLOAD_TOP="Top" +COM_PHOCADOWNLOAD_TOP_AND_OVERLIB="Top and Overlib" +COM_PHOCADOWNLOAD_TOP_WITH_DETAIL_AND_OVERLIB="Top with detail and Overlib" +COM_PHOCADOWNLOAD_UNABLE_TO_UPLOAD_FILE="File cannot be uploaded - unable to move file" +COM_PHOCADOWNLOAD_UP="Up" +COM_PHOCADOWNLOAD_UPLOAD="Upload" +COM_PHOCADOWNLOAD_UPLOADED_FILES="Uploaded Files" +COM_PHOCADOWNLOAD_UPLOAD_FILE="Upload File" +COM_PHOCADOWNLOAD_USER="User" +COM_PHOCADOWNLOAD_USERNAME="Username" +COM_PHOCADOWNLOAD_USERS="Users" +COM_PHOCADOWNLOAD_USER_STATISTICS="User Statistics" +COM_PHOCADOWNLOAD_USER_UPLOAD_DISABLED="User Upload is disabled" +COM_PHOCADOWNLOAD_VERSION="Version" +COM_PHOCADOWNLOAD_WARNFILENAME="File name must only contain alphanumeric characters, underscores, hyphens and spaces." +COM_PHOCADOWNLOAD_WARNFILETOOLARGE="This file is too large to upload." +COM_PHOCADOWNLOAD_WARNFILETYPE="This file type is not supported (or there are some restrictions on the server)." +COM_PHOCADOWNLOAD_WARNFILETYPE_DISALLOWED="The file type is disallowed - file cannot be uploaded" +COM_PHOCADOWNLOAD_WARNFILETYPE_DISALLOWED_DOWNLOAD="Error while downloading file (Disallowed Mime Type)" +COM_PHOCADOWNLOAD_WARNFILETYPE_DOWNLOAD="Error while downloading file (Mime Type not found)" +COM_PHOCADOWNLOAD_WARNFILETYPE_NOT_ALLOWED="The file type is not allowed - file cannot be uploaded" +COM_PHOCADOWNLOAD_WARNIEXSS="Possible IE XSS Attack found." +COM_PHOCADOWNLOAD_WARNING_AGREE_LICENSE_TERMS="You must agree to listed terms" +COM_PHOCADOWNLOAD_WARNING_AUTHORIZE_ALL="Do you really want to authorize all files of all users?" +COM_PHOCADOWNLOAD_WARNING_DELETE_ITEMS="Are you sure you want to delete the listed Items?" +COM_PHOCADOWNLOAD_WARNING_DIRNAME="Error: Wrong folder name" +COM_PHOCADOWNLOAD_WARNING_INPUT_FILE_UPLOAD="Please input a file for upload" +COM_PHOCADOWNLOAD_WARNING_RESET_DOWNLOADS="Really reset downloads?" +COM_PHOCADOWNLOAD_WARNINVALIDIMG="Not a valid image." +COM_PHOCADOWNLOAD_WARNINVALIDMIME="Illegal or invalid mime type detected." +COM_PHOCADOWNLOAD_WARNNOTADMIN="Uploaded file is not an image file and you are not a manager or higher." +COM_PHOCADOWNLOAD_WARNSAFEMODE="Directory creation is not allowed while running in SAFE MODE as this can cause problems." +COM_PHOCADOWNLOAD_WARNUSERFILESTOOLARGE="Maximum size of all your files reached. File cannot be uploaded." +COM_PHOCADOWNLOAD_WARNUSERFILESTOOMUCH="Maximum count of all your files reached. File cannot be uploaded." +COM_PHOCADOWNLOAD_YES="Yes" +COM_PHOCADOWNLOAD_AT="at" +COM_PHOCADOWNLOAD_ERROR_CONTROLLER="Error: No such controller or task" +COM_PHOCADOWNLOAD_ERROR_FOLDER_CREATING_EXISTS="Folder exists" +COM_PHOCADOWNLOAD_SUCCESS_FOLDER_CREATING="Folder created" +COM_PHOCADOWNLOAD_EDIT_LICENSE="Edit License" +COM_PHOCADOWNLOAD_NEW_LICENSE="New License" diff --git a/language/en-GB/en-GB.com_phocadownload.sys.ini b/language/en-GB/en-GB.com_phocadownload.sys.ini new file mode 100644 index 0000000..8009f96 --- /dev/null +++ b/language/en-GB/en-GB.com_phocadownload.sys.ini @@ -0,0 +1,59 @@ +; @package Joomla.Framework +; @copyright Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved. +; @license GNU General Public License version 2 or later; see LICENSE.txt +; +; @component Phoca Component +; @copyright Copyright (C) Jan Pavelka www.phoca.cz +; @license http://www.gnu.org/copyleft/gpl.html GNU General Public License version 2 or later; +; +; @test utf-8 ä, ö, ü +; + +;[3.0.2] +COM_PHOCADOWNLOAD_DOWNLOAD_LAYOUT="Download View" +COM_PHOCADOWNLOAD_DOWNLOAD_LAYOUT_DESC="This view displays link of file to download (File which is accessible by unique download URL)" +COM_PHOCADOWNLOAD_DOWNLOAD_GROUP="Download View" +COM_PHOCADOWNLOAD_DOWNLOAD_GROUP_DESC="This view displays link of file to download (File which is accessible by unique download URL)" + +;[3.0.0 Stable] +COM_PHOCADOWNLOAD_VERSION="Version" +;[3.0.0] +COM_PHOCADOWNLOAD_UPDATE_TEXT="Phoca Download updated" +COM_PHOCADOWNLOAD_DOWNLOADS="Downloads" +COM_PHOCADOWNLOAD_UPLOADS="Uploads" +COM_PHOCADOWNLOAD_LOGGING="Logging" +COM_PHOCADOWNLOAD_STYLES="Styles" +;[2.1.2] +COM_PHOCADOWNLOAD_TAGS="Tags" +COM_PHOCADOWNLOAD_LAYOUT="Layout" +;[2.1.0] +PHOCADOWNLOAD="Phoca Download" +COM_PHOCADOWNLOAD="Phoca Download" +COM_PHOCADOWNLOAD_CONTROLPANEL="Control Panel" +COM_PHOCADOWNLOAD_FILES="Files" +COM_PHOCADOWNLOAD_CATEGORIES="Categories" +COM_PHOCADOWNLOAD_LICENSES="Licenses" +COM_PHOCADOWNLOAD_STATISTICS="Statistics" +COM_PHOCADOWNLOAD_USERS="Users" +COM_PHOCADOWNLOAD_INFO="Info" +COM_PHOCADOWNLOAD_FILE_RATING="File Rating" +COM_PHOCADOWNLOAD_XML_DESCRIPTION="Phoca Download is a download manager for Joomla! CMS. It includes component, modules and plugins and allows to add files to the site which can be downloaded by other users." +COM_PHOCADOWNLOAD_CATEGORIES_GROUP="List Of Categories (Categories View)" +COM_PHOCADOWNLOAD_CATEGORIES_GROUP_DESC="This view displays list of categories" +COM_PHOCADOWNLOAD_CATEGORY_GROUP="List of Files (Category View)" +COM_PHOCADOWNLOAD_CATEGORY_GROUP_DESC="This view displays list of files" +COM_PHOCADOWNLOAD_FILE_GROUP="File View - detail of a file" +COM_PHOCADOWNLOAD_FILE_GROUP_DESC="This view displays detail of a file" +COM_PHOCADOWNLOAD_USER_UPLOAD_GROUP="User Upload View" +COM_PHOCADOWNLOAD_USER_UPLOAD_GROUP_DESC="This view displays User Upload" +COM_PHOCADOWNLOAD_CATEGORIES_LIST_LAYOUT="List Of Categories (Categories View)" +COM_PHOCADOWNLOAD_CATEGORIES_LIST_LAYOUT_DESC="This view displays list of categories" +COM_PHOCADOWNLOAD_CATEGORY_LIST_LAYOUT="List of Files (Category View)" +COM_PHOCADOWNLOAD_CATEGORY_LIST_LAYOUT_DESC="This view displays list of files" +COM_PHOCADOWNLOAD_USER_UPLOAD_LAYOUT="User Upload" +COM_PHOCADOWNLOAD_USER_UPLOAD_LAYOUT_DESC="This view displays User Upload" +COM_PHOCADOWNLOAD_FILE_LAYOUT="File View" +COM_PHOCADOWNLOAD_FILE_LAYOUT_DESC="This view displays details of a file" + +COM_PHOCADOWNLOAD_INSTALL="Install" +COM_PHOCADOWNLOAD_UPGRADE="Upgrade" \ No newline at end of file diff --git a/language/en-GB/index.html b/language/en-GB/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/language/en-GB/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/language/index.html b/language/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/language/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/index.html b/libraries/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/loader.php b/libraries/loader.php new file mode 100644 index 0000000..696be7b --- /dev/null +++ b/libraries/loader.php @@ -0,0 +1,78 @@ +setQuery($query, 0, 1); + $output = $db->loadObject(); + return $output; + } + + public static function getCategoryAccessByFileId($id) { + + $output = array(); + $db = JFactory::getDBO(); + $query = 'SELECT c.access, c.uploaduserid, c.deleteuserid' . + ' FROM #__phocadownload_categories AS c' . + ' LEFT JOIN #__phocadownload as a ON a.catid = c.id' . + ' WHERE a.id = '. (int) $id; + $db->setQuery($query, 0, 1); + $output = $db->loadObject(); + return $output; + } + + + + /** + * Method to check if the user have access to category + * Display or hide the not accessible categories - subcat folder will be not displayed + * Check whether category access level allows access + * + * E.g.: Should the link to Subcategory or to Parentcategory be displayed + * E.g.: Should the delete button displayed, should be the upload button displayed + * + * @param string $params rightType: accessuserid, uploaduserid, deleteuserid - access, upload, delete right + * @param int $params rightUsers - All selected users which should have the "rightType" right + * @param int $params rightGroup - All selected Groups of users(public, registered or special ) which should have the "rT" right + * @param int $params userAID - Specific group of user who display the category in front (public, special, registerd) + * @param int $params userId - Specific id of user who display the category in front (1,2,3,...) + * @param int $params Additional param - e.g. $display_access_category (Should be unaccessed category displayed) + * @return boolean 1 or 0 + */ + + public static function getUserRight($rightType = 'accessuserid', $rightUsers, $rightGroup = 0, $userAID = array(), $userId = 0 , $additionalParam = 0 ) { + + // User ACL + $rightGroupAccess = 0; + // User can be assigned to different groups + foreach ($userAID as $keyUserAID => $valueUserAID) { + if ((int)$rightGroup == (int)$valueUserAID) { + $rightGroupAccess = 1; + break; + } + } + + + $rightUsersIdArray = array(); + if (!empty($rightUsers)) { + $rightUsersIdArray = explode( ',', trim( $rightUsers ) ); + } else { + $rightUsersIdArray = array(); + } + + $rightDisplay = 1; + if ($additionalParam == 0) { // We want not to display unaccessable categories ($display_access_category) + if ($rightGroup != 0) { + + if ($rightGroupAccess == 0) { + $rightDisplay = 0; + } else { // Access level only for one registered user + if (!empty($rightUsersIdArray)) { + // Check if the user is contained in selected array + $userIsContained = 0; + foreach ($rightUsersIdArray as $key => $value) { + if ($userId == $value) { + $userIsContained = 1;// check if the user id is selected in multiple box + break;// don't search again + } + // for access (-1 not selected - all registered, 0 all users) + if ($value == -1) { + $userIsContained = 1;// in multiple select box is selected - All registered users + break;// don't search again + } + } + + if ($userIsContained == 0) { + $rightDisplay = 0; + } + } else { + + // Access rights (Default open for all) + // Upload and Delete rights (Default closed for all) + switch ($rightType) { + case 'accessuserid': + $rightDisplay = 1; + break; + + Default: + $rightDisplay = 0; + break; + } + } + } + } + } + return $rightDisplay; + } + + + /* + * + */ + public static function getNeededAccessLevels() { + + $paramsC = JComponentHelper::getParams('com_phocadownload'); + $registeredAccessLevel = $paramsC->get( 'registered_access_level', array(2,3,4) ); + return $registeredAccessLevel; + } + + /* + * Check if user's groups access rights (e.g. user is public, registered, special) can meet needed Levels + */ + + public static function isAccess($userLevels, $neededLevels) { + + $rightGroupAccess = 0; + + // User can be assigned to different groups + foreach($userLevels as $keyuserLevels => $valueuserLevels) { + foreach($neededLevels as $keyneededLevels => $valueneededLevels) { + + if ((int)$valueneededLevels == (int)$valueuserLevels) { + $rightGroupAccess = 1; + break; + } + } + if ($rightGroupAccess == 1) { + break; + } + } + return (boolean)$rightGroupAccess; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/access/index.html b/libraries/phocadownload/access/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/access/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/category/category.php b/libraries/phocadownload/category/category.php new file mode 100644 index 0000000..65550f9 --- /dev/null +++ b/libraries/phocadownload/category/category.php @@ -0,0 +1,137 @@ +text; + + if ($key->parentid == $id && $currentId != $id && $currentId != $key->value) { + $tree[$key->value] = new JObject(); + $tree[$key->value]->text = $show_text; + $tree[$key->value]->value = $key->value; + $tree = PhocaDownloadCategory::CategoryTreeOption($data, $tree, $key->value, $show_text . " - ", $currentId ); + } + } + return($tree); + } + + public static function filterCategory($query, $active = NULL, $frontend = NULL, $onChange = TRUE, $fullTree = NULL ) { + + $db = JFactory::getDBO(); + + $form = 'adminForm'; + if ($frontend == 1) { + $form = 'phocadownloadfilesform'; + } + + if ($onChange) { + $onChO = 'class="inputbox" size="1" onchange="document.'.$form.'.submit( );"'; + } else { + $onChO = 'class="inputbox" size="1"'; + } + + $categories[] = JHTML::_('select.option', '0', '- '.JText::_('COM_PHOCADOWNLOAD_SELECT_CATEGORY').' -'); + $db->setQuery($query); + $catData = $db->loadObjectList(); + + + + if ($fullTree) { + + // Start - remove in case there is a memory problem + $tree = array(); + $text = ''; + + $queryAll = ' SELECT cc.id AS value, cc.title AS text, cc.parent_id as parentid' + .' FROM #__phocadownload_categories AS cc' + .' ORDER BY cc.ordering'; + $db->setQuery($queryAll); + $catDataAll = $db->loadObjectList(); + + $catDataTree = PhocaDownloadCategory::CategoryTreeOption($catDataAll, $tree, 0, $text, -1); + + $catDataTreeRights = array(); + /*foreach ($catData as $k => $v) { + foreach ($catDataTree as $k2 => $v2) { + if ($v->value == $v2->value) { + $catDataTreeRights[$k]->text = $v2->text; + $catDataTreeRights[$k]->value = $v2->value; + } + } + }*/ + + foreach ($catDataTree as $k => $v) { + foreach ($catData as $k2 => $v2) { + if ($v->value == $v2->value) { + $catDataTreeRights[$k] = new StdClass(); + $catDataTreeRights[$k]->text = $v->text; + $catDataTreeRights[$k]->value = $v->value; + } + } + } + + + + $catDataTree = array(); + $catDataTree = $catDataTreeRights; + // End - remove in case there is a memory problem + + // Uncomment in case there is a memory problem + //$catDataTree = $catData; + } else { + $catDataTree = $catData; + } + + $categories = array_merge($categories, $catDataTree ); + + $category = JHTML::_('select.genericlist', $categories, 'catid', $onChO, 'value', 'text', $active); + + return $category; + } + + public static function options($type = 0) + { + if ($type == 1) { + $tree[0] = new JObject(); + $tree[0]->text = JText::_('COM_PHOCADOWNLOAD_MAIN_CSS'); + $tree[0]->value = 1; + $tree[1] = new JObject(); + $tree[1]->text = JText::_('COM_PHOCADOWNLOAD_CUSTOM_CSS'); + $tree[1]->value = 2; + return $tree; + } + + $db = JFactory::getDBO(); + + //build the list of categories + $query = 'SELECT a.title AS text, a.id AS value, a.parent_id as parentid' + . ' FROM #__phocadownload_categories AS a' + . ' WHERE a.published = 1' + . ' ORDER BY a.ordering'; + $db->setQuery( $query ); + $items = $db->loadObjectList(); + + $catId = -1; + + $javascript = 'class="inputbox" size="1" onchange="submitform( );"'; + + $tree = array(); + $text = ''; + $tree = PhocaDownloadCategory::CategoryTreeOption($items, $tree, 0, $text, $catId); + + return $tree; + + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/category/index.html b/libraries/phocadownload/category/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/category/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/download/download.php b/libraries/phocadownload/download/download.php new file mode 100644 index 0000000..63f10b7 --- /dev/null +++ b/libraries/phocadownload/download/download.php @@ -0,0 +1,564 @@ +getParams(); + $directLink = $fileData['directlink'];// Direct Link 0 or 1 + $externalLink = $fileData['externallink']; + $absOrRelFile = $fileData['file'];// Relative Path or Absolute Path + + // Type = 1 - Token - unique download link - cannot be direct + if ($type == 1) { + $directLink = 0; + } + + // NO FILES FOUND (abs file) + $error = false; + $error = preg_match("/COM_PHOCADOWNLOAD_ERROR/i", $absOrRelFile); + + if ($error) { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_WHILE_DOWNLOADING_FILE') . ' ' . JText::_($absOrRelFile); + $app->redirect(JRoute::_($currentLink), $msg); + } else { + + // Get extensions + $extension = JFile::getExt(strtolower($absOrRelFile)); + + $aft = $params->get( 'allowed_file_types_download', PhocaDownloadSettings::getDefaultAllowedMimeTypesDownload() ); + $dft = $params->get( 'disallowed_file_types_download', '' ); + + // Get Mime from params ( ext --> mime) + $allowedMimeType = PhocaDownloadFile::getMimeType($extension, $aft); + $disallowedMimeType = PhocaDownloadFile::getMimeType($extension, $dft); + + // NO MIME FOUND + $errorAllowed = false;// !!! IF YES - Disallow Downloading + $errorDisallowed = false;// !!! IF YES - Allow Downloading + + $errorAllowed = preg_match("/PhocaError/i", $allowedMimeType); + $errorDisallowed = preg_match("/PhocaError/i", $disallowedMimeType); + + $ignoreDownloadCheck = $params->get( 'ignore_file_types_check', 2 ); + if ($ignoreDownloadCheck == 3 || $ignoreDownloadCheck == 4 || $ignoreDownloadCheck == 5) { + $errorAllowed = false; + $errorDisallowed = true; + } + + + if ($errorAllowed) { + $msg = JText::_('COM_PHOCADOWNLOAD_WARNFILETYPE_DOWNLOAD'); + $app->redirect(JRoute::_($currentLink), $msg); + } else if (!$errorDisallowed) { + $msg = JText::_('COM_PHOCADOWNLOAD_WARNFILETYPE_DISALLOWED_DOWNLOAD'); + $app->redirect(JRoute::_($currentLink), $msg); + } else { + + if ($directLink == 1) { + + // Direct Link on the same server + $fileWithoutPath = basename($absOrRelFile); + $addHit = self::hit($downloadId); + if ($type == 1) { + self::hitToken($downloadId); + } + + if ((int)$params->get('send_mail_download', 0) > 0) { + PhocaDownloadMail::sendMail((int)$params->get('send_mail_download', 0), $fileWithoutPath, 1); + } + + // USER Statistics + if ((int)$params->get('enable_user_statistics', 1) == 1) { + $addUserStat = PhocaDownloadStat::createUserStatEntry($downloadId); + } + + PhocaDownloadLog::log($downloadId, 1); + + + $app->redirect ($absOrRelFile); + exit; + } else if ($directLink == 0 && $externalLink != '') { + + // External Link but with redirect + // In case there is directLink the external Link does not go this way but directly to the external URL + $addHit = self::hit($downloadId); + if ($type == 1) { + self::hitToken($downloadId); + } + + if ((int)$params->get('send_mail_download', 0) > 0) { + PhocaDownloadMail::sendMail((int)$params->get('send_mail_download', 0), $externalLink, 1); + } + + // USER Statistics + if ((int)$params->get('enable_user_statistics', 1) == 1) { + $addUserStat = PhocaDownloadStat::createUserStatEntry($downloadId); + } + + PhocaDownloadLog::log($downloadId, 1); + + + $app->redirect ($externalLink); + exit; + + } else { + + // Clears file status cache + clearstatcache(); + + $fileWithoutPath = basename($absOrRelFile); + $fileSize = filesize($absOrRelFile); + $mimeType = ''; + $mimeType = $allowedMimeType; + + // HIT Statistics + $addHit = self::hit($downloadId); + if ($type == 1) { + self::hitToken($downloadId); + } + + if ((int)$params->get('send_mail_download', 0) > 0) { + PhocaDownloadMail::sendMail((int)$params->get('send_mail_download', 0), $fileWithoutPath, 1); + } + + // USER Statistics + if ((int)$params->get('enable_user_statistics', 1) == 1) { + $addUserStat = PhocaDownloadStat::createUserStatEntry($downloadId); + } + + PhocaDownloadLog::log($downloadId, 1); + + + if ($fileSize == 0 ) { + die(JText::_('COM_PHOCADOWNLOAD_FILE_SIZE_EMPTY')); + exit; + } + + // Clean the output buffer + ob_end_clean(); + + // test for protocol and set the appropriate headers + jimport( 'joomla.environment.uri' ); + $_tmp_uri = JURI::getInstance( JURI::current() ); + $_tmp_protocol = $_tmp_uri->getScheme(); + if ($_tmp_protocol == "https") { + // SSL Support + header('Cache-Control: private, max-age=0, must-revalidate, no-store'); + } else { + header("Cache-Control: public, must-revalidate"); + header('Cache-Control: pre-check=0, post-check=0, max-age=0'); + header("Pragma: no-cache"); + header("Expires: 0"); + } /* end if protocol https */ + header("Content-Description: File Transfer"); + header("Expires: Sat, 30 Dec 1990 07:07:07 GMT"); + header("Accept-Ranges: bytes"); + + + // HTTP Range + /* $httpRange = 0; + if(isset($_SERVER['HTTP_RANGE'])) { + list($a, $httpRange) = explode('=', $_SERVER['HTTP_RANGE']); + str_replace($httpRange, '-', $httpRange); + $newFileSize = $fileSize - 1; + $newFileSizeHR = $fileSize - $httpRange; + header("HTTP/1.1 206 Partial Content"); + header("Content-Length: ".(string)$newFileSizeHR); + header("Content-Range: bytes ".$httpRange . $newFileSize .'/'. $fileSize); + } else { + $newFileSize = $fileSize - 1; + header("Content-Length: ".(string)$fileSize); + header("Content-Range: bytes 0-".$newFileSize . '/'.$fileSize); + } + header("Content-Type: " . (string)$mimeType); + header('Content-Disposition: attachment; filename="'.$fileWithoutPath.'"'); + header("Content-Transfer-Encoding: binary\n");*/ + + // Modified by Rene + // HTTP Range - see RFC2616 for more informations (http://www.ietf.org/rfc/rfc2616.txt) + $httpRange = 0; + $newFileSize = $fileSize - 1; + // Default values! Will be overridden if a valid range header field was detected! + $resultLenght = (string)$fileSize; + $resultRange = "0-".$newFileSize; + // We support requests for a single range only. + // So we check if we have a range field. If yes ensure that it is a valid one. + // If it is not valid we ignore it and sending the whole file. + if(isset($_SERVER['HTTP_RANGE']) && preg_match('%^bytes=\d*\-\d*$%', $_SERVER['HTTP_RANGE'])) { + // Let's take the right side + list($a, $httpRange) = explode('=', $_SERVER['HTTP_RANGE']); + // and get the two values (as strings!) + $httpRange = explode('-', $httpRange); + // Check if we have values! If not we have nothing to do! + if(!empty($httpRange[0]) || !empty($httpRange[1])) { + // We need the new content length ... + $resultLenght = $fileSize - $httpRange[0] - $httpRange[1]; + // ... and we can add the 206 Status. + header("HTTP/1.1 206 Partial Content"); + // Now we need the content-range, so we have to build it depending on the given range! + // ex.: -500 -> the last 500 bytes + if(empty($httpRange[0])) + $resultRange = $resultLenght.'-'.$newFileSize; + // ex.: 500- -> from 500 bytes to filesize + elseif(empty($httpRange[1])) + $resultRange = $httpRange[0].'-'.$newFileSize; + // ex.: 500-1000 -> from 500 to 1000 bytes + else + $resultRange = $httpRange[0] . '-' . $httpRange[1]; + //header("Content-Range: bytes ".$httpRange . $newFileSize .'/'. $fileSize); + } + } + header("Content-Length: ". $resultLenght); + header("Content-Range: bytes " . $resultRange . '/' . $fileSize); + header("Content-Type: " . (string)$mimeType); + header('Content-Disposition: attachment; filename="'.$fileWithoutPath.'"'); + header("Content-Transfer-Encoding: binary\n"); + + // TEST TEMP SOLUTION - makes problems on somve server, @ added to prevent from warning + @ob_end_clean(); + + //@readfile($absOrRelFile); + + // Try to deliver in chunks + @set_time_limit(0); + $fp = @fopen($absOrRelFile, 'rb'); + if ($fp !== false) { + while (!feof($fp)) { + echo fread($fp, 8192); + } + fclose($fp); + } else { + @readfile($absOrRelFile); + } + flush(); + exit; + + /* + http://www.phoca.cz/forum/viewtopic.php?f=31&t=11811 + + $fp = @fopen($absOrRelFile, 'rb'); + // HTTP Range - see RFC2616 for more informations (http://www.ietf.org/rfc/rfc2616.txt) + $newFileSize = $fileSize - 1; + // Default values! Will be overridden if a valid range header field was detected! + $rangeStart = 0; + $rangeEnd = 0; + $resultLength = $fileSize; + // We support requests for a single range only. + // So we check if we have a range field. If yes ensure that it is a valid one. + // If it is not valid we ignore it and sending the whole file. + if ($fp && isset($_SERVER['HTTP_RANGE']) && preg_match('%^bytes=\d*\-\d*$%', $_SERVER['HTTP_RANGE'])) { + // Let's take the right side + list($a, $httpRange) = explode('=', $_SERVER['HTTP_RANGE']); + // and get the two values (as strings!) + $httpRange = explode('-', $httpRange); + // Check if we have values! If not we have nothing to do! + if (sizeof($httpRange) == 2) { + // Explictly convert to int + $rangeStart = intval($httpRange[0]); + $rangeEnd = intval($httpRange[1]); // Allowed to be empty == 0 + if (($rangeStart || $rangeEnd) // something actually set? + && $rangeStart < $fileSize // must be smaller + && $rangeEnd < $fileSize // must be smaller + && (!$rangeEnd || $rangeEnd > $rangeStart) // end > start, if end is set + ) { + header("HTTP/1.1 206 Partial Content"); + if (!$rangeEnd) { + $resultLength = $fileSize - $rangeStart; + $range = $rangeStart . "-" . ($fileSize - 1) . "/" . $fileSize; + } else { + $resultLength = ($rangeEnd - $rangeStart 1); + $range = $rangeStart . "-" . $rangeEnd . "/" . $fileSize; + } + header("Content-Range: bytes " . $range); + } else { + // Didn't validate: kill + $rangeStart = 0; + $rangeEnd = 0; + } + } + } + + header("Content-Length: ". $resultLength); + header("Content-Type: " . (string)$mimeType); + header('Content-Disposition: attachment; filename="'.$fileWithoutPath.'"'); + header("Content-Transfer-Encoding: binary\n"); + @@ -211,13 +198,25 @@ class PhocaDownloadAccessFront + + // Try to deliver in chunks + @set_time_limit(0); + if ($fp !== false) { + if ($rangeStart) { + // Need to pass only part of the file, starting at $rangeStart + fseek($fp, $rangeStart, SEEK_SET); + } + // If $rangeEnd is open ended (0, whole file from $rangeStart) try fpassthru, + // else send in small chunks + if ($rangeEnd || @!fpassthru($fp)) { + while ($resultLength > 0 && !feof($fp)) { + // 4 * 1460 (default MSS with ethernet 1500 MTU) + // This is optimized for network packets, not disk access + $bytes = min(5840, $resultLength); + echo fread($fp, $bytes); + $resultLength = $resultLength - $bytes; + } + } + fclose($fp); + } else { + // Ranges are disabled at this point and were never set up + @readfile($absOrRelFile); + } + flush(); + exit; + */ + } + } + + } + return false; + + } + + public static function getDownloadData($id, $return, $type = 0) { + + $outcome = array(); + $wheres = array(); + $db = JFactory::getDBO(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $redirectUrl= urlencode(base64_encode($return)); + $returnUrl = 'index.php?option=com_users&view=login&return='.$redirectUrl; + + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $limitEnabled = $params->get( 'user_files_max_count_download', 0 ); + if ((int)$limitEnabled > 0) { + if ((int)$user->id < 1) { + $app->redirect(JRoute::_($returnUrl, false), JText::_("COM_PHOCADOWNLOAD_NOT_LOGGED_IN_USERS_NOT_ALLOWED_DOWNLOAD")); + exit; + } + $userFileCount = PhocaDownloadStat::getCountFilePerUser($id); + (int)$userFileCount++;// Because we need to count this attempt too. + if ((int)$userFileCount > (int)$limitEnabled) { + $app->redirect(JRoute::_($returnUrl, false), JText::_("COM_PHOCADOWNLOAD_MAX_LIMIT_DOWNLOAD_PER_FILE_REACHED")); + exit; + } + } + + + + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + $wheres[] = " c.id = ".(int)$id; + $wheres[] = " c.published = 1"; + $wheres[] = " c.approved = 1"; + $wheres[] = " c.catid = cc.id"; + + if ($type == 1) { + // Unique download link does not have any access + $rightDisplay = 1; + + } else { + $wheres[] = " cc.access IN (".$userLevels.")"; + } + + // Active + $jnow = JFactory::getDate(); + $now = $jnow->toSql(); + $nullDate = $db->getNullDate(); + $wheres[] = ' ( c.publish_up = '.$db->Quote($nullDate).' OR c.publish_up <= '.$db->Quote($now).' )'; + $wheres[] = ' ( c.publish_down = '.$db->Quote($nullDate).' OR c.publish_down >= '.$db->Quote($now).' )'; + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetDownload', array (&$wheres, &$joins,$id, $paramsC)); + // END GWE MOD + } + + /*$query = " SELECT c.filename, c.directlink, c.access" + ." FROM #__phocadownload AS c" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " ORDER BY c.ordering";*/ + + + $query = ' SELECT c.catid, c.filename, c.directlink, c.link_external, c.access, c.confirm_license, c.metakey, c.metadesc, cc.access as cataccess, cc.accessuserid as cataccessuserid, c.tokenhits ' + .' FROM #__phocadownload AS c, #__phocadownload_categories AS cc ' + . ($pQ == 1 ? ((count($joins)>0?( ' LEFT JOIN ' .implode( ' LEFT JOIN ', $joins )):'')):'') // GWE MOD + . ' WHERE ' . implode( ' AND ', $wheres ) + . ' ORDER BY c.ordering'; + + $db->setQuery( $query , 0, 1 ); + $filename = $db->loadObjectList(); + + $limitTokenEnabled = $params->get( 'token_files_max_count_download', 0 ); + if ((int)$limitTokenEnabled > 0) { + if (isset($filename[0]->tokenhits)) { + $tokenFileCount = $filename[0]->tokenhits; + (int)$tokenFileCount++;// Because we need to count this attempt too. + if ((int)$tokenFileCount > (int)$limitTokenEnabled) { + $app->redirect(JRoute::_(htmlspecialchars($return)), JText::_("COM_PHOCADOWNLOAD_MAX_LIMIT_DOWNLOAD_TOKEN_REACHED")); + exit; + } + } + } + + + //OSE Modified Start; + if (!empty($filename[0])) { + phocadownloadimport('phocadownload.utils.external'); + PhocaDownloadExternal::checkOSE($filename[0]); + } + //OSE Modified End; + + + // - - - - - - - - - - - - - - - + // USER RIGHT - Access of categories (if file is included in some not accessed category) - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + + $rightDisplay = 0; + if ($type == 1) { + // Unique download link does not have any access + $rightDisplay = 1; + + } else { + + if (!empty($filename[0])) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $filename[0]->cataccessuserid, $filename[0]->cataccess, $user->getAuthorisedViewLevels(), $user->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + if ($rightDisplay == 0) { + $app->redirect(JRoute::_($returnUrl, false), JText::_("COM_PHOCADOWNLOAD_NO_RIGHTS_ACCESS_CATEGORY_FILE")); + exit; + } + + } + + + + + + if (empty($filename)) { + $outcome['file'] = "COM_PHOCADOWNLOAD_ERROR_NO_DB_RESULT"; + $outcome['directlink'] = 0; + $outcome['externallink'] = 0; + return $outcome; + } + + if ($type == 1) { + // Unique download link + } else { + if (isset($filename[0]->access)) { + if (!in_array($filename[0]->access, $user->getAuthorisedViewLevels())) { + $app->redirect(JRoute::_($returnUrl, false), JText::_('COM_PHOCADOWNLOAD_PLEASE_LOGIN_DOWNLOAD_FILE')); + exit; + } + } else { + $outcome['file'] = "COM_PHOCADOWNLOAD_ERROR_NO_DB_RESULT"; + $outcome['directlink'] = 0; + $outcome['externallink'] = 0; + return $outcome; + } + } + // - - - - - - - - - - - - - - - - + + + $filenameT = $filename[0]->filename; + $directlinkT = $filename[0]->directlink; + $linkExternalT = $filename[0]->link_external; + + // Unique Download Link + if ($type == 1) { + $directlinkT = 0;// Unique Download Link cannot work with direct link + } + + $filePath = PhocaDownloadPath::getPathSet('file'); + + if ($filenameT !='') { + + // Important - you cannot use direct link if you have selected absolute path + // Absolute Path defined by user + $absolutePath = $params->get( 'absolute_path', '' ); + if ($absolutePath != '') { + $directlinkT = 0; + } + + if ($directlinkT == 1 ) { + $relFile = JURI::base(true).'/'.$params->get('download_folder', 'phocadownload' ).'/'.$filenameT; + $outcome['file'] = $relFile; + $outcome['directlink'] = $directlinkT; + $outcome['externallink']= $linkExternalT; + return $outcome; + } else if ($directlinkT == 0 && $linkExternalT != '' ) { + $relFile = JURI::base(true).'/'.$params->get('download_folder', 'phocadownload' ).'/'.$filenameT; + $outcome['file'] = $relFile; + $outcome['directlink'] = $directlinkT; + $outcome['externallink']= $linkExternalT; + return $outcome; + } else { + $absFile = str_replace('/', DS, JPath::clean($filePath['orig_abs_ds'] . $filenameT)); + } + + if (JFile::exists($absFile)) { + $outcome['file'] = $absFile; + $outcome['directlink'] = $directlinkT; + $outcome['externallink']= $linkExternalT; + return $outcome; + } else { + + $outcome['file'] = "COM_PHOCADOWNLOAD_ERROR_NO_ABS_FILE"; + $outcome['directlink'] = 0; + $outcome['externallink']= $linkExternalT; + return $outcome; + } + } else { + + $outcome['file'] = "COM_PHOCADOWNLOAD_ERROR_NO_DB_FILE"; + $outcome['directlink'] = 0; + $outcome['externallink']= $linkExternalT; + return $outcome; + } + } + + protected static function hit($id) { + + $app = JFactory::getApplication(); + $table = JTable::getInstance('PhocaDownload', 'Table'); + $table->hit($id); + return true; + } + + protected static function hitToken($id) { + $db = JFactory::getDBO(); + $query = $db->getQuery(true) + ->update('#__phocadownload') + ->set($db->quoteName('tokenhits') . ' = (' . $db->quoteName('tokenhits') . ' + 1)') + ->where('id = ' . $db->quote((int)$id)); + $db->setQuery($query); + + $db->execute(); + return true; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/download/index.html b/libraries/phocadownload/download/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/download/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/file/file.php b/libraries/phocadownload/file/file.php new file mode 100644 index 0000000..fc83df1 --- /dev/null +++ b/libraries/phocadownload/file/file.php @@ -0,0 +1,422 @@ +'; + } + + return $mime; + } + + public static function existsCss($file, $type) { + $path = self::getCSSPath($type); + if (file_exists($path.$file) && $file != '') { + return $path.$file; + } + return false; + } + + public static function getCSSPath($type, $rel = 0) { + $paths = PhocaDownloadPath::getPathMedia(); + if ($rel == 1) { + if ($type == 1) { + return $paths->media_css_rel . 'main/'; + } else { + return $paths->media_css_rel . 'custom/'; + } + } else { + if ($type == 1) { + return JPath::clean($paths->media_css_abs . 'main/'); + } else { + return JPath::clean($paths->media_css_abs . 'custom/'); + } + } + } + + public static function getCSSFile($id = 0, $fullPath = 0) { + if ((int)$id > 0) { + $db = JFactory::getDBO(); + $query = 'SELECT a.filename as filename, a.type as type' + .' FROM #__phocadownload_styles AS a' + .' WHERE a.id = '.(int) $id; + $db->setQuery($query, 0, 1); + $filename = $db->loadObject(); + + if (isset($filename->filename) && $filename->filename != '') { + if ($fullPath == 1 && isset($filename->type)) { + return self::getCSSPath($filename->type). $filename->filename; + } else { + return $filename->filename; + } + } + } + + return false; + } + + public static function getFileSize($filename, $readable = 1) { + + $path = PhocaDownloadPath::getPathSet(); + $fileNameAbs = JPath::clean($path['orig_abs'] . DS . $filename); + + if ($readable == 1) { + return self::getFileSizeReadable(filesize($fileNameAbs)); + } else { + return filesize($fileNameAbs); + } + } + + + + public static function getFileTime($filename, $function, $format = "d. M Y") { + + $path = PhocaDownloadPath::getPathSet(); + $fileNameAbs = JPath::clean($path['orig_abs'] . DS . $filename); + if (JFile::exists($fileNameAbs)) { + switch($function) { + case 2: + $fileTime = filectime($fileNameAbs); + break; + case 3: + $fileTime = fileatime($fileNameAbs); + break; + case 1: + default: + $fileTime = filemtime($fileNameAbs); + break; + } + + $fileTime = JHTML::Date($fileTime, $format); + } else { + $fileTime = ''; + } + return $fileTime; + } + + + + public static function getTitleFromFilenameWithExt (&$filename) { + $folder_array = explode('/', $filename);//Explode the filename (folder and file name) + $count_array = count($folder_array);//Count this array + $last_array_value = $count_array - 1;//The last array value is (Count array - 1) + + return $folder_array[$last_array_value]; + } + + + public static function getMimeType($extension, $params) { + + $regex_one = '/({\s*)(.*?)(})/si'; + $regex_all = '/{\s*.*?}/si'; + $matches = array(); + $count_matches = preg_match_all($regex_all,$params,$matches,PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER); + + $returnMime = ''; + + for($i = 0; $i < $count_matches; $i++) { + + $phocaDownload = $matches[0][$i][0]; + preg_match($regex_one,$phocaDownload,$phocaDownloadParts); + $values_replace = array ("/^'/", "/'$/", "/^'/", "/'$/", "/
/"); + $values = explode("=", $phocaDownloadParts[2], 2); + + foreach ($values_replace as $key2 => $values2) { + $values = preg_replace($values2, '', $values); + } + + // Return mime if extension call it + if ($extension == $values[0]) { + $returnMime = $values[1]; + } + } + + if ($returnMime != '') { + return $returnMime; + } else { + return "PhocaErrorNoMimeFound"; + } + } + + public static function getMimeTypeString($params) { + + $regex_one = '/({\s*)(.*?)(})/si'; + $regex_all = '/{\s*.*?}/si'; + $matches = array(); + $count_matches = preg_match_all($regex_all,$params,$matches,PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER); + + $extString = ''; + $mimeString = ''; + + for($i = 0; $i < $count_matches; $i++) { + + $phocaDownload = $matches[0][$i][0]; + preg_match($regex_one,$phocaDownload,$phocaDownloadParts); + $values_replace = array ("/^'/", "/'$/", "/^'/", "/'$/", "/
/"); + $values = explode("=", $phocaDownloadParts[2], 2); + + foreach ($values_replace as $key2 => $values2) { + $values = preg_replace($values2, '', $values); + } + + // Create strings + $extString .= $values[0]; + $mimeString .= $values[1]; + + $j = $i + 1; + if ($j < $count_matches) { + $extString .=','; + $mimeString .=','; + } + } + + $string = array(); + $string['mime'] = $mimeString; + $string['ext'] = $extString; + + return $string; + } + + public static function getTitleFromFilenameWithoutExt (&$filename) { + + $folder_array = explode('/', $filename);//Explode the filename (folder and file name) + $count_array = count($folder_array);//Count this array + $last_array_value = $count_array - 1;//The last array value is (Count array - 1) + + $string = false; + $string = preg_match( "/\./i", $folder_array[$last_array_value] ); + if ($string) { + return PhocaDownloadFile::removeExtension($folder_array[$last_array_value]); + } else { + return $folder_array[$last_array_value]; + } + } + + public static function getFolderFromTheFile($filename) { + + $folder_array = explode('/', $filename); + $count_array = count($folder_array);//Count this array + $last_array_value = $count_array - 1; + return str_replace($folder_array[$last_array_value], '', $filename); + } + + public static function removeExtension($file_name) { + return substr($file_name, 0, strrpos( $file_name, '.' )); + } + + public static function getExtension( $file_name ) { + return strtolower( substr( strrchr( $file_name, "." ), 1 ) ); + } + + public static function canPlay( $fileName ) { + $fileExt = PhocaDownloadFile::getExtension($fileName); + + $paramsC = JComponentHelper::getParams('com_phocadownload'); + $html5 = $paramsC->get( 'html5_play', 0 ); + + if ($html5 == 1) { + switch($fileExt) { + case 'mp3': + case 'mp4': + case 'flv': + case 'ogg': + case 'ogv': + return true; + break; + + default: + return false; + break; + } + } else { + switch($fileExt) { + case 'mp3': + case 'mp4': + case 'flv': + //case 'mov': + //case 'wmv': + return true; + break; + + default: + return false; + break; + } + } + return false; + } + + public static function canPreview( $fileName ) { + $fileExt = PhocaDownloadFile::getExtension($fileName); + + switch($fileExt) { + case 'pdf': + case 'jpeg': + case 'jpg': + case 'png': + case 'gif': + return true; + break; + + default: + return false; + break; + + } + return false; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/file/fileupload.php b/libraries/phocadownload/file/fileupload.php new file mode 100644 index 0000000..f1d49c0 --- /dev/null +++ b/libraries/phocadownload/file/fileupload.php @@ -0,0 +1,694 @@ +get( 'multiple_upload_chunk', 0 ); + $uploadMethod = $paramsC->get( 'multiple_upload_method', 1 ); + + $overwriteExistingFiles = $paramsC->get( 'overwrite_existing_files', 0 ); + + JResponse::allowCache(false); + + // Chunk Files + header('Content-type: text/plain; charset=UTF-8'); + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Cache-Control: post-check=0, pre-check=0", false); + header("Pragma: no-cache"); + + // Invalid Token + JRequest::checkToken( 'request' ) or jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 100, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_INVALID_TOKEN')))); + + // Set FTP credentials, if given + $ftp = JClientHelper::setCredentialsFromRequest('ftp'); + + + $file = JRequest::getVar( 'file', '', 'files', 'array' ); + $chunk = JRequest::getVar( 'chunk', 0, '', 'int' ); + $chunks = JRequest::getVar( 'chunks', 0, '', 'int' ); + $folder = JRequest::getVar( 'folder', '', '', 'path' ); + $manager = JRequest::getVar( 'manager', 'file', '', 'string' ); + + + $path = PhocaDownloadPath::getPathSet($manager);// we use viewback to get right path + + // Make the filename safe + if (isset($file['name'])) { + $file['name'] = JFile::makeSafe($file['name']); + } + if (isset($folder) && $folder != '') { + $folder = $folder . DS; + } + + $chunkEnabled = 0; + // Chunk only if is enabled and only if flash is enabled + if (($chunkMethod == 1 && $uploadMethod == 1) || ($frontEnd == 0 && $chunkMethod == 0 && $uploadMethod == 1)) { + $chunkEnabled = 1; + } + + + + + if (isset($file['name'])) { + + + // - - - - - - - - - - + // Chunk Method + // - - - - - - - - - - + // $chunkMethod = 1, for frontend and backend + // $chunkMethod = 0, only for backend + if ($chunkEnabled == 1) { + + // If chunk files are used, we need to upload parts to temp directory + // and then we can run e.g. the condition to recognize if the file already exists + // We must upload the parts to temp, in other case we get everytime the info + // that the file exists (because the part has the same name as the file) + // so after first part is uploaded, in fact the file already exists + // Example: NOT USING CHUNK + // If we upload abc.jpg file to server and there is the same file + // we compare it and can recognize, there is one, don't upload it again. + // Example: USING CHUNK + // If we upload abc.jpg file to server and there is the same file + // the part of current file will overwrite the same file + // and then (after all parts will be uploaded) we can make the condition to compare the file + // and we recognize there is one - ok don't upload it BUT the file will be damaged by + // parts uploaded by the new file - so this is why we are using temp file in Chunk method + $stream = JFactory::getStream();// Chunk Files + $tempFolder = 'pdpluploadtmpfolder'.DS; + //$filepathImgFinal = JPath::clean($path['orig_abs_ds'].$folder.strtolower($file['name'])); + //$filepathImgTemp = JPath::clean($path['orig_abs_ds'].$folder.$tempFolder.strtolower($file['name'])); + $filepathImgFinal = JPath::clean($path['orig_abs_ds'].$folder.$file['name']); + $filepathImgTemp = JPath::clean($path['orig_abs_ds'].$folder.$tempFolder.$file['name']); + $filepathFolderFinal = JPath::clean($path['orig_abs_ds'].$folder); + $filepathFolderTemp = JPath::clean($path['orig_abs_ds'].$folder.$tempFolder); + $maxFileAge = 60 * 60; // Temp file age in seconds + $lastChunk = $chunk + 1; + $realSize = 0; + + + + + // Get the real size - if chunk is uploaded, it is only a part size, so we must compute all size + // If there is last chunk we can computhe the whole size + if ($lastChunk == $chunks) { + if (JFile::exists($filepathImgTemp) && JFile::exists($file['tmp_name'])) { + $realSize = filesize($filepathImgTemp) + filesize($file['tmp_name']); + } + } + + // 5 minutes execution time + @set_time_limit(5 * 60);// usleep(5000); + + // If the file already exists on the server: + // - don't copy the temp file to final + // - remove all parts in temp file + // Because some parts are uploaded before we can run the condition + // to recognize if the file already exists. + + // Files should be overwritten + if ($overwriteExistingFiles == 1) { + JFile::delete($filepathImgFinal); + } + + if (JFile::exists($filepathImgFinal)) { + if($lastChunk == $chunks){ + @JFolder::delete($filepathFolderTemp); + } + + + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 108, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS')))); + + } + + if (!PhocaDownloadFileUpload::canUpload( $file, $errUploadMsg, $manager, $frontEnd, $chunkEnabled, $realSize )) { + + // If there is some error, remove the temp folder with temp files + if($lastChunk == $chunks){ + @JFolder::delete($filepathFolderTemp); + } + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 104, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_($errUploadMsg)))); + } + + // Ok create temp folder and add chunks + if (!JFolder::exists($filepathFolderTemp)) { + @JFolder::create($filepathFolderTemp); + } + + // Remove old temp files + if (JFolder::exists($filepathFolderTemp)) { + $dirFiles = JFolder::files($filepathFolderTemp); + if (!empty($dirFiles)) { + foreach ($dirFiles as $fileS) { + $filePathImgS = $filepathFolderTemp . $fileS; + // Remove temp files if they are older than the max age + if (preg_match('/\\.tmp$/', $fileS) && (filemtime($filepathImgTemp) < time() - $maxFileAge)) { + @JFile::delete($filePathImgS); + } + } + } + } else { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 100, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_FOLDER_UPLOAD_NOT_EXISTS')))); + } + + // Look for the content type header + if (isset($_SERVER["HTTP_CONTENT_TYPE"])) + $contentType = $_SERVER["HTTP_CONTENT_TYPE"]; + + if (isset($_SERVER["CONTENT_TYPE"])) + $contentType = $_SERVER["CONTENT_TYPE"]; + + if (strpos($contentType, "multipart") !== false) { + if (isset($file['tmp_name']) && is_uploaded_file($file['tmp_name'])) { + + // Open temp file + $out = $stream->open($filepathImgTemp, $chunk == 0 ? "wb" : "ab"); + //$out = fopen($filepathImgTemp, $chunk == 0 ? "wb" : "ab"); + if ($out) { + // Read binary input stream and append it to temp file + $in = fopen($file['tmp_name'], "rb"); + if ($in) { + while ($buff = fread($in, 4096)) { + $stream->write($buff); + //fwrite($out, $buff); + } + } else { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 101, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_OPEN_INPUT_STREAM')))); + } + $stream->close(); + //fclose($out); + @JFile::delete($file['tmp_name']); + } else { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 102, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_OPEN_OUTPUT_STREAM')))); + } + } else { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 103, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_MOVE_UPLOADED_FILE')))); + } + } else { + // Open temp file + $out = $stream->open($filepathImgTemp, $chunk == 0 ? "wb" : "ab"); + //$out = JFile::read($filepathImg); + if ($out) { + // Read binary input stream and append it to temp file + $in = fopen("php://input", "rb"); + + if ($in) { + while ($buff = fread($in, 4096)) { + $stream->write($buff); + } + } else { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 101, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_OPEN_INPUT_STREAM')))); + } + $stream->close(); + //fclose($out); + } else { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 102, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_OPEN_OUTPUT_STREAM')))); + } + } + + + // Rename the Temp File to Final File + if($lastChunk == $chunks){ + + /*if(($imginfo = getimagesize($filepathImgTemp)) === FALSE) { + JFolder::delete($filepathFolderTemp); + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 110, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_WARNING_INVALIDIMG')))); + }*/ + + // Files should be overwritten + if ($overwriteExistingFiles == 1) { + JFile::delete($filepathImgFinal); + } + + if(!JFile::move($filepathImgTemp, $filepathImgFinal)) { + + JFolder::delete($filepathFolderTemp); + + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 109, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_MOVE_FILE') .'
' + . JText::_('COM_PHOCADOWNLOAD_CHECK_PERMISSIONS_OWNERSHIP')))); + } + + + JFolder::delete($filepathFolderTemp); + } + + if ((int)$frontEnd > 0) { + return $file['name']; + } + + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'OK', 'code' => 200, + 'message' => JText::_('COM_PHOCADOWNLOAD_SUCCESS').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_FILES_UPLOADED')))); + + + } else { + // No Chunk Method + $filepathImgFinal = JPath::clean($path['orig_abs_ds'].$folder.strtolower($file['name'])); + $filepathImgFinal = JPath::clean($path['orig_abs_ds'].$folder.$file['name']); + $filepathFolderFinal = JPath::clean($path['orig_abs_ds'].$folder); + + + + if (!PhocaDownloadFileUpload::canUpload( $file, $errUploadMsg, $manager, $frontEnd, $chunkMethod, 0 )) { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 104, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_($errUploadMsg)))); + } + + if (JFile::exists($filepathImgFinal) && $overwriteExistingFiles == 0) { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 108, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS')))); + } + + + if(!JFile::upload($file['tmp_name'], $filepathImgFinal)) { + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 109, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_UPLOAD_FILE') .'
' + . JText::_('COM_PHOCADOWNLOAD_CHECK_PERMISSIONS_OWNERSHIP')))); + } + + if ((int)$frontEnd > 0) { + return $file['name']; + } + + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'OK', 'code' => 200, + 'message' => JText::_('COM_PHOCADOWNLOAD_SUCCESS').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_IMAGES_UPLOADED')))); + + + } + } else { + // No isset $file['name'] + + jexit(json_encode(array( 'jsonrpc' => '2.0', 'result' => 'error', 'code' => 104, + 'message' => JText::_('COM_PHOCADOWNLOAD_ERROR').': ', + 'details' => JTEXT::_('COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_UPLOAD_FILE')))); + } + + } + + + public static function realSingleUpload( $frontEnd = 0 ) { + + $paramsC = JComponentHelper::getParams('com_phocadownload'); + // $chunkMethod = $paramsC->get( 'multiple_upload_chunk', 0 ); + // $uploadMethod = $paramsC->get( 'multiple_upload_method', 1 ); + + $overwriteExistingFiles = $paramsC->get( 'overwrite_existing_files', 0 ); + + $app = JFactory::getApplication(); + JRequest::checkToken( 'request' ) or jexit( 'ERROR: '. JTEXT::_('COM_PHOCADOWNLOAD_INVALID_TOKEN')); + JResponse::allowCache(false); + + + $file = JRequest::getVar( 'Filedata', '', 'files', 'array' ); + $folder = JRequest::getVar( 'folder', '', '', 'path' ); + $format = JRequest::getVar( 'format', 'html', '', 'cmd'); + $return = JRequest::getVar( 'return-url', null, 'post', 'base64' );//includes field + $viewBack = JRequest::getVar( 'viewback', '', '', '' ); + $manager = JRequest::getVar( 'manager', 'file', '', 'string' ); + $tab = JRequest::getVar( 'tab', '', '', 'string' ); + $field = JRequest::getVar( 'field' ); + $errUploadMsg = ''; + $folderUrl = $folder; + $tabUrl = ''; + $component = JRequest::getVar( 'option', '', '', 'string' ); + + $path = PhocaDownloadPath::getPathSet($manager);// we use viewback to get right path + + + // In case no return value will be sent (should not happen) + if ($component != '' && $frontEnd == 0) { + $componentUrl = 'index.php?option='.$component; + } else { + $componentUrl = 'index.php'; + } + if ($tab != '') { + $tabUrl = '&tab='.(string)$tab; + } + + $ftp = JClientHelper::setCredentialsFromRequest('ftp'); + + // Make the filename safe + if (isset($file['name'])) { + $file['name'] = JFile::makeSafe($file['name']); + } + + + if (isset($folder) && $folder != '') { + $folder = $folder . DS; + } + + + // All HTTP header will be overwritten with js message + if (isset($file['name'])) { + $filepath = JPath::clean($path['orig_abs_ds'].$folder.strtolower($file['name'])); + $filepath = JPath::clean($path['orig_abs_ds'].$folder.$file['name']); + + if (!PhocaDownloadFileUpload::canUpload( $file, $errUploadMsg, $manager, $frontEnd )) { + + if ($errUploadMsg == 'COM_PHOCADOWNLOAD_WARNING_FILE_TOOLARGE') { + $errUploadMsg = JText::_($errUploadMsg) . ' ('.PhocaDownloadFileUpload::getFileSizeReadable($file['size']).')'; + } /* else if ($errUploadMsg == 'COM_PHOCADOWNLOAD_WARNING_FILE_TOOLARGE_RESOLUTION') { + $imgSize = phocadownloadImage::getImageSize($file['tmp_name']); + $errUploadMsg = JText::_($errUploadMsg) . ' ('.(int)$imgSize[0].' x '.(int)$imgSize[1].' px)'; + } */ else { + $errUploadMsg = JText::_($errUploadMsg); + } + + + if ($return) { + $app->enqueueMessage( $errUploadMsg, 'error'); + $app->redirect(base64_decode($return).'&manager='.(string)$manager.'&folder='.$folderUrl); + exit; + } else { + $app->enqueueMessage( $errUploadMsg, 'error'); + $app->redirect($componentUrl, $errUploadMsg); + exit; + } + } + + if (JFile::exists($filepath) && $overwriteExistingFiles == 0) { + if ($return) { + $app->redirect(base64_decode($return).'&manager='.(string)$manager.'&folder='.$folderUrl, JText::_('COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS'), 'error'); + exit; + } else { + $app->enqueueMessage( JText::_('COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS'), 'error'); + $app->redirect($componentUrl); + exit; + } + } + + if (!JFile::upload($file['tmp_name'], $filepath)) { + if ($return) { + $app->enqueueMessage( JText::_('COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_UPLOAD_FILE'), 'error'); + $app->redirect(base64_decode($return).'&manager='.(string)$manager.'&folder='.$folderUrl); + exit; + } else { + $app->enqueueMessage( JText::_('COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_UPLOAD_FILE'), 'error'); + $app->redirect($componentUrl); + exit; + } + } else { + + if ((int)$frontEnd > 0) { + return $file['name']; + } + + if ($return) { + $app->enqueueMessage( JText::_('COM_PHOCADOWNLOAD_SUCCESS_FILE_UPLOAD')); + $app->redirect(base64_decode($return).'&manager='.(string)$manager.'&folder='.$folderUrl); + exit; + } else { + $app->enqueueMessage( JText::_('COM_PHOCADOWNLOAD_SUCCESS_FILE_UPLOAD')); + $app->redirect($componentUrl); + exit; + } + } + } else { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_UNABLE_TO_UPLOAD_FILE'); + if ($return) { + $app->enqueueMessage( $msg, 'error'); + $app->redirect(base64_decode($return).'&manager='.(string)$manager.'&folder='.$folderUrl); + exit; + } else { + if($viewBack != '') { + $group = PhocaDownloadSettings::getManagerGroup($manager); + $link = 'index.php?option=com_phocadownload&view=phocadownloadmanager&manager='.(string)$manager + .str_replace('&', '&', $group['c']).'&'.$tabUrl.'&folder='.$folder.'&field='.$field; + $app->enqueueMessage( $msg, 'error'); + $app->redirect($link); + } else { + $app->enqueueMessage( $msg, 'error'); + $app->redirect('index.php?option=com_phocadownload'); + } + + } + } + + } + + + + public static function canUpload( $file, &$err, $manager = '', $frontEnd = 0, $chunkEnabled = 0, $realSize = 0) { + + $paramsC = JComponentHelper::getParams( 'com_phocadownload' ); + + if ($frontEnd == 1) { + $aft = $paramsC->get( 'allowed_file_types_upload', PhocaDownloadSettings::getDefaultAllowedMimeTypesUpload() ); + $dft = $paramsC->get( 'disallowed_file_types_upload', '' ); + $allowedMimeType = PhocaDownloadFile::getMimeTypeString($aft); + $disallowedMimeType = PhocaDownloadFile::getMimeTypeString($dft); + + $ignoreUploadCh = 0; + $ignoreUploadCheck = $params->get( 'ignore_file_types_check', 2 ); + if ($ignoreUploadCheck == 1 || $ignoreUploadCheck == 4 ) { + $ignoreUploadCh = 1; + } + + } else { + + $aft = $paramsC->get( 'allowed_file_types_download', PhocaDownloadSettings::getDefaultAllowedMimeTypesDownload() ); + $dft = $paramsC->get( 'disallowed_file_types_download', '' ); + $allowedMimeType = PhocaDownloadFile::getMimeTypeString($aft); + $disallowedMimeType = PhocaDownloadFile::getMimeTypeString($dft); + + $ignoreUploadCh = 0; + $ignoreUploadCheck = $paramsC->get( 'ignore_file_types_check', 2 ); + if ($ignoreUploadCheck == 5 || $ignoreUploadCheck == 5 ) { + $ignoreUploadCh = 1; + } + } + + + + $paramsL = array(); + $group = PhocaDownloadSettings::getManagerGroup($manager); + if ($group['f'] == 2) { + $paramsL['upload_extensions'] = 'gif,jpg,png,jpeg'; + $paramsL['image_extensions'] = 'gif,jpg,png,jpeg'; + $paramsL['upload_mime'] = 'image/jpeg,image/gif,image/png'; + $paramsL['upload_mime_illegal'] ='application/x-shockwave-flash,application/msword,application/excel,application/pdf,application/powerpoint,text/plain,application/x-zip,text/html'; + $paramsL['upload_ext_illegal'] = $disallowedMimeType['ext']; + } else { + $paramsL['upload_extensions'] = $allowedMimeType['ext']; + $paramsL['image_extensions'] = 'bmp,gif,jpg,png,jpeg'; + $paramsL['upload_mime'] = $allowedMimeType['mime']; + $paramsL['upload_mime_illegal'] = $disallowedMimeType['mime']; + $paramsL['upload_ext_illegal'] = $disallowedMimeType['ext']; + } + + + // The file doesn't exist + if(empty($file['name'])) { + $err = 'COM_PHOCADOWNLOAD_WARNING_INPUT_FILE_UPLOAD'; + return false; + } + // Not safe file + jimport('joomla.filesystem.file'); + if ($file['name'] !== JFile::makesafe($file['name'])) { + $err = 'COM_PHOCADOWNLOAD_WARNFILENAME'; + return false; + } + + $format = strtolower(JFile::getExt($file['name'])); + if ($ignoreUploadCh == 1) { + + } else { + + $allowable = explode( ',', $paramsL['upload_extensions']); + $notAllowable = explode( ',', $paramsL['upload_ext_illegal']); + if(in_array($format, $notAllowable)) { + $err = 'COM_PHOCADOWNLOAD_WARNFILETYPE_DISALLOWED'; + return false; + } + + + //if (!in_array($format, $allowable)) { + if ($format == '' || $format == false || (!in_array($format, $allowable))) { + $err = 'COM_PHOCADOWNLOAD_WARNFILETYPE_NOT_ALLOWED'; + return false; + } + } + + + // Max size of image + // If chunk method is used, we need to get computed size + $maxSize = $paramsC->get( 'upload_maxsize', 3145728 ); + if ((int)$frontEnd > 0) { + $maxSize = $paramsC->get( 'user_file_upload_size', 3145728 ); + } else { + $maxSize = $paramsC->get( 'upload_maxsize', 3145728 ); + } + + if ($chunkEnabled == 1) { + if ((int)$maxSize > 0 && (int)$realSize > (int)$maxSize) { + $err = 'COM_PHOCADOWNLOAD_WARNFILETOOLARGE'; + + return false; + } + } else { + if ((int)$maxSize > 0 && (int)$file['size'] > (int)$maxSize) { + $err = 'COM_PHOCADOWNLOAD_WARNFILETOOLARGE'; + + return false; + } + } + + + // User (only in ucp) - Check the size of all files by users + if ($frontEnd == 2) { + $user = JFactory::getUser(); + $maxUserUploadSize = (int)$paramsC->get( 'user_files_max_size', 20971520 ); + $maxUserUploadCount = (int)$paramsC->get( 'user_files_max_count', 5 ); + $allFile = PhocaDownloadUser:: getUserFileInfo($file, $user->id); + + if ($chunkEnabled == 1) { + $fileSize = $realSize; + } else { + $fileSize = $file['size']; + } + + if ((int)$maxUserUploadSize > 0 && (int) $allFile['size'] > $maxUserUploadSize) { + $err = JText::_('COM_PHOCADOWNLOAD_WARNUSERFILESTOOLARGE'); + return false; + } + + if ((int) $allFile['count'] > $maxUserUploadCount) { + $err = JText::_('COM_PHOCADOWNLOAD_WARNUSERFILESTOOMUCH'); + return false; + } + } + + + + + // Image check + $imginfo = null; + $images = explode( ',', $paramsL['image_extensions']); + + if(in_array($format, $images)) { // if its an image run it through getimagesize + + $group = PhocaDownloadSettings::getManagerGroup($manager); + if($group['i'] == 1) { + if ($chunkEnabled != 1) { + if(($imginfo = getimagesize($file['tmp_name'])) === FALSE) { + $err = 'COM_PHOCADOWNLOAD_WARNINVALIDIMG'; + $err = $imginfo[0]; + return false; + } + } + } + } else if(!in_array($format, $images)) { // if its not an image...and we're not ignoring it + $allowed_mime = explode(',', $paramsL['upload_mime']); + $illegal_mime = explode(',', $paramsL['upload_mime_illegal']); + if(function_exists('finfo_open')) {// We have fileinfo + $finfo = finfo_open(FILEINFO_MIME); + $type = finfo_file($finfo, $file['tmp_name']); + if(strlen($type) && !in_array($type, $allowed_mime) && in_array($type, $illegal_mime)) { + $err = 'COM_PHOCADOWNLOAD_WARNINVALIDMIME'; + return false; + } + finfo_close($finfo); + } else if(function_exists('mime_content_type')) { // we have mime magic + $type = mime_content_type($file['tmp_name']); + if(strlen($type) && !in_array($type, $allowed_mime) && in_array($type, $illegal_mime)) { + $err = 'COM_PHOCADOWNLOAD_WARNINVALIDMIME'; + return false; + } + } + } + + // XSS Check + $xss_check = JFile::read($file['tmp_name'],false,256); + $html_tags = PhocaDownloadSettings::getHTMLTagsUpload(); + foreach($html_tags as $tag) { // A tag is '' + if(stristr($xss_check, '<'.$tag.' ') || stristr($xss_check, '<'.$tag.'>')) { + $err = 'COM_PHOCADOWNLOAD_WARNIEXSS'; + return false; + } + } + + return true; + } + + + public static function renderFTPaccess() { + + $ftpOutput = '
' + .''. JText::_('COM_PHOCADOWNLOAD_FTP_LOGIN_LABEL').'' + .JText::_('COM_PHOCADOWNLOAD_FTP_LOGIN_DESC') + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'
'; + return $ftpOutput; + } + + public static function renderCreateFolder($sessName, $sessId, $currentFolder, $viewBack, $attribs = '') { + + if ($attribs != '') { + $attribs = '&'.$attribs; + } + + $folderOutput = '
'."\n" + + .'

'.JText::_('COM_PHOCADOWNLOAD_FOLDER').'

'."\n" + .'
' + .'' + .'' + .' ' + .'
'."\n" + .JHTML::_( 'form.token' ) + .'
'; + return $folderOutput; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/file/fileuploadmultiple.php b/libraries/phocadownload/file/fileuploadmultiple.php new file mode 100644 index 0000000..01cbb87 --- /dev/null +++ b/libraries/phocadownload/file/fileuploadmultiple.php @@ -0,0 +1,288 @@ +get( 'multiple_upload_chunk', 0 ); + $uploadMethod = $paramsC->get( 'multiple_upload_method', 1 ); + + JHtml::_('behavior.framework', true);// Load it here to be sure, it is loaded before jquery + JHtml::_('jquery.framework', false);// Load it here because of own nonConflict method (nonconflict is set below) + $document = JFactory::getDocument(); + // No more used - - - - - + //$document->addScript(JURI::root(true).'/components/com_phocadownload/assets/jquery/jquery-1.6.4.min.js');//USE SYSTEM + //$nC = 'var pgJQ = jQuery.noConflict();';//SET BELOW + //$document->addScriptDeclaration($nC);//SET BELOW + // - - - - - - - - - - - - + + //$document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/jquery.ui.plupload/jquery.ui.plupload.js'); + + if ($uploadMethod == 2) { + //$document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.gears.js'); + } + if ($uploadMethod == 5) { + //$document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.browserplus.js'); + } + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.js'); + if ($uploadMethod == 2) { + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.gears.js'); + } + if ($uploadMethod == 3) { + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.silverlight.js'); + } + if ($uploadMethod == 1) { + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.flash.js'); + } + if ($uploadMethod == 5) { + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.browserplus.js'); + } + if ($uploadMethod == 6) { + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.html4.js'); + } + if ($uploadMethod == 4) { + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.html5.js'); + } + $document->addScript(JURI::root(true).'/components/com_phocadownload/assets/plupload/jquery.plupload.queue/jquery.plupload.queue.js'); + JHTML::stylesheet( 'components/com_phocadownload/assets/plupload/jquery.plupload.queue/css/jquery.plupload.queue.css' ); + } + + public static function getMultipleUploadSizeFormat($size) { + $readableSize = PhocaDownloadFile::getFileSizeReadable($size, '%01.0f %s', 1); + + $readableSize = str_replace(' ', '', $readableSize); + + $readableSize = strtolower($readableSize); + return $readableSize; + } + + public function renderMultipleUploadJS($frontEnd = 0, $chunkMethod = 0) { + + $document = JFactory::getDocument(); + + switch ($this->method) { + case 2: + $name = 'gears_uploader'; + $runtime = 'gears'; + break; + case 3: + $name = 'silverlight_uploader'; + $runtime = 'silverlight'; + break; + case 4: + $name = 'html5_uploader'; + $runtime = 'html5'; + break; + + case 5: + $name = 'browserplus_uploader'; + $runtime = 'browserplus'; + break; + + case 6: + $name = 'html4_uploader'; + $runtime = 'html4'; + break; + + case 1: + default: + $name = 'flash_uploader'; + $runtime = 'flash'; + break; + } + + $chunkEnabled = 0; + // Chunk only if is enabled and only if flash is enabled + if (($chunkMethod == 1 && $this->method == 1) || ($this->frontEnd == 0 && $chunkMethod == 0 && $this->method == 1)) { + $chunkEnabled = 1; + } + + $this->url = str_replace('&', '&', $this->url); + $this->reload = str_replace('&', '&', $this->reload); + + + $js = 'var pgJQ = jQuery.noConflict();'; + + $js .='pgJQ(function() {'."\n"; + + $js.=''."\n"; + $js.=' plupload.addI18n({'."\n"; + $js.=' \'Select files\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_SELECT_FILES')).'\','."\n"; + $js.=' \'Add files to the upload queue and click the start button.\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_ADD_FILES_TO_UPLOAD_QUEUE_AND_CLICK_START_BUTTON')).'\','."\n"; + $js.=' \'Filename\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_FILENAME')).'\','."\n"; + $js.=' \'Status\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_STATUS')).'\','."\n"; + $js.=' \'Size\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_SIZE')).'\','."\n"; + $js.=' \'Add files\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_ADD_FILES')).'\','."\n"; + $js.=' \'Start upload\':\''.addslashes(JText::_('COM_PHOCADOWNLOAD_START_UPLOAD')).'\','."\n"; + $js.=' \'Stop current upload\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_STOP_CURRENT_UPLOAD')).'\','."\n"; + $js.=' \'Start uploading queue\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_START_UPLOADING_QUEUE')).'\','."\n"; + $js.=' \'Drag files here.\' : \''.addslashes(JText::_('COM_PHOCADOWNLOAD_DRAG_FILES_HERE')).'\''."\n"; + $js.=' });'; + $js.=''."\n"; + + + $js.=' pgJQ("#'.$name.'").pluploadQueue({'."\n"; + $js.=' runtimes : \''.$runtime.'\','."\n"; + $js.=' url : \''.$this->url.'\','."\n"; + //$js.=' max_file_size : \''.$this->maxFileSize.'\','."\n"; + + if ($this->maxFileSize != '0b') { + $js.=' max_file_size : \''.$this->maxFileSize.'\','."\n"; + } + + if ($chunkEnabled == 1) { + $js.=' chunk_size : \'1mb\','."\n"; + } + $js.=' preinit: attachCallbacks,'."\n"; + $js.=' unique_names : false,'."\n"; + $js.=' multipart: true,'."\n"; + $js.=' filters : ['."\n"; + //$js.=' {title : "'.JText::_('COM_PHOCADOWNLOAD_IMAGE_FILES').'", extensions : "jpg,gif,png"}'."\n"; + //$js.=' {title : "Zip files", extensions : "zip"}'."\n"; + $js.=' ],'."\n"; + $js.=''."\n"; + /*if ($this->method != 6) { + if ((int)$this->imageWidth > 0 || (int)$this->imageWidth > 0) { + $js.=' resize : {width : '.$this->imageWidth.', height : '.$this->imageHeight.', quality : '.$this->imageQuality.'},'."\n"; + $js.=''."\n"; + } + }*/ + if ($this->method == 1) { + $js.=' flash_swf_url : \''.JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.flash.swf\''."\n"; + } else if ($this->method == 3) { + $js.=' silverlight_xap_url : \''.JURI::root(true).'/components/com_phocadownload/assets/plupload/plupload.silverlight.xap\''."\n"; + } + $js.=' });'."\n"; + + $js.=''."\n"; + + $js.='function attachCallbacks(Uploader) {'."\n"; + $js.=' Uploader.bind(\'FileUploaded\', function(Up, File, Response) {'."\n"; + $js.=' var obj = eval(\'(\' + Response.response + \')\');'."\n"; + //if ($this->method == 4 || $this->method == 6) { + if ($this->method == 6) { + $js.=' var queueFiles = Uploader.total.failed + Uploader.total.uploaded;'."\n"; + $js.=' var uploaded0 = Uploader.total.uploaded;'."\n"; + } else { + $js.=' var queueFiles = Uploader.total.failed + Uploader.total.uploaded + 1;'."\n"; + $js.=' var uploaded0 = Uploader.total.uploaded + 1;'."\n"; + } + $js.=''."\n"; + $js.=' if ((typeof(obj.result) != \'undefined\') && obj.result == \'error\') {'."\n"; + $js.=' '."\n"; + if ($this->method == 6) { + //$js.=' var uploaded0 = Uploader.total.uploaded;'."\n"; + } else { + //$js.=' var uploaded0 = Uploader.total.uploaded + 1;'."\n"; + } + $js.=' Up.trigger("Error", {message : obj.message, code : obj.code, details : obj.details, file: File});'."\n"; + $js.=' if( queueFiles == Uploader.files.length) {'."\n"; + if ($this->method == 6) { + $js.=' var uploaded0 = Uploader.total.uploaded;'."\n"; + } else { + $js.=' var uploaded0 = Uploader.total.uploaded;'."\n"; + } + $js.=' window.location = \''.$this->reload.'\' + \'&muuploaded=\' + uploaded0 + \'&mufailed=\' + Uploader.total.failed;'."\n"; + //$js.=' alert(\'Error\' + obj.message)'."\n"; + $js.=' }'."\n"; + $js.=' return false; '."\n"; + $js.=''."\n"; + $js.=' } else {'."\n"; + $js.=' if( queueFiles == Uploader.files.length) {'."\n"; + //$js.=' var uploaded = Uploader.total.uploaded + 1;'."\n"; + if ($this->method == 6) { + $js.=' var uploaded = Uploader.total.uploaded;'."\n"; + } else { + $js.=' var uploaded = Uploader.total.uploaded + 1;'."\n"; + } + $js.=' window.location = \''.$this->reload.'\' + \'&muuploaded=\' + uploaded + \'&mufailed=\' + Uploader.total.failed;'."\n"; + //$js.=' alert(\'OK\' + obj.message)'."\n"; + $js.=' }'."\n"; + $js.=' }'."\n"; + $js.=' });'."\n"; + $js.=' '."\n"; + $js.=' Uploader.bind(\'Error\', function(Up, ErrorObj) {'."\n"; + $js.=''."\n"; + // $js.=' if (ErrorObj.code == 100) { '."\n"; + //$js.=' pgJQ(\'#\' + ErrorObj.file.id).append(\'
\'+ ErrorObj.message + ErrorObj.details +\'
\');'."\n"; + $js.=' pgJQ(\'#\' + ErrorObj.file.id).append(\'
\'+ ErrorObj.message + ErrorObj.details +\'
\');'."\n"; + // $js.=' }'."\n"; + $js.=' }); '."\n"; + $js.='}'; + + $js.='});'."\n";// End $(function() + + $document->addScriptDeclaration($js); + } + + public function getMultipleUploadHTML($width = '', $height = '330', $mootools = 1) { + + + switch ($this->method) { + case 2: + $name = 'gears_uploader'; + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_INSTALLED_GEARS'); + break; + case 3: + $name = 'silverlight_uploader'; + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_INSTALLED_SILVERLIGHT'); + break; + case 4: + $name = 'html5_uploader'; + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_SUPPORTED_HTML5'); + break; + + case 5: + $name = 'browserplus_uploader'; + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_INSTALLED_BROWSERPLUS'); + break; + + case 6: + $name = 'html4_uploader'; + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_SUPPORTED_HTML4'); + break; + + case 1: + default: + $name = 'flash_uploader'; + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_INSTALLED_FLASH'); + break; + } + + $style = ''; + if ($width != '') { + $style .= 'width: '.(int)$width.'px;'; + } + if ($height != '') { + $style .= 'height: '.(int)$height.'px;'; + } + + return '
'.$msg.'
'; + + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/file/fileuploadsingle.php b/libraries/phocadownload/file/fileuploadsingle.php new file mode 100644 index 0000000..59a7fa7 --- /dev/null +++ b/libraries/phocadownload/file/fileuploadsingle.php @@ -0,0 +1,39 @@ +' + .''; + + } else { + $html = '' + //.'' + .'' + .'' + .''; + } + + return $html; + + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/file/index.html b/libraries/phocadownload/file/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/file/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/html/batch.php b/libraries/phocadownload/html/batch.php new file mode 100644 index 0000000..4bcdd11 --- /dev/null +++ b/libraries/phocadownload/html/batch.php @@ -0,0 +1,60 @@ +setQuery( $query ); + $data = $db->loadObjectList(); + $tree = array(); + $text = ''; + $catId= -1; + $tree = PhocaDownloadCategory::CategoryTreeOption($data, $tree, 0, $text, $catId); + + if ($category == 1) { + array_unshift($tree, JHTML::_('select.option', 0, JText::_('JLIB_HTML_ADD_TO_ROOT'), 'value', 'text')); + } + + + // Create the batch selector to change select the category by which to move or copy. + $lines = array( + '', + '
', + '', + JHTML::_( 'select.radiolist', $options, 'batch[move_copy]', '', 'value', 'text', 'm'), + '
' + ); + + return implode("\n", $lines); + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/html/grid.php b/libraries/phocadownload/html/grid.php new file mode 100644 index 0000000..738e2f1 --- /dev/null +++ b/libraries/phocadownload/html/grid.php @@ -0,0 +1,30 @@ + array('disapprove', 'COM_PHOCADOWNLOAD_APPROVED', 'COM_PHOCADOWNLOAD_NOT_APPROVE_ITEM', 'COM_PHOCADOWNLOAD_APPROVED', false, 'publish', 'publish'), + 0 => array('approve', 'COM_PHOCADOWNLOAD_NOT_APPROVED', 'COM_PHOCADOWNLOAD_APPROVE_ITEM', 'COM_PHOCADOWNLOAD_NOT_APPROVED', false, 'unpublish', 'unpublish') + ); + return self::state($states, $value, $i, $prefix, $enabled, true, $checkbox); + } +} diff --git a/libraries/phocadownload/html/index.html b/libraries/phocadownload/html/index.html new file mode 100644 index 0000000..42682b4 --- /dev/null +++ b/libraries/phocadownload/html/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/html/jgrid.php b/libraries/phocadownload/html/jgrid.php new file mode 100644 index 0000000..6b275a2 --- /dev/null +++ b/libraries/phocadownload/html/jgrid.php @@ -0,0 +1,37 @@ + array('disapprove', 'COM_PHOCADOWNLOAD_APPROVED', 'COM_PHOCADOWNLOAD_NOT_APPROVE_ITEM', 'COM_PHOCADOWNLOAD_APPROVED', false, 'publish', 'publish'), + 0 => array('approve', 'COM_PHOCADOWNLOAD_NOT_APPROVED', 'COM_PHOCADOWNLOAD_APPROVE_ITEM', 'COM_PHOCADOWNLOAD_NOT_APPROVED', false, 'unpublish', 'unpublish') + ); + return self::state($states, $value, $i, $prefix, $enabled, true, $checkbox); + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/index.html b/libraries/phocadownload/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/log/index.html b/libraries/phocadownload/log/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/log/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/log/log.php b/libraries/phocadownload/log/log.php new file mode 100644 index 0000000..c9900c1 --- /dev/null +++ b/libraries/phocadownload/log/log.php @@ -0,0 +1,68 @@ +get('enable_logging', 0); + // No Logging + if ($logging == 0) { + return false; + } + + // Only Downloads + if ($logging == 1 && $type == 2) { + return false; + } + + // Only Uploads + if ($logging == 2 && $type == 1) { + return false; + } + + + $user = JFactory::getUser(); + $uri = JFactory::getURI(); + $db = JFactory::getDBO(); + + $row = JTable::getInstance('PhocaDownloadLogging', 'Table'); + $data = array(); + $data['type'] = (int)$type; + $data['fileid'] = (int)$fileid; + $data['catid'] = 0;// Don't stored catid, bind the catid while displaying log + $data['userid'] = (int)$user->id; + $data['ip'] = $_SERVER["REMOTE_ADDR"]; + $data['page'] = $uri->toString(); + + + if (!$row->bind($data)) { + $this->setError($db->getErrorMsg()); + return false; + } + + $jnow = JFactory::getDate(); + $row->date = $jnow->toSql(); + + if (!$row->check()) { + $this->setError($db->getErrorMsg()); + return false; + } + + if (!$row->store()) { + $this->setError($db->getErrorMsg()); + return false; + } + return true; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/mail/index.html b/libraries/phocadownload/mail/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/mail/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/mail/mail.php b/libraries/phocadownload/mail/mail.php new file mode 100644 index 0000000..c917738 --- /dev/null +++ b/libraries/phocadownload/mail/mail.php @@ -0,0 +1,82 @@ +getCfg( 'sitename' ); + $mailfrom = $app->getCfg( 'mailfrom' ); + $fromname = $sitename; + $date = JHTML::_('date', gmdate('Y-m-d H:i:s'), JText::_( 'DATE_FORMAT_LC2' )); + $user = JFactory::getUser(); + $params = $app->getParams(); + + if (isset($user->name) && $user->name != '') { + $name = $user->name; + } else { + $name = JText::_('Anonymous'); + } + if (isset($user->username) && $user->username != '') { + $userName = ' ('.$user->username.')'; + } else { + $userName = ''; + } + + if ($method == 1) { + $subject = $sitename. ' - ' . JText::_( 'File downloaded' ); + $title = JText::_( 'File downloaded' ); + $messageText = JText::_( 'File') . ' "' .$fileName . '" '.JText::_('was downloaded by'). ' '.$name . $userName.'.'; + } else { + $subject = $sitename. ' - ' . JText::_( 'File uploaded' ); + $title = JText::_( 'New File uploaded' ); + $messageText = JText::_( 'File') . ' "' .$fileName . '" '.JText::_('was uploaded by'). ' '.$name . $userName.'.'; + } + + //get all super administrator + $query = 'SELECT name, email, sendEmail' . + ' FROM #__users' . + ' WHERE id = '.(int)$id; + $db->setQuery( $query ); + $rows = $db->loadObjectList(); + + if (isset($rows[0]->email)) { + $email = $rows[0]->email; + } + + + $message = $title . "\n\n" + . JText::_( 'Website' ) . ': '. $sitename . "\n" + . JText::_( 'Date' ) . ': '. $date . "\n" + . 'IP: ' . $_SERVER["REMOTE_ADDR"]. "\n\n" + . JText::_( 'Message' ) . ': '."\n" + . "\n\n" + . $messageText + . "\n\n" + . JText::_( 'Regards' ) .", \n" + . $sitename ."\n"; + + $subject = html_entity_decode($subject, ENT_QUOTES); + $message = html_entity_decode($message, ENT_QUOTES); + + $mail = JFactory::getMailer(); + $mail->sendMail($mailfrom, $fromname, $email, $subject, $message); + return true; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/ordering/index.html b/libraries/phocadownload/ordering/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/ordering/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/ordering/ordering.php b/libraries/phocadownload/ordering/ordering.php new file mode 100644 index 0000000..f8fb924 --- /dev/null +++ b/libraries/phocadownload/ordering/ordering.php @@ -0,0 +1,66 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/pagination/index.html b/libraries/phocadownload/pagination/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/pagination/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/pagination/pagination.php b/libraries/phocadownload/pagination/pagination.php new file mode 100644 index 0000000..8c9881d --- /dev/null +++ b/libraries/phocadownload/pagination/pagination.php @@ -0,0 +1,40 @@ +get( 'pagination', '5,10,15,20,50,100' ); + $paginationArray = explode( ',', $pagination ); + + // Initialize variables + $limits = array (); + + foreach ($paginationArray as $paginationValue) { + $limits[] = JHTML::_('select.option', $paginationValue); + } + $limits[] = JHTML::_('select.option', '0', JText::_('COM_PHOCADOWNLOAD_ALL')); + + $selected = $this->viewall ? 0 : $this->limit; + + // Build the select list + if ($app->isAdmin()) { + $html = JHTML::_('select.genericlist', $limits, 'limit', 'class="inputbox" size="1" onchange="submitform();"', 'value', 'text', $selected); + } else { + $html = JHTML::_('select.genericlist', $limits, 'limit', 'class="inputbox" size="1" onchange="this.form.submit()"', 'value', 'text', $selected); + } + return $html; + } + +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/path/index.html b/libraries/phocadownload/path/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/path/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/path/path.php b/libraries/phocadownload/path/path.php new file mode 100644 index 0000000..83da286 --- /dev/null +++ b/libraries/phocadownload/path/path.php @@ -0,0 +1,88 @@ +get( 'download_folder', 'phocadownload' ); + $downloadFolderPap = $paramsC->get( 'download_folder_pap', 'phocadownloadpap' ); + // Absolute path which can be outside public_html - if this will be set, download folder will be ignored + $absolutePath = $paramsC->get( 'absolute_path', '' ); + + // Path of preview and play + $downloadFolderPap = JPath::clean($downloadFolderPap); + $path['orig_abs_pap'] = JPATH_ROOT . DS . $downloadFolderPap; + $path['orig_abs_pap_ds'] = $path['orig_abs_pap'] . DS ; + + if ($group['f'] == 2) { + // Images + $path['orig_abs'] = JPATH_ROOT . DS . 'images' . DS . 'phocadownload' ; + $path['orig_abs_ds'] = $path['orig_abs'] . DS ; + $path['orig_abs_user_upload'] = $path['orig_abs'] . DS . 'userupload' ; + $path['orig_abs_user_upload_pap']= $path['orig_abs_pap'] . DS . 'userupload' ; + $path['orig_rel_ds'] = '../images/phocadownload/'; + } else if ($group['f'] == 3) { + // Play and Preview + $path['orig_abs'] = $path['orig_abs_pap']; + $path['orig_abs_ds'] = $path['orig_abs_pap_ds']; + $path['orig_abs_user_upload'] = $path['orig_abs'] . DS . 'userupload' ; + $path['orig_abs_user_upload_pap']= $path['orig_abs_pap'] . DS . 'userupload' ; + $path['orig_rel_ds'] = '../'.str_replace('/', DS, JPath::clean($downloadFolderPap)).'/'; + } else { + // Standard Path + if ($absolutePath != '') { + $downloadFolder = str_replace('/', DS, JPath::clean($absolutePath)); + $path['orig_abs'] = str_replace('/', DS, JPath::clean($absolutePath)); + $path['orig_abs_ds'] = JPath::clean($path['orig_abs'] . DS) ; + $path['orig_abs_user_upload'] = JPath::clean($path['orig_abs'] . DS . 'userupload') ; + $path['orig_abs_user_upload_pap']= JPath::clean($path['orig_abs_pap'] . DS . 'userupload') ; + //$downloadFolderRel = str_replace(DS, '/', JPath::clean($downloadFolder)); + $path['orig_rel_ds'] = ''; + + } else { + $downloadFolder = str_replace('/', DS, JPath::clean($downloadFolder)); + $path['orig_abs'] = JPATH_ROOT . DS . $downloadFolder ; + $path['orig_abs_ds'] = JPATH_ROOT . DS . $downloadFolder . DS ; + $path['orig_abs_user_upload'] = $path['orig_abs'] . DS . 'userupload' ; + $path['orig_abs_user_upload_pap']= $path['orig_abs_pap'] . DS . 'userupload' ; + + $downloadFolderRel = str_replace(DS, '/', JPath::clean($downloadFolder)); + $path['orig_rel_ds'] = '../' . $downloadFolderRel .'/'; + } + } + return $path; + } + + public static function getPathMedia() { + + //TODO create a singleton + $option = 'com_phocadownload'; + $instance = new StdClass(); + $baseFront = JURI::root(true); + $instance->media_css_abs = JPATH_ROOT . DS . 'media'. DS . $option . DS . 'css' . DS; + $instance->media_img_abs = JPATH_ROOT . DS . 'media'. DS . $option . DS . 'images' . DS; + $instance->media_js_abs = JPATH_ROOT . DS . 'media'. DS . $option . DS . 'js' . DS; + $instance->media_css_rel = 'media/'. $option .'/css/'; + $instance->media_img_rel = 'media/'. $option .'/images/'; + $instance->media_js_rel = 'components/'. $option .'/assets/'; + $instance->media_css_rel_full = $baseFront . '/' . $instance->media_css_rel; + $instance->media_img_rel_full = $baseFront . '/' . $instance->media_img_rel; + $instance->media_js_rel_full = $baseFront . '/' . $instance->media_js_rel; + return $instance; + + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/path/route.php b/libraries/phocadownload/path/route.php new file mode 100644 index 0000000..26506a4 --- /dev/null +++ b/libraries/phocadownload/path/route.php @@ -0,0 +1,308 @@ + (int) $id, + 'category' => (int) $catid, + //'section' => (int) $sectionid, + 'categories' => '' + ); + + + if ($idAlias != '') { + $id = $id . ':' . $idAlias; + } + if ($catidAlias != '') { + $catid = $catid . ':' . $catidAlias; + } + + //Create the link + + switch ($type) + { + case 'play': + $link = 'index.php?option=com_phocadownload&view=play&id='. $id.'&tmpl=component'; + break; + case 'detail': + $link = 'index.php?option=com_phocadownload&view=file&id='. $id.'&tmpl=component'; + break; + case 'download': + $link = 'index.php?option=com_phocadownload&view=category&download='. $id . '&id='. $catid; + break; + default: + $link = 'index.php?option=com_phocadownload&view=file&id='. $id; + break; + } + + if($item = self::_findItem($needles)) { + if (isset($item->id)) { + $link .= '&Itemid='.$item->id; + } + } + + return $link; + } + + public static function getDownloadRoute($id, $catid, $token, $directDownload = 1) + { + $needles = array( + 'download' => '', + 'categories' => '', + 'category' => (int) $catid, + 'file' => (int) $id + ); + if ($directDownload == 1) { + $link = 'index.php?option=com_phocadownload&view=download&id='. $token.'&download=1&' . JSession::getFormToken() . '=1'; + } else { + $link = 'index.php?option=com_phocadownload&view=download&id='. $token; + } + + if($item = self::_findItem($needles)) { + if (isset($item->id)) { + $link .= '&Itemid='.$item->id; + } + } + + return $link; + } + + public static function getFeedRoute($id, $catid = 0, $sectionid = 0, $type = 'rss') + { + $needles = array( + 'categories' => '', + //'section' => (int) $sectionid, + 'category' => (int) $catid, + 'file' => (int) $id + ); + + /* + if ($idAlias != '') { + $id = $id . ':' . $idAlias; + } + if ($catidAlias != '') { + $catid = $catid . ':' . $catidAlias; + }*/ + + //Create the link + $link = 'index.php?option=com_phocadownload&view=feed&id='.$id.'&format=feed&type='.$type; + + if($item = self::_findItem($needles, 1)) { + if (isset($item->id)) { + $link .= '&Itemid='.$item->id; + } + } + return $link; + } + + + + public static function getCategoryRoute($catid, $catidAlias = '') + { + $needles = array( + 'category' => (int) $catid, + //'section' => (int) $sectionid, + 'categories' => '' + ); + + if ($catidAlias != '') { + $catid = $catid . ':' . $catidAlias; + } + + //Create the link + $link = 'index.php?option=com_phocadownload&view=category&id='.$catid; + + if($item = self::_findItem($needles)) { + if(isset($item->query['layout'])) { + $link .= '&layout='.$item->query['layout']; + } + if(isset($item->id)) { + $link .= '&Itemid='.$item->id; + } + }; + + return $link; + } + + public static function getCategoryRouteByTag($tagId) + { + $needles = array( + 'category' => '', + //'section' => (int) $sectionid, + 'categories' => '' + ); + + $db = JFactory::getDBO(); + + $query = 'SELECT a.id, a.title, a.link_ext, a.link_cat' + .' FROM #__phocadownload_tags AS a' + .' WHERE a.id = '.(int)$tagId; + + $db->setQuery($query, 0, 1); + $tag = $db->loadObject(); + + if (!$db->query()) { + $this->setError($db->getErrorMsg()); + return false; + } + + //Create the link + if (isset($tag->id)) { + $link = 'index.php?option=com_phocadownload&view=category&id=tag&tagid='.(int)$tag->id; + } else { + $link = 'index.php?option=com_phocadownload&view=category&id=tag&tagid=0'; + } + + if($item = self::_findItem($needles)) { + if(isset($item->query['layout'])) { + $link .= '&layout='.$item->query['layout']; + } + if(isset($item->id)) { + $link .= '&Itemid='.$item->id; + } + }; + + return $link; + } + + public static function getCategoriesRoute() + { + $needles = array( + 'categories' => '' + ); + + //Create the link + $link = 'index.php?option=com_phocadownload&view=categories'; + + if($item = self::_findItem($needles)) { + if(isset($item->query['layout'])) { + $link .= '&layout='.$item->query['layout']; + } + if (isset($item->id)) { + $link .= '&Itemid='.$item->id; + } + } + + return $link; + } + + /* + function getSectionRoute($sectionid, $sectionidAlias = '') + { + $needles = array( + 'section' => (int) $sectionid, + 'sections' => '' + ); + + if ($sectionidAlias != '') { + $sectionid = $sectionid . ':' . $sectionidAlias; + } + + //Create the link + $link = 'index.php?option=com_phocadownload&view=section&id='.$sectionid; + + if($item = self::_findItem($needles)) { + if(isset($item->query['layout'])) { + $link .= '&layout='.$item->query['layout']; + } + $link .= '&Itemid='.$item->id; + } + + return $link; + } + + function getSectionsRoute() + { + $needles = array( + 'sections' => '' + ); + + //Create the link + $link = 'index.php?option=com_phocadownload&view=sections'; + + if($item = self::_findItem($needles)) { + if(isset($item->query['layout'])) { + $link .= '&layout='.$item->query['layout']; + } + if (isset($item->id)) { + $link .= '&Itemid='.$item->id; + } + } + + return $link; + }*/ + + protected static function _findItem($needles, $notCheckId = 0) + { + + $app = JFactory::getApplication(); + $menus = $app->getMenu('site', array()); + $items = $menus->getItems('component', 'com_phocadownload'); + + if(!$items) { + return $app->input->get('Itemid', 0, '', 'int'); + //return null; + } + + $match = null; + + + foreach($needles as $needle => $id) + { + + if ($notCheckId == 0) { + foreach($items as $item) { + if ((@$item->query['view'] == $needle) && (@$item->query['id'] == $id)) { + $match = $item; + break; + } + } + } else { + foreach($items as $item) { + if (@$item->query['view'] == $needle) { + $match = $item; + break; + } + } + } + + if(isset($match)) { + break; + } + } + + return $match; + } +} +?> diff --git a/libraries/phocadownload/rate/index.html b/libraries/phocadownload/rate/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/rate/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/rate/rate.php b/libraries/phocadownload/rate/rate.php new file mode 100644 index 0000000..75088f4 --- /dev/null +++ b/libraries/phocadownload/rate/rate.php @@ -0,0 +1,313 @@ +setQuery($query, 0, 1); + $votesStatistics = $db->loadObject(); + // if no count, set the average to 0 + if($votesStatistics->count == 0) { + $votesStatistics->count = (int)0; + $votesStatistics->average = (float)0; + } + + if (isset($votesStatistics->count) && isset($votesStatistics->average)) { + // Insert or update + $query = 'SELECT vs.id AS id' + .' FROM #__phocadownload_file_votes_statistics AS vs' + .' WHERE vs.fileid = '.(int) $fileid; + $db->setQuery($query, 0, 1); + $votesStatisticsId = $db->loadObject(); + + // Yes, there is id (UPDATE) x No, there isn't (INSERT) + if (!empty($votesStatisticsId->id)) { + + $query = 'UPDATE #__phocadownload_file_votes_statistics' + .' SET count = ' .(int)$votesStatistics->count + .' , average = ' .(float)$votesStatistics->average + .' WHERE fileid = '.(int) $fileid; + $db->setQuery($query); + + if (!$db->query()) { + $this->setError('Database Error Voting 1'); + return false; + } + + } else { + + $query = 'INSERT into #__phocadownload_file_votes_statistics' + .' (id, fileid, count, average)' + .' VALUES (null, '.(int)$fileid + .' , '.(int)$votesStatistics->count + .' , '.(float)$votesStatistics->average + .')'; + $db->setQuery($query); + + if (!$db->query()) { + $this->setError('Database Error Voting 2'); + return false; + } + + } + } else { + return false; + } + return true; + } + + public static function getVotesStatisticsFile($id) { + + $db = JFactory::getDBO(); + $query = 'SELECT vs.count AS count, vs.average AS average' + .' FROM #__phocadownload_file_votes_statistics AS vs' + .' WHERE vs.fileid = '.(int) $id; + $db->setQuery($query, 0, 1); + $votesStatistics = $db->loadObject(); + + return $votesStatistics; + } + + public static function checkUserVoteFile($fileid, $userid) { + + $db = JFactory::getDBO(); + $query = 'SELECT v.id AS id' + .' FROM #__phocadownload_file_votes AS v' + .' WHERE v.fileid = '. (int)$fileid + .' AND v.userid = '. (int)$userid; + $db->setQuery($query, 0, 1); + $checkUserVote = $db->loadObject(); + if ($checkUserVote) { + return true; + } + return false; + } + + + public static function renderRateFile($id, $displayRating, $small = 1, $refresh = false) { + + $user = JFactory::getUser(); + $neededAccessLevels = PhocaDownloadAccess::getNeededAccessLevels(); + $access = PhocaDownloadAccess::isAccess($user->getAuthorisedViewLevels(), $neededAccessLevels); + + + if ($small == 1) { + $smallO = '-small'; + $ratio = 18; + } else { + $smallO = ''; + $ratio = 22; + } + + $o = ''; + + //.$rating['urlvote'].$amp.'controller=detail&task=rate&rating=1 + //$amp = PhocaDownloadAccess::setQuestionmarkOrAmp($rating['urlvote']); + $href = 'javascript:void(0);'; + + if ((int)$displayRating != 1) { + return ''; + } else { + + $rating['alreadyratedfile'] = self::checkUserVoteFile( (int)$id, (int)$user->id ); + + $rating['notregisteredfile'] = true; + //$rating['usernamefile'] = ''; + if ($access > 0) { + $rating['notregisteredfile'] = false; + $rating['usernamefile'] = $user->name; + } + + $rating['votescountfile'] = 0; + $rating['votesaveragefile'] = 0; + $rating['voteswidthfile'] = 0; + $votesStatistics = self::getVotesStatisticsFile((int)$id); + if (!empty($votesStatistics->count)) { + $rating['votescountfile'] = $votesStatistics->count; + } + if (!empty($votesStatistics->average)) { + $rating['votesaveragefile'] = $votesStatistics->average; + if ($rating['votesaveragefile'] > 0) { + $rating['votesaveragefile'] = round(((float)$rating['votesaveragefile'] / 0.5)) * 0.5; + $rating['voteswidthfile'] = $ratio * $rating['votesaveragefile']; + } else { + $rating['votesaveragefile'] = (int)0;// not float displaying + } + } + + // Leave message for already voted images + //$vote = JRequest::getVar('vote', 0, '', 'int'); + $voteMsg = JText::_('COM_PHOCADOWNLOAD_RATING_ALREADY_RATED_FILE'); + //if ($vote == 1) { + // $voteMsg = JText::_('COM_PHOCADOWNLOAD_ALREADY_RATED_FILE_THANKS'); + //} + + $rating['votestextimg'] = 'VOTE'; + if ((int)$rating['votescountfile'] > 1) { + $rating['votestextimg'] = 'VOTES'; + } + + $o .= '
' + . JText::_('COM_PHOCADOWNLOAD_RATING'). ': ' . $rating['votesaveragefile'] .' / ' + .$rating['votescountfile'] . ' ' . JText::_('COM_PHOCADOWNLOAD_'.$rating['votestextimg']). '  
'; + + if ($rating['alreadyratedfile']) { + $o .= '
    ' + .'
  • ' + .'
  • '; + + for ($i = 2;$i < 6;$i++) { + $o .= '
  • '; + } + $o .= '
'; + + $or ='
'.JText::_('COM_PHOCADOWNLOAD_RATING_ALREADY_RATED_FILE').'
'; + + } else if ($rating['notregisteredfile']) { + + $o .= '
    ' + .'
  • ' + .'
  • '; + + for ($i = 2;$i < 6;$i++) { + $o .= '
  • '; + } + $o .= '
'; + + $or ='
'.JText::_('COM_PHOCADOWNLOAD_ONLY_REGISTERED_LOGGED_RATE_FILE').'
'; + + } else { + + $o .= '
    ' + .'
  • ' + .'
  • 1
  • '; + + for ($i = 2;$i < 6;$i++) { + $o .= '
  • '.$i.'
  • '; + } + $o .= '
'; + + $or ='
'; + } + + + + } + + if ($refresh == true) { + return $o;//we are in Ajax, return only content of pdvoting div + } else { + return '
'.$o.'
' .$or ;//not in ajax, return the contend in div + } + + + } + + public static function renderRateFileJS($small = 1) { + + $document = JFactory::getDocument(); + $url = 'index.php?option=com_phocadownload&view=ratingfilea&task=rate&format=json&'.JSession::getFormToken().'=1'; + $urlRefresh = 'index.php?option=com_phocadownload&view=ratingfilea&task=refreshrate&small='.$small.'&format=json&'.JSession::getFormToken().'=1'; + $imgLoadingUrl = JURI::base(). 'components/com_phocadownload/assets/images/icon-loading2.gif'; + $imgLoadingHTML = ''; + $js = ''; + $document->addCustomTag($js); + + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/render/layout.php b/libraries/phocadownload/render/layout.php new file mode 100644 index 0000000..ba24fb6 --- /dev/null +++ b/libraries/phocadownload/render/layout.php @@ -0,0 +1,256 @@ +params = JComponentHelper::getParams('com_phocadownload') ; + } + + if ($this->filePath == '') { + $this->filePath = PhocaDownloadPath::getPathSet('file'); + } + + if ($this->iconPath == '') { + $this->iconPath = PhocaDownloadPath::getPathSet('icon'); + } + + if ($this->cssImagePath == '') { + $this->cssImagePath = str_replace ( '../', JURI::base(true).'/', $this->iconPath['orig_rel_ds']); + } + + if ($this->fileAbsPath == '') { + $this->fileAbsPath = $this->filePath['orig_abs_ds']; + } + + } + + + public function getName($title, $filename, $preferTitle = 0) { + + $name = $title; + $fon = $this->params->get( 'filename_or_name', 'filename' ); + + if ($fon == 'title') { + $name = $title; + } else if ($fon == 'filename'){ + $name = PhocaDownloadFile::getTitleFromFilenameWithExt( $filename ); + } else if ($fon == 'filenametitle'){ + if ($preferTitle == 1) { + $name = $title; + } else { + // Must be solved before + $name = PhocaDownloadFile::getTitleFromFilenameWithExt( $filename ); + } + } + + return $name; + } + + public function getImageFileName($imageFilename, $fileName = '', $type = 1, $iconSize = 16) { + + $name['filenamestyle'] = ''; + $name['filenamethumb'] = ''; + + if ($imageFilename !='') { + $thumbnail = false; + $thumbnail = preg_match("/phocathumbnail/i", $imageFilename); + if ($thumbnail) { + $name['filenamethumb'] = '
' + .'
'; + $name['filenamestyle'] = ''; + } else { + $name['filenamethumb'] = ''; + $name['filenamestyle'] = 'style="background: url(\''.$this->cssImagePath.$imageFilename.'\') 0 center no-repeat;"'; + } + } else { + $file_icon_mime = $this->params->get( 'file_icon_mime', 1 ); + if ($fileName != '' && $file_icon_mime == 1) { + if ($type == 3) { // Plugin + $file_icon_size = $iconSize; + } else if ($type == 2) { + $file_icon_size = $this->params->get( 'file_icon_size_md', 16 ); + } else { + $file_icon_size = $this->params->get( 'file_icon_size', 16 ); + } + $icon = PhocaDownloadFile::getMimeTypeIcon($fileName, (int)$file_icon_size, 1); + $name['filenamethumb'] = ''; + $name['filenamestyle'] = $icon; + } + } + + + return $name; + } + + public function getFileSize($filename) { + + $size = ''; + if ($filename != '') { + $absFile = str_replace('/', DS, JPath::clean($this->fileAbsPath . $filename)); + if (JFile::exists($absFile)) { + $size = PhocaDownloadFile::getFileSizeReadable(filesize($absFile)); + } else { + $size = ''; + } + } + + return $size; + } + + public function getProtectEmail($email) { + + $email = str_replace('@', '['.JText::_('COM_PHOCADOWNLOAD_AT').']', $email); + $email = str_replace('.', '['.JText::_('COM_PHOCADOWNLOAD_DOT').']', $email); + + return $email; + } + + public function getFileDate($filename, $date) { + + $dateO = ''; + $ddt = $this->params->get( 'display_date_type', 0 ); + if ((int)$ddt > 0) { + if ($filename !='') { + $dateO = PhocaDownloadFile::getFileTime($filename, $ddt); + } + } else { + $dateO = JHTML::Date($date, JText::_('DATE_FORMAT_LC3')); + } + + return $dateO; + } + + public function isValueEditor($text) { + + if ($text != '' && $text != '

 

' && $text != '

 

' && $text != '

' && $text != '
') { + return true; + } + return false; + } + + public function getImageDownload($img) { + + return ''; + } + + public function displayTags($fileId) { + + $o = ''; + $db = JFactory::getDBO(); + + $query = 'SELECT a.id, a.title, a.link_ext, a.link_cat' + .' FROM #__phocadownload_tags AS a' + .' LEFT JOIN #__phocadownload_tags_ref AS r ON r.tagid = a.id' + .' WHERE r.fileid = '.(int)$fileId; + + $db->setQuery($query); + $fileIdObject = $db->loadObjectList(); + + if (!$db->query()) { + $this->setError($db->getErrorMsg()); + return false; + } + + $tl = $this->params->get( 'tags_links', 0 ); + + foreach ($fileIdObject as $k => $v) { + $o .= ''; + if ($tl == 0) { + $o .= $v->title; + } else if ($tl == 1) { + if ($v->link_ext != '') { + $o .= ''.$v->title.''; + } else { + $o .= $v->title; + } + } else if ($tl == 2) { + + if ($v->link_cat != '') { + $query = 'SELECT a.id, a.alias' + .' FROM #__phocadownload_categories AS a' + .' WHERE a.id = '.(int)$v->link_cat; + + $db->setQuery($query, 0, 1); + $category = $db->loadObject(); + + if (!$db->query()) { + $this->setError($db->getErrorMsg()); + return false; + } + if (isset($category->id) && isset($category->alias)) { + $link = PhocaDownloadRoute::getCategoryRoute($category->id, $category->alias); + $o .= ''.$v->title.''; + } else { + $o .= $v->title; + } + } else { + $o .= $v->title; + } + } else if ($tl == 3) { + $link = PhocaDownloadRoute::getCategoryRouteByTag($v->id); + $o .= ''.$v->title.''; + } + + $o .= ' '; + } + + return $o; + } + + public function displayVideo($url, $view = 0, $ywidth = 0, $yheight = 0) { + + $o = ''; + if ($url != '' && PhocaDownloadUtils::isURLAddress($url) ) { + + $shortUrl = 'http://youtu.be/'; + $pos = strpos($url, $shortUrl); + if ($pos !== false) { + $code = str_replace($shortUrl, '', $url); + } else { + $codeArray = explode('=', $url); + $code = str_replace($codeArray[0].'=', '', $url); + } + + if ($view == 0) { + // Category View + $youtubeheight = $this->params->get( 'youtube_height_cv', 240 ); + $youtubewidth = $this->params->get( 'youtube_width_cv', 320 ); + } else { + // Detail View + $youtubeheight = $this->params->get( 'youtube_height_dv', 360 ); + $youtubewidth = $this->params->get( 'youtube_width_dv', 480 ); + } + + if ((int)$ywidth > 0) { + $youtubewidth = (int)$ywidth; + } + if ((int)$yheight > 0) { + $youtubeheight = (int)$yheight; + } + + $o .= '' + .'' + .'' + .'' + .''; + } + return $o; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/render/renderadmin.php b/libraries/phocadownload/render/renderadmin.php new file mode 100644 index 0000000..b69a2c6 --- /dev/null +++ b/libraries/phocadownload/render/renderadmin.php @@ -0,0 +1,104 @@ +' + .'' + .JHTML::_('image', $imgUrl . $image, $text ) + .'
'.$text.'
'. "\n"; + } + + public static function getLinks() { + $app = JFactory::getApplication(); + $option = $app->input->get('option'); + $oT = strtoupper($option); + + $links = array(); + switch ($option) { + + case 'com_phocadownload': + $links[] = array('Phoca Download site', 'http://www.phoca.cz/phocadownload'); + $links[] = array('Phoca Download documentation site', 'http://www.phoca.cz/documentation/category/17-phoca-download-component'); + $links[] = array('Phoca Download download site', 'http://www.phoca.cz/download/category/68-phoca-download'); + break; + + } + + $links[] = array('Phoca News', 'http://www.phoca.cz/news'); + $links[] = array('Phoca Forum', 'http://www.phoca.cz/forum'); + + $components = array(); + $components[] = array('Phoca Gallery','phocagallery', 'pg'); + $components[] = array('Phoca Guestbook','phocaguestbook', 'pgb'); + $components[] = array('Phoca Download','phocadownload', 'pd'); + $components[] = array('Phoca Documentation','phocadocumentation', 'pdc'); + $components[] = array('Phoca Favicon','phocafavicon', 'pfv'); + $components[] = array('Phoca SEF','phocasef', 'psef'); + $components[] = array('Phoca PDF','phocapdf', 'ppdf'); + $components[] = array('Phoca Restaurant Menu','phocamenu', 'prm'); + $components[] = array('Phoca Maps','phocamaps', 'pm'); + $components[] = array('Phoca Font','phocafont', 'pf'); + $components[] = array('Phoca Email','phocaemail', 'pe'); + $components[] = array('Phoca Install','phocainstall', 'pi'); + $components[] = array('Phoca Template','phocatemplate', 'pt'); + $components[] = array('Phoca Panorama','phocapanorama', 'pp'); + $components[] = array('Phoca Photo','phocaphoto', 'ph'); + $components[] = array('Phoca Commander','phocacommander', 'pcm'); + + $banners = array(); + $banners[] = array('Phoca Restaurant Menu','phocamenu', 'prm'); + + $o = ''; + $o .= '

 

'; + $o .= '

'.JText::_($oT.'_USEFUL_LINKS'). '

'; + $o .= '
    '; + foreach ($links as $k => $v) { + $o .= '
  • '.$v[0].'
  • '; + } + $o .= '
'; + + $o .= '
'; + $o .= '

 

'; + $o .= '

'.JText::_($oT.'_USEFUL_TIPS'). '

'; + + $m = mt_rand(0, 10); + if ((int)$m > 0) { + $o .= '
'; + $num = range(0,(count($components) - 1 )); + shuffle($num); + for ($i = 0; $i<3; $i++) { + $numO = $num[$i]; + $o .= ''; + } + $o .= '
'; + $o .= '
'; + } else { + $num = range(0,(count($banners) - 1 )); + shuffle($num); + $numO = $num[0]; + $o .= ''; + + } + + $o .= '

 

'; + $o .= '

'.JText::_($oT.'_PLEASE_READ'). '

'; + $o .= ''; + + $o .= '
'; + return $o; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/render/renderadminview.php b/libraries/phocadownload/render/renderadminview.php new file mode 100644 index 0000000..d719d02 --- /dev/null +++ b/libraries/phocadownload/render/renderadminview.php @@ -0,0 +1,80 @@ +
'."\n" + .'
'."\n"; + } + + public function endForm() { + return '
'."\n".'
'."\n".''."\n"; + } + + public function formInputs() { + + return ''. "\n" + . JHtml::_('form.token'). "\n"; + } + + public function navigation($tabs) { + $o = ''; + return $o; + } + + public function group($form, $formArray, $clear = 0) { + $o = ''; + if (!empty($formArray)) { + if ($clear == 1) { + foreach ($formArray as $value) { + $o .= '
'. $form->getLabel($value) . '
'."\n" + . '
'. "\n" + . '
' . $form->getInput($value). '
'."\n"; + } + } else { + foreach ($formArray as $value) { + $o .= '
'."\n" + . '
'. $form->getLabel($value) . '
'."\n" + . '
' . $form->getInput($value). '
'."\n" + . '
' . "\n"; + } + } + } + return $o; + } + + public function item($form, $item, $suffix = '') { + $value = $o = ''; + if ($suffix != '') { + $value = $suffix; + } else { + $value = $form->getInput($item); + } + $o .= '
'."\n"; + $o .= '
'. $form->getLabel($item) . '
'."\n" + . '
' . $value.'
'."\n" + . '
' . "\n"; + return $o; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/render/renderadminviews.php b/libraries/phocadownload/render/renderadminviews.php new file mode 100644 index 0000000..34326b7 --- /dev/null +++ b/libraries/phocadownload/render/renderadminviews.php @@ -0,0 +1,355 @@ +' . "\n" + .'Joomla.orderTable = function() {' . "\n" + .' table = document.getElementById("sortTable");' . "\n" + .' direction = document.getElementById("directionTable");' . "\n" + .' order = table.options[table.selectedIndex].value;' . "\n" + .' if (order != \''. $listOrder.'\') {' . "\n" + .' dirn = \'asc\';' . "\n" + .' } else {' . "\n" + .' dirn = direction.options[direction.selectedIndex].value;' . "\n" + .' }' . "\n" + .' Joomla.tableOrdering(order, dirn, \'\');' . "\n" + .'}' . "\n" + .'' . "\n"; + } + + public function startForm($option, $view, $id = 'adminForm', $name = 'adminForm') { + return '
'."\n"; + } + + public function endForm() { + return '
'."\n".'
'."\n"; + } + + public function startFilter($txtFilter){ + $o = '
'."\n" + . JHtmlSidebar::render()."\n" + . '
'."\n"; + $o .= '
'."\n" + . ''."\n"; + return $o; + } + + public function endFilter() { + return '
' . "\n" . '
' . "\n"; + } + + public function selectFilterPublished($txtSp, $state) { + return''. "\n"; + } + + public function selectFilterType($txtSp, $type, $typeList) { + return''. "\n"; + } + + public function selectFilterLanguage($txtLng, $state) { + return''. "\n"; + } + + public function selectFilterCategory($categoryList, $txtLng, $state) { + return ''. "\n"; + } + + public function startMainContainer() { + return '
'. "\n"; + } + + public function endMainContainer() { + return '
'. "\n"; + } + + public function startFilterBar() { + return '
'. "\n"; + } + + public function endFilterBar() { + return '
' . "\n" . '
'. "\n"; + } + + public function inputFilterSearch($txtSl, $txtSd, $state) { + return ''. "\n"; + } + + public function inputFilterSearchClear($txtFs, $txtFc) { + return '
'. "\n" + .''. "\n" + .''. "\n" + .'
'. "\n"; + } + + public function inputFilterSearchLimit($txtSl, $paginationLimitBox) { + return '
'. "\n" + .''. "\n" + .$paginationLimitBox ."\n" . '
'. "\n"; + } + + public function selectFilterDirection($txtOd, $txtOasc, $txtOdesc, $listDirn) { + $ascDir = $descDir = ''; + if ($listDirn == 'asc') {$ascDir = 'selected="selected"';} + if ($listDirn == 'desc') {$descDir = 'selected="selected"';} + return '
'. "\n" + .''. "\n" + .''. "\n" + .'
'. "\n"; + } + + public function selectFilterSortBy($txtSb, $sortFields, $listOrder) { + return '
'. "\n" + .''. "\n" + .''. "\n" + .'
'. "\n"; + } + + public function startTable($id) { + return ''. "\n"; + } + + public function endTable() { + return '
'. "\n"; + } + public function tblFoot($listFooter, $columns) { + return '' . "\n" . ''.$listFooter.''. "\n".''. "\n"; + } + + public function startTblHeader() { + return ''."\n".''."\n"; + } + + public function endTblHeader() { + return ''."\n".''."\n"; + } + + public function thOrdering($txtHo, $listDirn, $listOrder ) { + return ''. "\n" + . JHtml::_('grid.sort', '', 'a.ordering', $listDirn, $listOrder, null, 'asc', $txtHo). "\n" + . ''; + } + + public function thCheck($txtCh) { + return ''. "\n" + .''. "\n" + .''. "\n"; + } + + public function tdOrder($canChange, $saveOrder, $orderkey){ + + $o = ''. "\n"; + if ($canChange) { + $disableClassName = ''; + $disabledLabel = ''; + if (!$saveOrder) { + $disabledLabel = JText::_('JORDERINGDISABLED'); + $disableClassName = 'inactive tip-top'; + } + $o .= ''."\n"; + } else { + $o .= ''."\n"; + } + $orderkeyPlus = $orderkey + 1; + $o .= ''. "\n" + .''. "\n"; + return $o; + } + + public function tdRating($ratingAvg) { + $o = ''; + $voteAvg = round(((float)$ratingAvg / 0.5)) * 0.5; + $voteAvgWidth = 16 * $voteAvg; + $o .= '
    ' + .'
  • ' + .'
  • '; + + for ($ir = 2;$ir < 6;$ir++) { + $o .= '
  • '; + } + $o .= '
'; + $o .=''. "\n"; + return $o; + } + + public function tdLanguage($lang, $langTitle, $langTitleE ) { + + $o = ''; + if ($lang == '*') { + $o .= JText::_('JALL'); + } else { + if ($langTitle) { + $o .= $langTitleE; + } else { + $o .= JText::_('JUNDEFINED');; + } + } + $o .= ''. "\n"; + return $o; + } + + public function formInputs($listOrder, $originalOrders) { + + return ''. "\n" + .''. "\n" + .''. "\n" + .''. "\n" + . JHtml::_('form.token'). "\n" + .''. "\n"; + } + + public function td($value, $class = '') { + if ($class != ''){ + return ''. $value.''. "\n"; + } else { + return ''. $value.''. "\n"; + } + } + + /* TODO: + * CHANGE PATHS + * SET NEW PARAM IN PG: '/media/com_phocagallery/images/administrator/' + */ + public function tdImage($item, $button, $txtE, $class = '', $avatarAbs = '', $avatarRel = '') { + $o = ''. "\n"; + $o .= '
'. "\n" + .'
'. "\n" + .'
'. "\n" + .'
'. "\n" + .'
'. "\n" + .'
'. "\n"; + + if ($avatarAbs != '' && $avatarRel != '') { + // AVATAR + if (JFile::exists($avatarAbs.$item->avatar)){ + $o .= '' + .''.JText::_($txtE).'' + .''; + } else { + $o .= JHTML::_( 'image', '/media/com_phocagallery/images/administrator/phoca_thumb_s_no_image.gif', ''); + } + } else { + // PICASA + if (isset($item->extid) && $item->extid !='') { + + $resW = explode(',', $item->extw); + $resH = explode(',', $item->exth); + $correctImageRes = PhocaGalleryImage::correctSizeWithRate($resW[2], $resH[2], 50, 50); + $imgLink = $item->extl; + + $o .= '' + . ''.JText::_($txtE).'' + .''. "\n"; + } else if (isset ($item->fileoriginalexist) && $item->fileoriginalexist == 1) { + + $imageRes = PhocaGalleryImage::getRealImageSize($item->filename, 'small'); + $correctImageRes = PhocaGalleryImage::correctSizeWithRate($imageRes['w'], $imageRes['h'], 50, 50); + $imgLink = PhocaGalleryFileThumbnail::getThumbnailName($item->filename, 'large'); + + $o .= '' + . ''.JText::_($txtE).'' + .''. "\n"; + } else { + $o .= JHTML::_( 'image', 'media/com_phocagallery/images/administrator/phoca_thumb_s_no_image.gif', ''); + } + } + $o .= '
'. "\n" + .'
'. "\n" + .'
'. "\n" + .'
'. "\n" + .'
'. "\n" + .'
'. "\n"; + $o .= ''. "\n"; + return $o; + } + + + public function tdPublishDownUp ($publishUp, $publishDown, $langPref) { + + $o = ''; + $db = JFactory::getDBO(); + //$app = JFactory::getApplication(); + $nullDate = $db->getNullDate(); + $now = JFactory::getDate(); + $config = JFactory::getConfig(); + $publish_up = JFactory::getDate($publishUp); + $publish_down = JFactory::getDate($publishDown); + //$tz = new DateTimeZone($config->get('offset')); + //$publish_up->setTimezone($tz); + //$publish_down->setTimezone($tz); + + + if ( $now->toUnix() <= $publish_up->toUnix() ) { + $text = JText::_( $langPref . '_PENDING' ); + } else if ( ( $now->toUnix() <= $publish_down->toUnix() || $publishDown == $nullDate ) ) { + $text = JText::_( $langPref . '_ACTIVE' ); + } else if ( $now->toUnix() > $publish_down->toUnix() ) { + $text = JText::_( $langPref . '_EXPIRED' ); + } + + $times = ''; + if (isset($publishUp)) { + if ($publishUp == $nullDate) { + $times .= JText::_( $langPref . '_START') . ': '.JText::_( $langPref . '_ALWAYS' ); + } else { + $times .= JText::_( $langPref . '_START') .": ". JHtml::_('date', $publish_up, 'D, d M Y H:i:s'); + } + } + if (isset($publishDown)) { + + if ($publishDown == $nullDate) { + $times .= "
". JText::_( $langPref . '_FINISH'). ': '. JText::_( $langPref . '_NO_EXPIRY' ); + } else { + $times .= "
". JText::_( $langPref . '_FINISH') .": ". JHtml::_('date', $publish_down, 'D, d M Y H:i:s'); + } + } + + if ( $times ) { + $o .= '' + .'' + .''. $text.'' + .''. "\n"; + } else { + $o .= ''. "\n"; + } + return $o; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/render/renderfront.php b/libraries/phocadownload/render/renderfront.php new file mode 100644 index 0000000..965cf74 --- /dev/null +++ b/libraries/phocadownload/render/renderfront.php @@ -0,0 +1,241 @@ +input->get('Itemid', 0, 'int'); + $db = JFactory::getDBO(); + $query = 'SELECT a.filename as filename, a.type as type, a.menulink as menulink' + .' FROM #__phocadownload_styles AS a' + .' WHERE a.published = 1' + .' ORDER BY a.type, a.ordering ASC'; + $db->setQuery($query); + $filenames = $db->loadObjectList(); + if (!empty($filenames)) { + foreach ($filenames as $fk => $fv) { + + $path = PhocaDownloadFile::getCSSPath($fv->type, 1); + + if ($fv->menulink != '') { + $menuLinks = explode(',', $fv->menulink); + $isIncluded = in_array((int)$itemid, $menuLinks); + if ($isIncluded) { + JHtml::stylesheet($path . $fv->filename ); + } + } else { + JHtml::stylesheet($path . $fv->filename ); + } + } + } + } + + public static function renderPhocaDownload() { + return '
Po' + .'wered by Phoca Down'.'load
'; + } + + public static function displayMirrorLinks($view = 1, $link, $title, $target) { + + $paramsC = JComponentHelper::getParams( 'com_phocadownload' ); + $param['display_mirror_links'] = $paramsC->get( 'display_mirror_links', 0 ); + $o = ''; + + $displayM = 0; + if ($view == 1) { + //Category View + if ($param['display_mirror_links'] == 1 || $param['display_mirror_links'] == 3 + || $param['display_mirror_links'] == 4 || $param['display_mirror_links'] == 6) { + $displayM = 1; + } + + } else { + //File View + if ($param['display_mirror_links'] == 2 || $param['display_mirror_links'] == 3 + || $param['display_mirror_links'] == 5 || $param['display_mirror_links'] == 6) { + $displayM = 1; + } + } + + if ($displayM == 1 && $link != '' && PhocaDownloadUtils::isURLAddress($link) && $title != '') { + + $targetO = ''; + if ($target != '') { + $targetO = 'target="'.$target.'"'; + } + $o .= ''.strip_tags($title).''; + + } + + return $o; + } + + public static function displayReportLink($view = 1, $title = '') { + + $paramsC = JComponentHelper::getParams( 'com_phocadownload' ); + $param['display_report_link'] = $paramsC->get( 'display_report_link', 0 ); + $param['report_link_guestbook_id'] = $paramsC->get( 'report_link_guestbook_id', 0 ); + $o = ''; + + $displayL = 0; + if ($view == 1) { + //Category View + if ($param['display_report_link'] == 1 || $param['display_report_link'] == 3) { + $displayL = 1; + } + + } else { + //File View + if ($param['display_report_link'] == 2 || $param['display_report_link'] == 3) { + $displayL = 1; + } + } + + if ($displayL == 1 && (int)$param['report_link_guestbook_id'] > 0) { + + $onclick = "window.open(this.href,'win2','width=600,height=500,scrollbars=yes,menubar=no,resizable=yes'); return false;"; + //$href = JRoute::_('index.php?option=com_phocaguestbook&view=guestbook&id='.(int)$param['report_link_guestbook_id'].'&reporttitle='.strip_tags($title).'&tmpl=component&Itemid='. JRequest::getVar('Itemid', 0, '', 'int') ); + + $href = JRoute::_('index.php?option=com_phocaguestbook&view=guestbook&id='.(int)$param['report_link_guestbook_id'].'&reporttitle='.strip_tags($title).'&tmpl=component'); + + + $o .= ''.JText::_('COM_PHOCADOWNLOAD_REPORT').''; + + } + + return $o; + } + + public static function displayNewIcon ($date, $time = 0) { + + if ($time == 0) { + return ''; + } + + $dateAdded = strtotime($date, time()); + $dateToday = time(); + $dateExists = $dateToday - $dateAdded; + $dateNew = $time * 24 * 60 * 60; + + if ($dateExists < $dateNew) { + //return ' '. JHTML::_('image', 'media/com_phocadownload/images/icon-new.png', JText::_('COM_PHOCADOWNLOAD_NEW')); + return ' '.JText::_('COM_PHOCADOWNLOAD_NEW').''; + } else { + return ''; + } + + } + + public static function displayHotIcon ($hits, $requiredHits = 0) { + + if ($requiredHits == 0) { + return ''; + } + + if ($requiredHits <= $hits) { + //return ' '. JHTML::_('image', 'media/com_phocadownload/images/icon-hot.png', JText::_('COM_PHOCADOWNLOAD_HOT')); + return ' '.JText::_('COM_PHOCADOWNLOAD_HOT').''; + } else { + return ''; + } + } + + public static function renderOnUploadJS() { + + $tag = ""; + + return $tag; + } + + public static function renderDescriptionUploadJS($chars) { + + $tag = ""; + + return $tag; + } + + public static function userTabOrdering() { + $js = "\t". '' . "\n"; + + return $js; + } + + public static function renderOverlibCSS($ol_fg_color, $ol_bg_color, $ol_tf_color, $ol_cf_color, $opacity = 0.8) { + + $opacityPer = (float)$opacity * 100; + + $css = "\n"; + + return $css; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/stat/index.html b/libraries/phocadownload/stat/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/stat/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/stat/stat.php b/libraries/phocadownload/stat/stat.php new file mode 100644 index 0000000..8d50fcd --- /dev/null +++ b/libraries/phocadownload/stat/stat.php @@ -0,0 +1,84 @@ +quoteName('#__phocadownload_user_stat') + .' WHERE '. $db->quoteName('userid') + .' = ' + .$db->Quote((int)$user->id) + .' AND '. $db->quoteName('fileid') + .' = ' + .$db->Quote((int)$downloadId); + + $db->setQuery($query); + $results = $db->loadObjectList(); + + $date = gmdate('Y-m-d H:i:s'); + if ($results) { + // Update count + $query = 'UPDATE '.$db->quoteName('#__phocadownload_user_stat') + .' SET count = (count + 1),' + .' date = '.$db->Quote($date) + .' WHERE userid = '.$db->Quote((int)$user->id) + .' AND fileid = '.$db->Quote((int)$downloadId); + + $db->setQuery($query); + $db->query(); + } else { + + $query = 'INSERT INTO '.$db->quoteName('#__phocadownload_user_stat') + .' ('.$db->quoteName('count').',' + .' '.$db->quoteName('userid').',' + .' '.$db->quoteName('fileid').',' + .' '.$db->quoteName('date').')' + .' VALUES ('.$db->Quote(1).',' + .' '.$db->Quote((int)$user->id).',' + .' '.$db->Quote((int)$downloadId).',' + .' '.$db->Quote($date).')'; + $db->setQuery($query); + $db->query(); + } + return true; + } + + public static function getCountFilePerUser($downloadId) { + $db = JFactory::getDBO(); + $user = JFactory::getUser(); + + $query = ' SELECT count FROM '.$db->quoteName('#__phocadownload_user_stat') + .' WHERE '. $db->quoteName('userid') + .' = ' + .$db->Quote((int)$user->id) + .' AND '. $db->quoteName('fileid') + .' = ' + .$db->Quote((int)$downloadId) + .' LIMIT 0, 1'; + + $db->setQuery($query); + $count = $db->loadObject(); + if (isset($count->count)) { + return (int)$count->count; + } else { + return 0; + } + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/tag/index.html b/libraries/phocadownload/tag/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/tag/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/tag/tag.php b/libraries/phocadownload/tag/tag.php new file mode 100644 index 0000000..d96c8c6 --- /dev/null +++ b/libraries/phocadownload/tag/tag.php @@ -0,0 +1,101 @@ +setQuery($query); + + if (!$db->query()) { + echo PhocaDownloadException::renderErrorInfo('Database Error - Getting Selected Tags'); + return false; + } + if ($select == 1) { + $tags = $db->loadColumn(); + } else { + $tags = $db->loadObjectList(); + } + + return $tags; + } + + public static function storeTags($tagsArray, $fileId) { + + + if ((int)$fileId > 0) { + $db = JFactory::getDBO(); + $query = ' DELETE ' + .' FROM #__phocadownload_tags_ref' + . ' WHERE fileid = '. (int)$fileId; + $db->setQuery($query); + if (!$db->query()) { + echo PhocaDownloadException::renderErrorInfo('Database Error - Deleting FileId Tags'); + return false; + } + + if (!empty($tagsArray)) { + + $values = array(); + $valuesString = ''; + + foreach($tagsArray as $k => $v) { + $values[] = ' ('.(int)$fileId.', '.(int)$v.')'; + } + + if (!empty($values)) { + $valuesString = implode($values, ','); + + $query = ' INSERT INTO #__phocadownload_tags_ref (fileid, tagid)' + .' VALUES '.(string)$valuesString; + + $db->setQuery($query); + if (!$db->query()) { + echo PhocaDownloadException::renderErrorInfo('Database Error - Insert FileId Tags'); + return false; + } + + } + } + } + + } + + public static function getAllTagsSelectBox($name, $id, $activeArray, $javascript = NULL, $order = 'id' ) { + + $db = JFactory::getDBO(); + $query = 'SELECT a.id AS value, a.title AS text' + .' FROM #__phocadownload_tags AS a' + . ' ORDER BY '. $order; + $db->setQuery($query); + + if (!$db->query()) { + echo PhocaDownloadException::renderErrorInfo('Database Error - Getting All Tags'); + return false; + } + + $tags = $db->loadObjectList(); + + $tagsO = JHTML::_('select.genericlist', $tags, $name, 'class="inputbox" size="4" multiple="multiple"'. $javascript, 'value', 'text', $activeArray, $id); + + return $tagsO; + } +} \ No newline at end of file diff --git a/libraries/phocadownload/user/index.html b/libraries/phocadownload/user/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/user/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/user/user.php b/libraries/phocadownload/user/user.php new file mode 100644 index 0000000..8d4b2dc --- /dev/null +++ b/libraries/phocadownload/user/user.php @@ -0,0 +1,134 @@ +get( 'user_ucp_lang', 1 ); + + $o = array(); + + switch ($userLang){ + case 2: + $registry = new JRegistry; + $registry->loadString($user->params); + $o['lang'] = $registry->get('language','*'); + $o['langinput'] = ''; + break; + + case 3: + $o['lang'] = JFactory::getLanguage()->getTag(); + $o['langinput'] = ''; + break; + + default: + case 1: + $o['lang'] = '*'; + $o['langinput'] = ''; + break; + } + return $o; + } + + public static function getUserFileInfo($file, $userId) { + + $db = JFactory::getDBO(); + $allFile['size'] = 0; + $allFile['count'] = 0; + $query = 'SELECT SUM(a.filesize) AS sumfiles, COUNT(a.id) AS countfiles' + .' FROM #__phocadownload AS a' + .' WHERE a.owner_id = '.(int)$userId; + $db->setQuery($query, 0, 1); + $fileData = $db->loadObject(); + + if(isset($fileData->sumfiles) && (int)$fileData->sumfiles > 0) { + $allFile['size'] = (int)$allFile['size'] + (int)$fileData->sumfiles; + } + + if (isset($file['size'])) { + $allFile['size'] = (int)$allFile['size'] + (int)$file['size']; + $allFile['count'] = (int)$fileData->countfiles + 1; + } + + return $allFile; + } + + /** + * Method to display multiple select box + * @param string $name Name (id, name parameters) + * @param array $active Array of items which will be selected + * @param int $nouser Select no user + * @param string $javascript Add javascript to the select box + * @param string $order Ordering of items + * @param int $reg Only registered users + * @return array of id + */ + + public static function usersList( $name, $id, $active, $nouser = 0, $javascript = NULL, $order = 'name', $reg = 1 ) { + + $activeArray = $active; + if ($active != '') { + $activeArray = explode(',',$active); + } + + $db = JFactory::getDBO(); + $and = ''; + if ($reg) { + // does not include registered users in the list + $and = ' AND m.group_id != 2'; + } + + $query = 'SELECT u.id AS value, u.name AS text' + . ' FROM #__users AS u' + . ' JOIN #__user_usergroup_map AS m ON m.user_id = u.id' + . ' WHERE u.block = 0' + . $and + . ' GROUP BY u.id' + . ' ORDER BY '. $order; + + + + $db->setQuery( $query ); + if ( $nouser ) { + + // Access rights (Default open for all) + // Upload and Delete rights (Default closed for all) + switch ($name) { + case 'jform[accessuserid][]': + $idInput1 = -1; + $idText1 = JText::_( 'COM_PHOCADOWNLOAD_ALL_REGISTERED_USERS' ); + $idInput2 = -2; + $idText2 = JText::_( 'COM_PHOCADOWNLOAD_NOBODY' ); + break; + + Default: + $idInput1 = -2; + $idText1 = JText::_( 'COM_PHOCADOWNLOAD_NOBODY' ); + $idInput2 = -1; + $idText2 = JText::_( 'COM_PHOCADOWNLOAD_ALL_REGISTERED_USERS' ); + break; + } + + $users[] = JHTML::_('select.option', $idInput1, '- '. $idText1 .' -' ); + $users[] = JHTML::_('select.option', $idInput2, '- '. $idText2 .' -' ); + + $users = array_merge( $users, $db->loadObjectList() ); + } else { + $users = $db->loadObjectList(); + } + + $users = JHTML::_('select.genericlist', $users, $name, 'class="inputbox" size="4" multiple="multiple"'. $javascript, 'value', 'text', $activeArray, $id ); + + return $users; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/utils/exception.php b/libraries/phocadownload/utils/exception.php new file mode 100644 index 0000000..3a9228f --- /dev/null +++ b/libraries/phocadownload/utils/exception.php @@ -0,0 +1,25 @@ +'.JText::_($msg).''; + } else { + return '
'.$msg.'
'; + } + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/utils/external.php b/libraries/phocadownload/utils/external.php new file mode 100644 index 0000000..974420a --- /dev/null +++ b/libraries/phocadownload/utils/external.php @@ -0,0 +1,24 @@ +checkAccess('phoca', 'category', $fileName->catid); + } else if (file_exists(JPATH_ADMINISTRATOR . DS . "components" . DS . "com_osemsc" . DS . "warehouse" . DS . "api.php")) { + require_once (JPATH_ADMINISTRATOR . DS . "components" . DS . "com_osemsc" . DS . "warehouse" . DS . "api.php"); + $checkmsc = new OSEMSCAPI(); + $checkmsc->ACLCheck("phoca", "cat", $fileName->catid, true); + } + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/utils/index.html b/libraries/phocadownload/utils/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/libraries/phocadownload/utils/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/libraries/phocadownload/utils/settings.php b/libraries/phocadownload/utils/settings.php new file mode 100644 index 0000000..d8db473 --- /dev/null +++ b/libraries/phocadownload/utils/settings.php @@ -0,0 +1,126 @@ +setQuery($query, 0, 1); + $layout = $db->loadObject(); + + if (!$db->query()) { + $this->setError($db->getErrorMsg()); + return false; + } + + if (isset($layout->$type)) { + return $layout->$type; + } + + return ''; + + } + + public static function getLayoutParams($type) { + + $params = array(); + switch($type) { + + case 'categories': + $params['style'] = array('pd-title','pd-desc', 'pd-subcategory', 'pd-no-subcat');//'pd-', + $params['search'] = array('{pdtitle}','{pddescription}', '{pdsubcategories}', '{pdclear}'); + break; + + case 'category': + $params['style'] = array('pd-title','pd-image', 'pd-file', 'pd-fdesc', 'pd-mirrors', 'pd-mirror', 'pd-report', 'pd-rating', 'pd-tags', 'pd-buttons', 'pd-downloads', 'pd-video'); + $params['search'] = array('{pdtitle}','{pdimage}', '{pdfile}', '{pdfilesize}', '{pdversion}', '{pdlicense}', '{pdauthor}', '{pdauthoremail}', '{pdfiledate}', '{pddownloads}', '{pddescription}', '{pdfeatures}', '{pdchangelog}', '{pdnotes}', '{pdmirrorlink1}', '{pdmirrorlink2}', '{pdreportlink}', '{pdrating}', '{pdtags}', '{pdfiledesctop}', '{pdfiledescbottom}', '{pdbuttondownload}', '{pdbuttondetails}', '{pdbuttonpreview}', '{pdbuttonplay}', '{pdvideo}'); + break; + + + case 'file': + $params['style'] = array('pd-title','pd-image', 'pd-file', 'pd-fdesc', 'pd-mirrors', 'pd-mirror', 'pd-report', 'pd-rating', 'pd-tags', 'pd-downloads', 'pd-video'); + $params['search'] = array('{pdtitle}','{pdimage}', '{pdfile}', '{pdfilesize}', '{pdversion}', '{pdlicense}', '{pdauthor}', '{pdauthoremail}', '{pdfiledate}', '{pddownloads}', '{pddescription}', '{pdfeatures}', '{pdchangelog}', '{pdnotes}', '{pdmirrorlink1}', '{pdmirrorlink2}', '{pdreportlink}', '{pdrating}', '{pdtags}', '{pdvideo}'); + break; + } + + return $params; + } +} +?> \ No newline at end of file diff --git a/libraries/phocadownload/utils/utils.php b/libraries/phocadownload/utils/utils.php new file mode 100644 index 0000000..30cca3b --- /dev/null +++ b/libraries/phocadownload/utils/utils.php @@ -0,0 +1,119 @@ +Powe'.'red b'.'y Pho' + .'ca Downl'.'oad'; + } + + public static function getExtensionVersion($c = 'phocadownload') { + $folder = JPATH_ADMINISTRATOR .DS. 'components'.DS.'com_'.$c; + if (JFolder::exists($folder)) { + $xmlFilesInDir = JFolder::files($folder, '.xml$'); + } else { + $folder = JPATH_SITE .DS. 'components'.DS.'com_'.$c; + if (JFolder::exists($folder)) { + $xmlFilesInDir = JFolder::files($folder, '.xml$'); + } else { + $xmlFilesInDir = null; + } + } + + $xml_items = ''; + if (count($xmlFilesInDir)) + { + foreach ($xmlFilesInDir as $xmlfile) + { + if ($data = JApplicationHelper::parseXMLInstallFile($folder.DS.$xmlfile)) { + foreach($data as $key => $value) { + $xml_items[$key] = $value; + } + } + } + } + + if (isset($xml_items['version']) && $xml_items['version'] != '' ) { + return $xml_items['version']; + } else { + return ''; + } + } + + public static function setVars( $task = '') { + + $a = array(); + $app = JFactory::getApplication(); + $a['o'] = htmlspecialchars(strip_tags($app->input->get('option'))); + $a['c'] = str_replace('com_', '', $a['o']); + $a['n'] = 'Phoca' . ucfirst(str_replace('com_phoca', '', $a['o'])); + $a['l'] = strtoupper($a['o']); + $a['i'] = 'media/'.$a['o'].'/images/administrator/'; + $a['s'] = 'media/'.$a['o'].'/css/administrator/'.$a['c'].'.css'; + $a['task'] = $a['c'] . htmlspecialchars(strip_tags($task)); + $a['tasks'] = $a['task']. 's'; + return $a; + } + + public static function getAliasName($alias) { + $alias = JApplication::stringURLSafe($alias); + if (trim(str_replace('-', '', $alias)) == '') { + $alias = JFactory::getDate()->format("Y-m-d-H-i-s"); + } + return $alias; + } + + public static function strTrimAll($input) { + $output = ''; + $input = trim($input); + for($i=0;$i 0); + } else if (empty($value)) { + return array(0 => 0); + } else if (is_array($value)) { + return $value; + } else { + return array(0 => $value); + } + + } + public static function isURLAddress($url) { + return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url); + } + + public static function setQuestionmarkOrAmp($url) { + $isThereQMR = false; + $isThereQMR = preg_match("/\?/i", $url); + if ($isThereQMR) { + return '&'; + } else { + return '?'; + } + } + + public static function getToken($title = '') { + $salt = md5($title . 'string '. date('s'). mt_rand(0,9999) . str_replace(mt_rand(0,9), mt_rand(0,9999), date('r')). 'end string'); + $token = hash('sha256', $salt . time()); + return $token; + } +} +?> \ No newline at end of file diff --git a/media/css/administrator/index.html b/media/css/administrator/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/media/css/administrator/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/css/administrator/phocadownload.css b/media/css/administrator/phocadownload.css new file mode 100644 index 0000000..c21c36d --- /dev/null +++ b/media/css/administrator/phocadownload.css @@ -0,0 +1,608 @@ +/* Columns*/ +.ph-image { + text-align:center; + width: 10%; +} +.ph-title { + width: 60%; +} + +.ph-title-stat { + width: 10%; +} +.ph-filename-stat { + width: 50%; +} + +.ph-title-short { + width: 30%; +} +.ph-filename-long { + width: 50%; +} +.ph-count { + width: 5%; +} + +.ph-page { + width: 5%; +} + +.ph-functions, +.ph-id, +.ph-check, +.ph-ordering { + width: 1%; +} + +.ph-right { + text-align: right !important; +} +.ph-center { + text-align: center !important; +} + +.ph-uploaduser { + width: 7%; + white-space: nowrap; +} +.ph-owner, +.ph-rating, +.ph-hits, +.ph-language, +.ph-published, +.ph-approved { + width: 5%; +} +.ph-user, +.ph-parentcattitle { + width: 15%; +} +.ph-filename, +.ph-access { + width: 10%; +} + + +.ph-multiple-table tr td.ph-img-table { + text-align: center; + padding-top: 4px; +} +.ph-icon { + margin: 0; + padding: 5px; + float: left; + margin: 0 auto; + text-align: center; +} +.ph-icon-inside.thumbnail { + width: 100px; + height: 100px; + -webkit-border-radius: 0px; + border-radius: 0px; + background: #fdfdfd; +} +.ph-icon-inside.thumbnail img { + margin-top: 10px; + margin-bottom: -12px; +} +.ph-icon-inside.thumbnail span { +} + +.ph-head-form-small, +.ph-head-form { + font-weight: bold; +} +.ph-head-form { + margin-bottom: 10px; +} +.ph-in { + padding: 5px; +} + +.ph-w80 { + width: 80%; +} +.dl-horizontal.ph-input dt { + float: left; + clear: left; + margin-right: 20px; + text-align: left; + width: auto; +} +.dl-horizontal.ph-input dd{ +} + +.ph-cpanel-left { + float: left; + width: 50%; +} +.ph-cpanel-right { + float: right; + width: 50%; +} + +#configTabs li a img { + margin-top: -3px; +} + +.ph-head-form-small, +.ph-head-form { + font-weight: bold; +} +.ph-head-form { + margin-bottom: 10px; +} +.ph-in { + padding: 5px; +} + +.ph-w80 { + width: 80%; +} +.dl-horizontal.ph-input dt { + float: left; + clear: left; + margin-right: 20px; + text-align: left; + width: auto; +} +.dl-horizontal.ph-input dd{ +} + +.icon-multiple:before { + content: url('../../images/administrator/icon-12-multiple.png'); +} + +.icon-authorizeall:before { + content: url('../../images/administrator/icon-12-authorizeall.png'); +} + +.icon-disapprove:before { + content: url('../../images/administrator/icon-12-disapprove.png'); +} +.icon-approve:before { + content: url('../../images/administrator/icon-12-approve.png'); +} + +.icon-reset:before { + content: url('../../images/administrator/icon-12-reset.png'); +} + +.icon-back:before { + content: url('../../images/administrator/icon-12-back.png'); +} + +/* -- Codemirror Editor ----------- */ +div.editor-border /*, div.CodeMirror-wrapping */ { + border: 1px solid #ccc; + background-color: #ffffff; +} +#ph-editor div.CodeMirror-wrapping { + height: 400px !important; +} + + + + +div.icon-48-phocadownload { + background: url('../../images/administrator/icon-48-phocadownload.png') no-repeat left; +} +div.icon-48-info { + background: url('../../images/administrator/icon-48-info.png') no-repeat left; +} +div.icon-48-tags { + background: url('../../images/administrator/icon-48-tags.png') no-repeat left; +} +div.icon-48-layout { + background: url('../../images/administrator/icon-48-layout.png') no-repeat left; +} +div.icon-48-category { + background: url('../../images/administrator/icon-48-cats.png') no-repeat left; +} + +div.icon-48-section { + background: url('../../images/administrator/icon-48-sec.png') no-repeat left; +} +div.icon-48-settings { + background: url('../../images/administrator/icon-48-set.png') no-repeat left; +} +div.icon-48-file { + background: url('../../images/administrator/icon-48-file.png') no-repeat left; +} +div.icon-48-statistics { + background: url('../../images/administrator/icon-48-stat.png') no-repeat left; +} +div.icon-48-userstat { + background: url('../../images/administrator/icon-48-user-stat.png') no-repeat left; +} +div.icon-48-license { + background: url('../../images/administrator/icon-48-lic.png') no-repeat left; +} +div.icon-48-users { + background: url('../../images/administrator/icon-48-users.png') no-repeat left; +} + +div.icon-48-multiple { + background: url('../../images/administrator/icon-48-pd-multiple.png') no-repeat left; +} + +div.icon-48-vote-file { + background: url('../../images/administrator/icon-48-vote-file.png') no-repeat left; +} +span.icon-32-reset { + background: url('../../images/administrator/icon-32-reset.png') no-repeat left; +} +span.icon-32-authorizeall { + background: url('../../images/administrator/icon-32-authorizeall.png') no-repeat left; +} +span.icon-32-multiple { + background: url('../../images/administrator/icon-32-multiple.png') no-repeat left; +} + +span.icon-32-disapprove { + background: url('../../images/administrator/icon-32-disapprove.png') no-repeat left; +} +span.icon-32-approve { + background: url('../../images/administrator/icon-32-approve.png') no-repeat left; +} + +/* Phoca Download Editor Button Plugin */ +.plg-button-tbl { + width: 100%; +} +.plg-button-tbl tr { + border-bottom: 1px solid #f0f0f0; +} + +.plg-button-tbl tr td { + + padding-top:5px; + padding-bottom: 5px; +} + +.plg-button-insert { + margin-right: 5px; +} + +#phocadownload-links .icon-16-edb-sections { + background: #fdfdfd url('../../images/administrator/icon-16-edb-sections.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 30px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} +#phocadownload-links .icon-16-edb-section { + background: #fdfdfd url('../../images/administrator/icon-16-edb-section.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 30px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} +#phocadownload-links .icon-16-edb-category { + background: #fdfdfd url('../../images/administrator/icon-16-edb-category.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 30px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} + +#phocadownload-links .icon-16-edb-categories { + background: #fdfdfd url('../../images/administrator/icon-16-edb-categories.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 30px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} +#phocadownload-links .icon-16-edb-file { + background: #fdfdfd url('../../images/administrator/icon-16-edb-file.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 30px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} +#phocadownload-links .icon-16-edb-play { + background: #fdfdfd url('../../images/administrator/icon-16-edb-play.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 30px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} +#phocadownload-links .icon-16-edb-preview { + background: #fdfdfd url('../../images/administrator/icon-16-edb-preview.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 30px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} +#phocadownload-links a { + text-decoration:underline; +} + +#phocadownload-links .icon-16-edb-back { + background: #fdfdfd url('../../images/administrator/icon-16-edb-back.png') no-repeat 5px center; + list-style-type:none; + padding: 10px 10px 10px 26px; + margin:5px; + border:1px solid #ccc; + display: block; + width: auto; +} + +#phocadownload-links th a { + text-decoration:none; +} + +.notapproved { + background:#FFC2C2; + border:1px solid #bf3030; + color: #a60000; + padding:10px; + margin-top:5px; + margin-bottom:5px; +} + +.phoca-adminform { + background-color: #fff; + border: solid 1px #d5d5d5; + padding:10px; + color: #777; +} +.cpanel-right { + color: #777; +} + +.pgerrormsg, +.notapproved { + background:#FFC2C2; + border:1px solid #bf3030; + color: #a60000; + padding:10px; + margin-top:5px; + margin-bottom:5px; +} +.pgsuccessmsg { + background:#ceffc1; + border:1px solid #4ebd30; + color: #23a600; + padding:10px; + margin-top:5px; + margin-bottom:5px; +} +.pgunsetmsg { + background:#fff2c1; + border:1px solid #bda130; + color: #a68400; + padding:10px; + margin-top:5px; + margin-bottom:5px; +} + +#phocadownloadmanager { + font-family: sans, arial; +} +#phocadownloadmanager a img { + + border: none; +} + +#phocadownloadmanager .pd-admin-path { + border: 1px solid #ccc; + background: #f0f0f0; + padding: 10px; + margin:5px 0px; +} +#phocadownloadmanager .pd-admin-files { + border: 1px solid #ccc; + background: #fff; + padding: 10px; + margin:5px 0px; +} + +#phocadownloadmanager .pd-admin-file { + padding:3px 0px; + margin:0px; +} +#phocadownloadmanager .pd-admin-file-checkbox { + padding:3px 0px; + margin:7px 0px; + background: #f9f9f9; + border-bottom: 1px solid #f0f0f0 +} + + +/* Rating */ +/* Voting - style by http://www.jluvip.com/works/css/starvote/index2-1.html*/ + .star-rating{ + list-style:none; + margin: 0px; + margin-top:5px; + margin-bottom:5px; + padding:0px; + width: 110px; + height: 22px; + position: relative; + background: url(images/icon-voting.png) top left repeat-x; +} + + .star-rating li{ + list-style-type:none; + padding:0px; + margin:0px; + /*\*/ + float: left; + /* */ +} + + .star-rating li a{ + display:block; + width:22px; + height: 22px; + text-decoration: none; + text-indent: -9000px; + z-index: 20; + position: absolute; + padding: 0px; +} + .star-rating li a:hover{ + background: url(images/icon-voting.png) left center; + z-index: 2; + left: 0px; +} + .star-rating a.star1{ + left: 0px; +} + .star-rating a.star1:hover{ + width:22px; +} + .star-rating a.stars2{ + left:22px; +} + .star-rating a.stars2:hover{ + width: 44px; +} + .star-rating a.stars3{ + left: 44px; +} + .star-rating a.stars3:hover{ + width: 66px; +} + .star-rating a.stars4{ + left: 66px; +} + .star-rating a.stars4:hover{ + width: 88px; +} + .star-rating a.stars5{ + left: 88px; +} + .star-rating a.stars5:hover{ + width: 110px; +} + .star-rating li.current-rating{ + background: url(images/icon-voting.png) left bottom; + position: absolute; + height: 22px; + /*width:77px;*/ + display: block; + text-indent: -9000px; + z-index: 1; +} + +/* Voting small */ +.star-rating-box-small { + border: 1px solid #e7e7e7; + padding: 1px; + margin: 0px; + background: #fff; +} + +.star-rating-small{ + list-style:none; + margin: 0px; + margin-top:5px; + margin-bottom:5px; + padding:0px; + width: 80px; + height: 16px; + position: relative; + background: url(images/icon-voting-small.png) top left repeat-x; +} + +.star-rating-small li{ + list-style-type:none; + padding:0px; + margin:0px; + /*\*/ + float: left; + /* */ +} + +.star-rating-small li a{ + display:block; + width:16px; + height: 16px; + text-decoration: none; + text-indent: -9000px; + z-index: 20; + position: absolute; + padding: 0px; +} +.star-rating-small li a:hover{ + background: url(images/icon-voting-small.png) left center; + z-index: 2; + left: 0px; +} +.star-rating-small a.star1{ + left: 0px; +} +.star-rating-small a.star1:hover{ + width:16px; +} +.star-rating-small a.stars2{ + left:16px; +} +.star-rating-small a.stars2:hover{ + width: 32px; +} +.star-rating-small a.stars3{ + left: 32px; +} +.star-rating-small a.stars3:hover{ + width: 48px; +} +.star-rating-small a.stars4{ + left: 48px; +} +.star-rating-small a.stars4:hover{ + width: 64px; +} +.star-rating-small a.stars5{ + left: 64px; +} +.star-rating-small a.stars5:hover{ + width: 80px; +} +.star-rating-small li.current-rating{ + background: url(images/icon-voting-small.png) left bottom; + position: absolute; + height: 16px; + /*width:77px;*/ + display: block; + text-indent: -9000px; + z-index: 1; +} + +.warning { + padding: 5px; + border: 1px solid #FF8E6B; + background: #FFDCD1; + color: #FF3F05; + margin: 10px 0px; +} + +.pdview { + padding: 0px 5px 10px 5px; + border: 1px solid #ccc; + background: #fff; + margin: 5px 0px; +} +.adminForm, +#adminForm { + margin: 0px 0px 0px 0px !important; + padding: 0px 0px 0px 0px !important; +} diff --git a/media/css/administrator/phocadownloadoptions.css b/media/css/administrator/phocadownloadoptions.css new file mode 100644 index 0000000..ffcda1f --- /dev/null +++ b/media/css/administrator/phocadownloadoptions.css @@ -0,0 +1,41 @@ +label { + width: 20em; + +} + +hr { + border-bottom: 1px solid #cce6ff; + + display: block; + margin: 0; padding: 0; +} + +.ph-options-head { + background: #E5F3FF; + color: #0069CC; + border-bottom: 1px solid #B3DBFF; + border-top: 1px solid #B3DBFF; + padding:5px 10px; + margin:5px 0; + display:block; + text-shadow: 0 1px 0 #ffffff; + margin-left: -160px; +} + +.ph-options-head-expert { + background: #F2dede; + color: #b94a48; + border-bottom: 1px solid #edd3d6; + border-top: 1px solid #edd3d6; + padding:5px 10px; + margin:5px 0; + display:block; + text-shadow: 0 1px 0 #ffffff; + margin-left: -160px; +} + +.ph-options-head-expert div +.ph-options-head div{ + white-space: nowrap; + +} \ No newline at end of file diff --git a/media/css/administrator/rating.css b/media/css/administrator/rating.css new file mode 100644 index 0000000..c7dc5e7 --- /dev/null +++ b/media/css/administrator/rating.css @@ -0,0 +1,268 @@ +/* Rating */ +/* Voting - style by http://www.jluvip.com/works/css/starvote/index2-1.html*/ +#phoca-dl-category-box ul.star-rating li, +#phoca-dl-category-box ul.star-rating-small li, +#phoca-dl-file-box ul.star-rating li, +#phoca-dl-file-box ul.star-rating-small li{ + background: none; + list-style-type:none; +} + +#phoca-dl-file-box .star-rating, +#phoca-dl-category-box .star-rating, +.star-rating{ + list-style:none; + margin: 0px; + margin-bottom:5px; + padding:0px; + width: 110px; + height: 22px; + position: relative; + background: url(../../images/icon-voting.png) top left repeat-x; +} + +#phoca-dl-file-box .star-rating li, +#phoca-dl-category-box .star-rating li, +.star-rating li{ + list-style-type:none; + padding:0px; + margin:0px; + /*\*/ + float: left; + /* */ +} + +#phoca-dl-file-box .star-rating li a, +#phoca-dl-category-box .star-rating li a, +.star-rating li a{ + display:block; + width:22px; + height: 22px; + text-decoration: none; + text-indent: -9000px; + z-index: 20; + position: absolute; + padding: 0px; +} + +#phoca-dl-file-box .star-rating li a:hover, +#phoca-dl-category-box .star-rating li a:hover, +.star-rating li a:hover{ + background: url(../../images/icon-voting.png) left center; + z-index: 2; + left: 0px; +} + +#phoca-dl-file-box .star-rating a.star1, +#phoca-dl-category-box .star-rating a.star1, +.star-rating a.star1{ + left: 0px; +} + +#phoca-dl-file-box .star-rating a.star1:hover, +#phoca-dl-category-box .star-rating a.star1:hover, +.star-rating a.star1:hover{ + width:22px; +} + +#phoca-dl-file-box .star-rating a.stars2, +#phoca-dl-category-box .star-rating a.stars2, +.star-rating a.stars2{ + left:22px; +} + +#phoca-dl-file-box .star-rating a.stars2:hover, +#phoca-dl-category-box .star-rating a.stars2:hover, +.star-rating a.stars2:hover{ + width: 44px; +} + +#phoca-dl-file-box .star-rating a.stars3, +#phoca-dl-category-box .star-rating a.stars3, +.star-rating a.stars3{ + left: 44px; +} + +#phoca-dl-file-box .star-rating a.stars3:hover, +#phoca-dl-category-box .star-rating a.stars3:hover, +.star-rating a.stars3:hover{ + width: 66px; +} + +#phoca-dl-file-box .star-rating a.stars4, +#phoca-dl-category-box .star-rating a.stars4, +.star-rating a.stars4{ + left: 66px; +} + +#phoca-dl-file-box .star-rating a.stars4:hover, +#phoca-dl-category-box .star-rating a.stars4:hover, +.star-rating a.stars4:hover{ + width: 88px; +} + +#phoca-dl-file-box .star-rating a.stars5, +#phoca-dl-category-box .star-rating a.stars5, +.star-rating a.stars5{ + left: 88px; +} + +#phoca-dl-file-box .star-rating a.stars5:hover, +#phoca-dl-category-box .star-rating a.stars5:hover, +.star-rating a.stars5:hover{ + width: 110px; +} + +#phoca-dl-file-box .star-rating li.current-rating, +#phoca-dl-category-box .star-rating li.current-rating, +.star-rating li.current-rating{ + background: url(../../images/icon-voting.png) left bottom; + position: absolute; + height: 22px; + /*width:77px;*/ + display: block; + text-indent: -9000px; + z-index: 1; +} + + +/* Voting small */ +#phoca-dl-file-box .star-rating-small, +#phoca-dl-category-box .star-rating-small, +.star-rating-small{ + list-style:none; + margin: 0px; + margin-bottom:5px; + padding:0px; + width: 90px; + height: 18px; + position: relative; + background: url(../../images/icon-voting-small.png) top left repeat-x; +} + +#phoca-dl-file-box .star-rating-small li, +#phoca-dl-category-box .star-rating-small li, +.star-rating-small li{ + list-style-type:none; + padding:0px; + margin:0px; + /*\*/ + float: left; + /* */ +} + +#phoca-dl-file-box .star-rating-small li a, +#phoca-dl-category-box .star-rating-small li a, +.star-rating-small li a{ + display:block; + width:18px; + height: 18px; + text-decoration: none; + text-indent: -9000px; + z-index: 20; + position: absolute; + padding: 0px; +} + +#phoca-dl-file-box .star-rating-small li a:hover, +#phoca-dl-category-box .star-rating-small li a:hover, +.star-rating-small li a:hover{ + background: url(../../images/icon-voting-small.png) left center; + z-index: 2; + left: 0px; +} + +#phoca-dl-file-box .star-rating-small a.star1, +#phoca-dl-category-box .star-rating-small a.star1, +.star-rating-small a.star1{ + left: 0px; +} + +#phoca-dl-file-box .star-rating-small a.star1:hover, +#phoca-dl-category-box .star-rating-small a.star1:hover, +.star-rating-small a.star1:hover{ + width:18px; +} + +#phoca-dl-file-box .star-rating-small a.stars2, +#phoca-dl-category-box .star-rating-small a.stars2, +.star-rating-small a.stars2{ + left:18px; +} + +#phoca-dl-file-box .star-rating-small a.stars2:hover, +#phoca-dl-category-box .star-rating-small a.stars2:hover, +.star-rating-small a.stars2:hover{ + width: 36px; +} + +#phoca-dl-file-box .star-rating-small a.stars3, +#phoca-dl-category-box .star-rating-small a.stars3, +.star-rating-small a.stars3{ + left: 36px; +} + +#phoca-dl-file-box .star-rating-small a.stars3:hover, +#phoca-dl-category-box .star-rating-small a.stars3:hover, +.star-rating-small a.stars3:hover{ + width: 54px; +} + +#phoca-dl-file-box .star-rating-small a.stars4, +#phoca-dl-category-box .star-rating-small a.stars4, +.star-rating-small a.stars4{ + left: 54px; +} + +#phoca-dl-file-box .star-rating-small a.stars4:hover, +#phoca-dl-category-box .star-rating-small a.stars4:hover, +.star-rating-small a.stars4:hover{ + width: 72px; +} + +#phoca-dl-file-box .star-rating-small a.stars5, +#phoca-dl-category-box .star-rating-small a.stars5, +.star-rating-small a.stars5{ + left: 72px; +} + +#phoca-dl-file-box .star-rating-small a.stars5:hover, +#phoca-dl-category-box .star-rating-small a.stars5:hover, +.star-rating-small a.stars5:hover{ + width: 90px; +} + +#phoca-dl-file-box .star-rating-small li.current-rating, +#phoca-dl-category-box .star-rating-small li.current-rating, +.star-rating-small li.current-rating{ + background: url(../../images/icon-voting-small.png) left bottom; + position: absolute; + height: 18px; + /*width:77px;*/ + display: block; + text-indent: -9000px; + z-index: 1; +} + + + +.pd-small, +.pd-result, +#phoca-dl-file-box .pd-small, +#phoca-dl-file-box .pd-result, +#phoca-dl-category-box .pd-small, +#phoca-dl-category-box .pd-result { + font-size: x-small; +} + + +#phoca-dl-file-box ul.star-rating-small, +#phoca-dl-category-box ul.star-rating-small, +#phoca-dl-file-box ul.star-rating-small li, +#phoca-dl-category-box ul.star-rating-small li, +#phoca-dl-file-box ul.star-rating, +#phoca-dl-category-box ul.star-rating, +#phoca-dl-file-box ul.star-rating li, +#phoca-dl-category-box ul.star-rating li { + list-style: none !important; +} \ No newline at end of file diff --git a/media/css/custom/default.css b/media/css/custom/default.css new file mode 100644 index 0000000..fde8f4a --- /dev/null +++ b/media/css/custom/default.css @@ -0,0 +1,5 @@ +/* +Phoca Download +http://www.phoca.cz/ +http://www.phoca.cz/phocadownload +*/ \ No newline at end of file diff --git a/media/css/custom/index.html b/media/css/custom/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/media/css/custom/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/css/index.html b/media/css/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/media/css/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/css/main/bootstrap.min.css b/media/css/main/bootstrap.min.css new file mode 100644 index 0000000..a9cfd5a --- /dev/null +++ b/media/css/main/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../../images/bootstrap/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../../images/bootstrap/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/media/css/main/button.css b/media/css/main/button.css new file mode 100644 index 0000000..e1e16a2 --- /dev/null +++ b/media/css/main/button.css @@ -0,0 +1,102 @@ +/* +Phoca Download +http://www.phoca.cz/ +http://www.phoca.cz/phocadownload +*/ + +#phoca-dl-category-box .pd-button-mirror1 a, +#phoca-dl-category-box .pd-button-mirror2 a, +#phoca-dl-file-box .pd-button-mirror1 a, +#phoca-dl-file-box .pd-button-mirror2 a, +#phoca-dl-category-box .pd-button-play a, +#phoca-dl-category-box .pd-button-preview a, +#phoca-dl-category-box .pd-button-download a, +#phoca-dl-category-box .pd-button-details a, +#phoca-dl-download-box .pd-button-download a { + background: url(../../images/btn.png) repeat-x; + display: inline-block; + padding: 7px 12px 8px; + text-decoration: none; + box-shadow: 0 1px 2px rgba(0,0,0,0.6); + -moz-box-shadow: 0 1px 2px rgba(0,0,0,0.6); + -webkit-box-shadow: 0 1px 2px rgba(0,0,0,0.6); + + border-bottom: 1px solid rgba(0,0,0,0.25); + position: relative; + cursor: pointer; + text-shadow: 0 -1px 1px rgba(0,0,0,0.25); + font-weight: bold; + font-size: 110%; + padding-left: 28px; + color: #fff; +} + +#phoca-dl-category-box .pd-button-play a { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-play.png) 6px center no-repeat; + background-color: #294580; +} +#phoca-dl-category-box .pd-button-preview a { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-preview.png) 6px center no-repeat; + background-color: #b8301e; +} +#phoca-dl-download-box .pd-button-download a, +#phoca-dl-category-box .pd-button-download a { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-download.png) 6px center no-repeat; + background-color: #269926; +} +#phoca-dl-category-box .pd-button-details a { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-details.png) 6px center no-repeat; + background-color: #bf8e2f; +} + +#phoca-dl-file-box .pd-button-mirror1 a, +#phoca-dl-category-box .pd-button-mirror1 a { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-extlink1.png) 6px center no-repeat; + background-color: #1d786c; +} +#phoca-dl-file-box .pd-button-mirror2 a, +#phoca-dl-category-box .pd-button-mirror2 a { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-extlink2.png) 6px center no-repeat; + background-color: #aabb2d; +} + +#phoca-dl-category-box .pd-button-play a:hover { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-play.png) 6px center no-repeat; + background-color: #0d2453; +} +#phoca-dl-category-box .pd-button-preview a:hover { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-preview.png) 6px center no-repeat; + background-color: #78160a; +} +#phoca-dl-download-box .pd-button-download a:hover, +#phoca-dl-category-box .pd-button-download a:hover { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-download.png) 6px center no-repeat; + background-color: #0c630c; +} +#phoca-dl-category-box .pd-button-details a:hover { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-details.png) 6px center no-repeat; + background-color: #7c570f; +} +#phoca-dl-category-box .pd-button-mirror1 a:hover { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-extlink1.png) 6px center no-repeat; + background-color: #094e45; +} +#phoca-dl-category-box .pd-button-mirror2 a:hover { + background: url(../../images/btn.png) repeat-x, url(../../images/icon-extlink2.png) 6px center no-repeat; + background-color: #6d7a0f; +} + +#phoca-dl-download-box .pd-button-download a, +#phoca-dl-category-box .pd-button-mirror1 a, +#phoca-dl-category-box .pd-button-mirror2 a, +#phoca-dl-file-box .pd-button-mirror1 a, +#phoca-dl-file-box .pd-button-mirror2 a, +#phoca-dl-category-box .pd-button-play a, +#phoca-dl-category-box .pd-button-preview a, +#phoca-dl-category-box .pd-button-download a, +#phoca-dl-category-box .pd-button-details a { + border-radius: 0px; + -moz-border-radius: 0px; + -webkit-border-radius: 0px; +} + diff --git a/media/css/main/buttonrc.css b/media/css/main/buttonrc.css new file mode 100644 index 0000000..37e8098 --- /dev/null +++ b/media/css/main/buttonrc.css @@ -0,0 +1,18 @@ +/* +Phoca Download +http://www.phoca.cz/ +http://www.phoca.cz/phocadownload +*/ +#phoca-dl-download-box .pd-button-download a, +#phoca-dl-category-box .pd-button-mirror1 a, +#phoca-dl-category-box .pd-button-mirror2 a, +#phoca-dl-file-box .pd-button-mirror1 a, +#phoca-dl-file-box .pd-button-mirror2 a, +#phoca-dl-category-box .pd-button-play a, +#phoca-dl-category-box .pd-button-preview a, +#phoca-dl-category-box .pd-button-download a, +#phoca-dl-category-box .pd-button-details a { + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; +} diff --git a/media/css/main/index.html b/media/css/main/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/media/css/main/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/css/main/phocadownload.css b/media/css/main/phocadownload.css new file mode 100644 index 0000000..0346d54 --- /dev/null +++ b/media/css/main/phocadownload.css @@ -0,0 +1,684 @@ +/* Phoca Download http://www.phoca.cz/ http://www.phoca.cz/phocadownload */ + +/* Main */ +.pd-hr-cb { + border-bottom: 3px solid #e9e9e9; + margin-bottom: 10px; + clear:both; +} +.pd-hr { + border-bottom: 3px solid #e9e9e9; + margin-bottom: 10px; +} +.pd-fl { + position: relative; + float: left; +} +.pd-fl-m { + position: relative; + float: left; + margin: 5px 0; +} +.pd-fr { + position: relative; + float: right; +} +.pd-cb { + clear:both; +} +.pd-cl { + clear:left; +} + +.pd-cr-m { + clear: right; + margin-top: 20px; +} + +.pd-not-found { + text-align: center; + font-weight: bold; +} +.pd-center { + text-align:center; + vertical-align:middle; +} +.pd-inline { + margin:0 10px 0 10px; + display:inline; +} + +/* Top */ +#phoca-dl-category-box .pd-category h3, +#phoca-dl-file-box .pd-file h3, +#phoca-dl-download-box .pd-file h3{ + margin: 0; + padding: 5px; + background: #fafafa; + border: 1px solid #e9e9e9; + margin-bottom: 7px; +} + +#phoca-dl-category-box .pd-category div.pdtop, +#phoca-dl-file-box .pd-file div.pdtop, +#phoca-dl-download-box .pd-file div.pdtop { + float: right; + position: relative; + width: 16px; + margin-top: 5px; + margin-right: 7px; + padding-top: 2px; +} + + +/* Category, File, Overlib */ +#phoca-dl-category-box .pd-filesize-txt, +#phoca-dl-file-box .pd-filesize-txt, +#phoca-dl-category-box .pd-version-txt, +#phoca-dl-file-box .pd-version-txt, +#phoca-dl-category-box .pd-license-txt, +#phoca-dl-file-box .pd-license-txt, +#phoca-dl-category-box .pd-author-txt, +#phoca-dl-file-box .pd-author-txt, +#phoca-dl-category-box .pd-email-txt, +#phoca-dl-file-box .pd-email-txt, +#phoca-dl-category-box .pd-date-txt, +#phoca-dl-file-box .pd-date-txt, +#phoca-dl-category-box .pd-downloads-txt, +#phoca-dl-file-box .pd-downloads-txt{ + font-weight: bold; + clear:left; + margin:5px 0; + float:left; + width: 100px; +} + +#phoca-dl-category-box .pd-notes-txt, +#phoca-dl-file-box .pd-notes-txt, +#phoca-dl-category-box .pd-features-txt, +#phoca-dl-file-box .pd-features-txt, +#phoca-dl-category-box .pd-changelog-txt, +#phoca-dl-file-box .pd-changelog-txt { + margin: 7px 0; + font-weight: bold; + clear:left; +} + +#overDiv .pd-filesize-txt, +#overDiv .pd-version-txt, +#overDiv .pd-license-txt, +#overDiv .pd-author-txt, +#overDiv .pd-email-txt, +#overDiv .pd-date-txt, +#overDiv .pd-downloads-txt{ + font-weight: bold; + clear:left; + margin:5px 0; + float:left; + width: 80px; +} + +#overDiv .pd-title, +#phoca-dl-category-box .pd-title, +#phoca-dl-file-box .pd-title, +#phoca-dl-download-box .pd-title { + font-weight: bold; +} + +#overDiv .pd-image, +#phoca-dl-category-box .pd-image, +#phoca-dl-file-box .pd-image, +#phoca-dl-download-box .pd-image { + position:relative; + float:right; + margin:10px; +} + +#overDiv .pd-textonly, +#overDiv .pd-cdesc, +#phoca-dl-category-box .pd-textonly, +#phoca-dl-category-box .pd-cdesc, +#phoca-dl-file-box .pd-cdesc, +#phoca-dl-download-box .pd-cdesc { + margin: 10px 0px; + padding: 5px 0px; + clear:both; +} +#overDiv .pd-fdesc, +#phoca-dl-category-box .pd-fdesc, +#phoca-dl-file-box .pd-fdesc, +#phoca-dl-download-box .pd-fdesc { + padding: 5px 0px; + clear:both; +} + +#phoca-dl-category-box .pd-buttons, +#phoca-dl-file-box .pd-buttons, +#phoca-dl-download-box .pd-buttons { + position: relative; + float: right; + margin: 5px; +} +#phoca-dl-download-box .pd-filenamebox, +#phoca-dl-file-box .pd-filenamebox, +#phoca-dl-category-box .pd-filenamebox { + position: relative; + float: left; + margin: 5px; +} + + + +#phoca-dl-download-box .pd-downloadbox-direct { + margin: 0 auto; + margin-top: 20px; + background: #f5f5f5; + border: 1px solid #d9d9d9; + -webkit-border-radius: 3px; + border-radius: 3px; + padding: 10px; +} + +#phoca-dl-category-box .pd-filebox { + margin-top: 10px; + margin-bottom: 10px; + padding-bottom: 10px; + border-bottom: 1px solid #f0f0f0; +} + +#phoca-dl-download-box .pd-filebox, +#phoca-dl-file-box .pd-filebox { + padding: 5px; +} + +#phoca-dl-category-box .pd-title, +#phoca-dl-file-box .pd-title, +#phoca-dl-download-box .pd-title { + margin-bottom: 3px; +} + + +#phoca-dl-category-box .pd-mirrors, +#phoca-dl-file-box .pd-mirrors { + position: relative; + float: right; + clear: right; + margin-top: 0px; +} + +#phoca-dl-category-box .pd-rating, +#phoca-dl-file-box .pd-rating { + position: relative; + float: left; + clear: both; + margin-top: 15px; +} + +#phoca-dl-category-box .pd-tags, +#phoca-dl-category-box .pd-report, +#phoca-dl-file-box .pd-tags, +#phoca-dl-file-box .pd-report { + position: relative; + float: right; + clear: right; + margin-top: 15px; +} + +#phoca-dl-download-box, +#phoca-dl-file-box { + text-align: left; +} +#phoca-dl-download-box .pd-file, +#phoca-dl-file-box .pd-file { + + margin:5px 0; +} + +/* Categories */ +#phoca-dl-categories-box a img { + border: 0px; + padding: 0; + margin: 0; +} + +#phoca-dl-categories-box div.pd-desc { + margin: 10px 0 10px 0; +} +#phoca-dl-categories-box div.pd-categoriesbox { + width: 28%; + position: relative; + float: left; + margin: 1%; + padding: 1%; +} + +#phoca-dl-categories-box div.pd-title{ + font-weight:bold; + font-size: 120%; + margin: 5px 0px 8px 0px; +} + +#phoca-dl-category-box .pagination, +#phoca-dl-category-box .pagination div ul { + text-align: center; + margin: auto; + margin: 5px; + border: none; + +} + +#phoca-dl-category-box .pd-subcategory, +#phoca-dl-file-box .pd-file { + margin: 5px; +} + +#phoca-dl-download-box .pd-file-details, +#phoca-dl-file-box .pd-file-details { + border: 0; +} + +#phoca-dl-categories-box .pd-subcategory, +#phoca-dl-category-box .pd-subcategory { + padding-left: 20px; + background: transparent url('../../images/folder.png') 0 center no-repeat; +} + +#phoca-dl-category-box .pd-category div.pdtop, +#phoca-dl-file-box .pd-file div.pdtop, +#phoca-dl-download-box .pd-file div.pdtop { + float: right; + position: relative; + width: 16px; + margin-top: 5px; + margin-right: 7px; +} + +#phoca-dl-categories-box a img, +#phoca-dl-category-box a img, +#phoca-dl-file-box a img, +#phoca-dl-download-box a img { + border: none; +} + +/* Icons - icon next to file*/ +.phoca-dl-file-box-mod .pd-document16, +#phoca-dl-file-box .pd-document16, +#phoca-dl-category-box .pd-document16, +#phoca-dl-download-box .pd-document16 { + padding-left: 20px; + background: url('../../images/icon-document-16.png') 0px center no-repeat; + height: 16px; + line-height: 16px; +} +#phoca-dl-most-viewed-box .pd-document16 { + padding-left: 20px; + background: url('../../images/icon-document-16.png') 0px center no-repeat; +} +.phoca-dl-file-box-mod .pd-document32, +#phoca-dl-file-box .pd-document32, +#phoca-dl-category-box .pd-document32, +#phoca-dl-most-viewed-box .pd-document32, +#phoca-dl-download-box .pd-document32 { + background: url('../../images/icon-document-32.png') 0px center no-repeat; + height: 32px; + line-height: 32px; + padding-left: 36px; +} +.phoca-dl-file-box-mod .pd-document48, +#phoca-dl-file-box .pd-document48, +#phoca-dl-category-box .pd-document48, +#phoca-dl-most-viewed-box .pd-document48, +#phoca-dl-download-box .pd-document48 { + background: url('../../images/icon-document-48.png') 0px center no-repeat; + height: 48px; + line-height: 48px; + padding-left: 52px; +} +.phoca-dl-file-box-mod .pd-document64, +#phoca-dl-file-box .pd-document64, +#phoca-dl-category-box .pd-document64, +#phoca-dl-most-viewed-box .pd-document64, +#phoca-dl-download-box .pd-document64 { + background: url('../../images/icon-document-64.png') 0px center no-repeat; + height: 64px; + line-height: 64px; + padding-left: 70px; +} + +/* Plugin */ +#phoca-dl-category-box-plugin .pd-document { + padding-left: 20px; + background: url('../../images/document.png') 0 center no-repeat; + text-align: left; + padding-top: 4px; + padding-bottom: 4px; + +} + +/* Module */ +.phoca-dl-categories-box-module .pd-categories { + color: #BF6070; +} + +.phocadownload-navigation { + padding: 2px; + border: 1px dotted #D6D6D6; + width: 6em; + position: relative; + float: right; + text-align: center; + margin-left: 5px; +} + +.phocadownload-navigation .navigation-text { + color: #BF6070; + background-color: #D6D6D6; + padding: 2px; + margin-bottom: 3px; + font-size: 10px; + text-align: center; +} + +#phoca-dl-license { + border: 1px solid #ccc; + background: #f5f5f5; + overflow: auto; + margin-top: 10px; + margin-bottom: 10px; +} + +.pd-pagination { + margin-top: 20px; +} + +.pd-float { + position: relative; + float: left; + margin: 0px 3px; +} + +#phocadownload-upload .comment-input{ + width: 98%; +} + +#phocadownload-upload .comment-input2 { + width: 40px; + border: 0px; + font-weight: bold; +} + +/* tabs */ +form { + margin: 0; + padding: 0; +} + +dl.tabs { + float: left; + margin: 10px 0 -1px 2px; + z-index: 50; + +} + +dl.tabs dt { + float: left; + padding: 4px 10px; + border-left: 1px solid #ccc; + border-right: 1px solid #ccc; + border-top: 1px solid #ccc; + margin-left: 3px; + background: #f0f0f0; + color: #666; + +} + +dl.tabs dt.open { + background: #ffffff; + border-bottom: 1px solid #ffffff; + z-index: 100; + color: #000; + +} + +dl.tabs a { + text-decoration: none; + font-weight: normal; +} +dl.tabs a:hover { + background: transparent !important; +} + +div.current { + clear: both; + border: 1px solid #ccc; + padding: 10px 10px; + background: #ffffff; + +} + +div.current dd { + padding: 0; + margin: 0; +} + +#loading-label-file{ + text-align: center; + display: none; +} + +/** Table styles **/ +#phocadownload-upload table.adminlist { + width: 100%; + border-spacing: 1px; + background-color: #e7e7e7; + color: #666; +} + +#phocadownload-upload .pagination { + margin: 0; + padding: 0; + display: inline; +} + +#phocadownload-upload table.adminlist td, +#phocadownload-upload table.adminlist th { + padding: 4px; +} + +#phocadownload-upload table.adminlist thead th { + text-align: center; + background: #f0f0f0; + color: #666; + border-bottom: 1px solid #999; + border-left: 1px solid #fff; +} + +#phocadownload-upload table.adminlist thead a:hover { text-decoration: none; } +#phocadownload-upload table.adminlist thead th img { vertical-align: middle; } +#phocadownload-upload table.adminlist tbody th { font-weight: bold; } +#phocadownload-upload table.adminlist tbody tr { background-color: #fff; text-align: left; } +#phocadownload-upload table.adminlist tbody tr.row1 { background: #f9f9f9; border-top: 1px solid #fff; } +#phocadownload-upload table.adminlist tbody tr.row0:hover td, +#phocadownload-upload table.adminlist tbody tr.row1:hover td { background-color: #ffd ; } +#phocadownload-upload table.adminlist tbody tr td { height: 25px; background: #fff; border: 1px solid #fff; } +#phocadownload-upload table.adminlist tbody tr.row1 td { background: #f9f9f9; border-top: 1px solid #FFF; } +#phocadownload-upload table.adminlist tfoot tr { text-align: center; color: #333; } +#phocadownload-upload table.adminlist tfoot td, +#phocadownload-upload table.adminlist tfoot th { background-color: #f3f3f3; border-top: 1px solid #999; text-align: center; } +#phocadownload-upload table.adminlist td.order { text-align: center; white-space: nowrap; } +#phocadownload-upload table.adminlist td.order span { float: left; display: block; width: 20px; text-align: center; } + +#phocadownload-upload .error, +#phoca-dl-file-box .error, +#phoca-dl-category-box .pd-error, +#phoca-dl-category-box .error { + background: #FFC2C2; + border: 1px solid #bf3030; + color: #a60000; + padding: 10px; + margin-top: 5px; + margin-bottom: 5px; +} + +#phoca-dl-categories-box .pd-no-subcat { + margin-left: 5px; +} + +/* not conflict with beez */ +#phocadownload-upload table, +#phocadownload-upload table tr, +#phocadownload-upload table tr td, +#phoca-dl-file-box table, +#phoca-dl-file-box table tr, +#phoca-dl-file-box table tr td, +#phoca-dl-download-box table, +#phoca-dl-download-box table tr, +#phoca-dl-download-box table tr td, +#phoca-dl-category-box table, +#phoca-dl-category-box table tr, +#phoca-dl-category-box table tr td { + border: none; +} +#overDiv table, +#overDiv table tr, +#overDiv table tr td{ + border: none; + padding:5px; + +} + +#phoca-dl-category-box .pagination.pd-pagination { + border: none; +} +/* +#phocadownload-pane div.current, +#phocadownload-pane div.current dd, +#phocadownload-pane .tabs, +#phocadownload-pane #pane { + width: 100%; +} +*/ +#phoca-dl-category-box .pdtop a:hover, +#phoca-dl-category-box .pdtop a:active, +#phoca-dl-category-box .pdtop a:focus, +#phoca-dl-category-box .pdfile a:hover, +#phoca-dl-category-box .pdfile a:active, +#phoca-dl-category-box .pdfile a:focus, +#phoca-dl-file-box .pdtop a:hover, +#phoca-dl-file-box .pdtop a:active, +#phoca-dl-file-box .pdtop a:focus, +#phoca-dl-download-box .pdtop a:hover, +#phoca-dl-download-box .pdtop a:active, +#phoca-dl-download-box .pdtop a:focus { + background: transparent; +} + +/* overlib */ +#overDiv table, +#overDiv table tr, +#overDiv table tr td { + border: 0px +} + +#overDiv .fontPhocaPDClass { + color: #999; + margin:0;padding:0; +} + +#overDiv .fgPhocaPDClass { + background-color: #f0f0f0; + margin:0;padding:0; +} +#overDiv .bgPhocaPDClass { + background-color: #f0f0f0; + margin:0;padding:0; + border: 1px solid #999; +} +#overDiv .capfontPhocaPDClass { + color: #999; + margin:0;padding:0; +} +#overDiv .capfontclosePhocaPDClass, +#overDiv .capfontclosePhocaPDClass a { + color: #999; + text-decoration: underline; + text-align: right; + margin:0;padding:0; +} + +#phoca-dl-category-box .pagination #pg-pagination ul { + margin: 10px auto; + text-align: center; +} + +.pd-mirror, +.pd-report { + margin: 0px 5px 5px 0px; + float:right; +} + +.pd-mirror-file, +.pd-report-file { + margin: 0px 5px 5px 0px; + float:right; +} + +.pd-fbcomments { + margin-top: 10px; + margin-bottom: 10px; +} + +/* + * If Beez template is not used, the following code + * can be removed + * Because of using !important methods in Beez + */ + +#phocadownload table, +#phocadownload-pane table, +#phocadownload-pane table tr, +#phocadownload-pane table tr td{ + border-style: none !important; +} + +#phocadownload-pane table tr td { + padding:3px; +} +#phocadownload-multipleupload form fieldset { + text-align:left; + padding:5px; +} + +#phocadownload-pane .actions { + text-align:left; + width: auto; + padding:10px 5px !important; + margin:10px 0 !important; +} + +#phocadownload-pane ul#flash_uploader_filelist { + margin:0px; +} + +.label { + border-radius: 3px 3px 3px 3px; + padding: 1px 4px 2px; + color: #FFFFFF; + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + vertical-align: baseline; + white-space: nowrap; +} + +.label-warning { + background-color: #f89406; +} +.label-important { + background-color: #b94a48; +} + +.ph-cb { + clear:both +} \ No newline at end of file diff --git a/media/css/main/rating.css b/media/css/main/rating.css new file mode 100644 index 0000000..c7dc5e7 --- /dev/null +++ b/media/css/main/rating.css @@ -0,0 +1,268 @@ +/* Rating */ +/* Voting - style by http://www.jluvip.com/works/css/starvote/index2-1.html*/ +#phoca-dl-category-box ul.star-rating li, +#phoca-dl-category-box ul.star-rating-small li, +#phoca-dl-file-box ul.star-rating li, +#phoca-dl-file-box ul.star-rating-small li{ + background: none; + list-style-type:none; +} + +#phoca-dl-file-box .star-rating, +#phoca-dl-category-box .star-rating, +.star-rating{ + list-style:none; + margin: 0px; + margin-bottom:5px; + padding:0px; + width: 110px; + height: 22px; + position: relative; + background: url(../../images/icon-voting.png) top left repeat-x; +} + +#phoca-dl-file-box .star-rating li, +#phoca-dl-category-box .star-rating li, +.star-rating li{ + list-style-type:none; + padding:0px; + margin:0px; + /*\*/ + float: left; + /* */ +} + +#phoca-dl-file-box .star-rating li a, +#phoca-dl-category-box .star-rating li a, +.star-rating li a{ + display:block; + width:22px; + height: 22px; + text-decoration: none; + text-indent: -9000px; + z-index: 20; + position: absolute; + padding: 0px; +} + +#phoca-dl-file-box .star-rating li a:hover, +#phoca-dl-category-box .star-rating li a:hover, +.star-rating li a:hover{ + background: url(../../images/icon-voting.png) left center; + z-index: 2; + left: 0px; +} + +#phoca-dl-file-box .star-rating a.star1, +#phoca-dl-category-box .star-rating a.star1, +.star-rating a.star1{ + left: 0px; +} + +#phoca-dl-file-box .star-rating a.star1:hover, +#phoca-dl-category-box .star-rating a.star1:hover, +.star-rating a.star1:hover{ + width:22px; +} + +#phoca-dl-file-box .star-rating a.stars2, +#phoca-dl-category-box .star-rating a.stars2, +.star-rating a.stars2{ + left:22px; +} + +#phoca-dl-file-box .star-rating a.stars2:hover, +#phoca-dl-category-box .star-rating a.stars2:hover, +.star-rating a.stars2:hover{ + width: 44px; +} + +#phoca-dl-file-box .star-rating a.stars3, +#phoca-dl-category-box .star-rating a.stars3, +.star-rating a.stars3{ + left: 44px; +} + +#phoca-dl-file-box .star-rating a.stars3:hover, +#phoca-dl-category-box .star-rating a.stars3:hover, +.star-rating a.stars3:hover{ + width: 66px; +} + +#phoca-dl-file-box .star-rating a.stars4, +#phoca-dl-category-box .star-rating a.stars4, +.star-rating a.stars4{ + left: 66px; +} + +#phoca-dl-file-box .star-rating a.stars4:hover, +#phoca-dl-category-box .star-rating a.stars4:hover, +.star-rating a.stars4:hover{ + width: 88px; +} + +#phoca-dl-file-box .star-rating a.stars5, +#phoca-dl-category-box .star-rating a.stars5, +.star-rating a.stars5{ + left: 88px; +} + +#phoca-dl-file-box .star-rating a.stars5:hover, +#phoca-dl-category-box .star-rating a.stars5:hover, +.star-rating a.stars5:hover{ + width: 110px; +} + +#phoca-dl-file-box .star-rating li.current-rating, +#phoca-dl-category-box .star-rating li.current-rating, +.star-rating li.current-rating{ + background: url(../../images/icon-voting.png) left bottom; + position: absolute; + height: 22px; + /*width:77px;*/ + display: block; + text-indent: -9000px; + z-index: 1; +} + + +/* Voting small */ +#phoca-dl-file-box .star-rating-small, +#phoca-dl-category-box .star-rating-small, +.star-rating-small{ + list-style:none; + margin: 0px; + margin-bottom:5px; + padding:0px; + width: 90px; + height: 18px; + position: relative; + background: url(../../images/icon-voting-small.png) top left repeat-x; +} + +#phoca-dl-file-box .star-rating-small li, +#phoca-dl-category-box .star-rating-small li, +.star-rating-small li{ + list-style-type:none; + padding:0px; + margin:0px; + /*\*/ + float: left; + /* */ +} + +#phoca-dl-file-box .star-rating-small li a, +#phoca-dl-category-box .star-rating-small li a, +.star-rating-small li a{ + display:block; + width:18px; + height: 18px; + text-decoration: none; + text-indent: -9000px; + z-index: 20; + position: absolute; + padding: 0px; +} + +#phoca-dl-file-box .star-rating-small li a:hover, +#phoca-dl-category-box .star-rating-small li a:hover, +.star-rating-small li a:hover{ + background: url(../../images/icon-voting-small.png) left center; + z-index: 2; + left: 0px; +} + +#phoca-dl-file-box .star-rating-small a.star1, +#phoca-dl-category-box .star-rating-small a.star1, +.star-rating-small a.star1{ + left: 0px; +} + +#phoca-dl-file-box .star-rating-small a.star1:hover, +#phoca-dl-category-box .star-rating-small a.star1:hover, +.star-rating-small a.star1:hover{ + width:18px; +} + +#phoca-dl-file-box .star-rating-small a.stars2, +#phoca-dl-category-box .star-rating-small a.stars2, +.star-rating-small a.stars2{ + left:18px; +} + +#phoca-dl-file-box .star-rating-small a.stars2:hover, +#phoca-dl-category-box .star-rating-small a.stars2:hover, +.star-rating-small a.stars2:hover{ + width: 36px; +} + +#phoca-dl-file-box .star-rating-small a.stars3, +#phoca-dl-category-box .star-rating-small a.stars3, +.star-rating-small a.stars3{ + left: 36px; +} + +#phoca-dl-file-box .star-rating-small a.stars3:hover, +#phoca-dl-category-box .star-rating-small a.stars3:hover, +.star-rating-small a.stars3:hover{ + width: 54px; +} + +#phoca-dl-file-box .star-rating-small a.stars4, +#phoca-dl-category-box .star-rating-small a.stars4, +.star-rating-small a.stars4{ + left: 54px; +} + +#phoca-dl-file-box .star-rating-small a.stars4:hover, +#phoca-dl-category-box .star-rating-small a.stars4:hover, +.star-rating-small a.stars4:hover{ + width: 72px; +} + +#phoca-dl-file-box .star-rating-small a.stars5, +#phoca-dl-category-box .star-rating-small a.stars5, +.star-rating-small a.stars5{ + left: 72px; +} + +#phoca-dl-file-box .star-rating-small a.stars5:hover, +#phoca-dl-category-box .star-rating-small a.stars5:hover, +.star-rating-small a.stars5:hover{ + width: 90px; +} + +#phoca-dl-file-box .star-rating-small li.current-rating, +#phoca-dl-category-box .star-rating-small li.current-rating, +.star-rating-small li.current-rating{ + background: url(../../images/icon-voting-small.png) left bottom; + position: absolute; + height: 18px; + /*width:77px;*/ + display: block; + text-indent: -9000px; + z-index: 1; +} + + + +.pd-small, +.pd-result, +#phoca-dl-file-box .pd-small, +#phoca-dl-file-box .pd-result, +#phoca-dl-category-box .pd-small, +#phoca-dl-category-box .pd-result { + font-size: x-small; +} + + +#phoca-dl-file-box ul.star-rating-small, +#phoca-dl-category-box ul.star-rating-small, +#phoca-dl-file-box ul.star-rating-small li, +#phoca-dl-category-box ul.star-rating-small li, +#phoca-dl-file-box ul.star-rating, +#phoca-dl-category-box ul.star-rating, +#phoca-dl-file-box ul.star-rating li, +#phoca-dl-category-box ul.star-rating li { + list-style: none !important; +} \ No newline at end of file diff --git a/media/images/administrator/b-prm.png b/media/images/administrator/b-prm.png new file mode 100644 index 0000000000000000000000000000000000000000..c83f0a8a21121cdf1ec1e871bddc8da0a71ae635 GIT binary patch literal 21641 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 Y-#Jh>HzR_mtpET307*qoM6N<$f)m_#9smFU literal 0 HcmV?d00001 diff --git a/media/images/administrator/bg-install.png b/media/images/administrator/bg-install.png new file mode 100644 index 0000000000000000000000000000000000000000..5e77919fa937a909107b1284605dd9183102e568 GIT binary patch literal 2164 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 M07*qoM6N<$f*K=n$N&HU literal 0 HcmV?d00001 diff --git a/media/images/administrator/btn.png b/media/images/administrator/btn.png new file mode 100644 index 0000000000000000000000000000000000000000..222cdc9131383dbb710de07fbb1833879ad9bebf GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI}!3HGf{@&OHq$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c6={09IEGZ*O8WQz|9)m+X6D2776%(nxhnsAD5^a9YrmG; h!*Z2f?2Jr23}w1TDGooh7XURec)I$ztaD0e0s!~ADr5iv literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-12-approve.png b/media/images/administrator/icon-12-approve.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f9bb87013c5bcfac67367b6270bd7847f2f06c GIT binary patch literal 702 zcmV;v0zv(WP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4F)uJNFEKJZsoO#T00I_C zL_t(2ktNZ~OB8Vc!13>I<~O^xySlrkCZ?`s842!*{cAFHnWa%XmCejWP!3m>7BLX4z!l4dt~(Ou10 z*V)qJlhal>;`c}9ecrXP=IFz@Mrr{NN-4w}LYT`R$jI&0>V?%3J|kT`nvD-#lT*?Y zyjfhjb+BjGP+kK#veI5$WPYu|l*rWukDWqWOHhL~EPrf8EKz za6d&}D9{B`dhv?DIiZxIsY~BuNNv=zR6sd8C4~`YmcIiofi(uYA7IZ~ebVG7wVRUJ4ZXi@?ZDjy4F)uJNFEKJZsoO#T00H$$ zL_t(2kp;m)NEA^3fZ_kWnRRzotTl0eBQS0aKu6bO;!DJrUS5!KO?5p;@zI%F3k zx&#G9hv*VWNq8uPs6&OInYfjdE$ZqjIlDVE@6DUn_X%q)0K;F4!dc7g^Ucy|On3w- zX>wcVGT!!UX|H+w&VhF^fUwqbX}m?oHG4ryI|8EJ0$7U>V5KyfblcrRe*f*8ePeYO zAY4;tgcOexE73-gV8BAC0dQJ9a~(CkP9OKg*+-(?5zeGV6zh@3m5_B{wFbL#9h~UB z$ou&hEY|<5b`}oyyRl+0v2jn@z%~c`2CT%eJJ-YTu?IN$qkR1PgP>B%msh`^bZumd ziY8I=&T)EgKY2UL)hUsixX;W}&4+v;q~|-YH)VGTW0?Il%}nVFU8#Vi@|ME#eWZYn@D=%Zd1@e0 z&*YO4wUVoT7)mu}F~K~GpD*LD&EYv&Qbs^y9i_MMi5p8-w$=)QmzB#h)Q8!uo)`5^ z$BiqfmQI9DK^TxUI|wDQnvhK5yF}4w5`-C)73dVk?0_i7CK0F*oRqdkm(f}ynyM~g zSSE_PQL#YzAQb5A0)F)=!M})&B;ecR1o@q1iv7`lOquvpCeH-I00000NkvXXu0mjf DNv$DH literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-12-back.png b/media/images/administrator/icon-12-back.png new file mode 100644 index 0000000000000000000000000000000000000000..f5cf66506e84b999c297e70c0e002f7321d27c44 GIT binary patch literal 350 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq zxITa|qthCb89+g?64!_l=c3falFa-(g^a>QWe}Xi&D$;i?WLqoP$l+HeFr-RJYC3#W6%j_h)Oqo7qicP=w zJWk(@_S)L7T>}FHnPa3PCWw45E+`NII?BMn(C}f<`2$LtnwsYi9N5q}fByZ3*|Vi@ zZu@`3#NgD)lePi^0u$0xQ;%k9871W9=hs(1KPP+l{{DJy!NrXq|NsAQ^ZfjL^Oft@ z>(_sKGn3ut(V3aXeHNvE|No!=6eugj%F6mSEiG++Z*T9$UGlTtIwLoysouDG^RAi~ kbBOTyoyE^(3QjUJ?A~B@e3@%jDbNQDp00i_>zopr0H>ma$p8QV literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-12-disapprove.png b/media/images/administrator/icon-12-disapprove.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d951c55cd44a39e1c4c9b0a4596dbdbe385914 GIT binary patch literal 682 zcmV;b0#*HqP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4F)uJNFEKJZsoO#T00II@ zL_t(2kv+jnNK|1MfZ_N5&zUn9$HBWaBAS)qAeQCA!bJ%YQCOiwL6x}vQ^Up zM|%+Q$i+7)p&D|2sN*JP7}#iGIp zS7Mw#gLn}->w`1^h3ZC12-r3n4Fa*9E~Bs&L$*8p;!cjqf4PkOxX~+%?MhZoRLQrV z+VARj8-aKv^43-ypg!N^)|X^p|OLSp?g&1 z;aT5Ya!-i}N+}Ca{q>>7&I7IZ~ebVG7wVRUJ4ZXi@?ZDjy4F)uJNFEKJZsoO#T00G5G zL_t(2k#&(zNRx3K#y{WpotsX#niDrHgU|}9i=7kf6m$uapxfvYg;d7^ExHLoP*4z* zbl61_qC-%S#;`)NsO(luL5S8iw!L%P+y1@3ZezSoT#fRrT!Cm5tnN`F;A* z`J0c9aj}>uCoL%k5VwT51t>Pb(M?g+Z6E5NLX&~5>JhQ6kLGpkC6&x$V)5f@>R2`B zv-qvEqN;eS!vVXLnWk-DQ-1`hXI*+pe4pF-qCe&&nl`<`kpGGQdLxahVv^QjGvDQT zE9X@6tEww!ROc;6lkEHF2LLUbE(*qyMg;oy!>=7s&>&k3(GeejQQud)(!M8a$tkjH zka-8L-X_ROC-7G~ccVMn?X~Xs)l9a8hqb`KmH15F?F4=UZ8YweNfgTA00000NkvXX Hu0mjf;@K1y literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-12-reset.png b/media/images/administrator/icon-12-reset.png new file mode 100644 index 0000000000000000000000000000000000000000..04c2403785a877d1ffcdec87c05020a84941e857 GIT binary patch literal 640 zcmV-`0)PF9P)s9N3W^5v40k zARd#W2p?Ak!v>UF`Ptvh>e^1#^y3|%W)3d6S?YBe&6pXBjS zo{!;iF5_!&{>k0Pmxljd5=0Xl)GZ6qY#5q`o!{tQH>y%6q2iK?<=o8$L>vwstB@c! z7o)TP0PA;b$8fq?{Pu}oK^?o&ZB0Paq(y{4z{!jL3v}%7X3wnwUWG?^yE#t2y^3BF z4M2Yg-X4deU22M8Tb-u`lbP^!^m3WS?gY^*Wo%NTRryzu#iwURM}vdW=zKbxjTB3{ z(oDy;dd27STgg;aH`7(uc*R3btGX8KA7i~SKWD;WT`5JwyIt4;y9O;GI_*j+X=Hsv aecB%!=)_L@UBXlV0000!-CxaX51AMU@@TN*5jQS#?QyPexY?>|xmeS7 zlZxe=$TO#zgSvSk9aq-?3nW> zXYJb>XQgDJ;HwAIK3G*)?`C&9vNUB`wnL6!!N>4PS9wpJ@SEJY%lS~ZwRyOerFs|h zv!KFhcVf2P&`I8L*|9-gbBe61gIbP0 Hl+XkKKNhGj literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-edb-categories.png b/media/images/administrator/icon-16-edb-categories.png new file mode 100644 index 0000000000000000000000000000000000000000..ccd2a46101c74744ebc0ca5564ac75aeeb6be6d7 GIT binary patch literal 637 zcmV-@0)qXCP)lOq7)&x2z98UQ)fs21Si44LGUjSoE+@# zbPIJ_$vH=6| z_5Ho&Y;w4yAO?sX${(oDbN4^2{0kr}j~7d~E8UNUTzJ*RGBS#zYqO2D9~Wr}f?J%u} zMr`WP9}A>=4TAL^(MZ+b`9R8=#dmAhADFsd*c@b(pHxSHQBX)K=$xqA0SeLyIXiFG zyK~j0+$T>d3X`2i*))3LJR}p?ttM)B9}$q)5f16s{lXXZV(U?D5bACeLO5}I*#v35 zO~!sFdBGt!%jil8sgyX#&$8)Vsv5U?t-tX^cT$HlJl?@xKrbJnG(ZD9uw$PW6z!|V z!&>0E0r0|^_8EIZ2VsoYm;vLEF~A9k z75u(#!FUtBDA|vg27o2=%b&6;piQpx2hfO$FExP(u^JbdoSJZKog6|-iYox}-+$w8 XXs61nRipE_00000NkvXXu0mjf*+3Mu literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-edb-category.png b/media/images/administrator/icon-16-edb-category.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e105568137022d415c876ac53c2a1cfc1ef5ce GIT binary patch literal 557 zcmV+|0@D47P)Cz5+H)ryqTDW!*PY zM1S^PpxkYf?RUusuFmp-s4&Z~_wGJ2t)zCCR#Z|_LxBOv5oMi`z5}43JR#Q?&3?Sl zSgC%nN>Lm4K?TTy>9vyDC$;@`tC>0-=MLNjI?a?lv^N_nyuH&)o$g$O>>Q*{cX!*5 zn+BklnUjiUL|mgw0jbxW)2qe!0vfP>B8J~T(dMOI&iDczuuP_Z1={)a vjwTbqD7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00O;9 zL_t(Ija`$yi=0&y#((#|cfQ`)ot=+03z{|Kf(h|sgE6MDQ3S0L6!Z@eOkpKhh=^SZ zi!?$ILfk?@>})KAMI;Co0c{dB!Kg8e`S7W8@+IwdpN(td7kGw zGh^>8oj-eOt`)xkX#V0RHRr$#%B2Eo&fn~8e)smfXTJ#mAAj_I`^cf%d(RxMy-^I& z%s$fPh%v|ch$P8uHkK$yjw*u+2yZWD-?qf;feqO zz|x-1KY5z+OdD0fIfts^y+=dwS(cgi5qG;?cJ6mkRiY>` z8YRSW3_xwBj;NxdIKadn1f<|18m$8qN)-wrOr{^0txptDHB>Vk5jvJR02E7Q)^B`I z9ABa2J$+zg4l~F0?->R-3{CE$>To9i1qAO+@BGHk>m}B-K!b#*N(mMMqp>C4fzu*l z1}3QbeL#07k)IBpM%#HfeH>m)h1w851)P{dh9qy z8#64NSP^`(kDR?%TU<^C~DpV_^&>E>+}BR z+K<<_jX!s%xH|U=tJ*~U6!Z5wG?NWd&7-U$fMI|c$;5>-?(096yU(AvF?gcT8>EGP z)n}~yI$GRXhEO2W{7Z;JrhaXh`la>zm5cj180~)g+PyD+xS*#NcAN9Zddb$csnsv9 vZ#;aEo||^gYz#2>%f{@bix~00000NkvXXu0mjfB3Xw2 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-edb-play.png b/media/images/administrator/icon-16-edb-play.png new file mode 100644 index 0000000000000000000000000000000000000000..861a4e90059dc4884bae7ab6802e3eb802647343 GIT binary patch literal 907 zcmV;619bd}P)2k&wy9aA`zU^m zjt$Y|PG+2_py&`Uycy!fpokwAO1%@=uKYkNQxKWL#9as#zqfVnqNOwr$+|jgpdXoA z(=;FFG$+eBuU8G)vH#T{9-bf1!}I)wQVIYe1W5fY2A^7BRo$Q!XwaBQV=w%ulseCC z6!?!9D1Qhgt^JSOm)@P~*){W1W#F-go_oUcymQOT%is3)_I`g`fKo~cAyoEY@`ZT9 zO6bipL7|9u$GfDIL$O%w4@bes?{=;T7{d< z2AZZJgupNi48zDI`;r%MiQWR(f8fCn)r!|BHQp?4*)|M_^zVn z)KX`rPM
    D${Yd7HV4(f)53O z08Pr9vp^=38GHKp;eKmx{S6~o;o6^zSTc+j(5p9A>(iI!3J*lD>ydhaQ=DfUKy0LO zLtBoCBLhQSpN3~?_FD6SUhq3#FE$}yQ!$KT2gLlTAw-Q51&XJDJIcSTjO(qlpVEwd$gaYN=*~ zMkKhfk?guDRO%*>l7$wUU(l}l7qSbk+!x$f(NRI%3^pP}#1Durl62xs=5}&iI2|N* zD#Zhbd$=DD=bZOkMnrgs2@iS=Ky2M$jP>Mlxp*iP@)rsPRns)>p9CUuJ(Wt$s;XM7 zR;%S&?bn&6?H?>IE@f`tX>~V1>xN<5Fpo;5GPMNq2WGJl&p*L zxw)~qK0KFvV|oEt>mV`4f-yyT*(uAuy}jL%7z}@njgP&aiBAl?efObqhv3R_Q_dp* zG5|jS2|xgV@5$2<_5J+(K2=UcPZ^zZx&S~$0000)QIG?8EI+ha|VA7!f7oarYL*hjg3^MXvqr6m@ f%Qyg#|Nf14EswzWMt3HH00000NkvXXu0mjfMl<8= literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-edb-sections.png b/media/images/administrator/icon-16-edb-sections.png new file mode 100644 index 0000000000000000000000000000000000000000..a0fcb9cc3078ab4598fc51e253bdd9fe0cb9f886 GIT binary patch literal 642 zcmV-|0)737P)^HGsU+V( zQX8-qZ3I&UV#KUO+-x@4&AV^k-Fxp?Br&TIEK+!2s$tH|nVBQ1%0*xGNXeFlGMF+=%gSF5+oq= z%3j?QMqv25p@u<+AT^Y1-4vHvy)Co2`P$*C!{{moLtRBEJn5TLCrkvyAFohrO4hWf)6V1d)dLG)oIi+B&k>+-w4vB- zIDL5$aAm}VssksVnDzQDhA?oZGqj77jSe6gm`Yji7s0saWj~52804J0&buuLV~JG& c`R{K03H^8QuA|qDw*UYD07*qoM6N<$g67&3?f?J) literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-folder-small.png b/media/images/administrator/icon-16-folder-small.png new file mode 100644 index 0000000000000000000000000000000000000000..7c613e054b15f36f1c63d3a9e68c29f95ccafbf2 GIT binary patch literal 395 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4fxrAZ4@_Z>LpB(P=EDgGHs@(H<#3lpZ>Z`kgozhr}u z%ND^SH)bT1ai5(%GhLBQWyc2T{QCEEs*fL)cv-qlud%l7b=JzvYWCyXgSnn09r_m{_v@Z)oh|J@zx(K@^6+>g^d@v4;gkbWsEoXE%32*i1tcpTNXd5CcIl)ECgqz|2rE6EW}s7R?kl za1q`0GCkMruC6-2LANtwVlsgzsp4?{@7$`KBv!G66>Vie3h?3OmEEkjwdLG0PgLVi z`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|UIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n z6o8--^T(=hkBNQ_k{-_GWE;FMW7!p}f{NG3nHZ{D5<3d8&tLh%a4AqqnjMkr3m&fkMdECD3N5}Unig5wy40;>lo4j~k+e}v)` zR6)J8Mk*u=SpB`p6o)7j?S0T@9?bz#m@l>gc*zk__|*!FMcHwP!gwLJvS~9c0px8E zW!|L0y&Ro1i2 zTFI$+a%MUc{nvNdN=v)MMsadTJvOL_r1Qw+HpZSz4y}AaLG#(GLG$( z&I0b5fb5n%x1xFHBt%f4KUYc%7M>k0g4?0F3y>X5O-6q@XVCC}83l=i-tRnIZ{O|E zlNn0ii2iWSFEw|D62WpMo*7DKx&R60Br`C6y(d?=><0l2bj9!kUwU$d3)%Son@47@ z34o|7S4R(x#s5|wZ636?A*d-TeuCv&2z$gx?ToqL>0ZTR!tm}V8g z3N#Jim9z1{zPA^j>csGpiTdCmFYny8b$bQ%EBIa=1guCD#A*YA27;M)ZJihf+NPj& zM}pD>$jYmAK=K_!og?PAl8aRQ+DVH#?SV0zj# z2s9$B0C2!9fL8$^0K_YUTLj~E0=)iifOu7lS{3}ZcTz8-wE~!W2SB`--32JS^6s-g zc&hm2d#|a!j;Nq^-Y!L*gs-Nh*;k?9hTbe6yx#Bp565TI+_?f3VgLXD07*qoM6N<$ Ef`rp1DgXcg literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu-category.png b/media/images/administrator/icon-16-pdl-menu-category.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e105568137022d415c876ac53c2a1cfc1ef5ce GIT binary patch literal 557 zcmV+|0@D47P)Cz5+H)ryqTDW!*PY zM1S^PpxkYf?RUusuFmp-s4&Z~_wGJ2t)zCCR#Z|_LxBOv5oMi`z5}43JR#Q?&3?Sl zSgC%nN>Lm4K?TTy>9vyDC$;@`tC>0-=MLNjI?a?lv^N_nyuH&)o$g$O>>Q*{cX!*5 zn+BklnUjiUL|mgw0jbxW)2qe!0vfP>B8J~T(dMOI&iDczuuP_Z1={)a vjwTbqD7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00K`* zL_t(Ijg6B{YZFlvhTk*y&U8}iq%CQvLDR9xqKhDnNE`gvlx`}x6of|5qKHd3F0xU? zWgrV(1w>kZfcOLI7c?%k(2Y_Mg&JaND775!yWNrZvh-?Rtr0Bl^J+{0B-v>Mo z5CZT#$Ufihrj-s%zf4zu>t2Nu0M`Lr7mNTi?cJj*bp3!nUgG@x{J5Ug?|)hUe4+mB zdDb}LVptmn0Br7T;8;t-E&axN@nrE$v(2heCV7E`Izlq#!mwrxCm{TPeE zJAiL~(570j_0Nb}=7{+p`R64f@sMqWH>FMdOilTIE5kXi2FFr273w_K@&Vl!F zM543DAPBIuv{WpY%PSlJipAn>P16uX(H_8qhntt?006tvE@VYU>{eA(6bgkq0PeC@ zt2H_^GgD0@5=kP0BuOA5D6#^kFffHdmSx1XI63FpTCMh$>$*OqX6GLEN2%R00f066C$A_PGIB0>~JVHk!k&tx*J-EOnh)m1RY4xKzP zF#%OoAxWLnaU6#QLBROh+S;F7F4xv|T|UZzWm#|>r}G0lPJX$ryFo$-RIAnTbUHmO pj#z?W7zo2Kev7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00O;9 zL_t(Ija`$yi=0&y#((#|cfQ`)ot=+03z{|Kf(h|sgE6MDQ3S0L6!Z@eOkpKhh=^SZ zi!?$ILfk?@>})KAMI;Co0c{dB!Kg8e`S7W8@+IwdpN(td7kGw zGh^>8oj-eOt`)xkX#V0RHRr$#%B2Eo&fn~8e)smfXTJ#mAAj_I`^cf%d(RxMy-^I& z%s$fPh%v|ch$P8uHkK$yjw*u+2yZWD-?qf;feqO zz|x-1KY5z+OdD0fIfts^y+=dwS(cgi5qG;?cJ6mkRiY>` z8YRSW3_xwBj;NxdIKadn1f<|18m$8qN)-wrOr{^0txptDHB>Vk5jvJR02E7Q)^B`I z9ABa2J$+zg4l~F0?->R-3{CE$>To9i1qAO+@BGHk>m}B-K!b#*N(mMMqp>C4fzu*l z1}3QbeL#07k)IBpM%#HfeH>m)h1w851)P{dh9qy z8#64NSP^`(kDR?%TU<^C~DpV_^&>E>+}BR z+K<<_jX!s%xH|U=tJ*~U6!Z5wG?NWd&7-U$fMI|c$;5>-?(096yU(AvF?gcT8>EGP z)n}~yI$GRXhEO2W{7Z;JrhaXh`la>zm5cj180~)g+PyD+xS*#NcAN9Zddb$csnsv9 vZ#;aEo||^gYz#2>%f{@bix~00000NkvXXu0mjfB3Xw2 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu-info.png b/media/images/administrator/icon-16-pdl-menu-info.png new file mode 100644 index 0000000000000000000000000000000000000000..7193ca419629cc67870fdd44a26fda248cf17574 GIT binary patch literal 777 zcmV+k1NQuhP))sDQ|*(0LHs7VWYB~DZef}otZ4|NO1c8v#V>#Ox^|Y z4iHvr4pk+U2oaRP)vC$0;`q{?3y=RI7`?Y}`A6#D6K?`Ul}6;bbv(nacEf|0D;N7zSlW-cn=qcdx#-; zt6K;Zje_*t$Y|PNwlX)7FouWACEk3lpy)RBEihoNeON4ub7dld2#7!(B*QiW5magQ ze?t)G%GW+Dmd(H`C1xv2e|#Z=jdf2HHBVfvM93fN&7FZ)+B{>=#=F_j*6QjEIH;|A zPW12Q(B1?_g!9AQ*m_eyoguWfde6qY*_IC$@)M<$UCA0}Q71HN%8|Yf-hQg`;_Xic z`#Mku>ICB~DZ7$g$WN61w(|J1t80?UM-uO-);)I97seQp2}7W@YEp~iOZk6TxfQ1C zQ<ZpOK=bDVzx!r44$q2v+#00000NkvXX Hu0mjfM~qp9 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu-layout.png b/media/images/administrator/icon-16-pdl-menu-layout.png new file mode 100644 index 0000000000000000000000000000000000000000..95d14061614f4fb204ac53ef591e5f7d4ae912c2 GIT binary patch literal 512 zcmV+b0{{JqP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00CG@ zL_t(IjiuAQN&`U@hT-r0WHu6`DI}HPZ)4#NSXpafrG>X3cojC@h)qB%dqEVdv?5rD zph855%R+XO>>LZpsJICUnP#Thhxg2|WM-IVDFAF=J|5<-yaDi-nkVU|_gA~?X9@t_ zxrL)_wzfrMer^OrN&6PSHvqE)24IqD%#tud-&?nz=RGn401%7?CVgPPM3iOOQ<|pDR;yLD0)dDqNs_yIy$+i8cm4vJgqz!-Isa4u0000PT*afVu zBB%(7f~nH@gQN*TuQ+pe>+am`n|aUTvg>UI9y9P}KJWXTd1F)+$H&JH+U@o;A`)C1 zs){sCvA4Ik-Rt!}U(Z8TadvjLW35$dt>k$wd7g{4R z54wUF5dkwB=bZ808)i1%d*hrlL}a?%Zg+EY^KffxYkgh-0e~?EA_5VC_a5GRs4Beo z5D_@%&}y}?v9Yn5B*~{FN!Du?PESvtdheB)m6_E!SIy2j9goMFWtkR5p`+1AkB*Km zc6WEzR27YR5D`IDXVQouA|N8faf~!gF`Z7Ks_1k&t8pCP2k^2{T1e9r%nV~p1u3EB z9#w^ipxJDq)oOVF{}nVEvtaI$1xv{L+Y&I)ZB8o{-;M=R$IDh*NdR3%mAjk<+A&yl8S6d#5i1Q)QIG?8EI+ha|VA7!f7oarYL*hjg3^MXvqr6m@ f%Qyg#|Nf14EswzWMt3HH00000NkvXXu0mjfMl<8= literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu-settings.png b/media/images/administrator/icon-16-pdl-menu-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..3f1e2b3ffa7ea188869dd1140038e7f0f966c8e9 GIT binary patch literal 871 zcmV-t1DO1YP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00O^B zL_t(Ijg3=5NEBfd{$_S|cAQbRnO$}Ti@6m+5{U-lQB1r@mqcp8LNYa3NEGrY>_Nil z5ZY3>AbN@*y@+h?!9xexK(RfzEHW2qXme-S(N$q*{@0=GP+EQPPVar+gYSJ0M1;T9 z+}zyQ@bK{U^ZFbS;XJIat}ZBwa?5qy;=#eei|+33)bBI=dE`_obz7F@UR6~inx+8D--~th0X=&+hI-UNwwzjsl zyu951%fx|!fx3~AkrhQz!YeB)F9!z)XHHH|STdP>(9_fNv|KKKo}Zt8($Uee8i_<2 zi3sI#+1T0HxhDVsW6U262CwS69%^fAo7vplBqHKEJ3HrfU58;90?+dejIoHSst`pH zrBbOj5D0W~L zV4CK;SS)sjo0^*H@9OHBQWQnAEQ?oF6`tq)aG2*|+cu)nD6=f9oJb^Yw6?Zh7DX{U zIXU^hR4Sba9LGsSRO`AfFG&()S%&NWxRxLYs8lMbR;xT?>_UBgJ&lcxeE@)XJPrWx zZES3OG7RH25q%4X!yVCR6g4$9kR%C=F_@-_bUNL?xVSj5u(0suj~qCTL#nDCHa0fK zg25mPg#s+g!v6j~c6WCX3Wd_)sSu5hg(})FHO_L-rk3<{F$47;yY2iiTV2eWJv%3002ovPDHLkV1oY+kShQH literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu-stat.png b/media/images/administrator/icon-16-pdl-menu-stat.png new file mode 100644 index 0000000000000000000000000000000000000000..fac766d2374a0df77091190d530c432cc84e19a1 GIT binary patch literal 605 zcmV-j0;2tiP)eg%Vq7Jdpl@ujh}@&lx_ z(N0iI7eT}q5K=^C4Kw5J+j-aOW|s|oNZ-MQ_J0$(1i8h`}*w->63Kp+$WBLNvojTWxJ zQ8t?-x%heE#rczKk5dlXT8nEZ#TXicV~%! zgSj6(0|r2#MoEC6D2kLj05u{(Dhn_G2oxhNL;|r*5cedY20~jAkoGwMnij$kP}`HB z`Cu{-hJX->rceSu|BxW;x`pO1Bm^O#MCj4fXo4EhF$vT{M_WJ%sKptC*^w!kwInmd z9l#=;A+Xg+>xIcFjO0b+tFPCmdY?A)z&v1?Qu%KA_P})PTQU=Hogl9PWH62LKsIP)5~(w$@{6l*YTmDEDgak5bIGn1J+_a-xQ@16U7E>bnM9(Xq|oWuK` zb7b!4`D-IXg$ch~DPt`=AtC_S|Lm0rL2S$)tCe{@GFX`C^$X*7t1WSq{7t3H@lY8c zV3Z}zn!vVDW-JHx^w<##+RrJqP;JS_i+$p`3Iw{Wu(bLu_oG<^#likp7#n<@1Pd0n zQp20~2DArQmTT8}y0OIJv1yVFHWR@hh=5iCse#oN z^aDxlHx|lYfF9Vs9{`Wr!8P*UX;lAy!qzs&5zx*KfmlJiat}5-;L1+hAcVW;d5NBUuWGu#*IH$*w~%pn-{;N?P!R>adTiJ zw2^MQvxt42CEQLI0LBPI?OXhw?V*(TqzCq~TIuG{jZ37*PO~}tIhDaz;f<5%xTipV z{VU%6;XU$s$oKVw?qcte4=AN4(RV)KP;HSHj$Q!ck)>agdwH1QT*i8R3%wcEc%nGL ziPx^66wJ(ArIBc^yz@4G{x;8yeMGsg`0ieWR+<6N(ujW~$|;W9=g?6jpja&O=7;AA zx7y5=>P$^dapL(&U=o0!5iz-V7uR(OqZUfPh1b_h=442@T)s6rIy%0ic8{RdYO%b$ z{J7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00JIK zL_t(Ijir-4Xj4%f#m{?b(rT1$LOOOSO1jla{3r^UgbWT+5W&HMil9O%2nq$Eizo%f z!AWq?AxolGlS~dGsn&d`ydm0rycZhV_g>>OU-!Lt9BfOhNjiAo4)=fW{|Enj&Xq{w ze>AY$1xb>md_I56=kpzqWf>&hR4Vl_91ed40Fdmt07#`$>4odMBuOCzg%GUOYDP2~ zJw&oM0DxRBmtS&ImSwF)B9X(fSnNov)oSUwp6UqzAgkr_B0E&AR+qQV4Z~QmEKBJM z0N_zo^$kht?>^D0u8|~d+h(Cqcv>tLpF562(=?a=0RR}#R5ebLKi+;|bM!3D(=#-6 zgFCgcv7wNJ-0|98P162v27cbO63uNKY&mu zv`5pl*MUIb7s!c=NI>q(rdDfdv3L%)yW@kIcmH}XOb@g$h*$|$gK{)!RIuN!qT%bUJ;lZ``{TlgZ>! s(=@;5a=FX>n*08Rxw*OV-I___H?Ur6Nx}i%VgLXD07*qoM6N<$f_P6iumAu6 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu-upload.png b/media/images/administrator/icon-16-pdl-menu-upload.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2f538d98e7b86d8490d8a25063d98432ea492f GIT binary patch literal 756 zcmV7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00K-& zL_t(Ijir)3Xj4%X$N%@E=}n?9DM@2_1oLQ2b%@YFh>IXf9I`s-&`e^HZUu*8bX620 z)lK4J6cofoa96~LR0JtV3staUOpTH@ZC>9?UhcaNw)KOi9XxP`!}74`#n^S4XxZxH~>_@`%s8cTi|U1Oy9qvoT|N&*n=Xp6oi{ z@pyFVkk7i7j06G704Ts!nESDext6$c>Q43YpY`#0#HD!ZsA$`(#ySvb6=#r#+H_rZjOzOz50tFkx1MKhr=fb7Z9s4ka`E$(*YDf z8o*%4I2zJ*C}$mhzke7&dW)b`DjmpXvkM-N2ZZ&(tbfM(%ylrKKomjO21I%inmz)z z+kxXas8lMcd_Mn<13)U38rL)puImB-2BL8UVh^F*-%>N#f|3s4@jwWHWHNakzyzyS ztHZfmuITl81B4JzN;hB2sVn%C#^VW+p=%t5i|L$F+HN+RUDGssHUj|X9E1=!jsrpnT-TLSN}KDt&T6$9o1dQtW31=qOeO;% z1StLWdzNJ}$8i{6TwGj^$Ky4_F#2{PFijJdWkD&mN%GCM?K)9Pp;#=AMk0|RwSx$a mMgvmH&5(3Do$rN0;q6aL%=_L69XsU!00007IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00HJn zL_t(Ijir;#OO$aC$3L^r^Q`IW>Pjz0?V%S$wgS5pMW7KvARW3CEO|&40#QTROI}x19O@A&W9OhMwC+g zkLiC)q^EATuFuc*0jlHT*xbFzn^rxY)azh);CP>(|NIos=>i2t^EZ9((JPOhFJv16 zQdbAN*517M=v#KgaY5Hnj)llBito(*M^^3ctJ{vS`0VAlTeKr#L)3WsGH1^nW9icm z1wp&k8XEyJ+X9BJ_4nJR#ihYsdV1qfcID9F9uQc|Sr-}tZVaDkH)00-as{(c4Y~p$ zg-8&s)o%e5ilv`>L`x9VX2A6;x!PE03&3=qpvr*zrw3()}j0x`tbOZrOPXWEJV2DEg{PyH}t^fc4 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu-vote-file.png b/media/images/administrator/icon-16-pdl-menu-vote-file.png new file mode 100644 index 0000000000000000000000000000000000000000..2840b083dc269c5e7a5bd9702d233aa3dc7f41bb GIT binary patch literal 719 zcmV;=0x7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00JjT zL_t(Ijg?YeNK;`Le!g?gHqV-FZY-D7Pz<+4f_CKc)E8J#D<#$rQyyIu0$@d%pq_fVHs*;svUTzmji5GMQ&?um3RZu_bq2!WwGcDrB<_%6BccV784UNeFb>+{`@54HS`n8Sf| zuJwt3Wc8v^H=R+Eg(Nfz&^l`LudNQI1RhI%faofq)spBc+?M=6y}#)nh$sd@6)4n( z&9ZAA0NR?Q5u2dEj$*K32h$UiB1hG}t-NC~nF)ma(afknni)-I0->$EW09k3-}J BH(US! literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-pdl-menu.png b/media/images/administrator/icon-16-pdl-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..9afbbc9a6f1e1c720995218ff6c89686ab6abb68 GIT binary patch literal 859 zcmV-h1ElZ&O(i#eXyJKKt3oj#rT*8&FuJ082@M2n}>d)ReG7qF&L`LP5n>K%$|D zDBu%NV1%?Qr2q;7C~G7e))t7wf8Wcy*YDmfOjg@$vC|yQjArKO%#3tic79u5Tfbz~ zXb6Eo09az+KmEcNe(-(JF~^(7FFhYWzcx&VlEeu{4Ut3`F+>^>M=?gtKk-N+RFu_Z zHMCY+m{L^IkNY2G=lhO?Jdi{QYLt4dPOV(SW)@ipaU4@QQlU|4AP9MpbF6esjfjvg zQhe&UbM6k!Mw7|GglFAn?2dN1vT}vX8<+8Twg=n1oxY`7u9CS7DGRD7lYBxE3NHR~ z5$7EntqpEpxJ{a+oM@fk=;~35P;mYHbFWkhXjt89w^v8WnSkB018QysUfzfD0-PBQ43;{$05uqAadHly?o_u&h-}XtO z1YwzzAgoo_nB_Ajc7iJ$z)}N^6g5gLF`x6#yvyEEG9^rGK)`y-ieF*#N=HOd z1Ojm!)8FsY8}=AyWA1L>rL*55F$q5whYD2 z5fb_@!?$@exVN@K~P!JcHVKiaXMIUz3C3Rom=a- lh)>4K|1eiL-yL*2e*+&JL7;c`Tv`AC002ovPDHLkV1i9Zaqj>C literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-up.png b/media/images/administrator/icon-16-up.png new file mode 100644 index 0000000000000000000000000000000000000000..e797bb8db8180b0bfe9807f6d1101c6e7c357761 GIT binary patch literal 576 zcmV-G0>Ax7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00Edu zL_t(Ijiu91C~Q$22k`Ij%)Mip879n#{3*o7pGTU)j+GK+@zzMaW}{^Bie_Oo{$wF} z8!J0wVxJ>Gya`zlzXGIkpD zXt%#~o0^wC*>E?hW&{`|Rf=gyuzd;0Y0Q>RXy0Dxx;5i;GtjFs#U9UYf_4mzS5BnVFH1k&=> zC#5R5WfrBD=NDxcD>w(6ux+}$0I2SYr;B5V#MI=D<_0E-goe#rL5fTUqH8i8PoB`4 zp=5K$CRtD`{cO;>F;!AR@-nk;uFTpmbD0~MW-&1Z&GGb9R4c2}JGgHT z&z)O3cbt-hggV{6{aVbP0l+XkK`Ru?c literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-upload.png b/media/images/administrator/icon-16-upload.png new file mode 100644 index 0000000000000000000000000000000000000000..c39e98dfcdb3a49507f4802201121d09f9752187 GIT binary patch literal 887 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJbFq_W2nPqp?T7vk7#J8k1AIbU zKYsl9=FOYm&#%3F`SSPE%P(HMc>e6!nH*em&Y15{S8#iv)uwniB_50V(Tf27cnl)=y zuU@@s)vA>%SFTvGV)^pr%a$!$x^(IM`Sb5ju)f!CJ#*&FyM0!7`YfkUpMJa7;%2Y; z%^vd`J!V(Cj3-Z?e6`DD(xge3I`k$^oOrQaXTpRD{r&yt+BD9!X`OG=>g($}+p5{y z+k2)(?M#bGPfyROX2q_quH%gg?d|PH>m?4=%O0+mIZ`KfxK8Y7okVME>w!9%L$x9Y zYlIKhi0!MD*k3EPzeadpjo5)2;l0%YyQ>5?R*Tiw*YB+4+g8rAwTyFf8Rxn(?zLsY zm6eqnO4!#Gv#cuNDlRTwQNXYwk9lbxV_sffW@ctaMn+0XN^){?LPA1ZTwH8yY;<(= z|NsBb{o`5&jHBj~AirQBcYpzdQv1pUK<984ctjR6FmMZjFyp1Wb$@_@5+$w?CBgY= zCFO}lsSJ)O`AMk?Zka`?<@rU~#r~V+{eWsNdAc};NK8%6aAM}+NRwQ};9VJHxQQV+ zt))0c&&AyI0>zOpmYaCd2^uURTiEm!WKFAWC!60HFBsA%b;b-lp#xy%L`oCvOmZ{(zNfolSIkcZHdmH=8M+5=~bER?AIER zdE#wZfws2s@#fp#eEISsqw<|XTa>5r;t2xr1_5D@iW65%H#0OeG`Mi}Qc!q!px}m- zjFjoqrcGmDGBiv~OiVLw+i>jIu34*2T{^VphJv`av8&2`CkBQ>9)Dl$&+{#TzGLuo L^>bP0l+XkKNEGh? literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-16-user-stat.png b/media/images/administrator/icon-16-user-stat.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8be3cc81eda19660bfe9baf28705f1be6a9d75 GIT binary patch literal 711 zcmV;&0yzDNP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00JLL zL_t(IjiuAgOO#O*$MNsI&ogh4&`e3nV1?Qu1f!O=>P?askrB~0BB71Ywtqm{l+q?> z)2dxTErQ%=D?up2m?WdH)X=GzoN=7zxi6>1jFW;w)H$5ZU3|E|14oGn|5M?1j~7QD zw-tL%J@Pu#0NOjrewrS7e&hV-zXGOu@?nS0^}9p@0PP&&g1x}@!0WD|)4L*$A^5;s z8R^YOcW?DYVMGc*IS(;@#|Zm>x|{7K8T3Giqtvoms1UC0sn!AUuzR(&x+7pP6@%b` z07s0g=nC3LpaKYN!pwEgoalHq)~9@0E6@qUhmV&ZOoRXyi^1aojl+t?$BF?74!oMpwJmwXE5rbX z%BBbwgKhl4vhFplr4_E6%+WtE%#q`rP_x8~3*4`jL20m?c2JLCnn3I<83`D^eHJ1Q zrDX^Mv^atm30GPb=%-1nLp~0H(2p4a5;=&h(B4 zlW~%{V!%?_@?<&71v)uUPJxlF5uBK`BSuivaLixL9_>CjNwFO8@LLuof(kwPAmWf0wN1f9;!A~oX|ri08YQd7nzkej)pw&fK}@o^$+g@668Z>~3vh;z|BF_nvvq`Tw8iIp?`>eCcXLINJL7bde zgXSpOuE!Wq@vo^&e%3zrfouOu0b;fYh=GX$N(^IIi#A{^SWCCL@#pQgKUUG^N)OsB zZJr}D0n!UDzqjkd1KZpu4y|6jdUQVGI`8ZPPE71T^Bh`(iXo1{2r!2G^E+7T{|O;x zE||iAn_WQHqLr_2T(on?L+{@?GM@lvR(aZPz-Z7q^&Zd)l%gE3A|tv8#3BN*xPiP} zOwR2l@H?*)f-g9GEprgj#LZ6 zu)e$(heJ{-}qD{aTjymgBseKPSI!uU7D!^!bdy|6v3l`>u zwwf@mP_Dj>6KC>of%#*G#e2-=AoDmzb(eBD4p_ zaQepKqs^Qxg~+k~w?dQUrr5wg;;o7I1~3MrB^Rc?OxZ5yc6o-|~Fu$R8*p3$^@A_*WP+_-Lc^VYk~97R0n#Fe)~H$vG}QR_W`u^A*?|Z zB^xo;3ABN@214PuhNbyeSZ0S<;SM&)H{bmzU-|fv#`_=sew^=}`b?5unZ=@5aodKU z9Q^ce9&SWH9J}%i!55zb0ZJvru}U_e)~)dr5)hae#_R)(c@J_kI?O%JAvUjSB?rj+ z1&mIfYdR$BXPKD%+b3I7AmnbWfUuHOJ>9(fN#Av{vq(#z5HMMWT)>-|UUuD8V%L4G zdC#@}?x2!eX1ulVhmOy(=q6 z@b$IU;-k}Om>7&o1ehqvg6q+lw>)w09h`rtr-fwbVv+tAd$ERD(cBuRVCz2TrXwjx zGALbZ80_7Cnl*Q9YMIpkLN8Zujk0(9={66CE)?m1q22R(bESttaq=5RKvNyCnh`75 zq>VvX2a`%2dhLg80=~B82vcFHZSh~8FVa6SH#vaxB(BJn>+g+9Xbi&$P_e=he&f`g z8Yyz{Wc#A|Y@v<(;K|;3DT%X(6140Ns@w7PO1#HrxgYO1}YO00k{&kP?&26p6ZE&Q>{^Rq9 z9Y8uBL0+OFQ5kr$lArxXWY`mjfHde>p7JKKhQtLI`{}AjoHk zn8Z{v{qoD z_BdXmRA!QuOqBd7(F!uM^Lm$Da_sjnzHw;mRZ4(P5tDul)81HXZL>CvhBx>xmZiWyN8>2GzrunDzPNMx;zn~$MMmC-awHj&qDY*XLdM3a5J)otS$ cQ0X}T0fAEv-kMUcrvLx|07*qoM6N<$f|DzS*#H0l literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-32-authorizeall.png b/media/images/administrator/icon-32-authorizeall.png new file mode 100644 index 0000000000000000000000000000000000000000..62edcf81c131933ac8395f6e21987d56097eb338 GIT binary patch literal 1748 zcmV;_1}piAP)B#3qDUHI zOiKeoYTBkv(KML07}ofqM6Ds3sH7x_`k^LjQKOcopr~n!7O5eUl2TdL-NNuJ!9b0+8ae_qaW?kMj)ALJE$pmZP{xlu}8 z_2oYtdi3ts-R|#}P2YT+%pENise*!1$9 z>)tIL*_c)P+Ef5a$nEc2z}g-29vZOc{uG3u z35jXJ<4J7^CuX9Ej=2J*iFAQDE|U2&nW=KkHH!~zUeORSseo0#SBta`52J0YY)DdQ zrD{r8Nv{f?NJuekK~zRHEpubXUE6=WbWhi40pqq|q>{gg*w|;9IG91XJc!9syk*+v zjH6V!3`P^_BB$Tkx8~0Wf4Xpt$k7k?Kc&_gSGmC%h=XP-=`hAwMEJj~ln$X>1S0J3 z+q!*H0fCRdCjtQls#%J$7I9457JqCdKe%f@U%!1DiEcw2l+$6tAfdPCKZ|x8Xhfmj zh`#t+wbDs8R|LXPliKpMa}Kb4eiz^T{5Aj<08LRFKiT^wJf1AID1^iPyS~4Q?>sn0 zfH>|`0HQJ0A#S4OuL8fR0Ux=V)=t0Tmv?sY ztrgqGjsN@X0T^}OIp;A$m)ge(@WL_=C=o=a2VZe>1Ab!AvgX(z$NLP3&|Y4^Vwpwk z`vDNZim5m9dJ+0s0eP?RLft;mzKEy3`Zmw3?PGao7hYg6?BvytyvXi(=h=PjS^laX zqqpj~Y&@%v4spES7M;d2E$K*2;Hw~ zb}ngQ-50h|k%Y$vS1}mg3{F54ul71tAL`}HH@5Jv0h4=TZEm9I36^kKEuh^U!C!HR z)g$0CE-S#QHjdB!4TI6bx)&pWVIy>W`ezJAogfx$23ZBtl)Yz4>^W1;;m(2hJonCk zF${A(-hp?X(MQPW6m)xm^M$1h#S;UL^;S82$xI44b@2>1pO1^HMJRvH;h+OetY;37 z6ClC?6!gUlCk34B%MkICLN1&?n72MBwRdX2&QY-Ezy~-Hin{gWI01N`cLwmmPYM6RC}^Cpo_Fealpn6-7BfEPAMw@rDa*_@gbaP-8lSvor= z_A())z5EjGL;LGvSPxE^Q{6{VE)#@~z$fJ=ztR2V_z2{ibkod%e@^U$?dQ~6zhciz zYq@)FVLYU=kAk_t$NRRRtgDH4Xj|f@^5Z1Mgi58#hvIn~C)@=9FaA(oDGs0h#fMAd zy_j9uM{Il8d+c|V-}oBJ${0vT=?Qw1Wt?eQT|1TXD0#1Wx9Ji75p3d|UUTV>>6TsU z(H-^8sIL4jSiU}J8)&}m=<&H*ulLS_wS=a`lAaYfGy};kTxhwMi^-k&cCt42xDeyT zHU6!71=i)}1Z)b*Ko}U3=G~ZVr~mfno*pAWJ@LjYiZgBvT&2r9eSZUBXwp5DgSq&) z0H|7x$Yc;G&HyW5$>+R~Hx{6E21Eg*)t@WxJ?h!_?m^U7Q2Jg(5~?X=+0=lh)_h!o z#{5K(QU$76E*feP^3aq(AtY2g{`(_>cmsg~V{))Hc>%gcE)fBx^M!1!e3B5#)!HFq z$3ljNb4XJWO7*@|t2_nQlA_7q7e&G z0wRPt%r-jTNN$~L^aAIu0!XKX)aSwigb@VlB0;c?p@FAEtg$!=>&>VBI}!!^J^*Gs z1nHyi?B95K{~li0assHkvVm+t3^ZX!~msws185F$%DJt qzW&Wxel%lyi?3Csy~4~$wf+xzz>)e~%F&|$0000 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-32-disapprove.png b/media/images/administrator/icon-32-disapprove.png new file mode 100644 index 0000000000000000000000000000000000000000..f62c7b39c0ae88eca198842b57b34c9a04ba0a1c GIT binary patch literal 1776 zcmVOO97^z1LnEY!=z>}!pHFfqM*u9b8O$6FWmL=g7)Y-;HvI9 zik`H_jzqTfYxB%oCoV=@@b(w5^Yoo~p1^xZ9XJPKK!iQ}zsu*w{|UyEf@IGHX;8RFb{!#ldL=`9xOrtUggLN1ff@+PhTv<{IqetDA zWykc3%dfwX6a58UR;5>eEf>;eiWxTShdCTJAIR#AJvUr=ptaQ$? z?dUVu)aNDeRO2QOANdtdjKE)rdyqTx3 zxCs%!Iie)t-s8J?duS1x&AV(|y@G45U5PaYIe85C(o?usNBWgHXENA~03 z@zhw4fct*$5`!eut2ZXQUK+@9x}tRTwRq`& z%o{H~f-?uaeD>>ypJ0CTTyOL7xf|j@(oBFPV1Tg1!g)2m|CwdH@#U*~NEGIDz|Ry^ zyamVC&OaX*Gc2VDP2yR~>)-nYl?}IHt;HBa5Cm9jJHNZ5{l)>_`{w4p4%jfnc+avw zkD6%*04I7#RB_JXFgVd3G+%tWLo}0cW=y>B)U5dhupzOR!@VT{Qf03iOOiTV7?CPH zXdK)_>#xsajJcqI_M3+|yYn}*=BEm&v3ONd<@H$toUuDvqNuev6ObB9is`|rhquw# zy<<)n8V7ds_IK_iNz++#Qw$mn5GM&K=GkISPb)rnuYXi z-o~vAt@<=URHpgX-x=G#o6+ZfH>Wcu45>#EldaajRv$RKyzeL3D>p7!Uowo8jG+~l zK^5tE)ia2hTm$SAa2wksB8LtR9+ei708gisonge?wlY)d*XY zoQvI_4F^Xzzy-buo$|n0$Kgs~iIOJH257a8vq9gw&Ix0Y@*ve(jj%n%>9#xRl-p+s zoaun7^2Zx49|rafhvvGnf$^|{iz;ZEA}&SJTSaTcw=dm28e?aVl3iZmhU~rS}=w%uv9|JfKLgN7UQvF zLd;=nShw}y2V=|#Rh=cEc(*#G`TgoecLhd&Uboch0az3bLR=7KbAkX=3BAK0NSZR? zgoc=@RLvt_dF}lNx;b;?{JjD!5X?Xb*iDxY&fB!Gdh2k>d}}bUAFUWAFouC#X3Gm0 zOH-67uScgmkMDYK^2z5TInhX$`% zTnRrGS<^XIPc+ll_MB-RJu(qbcCFY0DUbl|e2nvJsjB*J0VSZElMm)&xo{ybkI&T? zt19d?Gh8$Iy&|vOg*X?IsH*G!cPzOwx+Vo(wf*^U(YEf$*oPyRAL7TdcbSF(3x$jjKkIf1TiW@C`k^>H@;= zZ@$agGjEF378uX~-sf3`0aJh!ko<>4|5d)Jr&dFN0jPd+=US7_{z5di2nwzXwI{8A zkZRrcp-$i&)Ln>n16u55pO{q>Q0j@NOmtItpmyMZ0A}(fT9ZG4K<@Jjbp^p}CCH#v^_#)8;N!P* zDw1XagNtW~{~~CMXh8i^h%Hh+fUucAN*`iTRnp7Fd1G0JCQyZuu`J*_?}91ew|C@? zbkBp(+nJnXTlfNGh+D0rZ<)eRfk1MQAbsvZTwKG*zhB9zL%_5_!vRvbhx;@c0CoBz zP9a+Gz{Lx2aW)^lViZ0(pPMJQV8O*b&F)tMu>n{(H@aIZeHSMX%M4--{Ocfm)C+s; zEgsuY>)$y`Ux0*aCtjfn8Q6th3l51_7W=wAA$5dcb}d2(r02|+#OU9oH8KVQ!RJ*) za?WiD#zKm7IQJEv(PMo8RseC|Ow2RsX!LA}3)Or0kfEauT7ta>)S|UJMCHCVw0Hxt z6Q~v;mK(ne#mFMW*WCuK4LJf%^Y>r`M5GPWg}}b=v1{^1ZvX6vj3Z({snV$<=Xm3R zS9!Usw1J?iu~~m55D(slH9%0f=U2P{6rdK=WTYr_ACCUv&W}2M5zCJ-7Gi+vLNBZX z5Gy?sqnAp*rw<{3sxEEeuxkCLYFAagsxGK%(EJQ#U?mXC(wEJgIN2)8vLhlYB06&M zgEeF4w>@Dwx9vY!>vAC;5^(JJ%r#|MMq^9>()jUj-(8rKKmA{=HT+O+6Jf6{%gxvl zQp)p90h-X@4oQrU^8v zFbMIOh>iiLAQ@xk+wFF|;rcNKpGH6gNGa0kbTF}AOA_!pY^|d=LH7b|d1HySDu~?L zK&+}4RW;=#35rUL5%0asU!G^<#+!6Vfb&iTh)D?{E~`FJ)5aL%QcNMm9I})mNtMDD z&4L0jGjq~ROl(Sv0_qwO0|K+Nv!u$-8p}Em?BSPS`j-q@>#rw=t<_tQ^v~c!Xm+M3 zpSkv0y4?lpy2hA%^EWb%9X}zreDP*20BYy3X0gbEXkp!HLbqfldw zMFcv}&)4ZW^BBQrYn1}T!yg{+S*w7QAQpU_Bc#XPy7%omRb4ur4&&qFq!h8%&~CTc zxbgE?Ynhvy)CYgP>)^Ea4(9_QM5?NysvRjM zVhmJOMYr2!?(${4^E7?~!}WkPxlvU_q`iCh&zy)b@y?S^|2J#hzyDxFK$D^<0!&R! z5<=kU(P=~kg$71Ym91O9u7mY}^dh2U>#29_*xrma^+7RE9~8ajUjN-bZFaPH3i5}w imJkBcE92vmDW3wmUR|+iJxVbE00007IZ~ebVG7wVRUJ4ZXi@?ZDjy3F)uMTFEBaTeIgtH00-v}IDi!wusTHUe2`wO%nhMcU5)z1-CJrXXi9hkjetUO5?&-s> zch`v>svhk~XJ+rr|9}7I%>T|6Ri!aRgwF`sAlD7@HE}JT`&noWK=R{f|Iof;Z+~~- zmtAWkI`+498j&CEZ z++@^IjG!T|GhZnAnWFOy@EQbbB9@)?yb%JAo!3sFGhLvMz}m5s)gl3wS^?=il$>n4RG(|9WlBz#S7G0)OT% z;Jvta_iy1OPy+nwp&Kb7H)ukq3LXREPtyDKeQs*l4a1fjkOsiV{`*PJ+z%9ia+O2~ z*z53CFWmRsbNnnGk98a4PM1n@ac0JScWkWb;?z|0?n^7T^)JUpq@oA_J%oo&M24L>n|+ehau%KWND#9_FSfR!-J#Gle(?1Li(-uSv-4@ou(0}A%T6?ww;2>L{=9ceJX=1}#<627q$1ymLU<@RaXlEy3 zDn+prs|~qh=rI8NOujZt06(4M^w4i==U+Jba4qj3_T{S5&W#CFLQo|#h5*QyERkPP zthHx5$z5HQ*}rfCKb>21Pc;d*0y@dte`bbo8h%S-#Oy!meV z&0p~niR%?`T>*?zS+OE(uUolRqud~WHeP$yh6GNpyuBx$kCDx%x%$C;CibzZ;noRM zEKmTf2v!w~vQFQSo0zHPH(ctfF}pH_yCT>XC7PE&ZT+sbB>=PfuBZsI4miN(hH@Ai ztvjYMQn4*0yd+`-ad1ssYPgMyQAGg}s7h}d`qoe9*M0bo%yKQ?K6uB5Bn)QN2^{0p z3Dgy^RuK^~^-E3l^0IjLVtqypuUUJ!RLfg?DzE9PDFH0r91>xPuwX#I)dt*aOCTbG zh+tG{X&}(J(DWP{tmQZPeigj#6Eh8CXL|!wEMO}Tf)TARxs667s0ykW5gZ_91TRr< zn6crL0CXL^o$Z4MXp93@mxPKbt;W=TA9XBZ1RMdu5z%!CfQYVs4~Q{1#*j$W|33H2 z7i;-FBgg4EG)QaDb`A_ZM&IEFDzks<{WWS`zGDSMu~>`&1qV~_?s^keYHwDX(1_rP zuxX2sy$aS=oNn}oKV|TD&k}1(a?hWBv4(&ClNnw=^i=Kq)crYZOcAl*XyuaxkOl%Z z1!Cp0B9-nGRm55xYl#6}-3?`U;RJ7d_vtl_=4bMZ4WHztfk$dhf?A6Jt_WS5g-p6YK3%chiILGYbzUz{9Gxe>Ilzcu zu{a2bAQ*R`zrSw9XU?4Iol7L5&OLkfwwyojB7$oSo+?%Z10Es0danTLgn~zjokY@AwB3I#-x>Tvgqq)|OPnb3}|$rPcFD zdLEG~7AO~sOhdE1CRMfB4a1Oo_wCD?@$sdZS6_`zrPDz=2rNLPszDHFx?JYH zrNx;-+x~^HtN%+M-Pw!{OQKn6n_E@`|@KfX~)*=>Ez!sF1PePb? zCm(v~`&V+M4615ne0+T0<42Bsb?Vfq`#P4EzI`bSy#OMqe8*c=wE_gHW7_jz+-+*< z3-gnpiegb~u~A60vW#lx>Xrv=XQ@z%*@6IC`B}yK;Lk_MvUg=i`_4a(yfX6p<@9os z8-`(d_qJ`*+1}na(}~0@d%*#65@HWrK7rly!}>u4)B-`rGI*P2W=6NyN+abqG>HX*Te zI_*tNOt_PilkV*7teKme^Ol#FSz1~$>2%u5X0uW#6j&*hu-4+aF7bGr*49>SYi|qM z+uF3feG{EqJA-Xow?#X5?hL!TyQAH^cdzc0!r|dz4j(=oUAHr8jAO@+$-=^dq|<39 zpU+b)7Nt-qxW!_Ta=AqEcn-zg>PL4&2_w1M&dUei zxC+Nl12{;=cu~BH0n@>{&H_XW)w<1eVi!R`6hr+%-`Lj4M}UUF`OU>jm~=&VCIAp= z#pRn>!cfqQkO9^Bxm+B~G|QZvPuYtSg{Z>}1i+9ri8Jv%_T=I$(G{SS;z{S`^Dn%3 z=<|8DHdRfJJ$pI)wseGs{Y-KvC zTnp%hi1IGP3}kJ8J!{B00L8E`A8H%RGILk}bq}qe6sBBUst$k~W($F_iL0>Vj=U6T z1(hgS*k8kQ04C}=H;9}tV-Z^pTjbCv%26u+i69QZczs|hFfkuPuGcf5fKV*TQC|TX zYoSZQ`ch5D%CZauETC>|iaMQ#hQJ^G1C^?dmyC2ilrA;`)QuxT`ytAq$tbSfVig)#K}Rn_sStJMcRn6;%W>%M%bEn-UdbQX*PUniz0KJ3FRfs)P? z>c+uQn$A{4i;Gd2sT9ErEjRpQ`G34Mn~flAdRsv@L&bv70t5Qnl!7n@}* zfe9J(swUwX&6-|*g#r_!WHPr4jGMK-XHvc~^z0~P0W}jhCCQeXWi5dUBQ@WoJT1LD z8w*gAME#Be==YF^=;P|UXES&s2Bp-@9!>afhj!1}(0;~I zjXzkRBJA=xww*qyk9{jAX1eKZ0?UnMe@eL`&}~)(y3Ieu5y_%BWKxCz0000qEcn-zg>PL4&2_w1M&dUei zxC+Nl12{;=cu~BH0n@>{&H_XW)w<1eVi!R`6hr+%-`Lj4M}UUF`OU>jm~=&VCIAp= z#pRn>!cfqQkO9^Bxm+B~G|QZvPuYtSg{Z>}1i+9ri8Jv%_T=I$(G{SS;z{S`^Dn%3 z=<|8DHdRfJJ$pI)wseGs{Y-KvC zTnp%hi1IGP3}kJ8J!{B00L8E`A8H%RGILk}bq}qe6sBBUst$k~W($F_iL0>Vj=U6T z1(hgS*k8kQ04C}=H;9}tV-Z^pTjbCv%26u+i69QZczs|hFfkuPuGcf5fKV*TQC|TX zYoSZQ`ch5D%CZauETC>|iaMQ#hQJ^G1C^?dmyC2ilrA;`)QuxT`ytAq$tbSfVig)#K}Rn_sStJMcRn6;%W>%M%bEn-UdbQX*PUniz0KJ3FRfs)P? z>c+uQn$A{4i;Gd2sT9ErEjRpQ`G34Mn~flAdRsv@L&bv70t5Qnl!7n@}* zfe9J(swUwX&6-|*g#r_!WHPr4jGMK-XHvc~^z0~P0W}jhCCQeXWi5dUBQ@WoJT1LD z8w*gAME#Be==YF^=;P|UXES&s2Bp-@9!>afhj!1}(0;~I zjXzkRBJA=xww*qyk9{jAX1eKZ0?UnMe@eL`&}~)(y3Ieu5y_%BWKxCz00007IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00-(x zL_t(&fz?`DY*g13UHhDS=gx~6JjV8bUnK_OVo;#MV}Xo_sO<{lB1JVR5=N;ikdf0r znl_>NAV?7v;C6649zW)B?>*=AV?2Y6 z?Xia$^H|c6X6~H1XRp2X-e;dXLrN(;%g_pOli|)`=ZE-kfdz{Ln8_o=z|?xIkGzGq zhL3k2&ui_x37qac?Rk}6J=AZ7Tcl|*5M}>@QXq}PYxuwHP#wDg^yagE-UNEkQ~F=) z-b`p zS0DnIJpmz7bDk;%2q^-#oiZ>Rgh`HETW}k<9SlshqBTOGgzBEXFgX#}imj{` zwfl!Kw1t6@ZCO%NnloZWiUZO+>m()x#H_gX2lei+e@92&jwJXMO)z!kdkle6~O7PCki%U7>~KTwQhJU(M9 zow+Y#Fx)Q0M@Mnv>Ln!lhV6BH-GxSK?7pw=_okL68X6iJJaOX0mrAK=JH)I64jee} zvrs7XD_z%%((@Q&wxJBO=bIkyp$muftC6cHUr~dK#fu?@gq%SEB7&ytxZigVx2|48 zrB;DognlXNpQ|6TG)ogg=wk#RrHoy_e*KSKU0rWZM`Bt68#iuTxp(j0Gv(#w0o%4g z<4;-yXiCFCcmVI5e+S2J9EYdEkLOpcgswYa+fx@8&N&nm{{8h==>NJ8&6Q2qv;OC( zuB?V&0^@B_N`Z5Z!NEZsJ$iJ@kt0V=O?6K;ou@W$-n_M}tSq3E0%HtB^k9G>nMCoT zV!W~G4IF&&AdLGAmp}Og(Qo^qbDqkDbXk=W8e@o$j^N6t=MlYiAA8p9!ND!R!Q$r@ zLvoo>Cp{QrP)Z>X2w?5nwH-t>Wxh^HAQ%jm*VWZ+b-Uf*oI}&JNrQ6^5TN^Xw6AZ+ zpI&+&4W1BgeEJ#g{Ocw-5f}iH5;|iD_ua$if4_(-vjXq7{vKV;UGSE8p-4@;MtUq+ zvg8M?t*zgiQq_I?_D#AtFfj0PV`Jk_HBHNSW4b{^fCelqU5KXYCdjzJ*)PsuV5A>` zKruKm-0b-Zeb;-@R^5g}n-5{t@>P(!L|WZ!0{}c8kCTW7L!r>$9=3H-4iJ&&9-L{MDTj^>)7zZ z21rM$N~JxU3o0usYj*D3xf#H3rzJo{?AWnm+e%7G45bt_?a^8#r7NtgTZ#9o-h&VV zUcVQTBuLSNu*>CsO2Oyzp`oE+8xb8>N@aHH2^KaqG}P7A)&0;g3|N-+NXDl@MDPZ@ z0Fd&!%H8YZ!5BkLP0iX}yLP<@;Lqvn69{y4bo{8IqM{@p?@xtC3B{>UQc|L|w6ts^ zqQ5GoY+xJ#uh$zqbLPxezuynjG;@~uaX`~FtXj2dQ*(3k3ji(w;|T2Dy}QljaxK4e z=gy4nz>@^$eEz0Qn|_S(1d57^N)8`ByvytL!nW;#NnU6urJ(CNmMvShy`iDu{Rsed_D<` zg-|k?90ZWCEX&As_nk{9r6v^6oslsF<{Anx+Yl#{-wk1tA1D=SUgN#X%fA?z2KZf2mwvg;BcfK7NkRON(Gcs=JbriU5Atsx~_wWG8^o4RR}@|vMdXRVZiNn&uKU6a5yk;-aMG5Ipfjt;Y1&|4*(b= z5Rb=`Qc5O-fWzTHFc_QzvnL`Q%a3w88{3VOz!-t^=gU<88Ggt#L}fp1FfyCs|~}L_q6_lWh~Sa7cXA?{M@;7-vBc_8+{h=e~BF4 Uv&4%UwEzGB07*qoM6N<$f7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG01Ns_ zL_t(&fxVbpj2y>xhQCu)J>9c2v)AErDPF)Oy_6}LG!2_A2mSPEk!mj??5Y$u@t$P5|Eq{tP?)h;iyv)tXe z^rfouFxTCk9SvzS2dL?u>gw+QuXD~{r&_%CjA|k>1E`U2_{o|F67T(bf2VvD0TI!^ z^3s=n>cwY|y)-?MpSR8{0C}Ky%a+4{E4!Kpv{K}wz;4uaakTv6zH(tgYavZj(sbC{XP2IKZ{G#2#MhdZ>sPCO`E~^@nUqUL0uv$v4(N~iE`f?ZIQ>Vz zbog&4OX1VaIN|EeW-9<6EZB#b3?b1n4>Xz?YxmbtK4}5h0p5di9;MporT3IBfnsrN zdb*UG-#Z-!jg7ke(2B3ABj$EXpZFpt_N; z*~tE1z(=8`JdqPx7Q^Nc>Q`6Ir7J1t?HgYs#+ePSUP2_g#^!H0i zmw<@iy~lYE9-On?K}$;OT&CPM~;zaLvBD=VBo zf1WJMIC0_xi;Iht%Vn-yxk9;IW_^8~nVA`;rlz=b=@KHs{QNwXN`lA3x5@$_lkwjUWg})3h5x-4`0OBYc3C zc;Iov2>6Z)^{g+1I)gel_a1Tbqm=3%M>5w7 zp;j30EIK+lE(}!3Ht7)qtmXh0sqj0w5|(v9;$E|6_Uwt2w&7J(?I zsjc7T&h7A#f$q1su}PGZu7vNZLUc-=fgWfPu--E@91BwFdXIChB$*jEl*f17u>C}>E$`hGez*#4wJivJ+eh17DAHT}`ctdp(g*l1 zu&YT2+OSfBP6+K%3$?V^b!S3EP~!1PMjU6tR^&fwbB?2pGrx)ZV+ zf%dSS1ln2L1CJ-!Y_L)j-uDw+4<=dGW2_lX(>ZjOFxjm0v9%38rE5H1bmWRTtf=lY z9>%t;#sddzWzgq=PNfGfNmyA;xey%UM|+P@$(Lw&Pi9k+ETd^H4ePjW9pB3`-e}Z$ zYV8icwsDsyrv;+i)}7RY5MW3x1o+*O*dtyqtJpxzRpu zbTwdD4&VnTadAv9s84-%s<>w#&3X-^HChDK0dH-0*87{<_TN~GiZpLbEU-}hAt!Sd zCxgD|?GA9*IsjY0PPM*sil~Jzyzs?63m*?7n~^t$$QUB6$!krdHIXqC`dbiCFot61 zJP0TT0b@bHq*l1%IB)6w)HmYRR>_an7^Q7b;$Q#lFB~r|Jn>vJ^8`So4O+R@tU8CX zwso!zN)*~TbP{7EZiUY_?-&u3^IV?t5wwUHNrHZHn|r)wFi?lwg-dj zANw>$8ogxhcta^Hik18fo6TDkBg06l+AU`WU+NI;5_nFSO~cZmdJ0xNnFHHxjwm#+ zS!3+NxA|B(#pDWjpfuso%m2Z}i9Mu`9Y!}BJ0uo_BtOnZT`0K0pmu=lmejit@E+A4 zLgj8YE&|gf#rWMtHV+*`n{!5Rm)SEu(1J+RiHa+)z?NQ`Oa zOJ6=H4_SNvyIW%J^Z>}NMd1Jyn!C|lz1V21k+?Pi-eajGjKkovYJK)vK6% z9=zbQjN9uD{rD5)6zKN4p;X#UG9(Fk zZ7^bqMS5$72wn%2)|ZKb)=qEK5PA?Z0Q)ch+jnmt`soih&Hl%%vsf==z9psIaB@v@ zfyU1r1EWxqvANkGH9`~!IjvjuP$!H$_*$Lm^&6PUVB{PaQUnb&1@PzRzIU~>a_P-l zBcqmh>WQb3cvE0VwQKTOMgyhz&v zBa{*&Sbq+*g2{W1UiEtS5$jxEjtFT!PrMmZ{O@mY*xn!#{Zxwknhc>me0GQ->5* zZn6LUf99}RW^BCha9c`xpK+S0Zd4oLTOU*lXJ7xjpMBfcUQWNdZETl7z3Cf(PbJ{c zl;zdUf8qT4dz{aGk~_J5q=Y00X}jeRQWTlXC~Yh=TfM;i<^^Vp78B-4?Sq3CAZK7b zQycf2xo>^2Ry_Oq+0Vc2{h9QuXLq@$lQf?@^V_*+PpZ!Y3kVp651JdgQdh-mxg)dH z(xHQKerhjaz8Dx$5otY&H!AtHTel{wSC(hw{#rOWkvTEmxsi&Vfo83*eNf@u*Z$%3 zJO196laC}ligd|0;9q}FX5T%&_py7EN6Q&no9gn~*blER@4L^+Z+ZWbFM3q=fBx1Q UPGcw`*Z=?k07*qoM6N<$g4`!H*8l(j literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-files.png b/media/images/administrator/icon-48-files.png new file mode 100644 index 0000000000000000000000000000000000000000..41469113b28e28129c2f8bea652a87056cbe027a GIT binary patch literal 3234 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 UPGcw`*Z=?k07*qoM6N<$g4`!H*8l(j literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-info.png b/media/images/administrator/icon-48-info.png new file mode 100644 index 0000000000000000000000000000000000000000..77ebfe26fad5760367b6d834e92b5e10f2bc060a GIT binary patch literal 2430 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 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-lics.png b/media/images/administrator/icon-48-lics.png new file mode 100644 index 0000000000000000000000000000000000000000..49525552dc2475fd8c2b1e260339e199d671e7d6 GIT binary patch literal 3961 zcmWkx3p`WpA0K&HUb*ETxsSOo4GXbcM%u)}OHm|pf78O;4SAU;w<*_LLWw>pEB8<+ zm(gf3EcXy|O>&vb|7oAk**VYoob#OX{C?ltNwUFTIL0r@4}n0A;jrd*V2}K>L3zRd z74Drxu;U5B;OwE`7X|gW2gXP5V4Z>>kiSL$Y+PT)qW8eb6U6h5M6*CoH=-}$w!FQs zzb8Zsd0Gc~8hLi3~#h4h~*{vmh~L)`*BA*LP#cTaf>-$2h$Lg2qa@@D^_c&UtH z2t;rIXKrfmbN6H3wOi86@XnYZR>4^Ah|74^#k^@s6a4(ZGtDeSkKnhmwTss!v0e}L z6ixce-+g}??K@C6r^MwarJAgJY)`B>Vd|n?aqL*R1WEN)x%Q2V$*Q&`z4t>J-ua$> zV`!MILn`)eMB(ylMSdOO{dU%HzIW&IVbfkKK`p@z3qReu_w)Ep)WLxx;OOy~AMaTF%*t%Vo{Y&95C12a}1$drvm! z@(Bm5I;W*r?!x($GP?>c7iR0&iB^nXjUMa`B@V(rnvZo%i-yO&)Q1U z>NLm5`}5-u0n!5PlT+=9^;NWAzfgmIkL00{HFVm@h!Y$){V7E%=UI}c6FO`ymQjA` zI2lHEvw1P-qnrPhuc{YJN@x~7995qp{e=PI$giagy@&8>4Kra#m-Ny&ve2w zarh#m6m}yxn46n}wx`QOeQK^kVO_Iwe8c{j%5+Rg~m0qun2hpNov?1%{zm<;?AtOA=%O zA)z;K-^RO1JV;G-m*6dm`gt_hiu~b&sji;hNeKxPsOihgrOujfs8md~W7(jet!B2G z7(e7kW2!JWeWRYZKvBYd(Qv(%gcO)zi??onbk)u8ThkZ8#AEJl8$sjxxAwOUI|BsK zQs)?vr{kf7i58ivmoF1uUe@?FI?Au7tJ{_+BuCcJ(3p}Uyc?(wSsuL;} zC9LHy3&ht5HbgsPgKM}p#Z7{5&Nq*DiDNFz(?xyo%y+vbt+H}GsIs!e_v(XKI1WpR zpASbM5ROzt(ePtIRbeuWieTK*4PR~E`VrF9+t>FI|Bgx(H4J!pxqXWSac0i;=IW?~ zxU*^-A~w~NON!YBR77X?e7JK<)Cf1etOLf=hBSwMNcda4AC-a>s9>_;qDMhj*3d!@ z4!QaHM}8NyTz_?(hl@laJvIy#WS|Cu3o<4PIW4*X;KywkO7?MML&3k#&c zfBAX@O1Fm(O7g4UnOzP?1oOJ4=6r?yG=O3C@oY;aGMOxR8{;5UEDQ?}RT5O|Uk*7b zC+F?%4iK@iu~FS_4n4Q^EeJ~y%kR(C@dlu}T_?o~mLOv(<`QJE+Ovg1HWl`Q{^nVp zlSx(?v?zm8$E_J%ktz%gj>R4)VKCVbuB87Of-L<;KK7DZN=#2`wMu<#eEM zbU1WP)wsS&%9U<>7-iuw_=iBvbraDXJvX|q^um#5m4o2#@Su2Mzz%;_SYc?HsBPRY zv=Dt`ja0O-;LCoReSJ4vm`Co2UYf(?rBkND>Gb)L(NXuvNY3zlgqiM=qOP%V%wo4n z(c?M&zalQV+KSmbC_&@Gs_zN%n8pfoJ2=d&DyT3~De}gbQfU;YguPnKE(+0Jb3V6?Z-gr@Iur?xg$c9hihwf z;sOIDn#2S69oX<-mE)N8aeQ2MIV3;ID9xXR%D1*+fHDL&NasBZ*qF2axq}|Not>0) zbZBTuLPln`qP)<6GA4_g15;cw+JSFI$h0Hf4Xw%<0LXBh*!}a8DZDMKia62b5UF+~ zXt9;@f1XayD=pO@VQe1`SDmpgz5GH;SNB9|HWrSBiWHli@p&Ws+Yd%93+=vZn>RVbuB$uT3d5sJYPXgLm;qidpcU;7Al$_k$Cj&m|mQTStAJRPi zYOYFG*gKrl?vcUGq3JhCB$-%H*^rQs*Z%o;?{a|yAc#v#OAs6NN5d>u>By~VeZk5~ zJM~A7E-oqEW5dG|Y&IKI3}t=O+dGkH&^I)6f{J+4+$@tn;9W$rP=Dke5|XvN>_5b0 zs%6uB@2JL0 zpH7Qm)_Qg5(h&^^S|T;-;iNOuGcZu}ye%{i0_3jGxXk43QD*Q>b?JeLdzvpQB^kF^ zwKH+w?+4mj95jAuvM5{1Ru{Hb7vs0GvVw5dL!+aOyq*l?AZYbfk@9+grbRb8yh~L7 zCzA@tL1EMLCF{^r0N|3aO0{_5PF-j!LM=2Tq@KjlZE#LKIEY5m6$|j4HLra0>|Z!& z=UVN>byZ8HSoD&vzC4kD;hNae5>O1e+KznAWJAgrzVX5VcqdoaPAURTFSSv%dBp@o zh%$=N=21|BWMyaP=H-Ll6yLyzyfi)e<579 z9A8jkSJAn8+Ye~+s;Yn_jZ^KuwURB8N`}Doi5kYNiOs--BKT}pw0amA&fxWZ2I5eVJax?8*kLYMwr>q^Ia>AH?CNptHA5;r6 zx~w~LE6bwvuA9Wt%E}63*@`?UWbCmT+FClv_xy*C>W}9+aBQ)H&4Re*P)y6E<$ZC9 zu&GEDGsy2!%u~A$C~FWjL2ZDR#L3??>~E~nK_X4mA58dbi8aaP7_7w|s$sQQ6?U~gE zrcz!Qp-$FRa7-@g7}J6A1O)|YX;>>~YW3O{`M9~kG@XHGu{p%UFg}lyuCa;l72kg- zPq?4@-mL#ar=rQhjP{CF!_4pm-^xVmCEa|bTq}im6Xs^lRu{E*rZWw23uJ(DhN-O> zn%-XP@61dw6o2LmvTlX_;^AYbEL@?HwLFiDv$W{jb(;*4_;pvlG-b_|1sn?3#;H{O zdQB*5ccC1lTky68c)oVz_R<^r9hYpo3iIacX(D%|69XHpKtY6JwvT|61bnoohaW_9 zVv~!Pw>L;BDeKbz~V8;je8Zb|GBcT32ub2(Q1<}ojg6e85a$=${N)k)y`21Ng zbp~lr z(8e)MfR4*AJ_7%!Vt@LEhH?Wr5ikRC@9&>7HRUGV=@uHA?e*ql{uf}o3&cG4>UsiY zOmjYZ_a7s_8lRQ}gXqcr4=^rltOo6#_^Y7buUwVceD^Xb4PDQqQg|DjHE(M#FE0bB z1-1$FZE{i`6bTrv#f1wEF^5J^?UMXzdLC(9!Im@l^li*}6l>LRqU|J-^Ues}arblR z^Zi}s+mO(7v|R9=^t;*D-RBzSC1fQP_Ry~$=cEV<3To@<91l%qED*nGieQjhTBh2$ za40t*G8F*=MVE(m&NEycE9GMQ3|zpBn||{~SPpIC&}eftT0D}F*1x4iCU-3wOiFu|B_(Sjza|s2b zw1|v06;qQH|DoSK0dEb)yTtLF=Ld(`I0* zlMYJ=uQEjaP0Y()kC$zu{kL)0kyL7-{ttO=p+f)w literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-logs.png b/media/images/administrator/icon-48-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..955a19f9751655e696ea7f148ac1b2033003c9a6 GIT binary patch literal 3762 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 Knlu`F-}*laxjLNy literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-pd-multiple.png b/media/images/administrator/icon-48-pd-multiple.png new file mode 100644 index 0000000000000000000000000000000000000000..8056d9e60cba5d18657f463466d1c76534b2b03f GIT binary patch literal 2710 zcmV;H3TgF;P)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG0156% zL_t(&fz_I6Y+Th9fWP~eSv)fy+p#lvkL@%GOA?wuf*~LpLZJjfp(;|v(l%XGRj5cT z>IQ95DT*rSLWTHI6^SZDVi7cKRn;VdrliUOBtRMx2RC*S?_+!R_vXEKZ-30B!H&nf z67@(=8qK@!-t(P%&OPVe_r(48-`^IC#n!v7+X_hjKSVPOqqD!if2R?P#nx}ywCN$g z-yZ|i`POWjB5d34fA-mDFFhWSjAH~t-`BV(Wg%mzRRgb;vs=5YleQA&ZD zotJtDTFZvH?GiyC9R1(_V*sp7n$DDS-WSLEp^ewgFwhqMBBur$Uubcz6zT16DD;9w6sPdrSAz8kzK zcvA(v0LqYf?2=osI&-XOeV9yn7%>HeT?7~}6S|O9(t>9imSrpsbpM_Xxf@i)3{#*E zBEmlR6(U`Y#1?-a%O@u7!=_-|@g_Peh+SET0d4Z(8R^;1f$W=Ll+Q%-&xi&D*pt}8 z4gFVcT#}UF)$f`(jc79aCGQZr00SR%n|^=M@GguKCq4Y$`xdN8luE3 zSj^CcN_n$TkQ@1glbMe}3(hLnjS=OiJGqBgsu!!WzGN&|6kTXqL99TVNHGD1gk89+)KzY-Kr00x!7-*W1C9jOD-e$t z0eA|Mp$n-DUQ8~%8}vDD1>2vvlRlx^>G$3a|b9wTl}ca+1k0;WL9Pux<2qjt)G^imEgHpOwhGIWW1HC?yI7S@DvdM!<9_ z%jRJ5PvI*c!WW(c6kPW-eD6cJZZoDWsdnQuW)AV%qOZ|jaS)s^s(m}u-AzqC#kck6 zaQ8jQa898YXJU-DIS&@*4zncHNl0@hv}h@jXaw90dB4esR)s6f!v9L3G!w@*&<}5c zo-U|phD*N-`=5sXBQUrJ>DLG+yLhzuPt^K`3a(~4h`Q_G)E?+7XuCA^3|&X=qG{<$ zG))@|5YOtYP5+Ur#Rmw2GoAru2)qUp#hJa15Q>p(l+N@*F3KK&!2@vNT3GV{9D5V? z{uQEdT&v*{?M=Sq-vL?+th^JnGRUW(=5kp7Ge{gGv~Me%_y@VR&!g-5SO6(Ka)}Ii zCpYVIU!65;3QgsB%d4ZMVwhmq0&5sLUWarKRDz@Vczv`HAxAK>c?hnA)xRt}p3gw@ z23T}G^zMhfThZ(UQi2d-oWpAZE9D?ZGYDh8c3c8MhJD!qi;7WS|t-T_;00UeIz zD|w~Ao<2K{5PpU(SU~lsZ@|%J@KwP*yJ7!R@Xl{ROQAIID%$WFg~Q%40J@=LjikwR zr7--Nc>*|%G01WJJlR!2eYlRG8DK+x$Io;PmEsj7_9*t(iy@f5oM?4&VQ384@|(dR@7`W$Y#vWJxy^byP} z5_XV%9hGeR&kD8=MA;BL2v!3AatHLi4?Y<3f^@BVf>llRIGHp`sj&dzppSbVe1c@E zaC7dbR%1m7f$i#i`q5ilsqQ1J4})Fyb2rMsE1I}F3XMeAVsFW}%- z=uOZh4|8So1;j1S;aWeSf3y$H3{qaxz>=tWZc2$#qJTvA+bl~Rg76}!t_ObuI2owC z44fK>AEvT<8}az3v@ULg+Nw$WJf{FIAhJD}Dd3uCpz+4S4JQK|w-$cyd;tI7euI-5 z0NSSP^PB?cfHJFb^I-hz5qR%;XljQ`?uH!?L82E_Y)#rSjPEC6-e|r?sWdb-a&pO| zw)%=GEnC!CGYrG%%;j>uQp$7ov4^P%>ek*tPklSbPkbP-6Nqpv;pSDU>4F8gnKb#y zUy};kw)+jk=oIJca~q$}#2*Zk)ho2TG(=FdrOz2rRxXR{PW6`Y%;z@$1;u?(X>jp2 QDF6Tf07*qoM6N<$f;Qmr0RR91 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-phoca.png b/media/images/administrator/icon-48-phoca.png new file mode 100644 index 0000000000000000000000000000000000000000..7a35e909d286984ef2e5f6958b67ecf2cfd3c4bd GIT binary patch literal 4373 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 HMd<$lQTi{f literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-phocadownload.png b/media/images/administrator/icon-48-phocadownload.png new file mode 100644 index 0000000000000000000000000000000000000000..440c05e9a7ae653603650fe04649af21ccd6ad2a GIT binary patch literal 2984 zcmV;Z3s>}sP)I@GYfCB zNV0IU&MxpK+hmz6i~y4afnbb`*ak)(+mlJmP!uJIY?`D*HoMvEN7b!+PZqbk`oZEu zm_gtivcamlRp;JwzVAHhHq{$%yrHYr>Qh?lMZocoA=)|j;PU0mt6{ZTefq~g`SDwG zGjm^xR3svD;*-J&<8sRQY0m>E%`XTFg;P!)G!O2)`R1Gd9%`)@=4R%;Vkhjy<-KJh z9ify0K+*fF)X4GpSpU4}_@ps~!vCH;Hhk>Fu{f~^5NWL!Lcql;PCwcGgttC^iPw*-uTFQf4ty1BZlW6f1Y!4E(KiJhej(+9K=LHbVO;9vPZo(a^Ba^ z*!{h0`Oh$FeUxN?EI`=5!HL6ILuRvMC;xj~8!@opnh}E&H);TY!(p7kI8!{C?ok1a zQw}W}CocEYNzjkbqo+p@|Gaqbp4AxRya9c51_tyHFwW!;gkeY!1|FGihBX!hw9*7Y zK)GC|R4SpB##uMI5asC*gaJ_)k=YEB7_Y;59Z?*49dQZkEMnzUw2U(&nJVmO5)r|; z0fmAfpt;jzXLW~?D=`z#FcnWxic2UI85z5Fm$q(Geyq%e%NK~F80&04Sr7!YYi-s) zT}LH~sc4GHc#=4ZQA*LINk=-kievuLJPV5p-n&i}BB)R~0!Jw{gn&|hfz9Hv3W~XPFC{LiYhuk{LVf&Evops(_ewUlKZ!&dhigPpP$ZUpI8qvaMcR%Cxe|nv7 z|MRz*nVz9is-U$7Aj>l9%{sTMxB25=|H$g@Dwm$TL^&>Foh_teYSWy$g+XkrL2Hf8 zER(a7yz;NFFj=0Yn{=^a!45LO^yD;OedeotW9b{bdhbEi6wsc@()p|qHWrqjxHm! z8Hb%?bRd|_&}=tpbz8jr+{=9To8RT2c0kv3^Q6+xj(rCY2XSsde?ghc@`tRmdHL>3 z6h;IpAkq<080C4o-l_BS{L{Sl^lLPeW=_Y2}zDe4AU9TfBYmZJGy70v+U3o+;0;G_yovlTixw5Eu?(O@WAbW31RC z*DI9@50i)7ZrtWKpZ$hg+qakqC-U()in$P8@ciygJknu`N3xZ+SZ}WLUh_TP+j@_3 zP|kHoC|sSoN=cP+XAZ|hAp(Vl6tuqmAavqLx(PQ|ZW07RKBfcBw4O%eQ(oq>BRcw? z?$h)StAC)Cw$MuF^Da&-GOK5ETK8*|v7<3?q5}9heM`YpyGzbIk)$XzSV3kr>%5_YZCpoXrlgS{dj8JGi3q7ic2v#iZPTNDO21YvP z@_0H90c!{2ZP#XHdnM0mB0?O;oD0tRtIUsYHk24Wa5a}pyGII*K^z2!vNJ`}r z^?P*|?k@22fBQLKzVc-{NvEewvsPWB9@I(FB+n{E(y#cL&9GQHrh{{Xg(;=bqCtj? zEodc1V?dDyCpQNE&&?M$UZ&=bzxU+nR5B~cD zHp`pbDc|Al#@+mlt4K#K%4Zs_{JZsJJV_XYzVTBEapGHQ3>jIzgJH2FNns=glpfm3 zQ0j=+;wWZiWrekSYY4*b!7jUYm&3;nS?#W}R$U_s1{-6;n^s5Gul!s}D_rK7o0!X+ zLI7tSEz`njpT!(Lqh*YCw*v#zKxsa~*yI|`=I$oHZT^;WrHq*|)J%=d?M>QAn>dU| zpHYLIyORvCiRIGVr9m}U3X>WR(gW}PA!j;VaS->n?@r1>2vo`y_Sj?n;kplW5h5K? z4$DXLeUXl_aitZK2v;v$&0jUO*0kGg>ZVR6*%8MM>pU5OW4zbjL5qTDY&~Q5pN4=| zSZkSf(=1(CqH6{Pu~x6K@AmyRkJiUBBPU&dgKGFwB%*w-?!P6S_Bj>>1wjd@EV8Z^j4y%ke-Cj_pWsI?{D}GQ%=6qc&(Sz+0G|74 zJLSWb580d9qrP1y)MM?)NeKKsL`0~RD!lOQ3s|xF;+0aA;u1IBxxxMTJ{z44oVbzN zP$VN+s1SkUynI#!`u7YW>BMo^J$_ literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-rafile.png b/media/images/administrator/icon-48-rafile.png new file mode 100644 index 0000000000000000000000000000000000000000..60aa0171f0be4e6e73c55dc2bc1cc8238580358a GIT binary patch literal 2592 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 MH;vJis5>$L2TL66egFUf literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-stat.png b/media/images/administrator/icon-48-stat.png new file mode 100644 index 0000000000000000000000000000000000000000..9e14ab06473ca7f0a0c8874a0c8bf3342a1831d8 GIT binary patch literal 1190 zcmV;X1X=ruP) zL_t(&f$ds7h+I_^{?2`GW_CB5%)&|}2_&1vXqPG`h!8~4R8}d3fK3FGE@ES0mBK=T zkRr{NDboaO#41Dt6%A;$Ag*kPM%}_q!v19b?l~6k-M8;eoSl2_yI~0AOfkc7&wbx_ z&v$;_n;{XwvutM40P0#AW0UhAf3m=7<2XcG0DMBq0DirG<+Ek+TR+mG5cuc#JD2`F zcIqQyKP-{}d;ePb>h{dcS!{22>RdYt0W+}s`>k0J`>p2$0MiR=j~`C~m^=ZnSn9)@ z05Je7)^qu;7Ks1=o4;#(B3L{E1L)H6nI<5}A{N1R2+)V1Kg~3jrHwvlY=>YF7OC^@ z2TPmu-q#tRNk-u4k2Lk&oASln7ES}8v7Q7d*Tv>QseuV8vXbYyBNEZ-qc^UxyM69tO4B$_|Co1`Gj%RRn}&=R}nRD5*CG0TluSDPI0K#6>_`Mj6<@UcVMSK_Dms zOgaJvAZrF+o_l5S(`y$_H+z`(@+N=@tFL{Jo1foU+I)gQh=eLRpooAOB)vb5EWYv6 ztGLR>(>DS3J;0;4Zs87q{0U?cARPfGIR`3E1l(SMNvx4j83@Cv*UxWg-H?O=B0vFU)Ddui;z>xK1A>4m zR3@N}!0r;#_krT#Ap{b{l~8B|RHe`XvB(I-lu%F(xGJRSesz*~l!T~gWXdX3PGVns z8U##bm zgCK1P<U`U5rFUN3GCv!}9xoaMH2e5HVO}e~Dt@Ua!qod`4({#Yh@tU^NdRrL?RI{- zyT0&Xg%%EDK1o}tm!#P8y*0c3aN|(__2zs#ot^e0Ab{EIuHCM^w9*M|G0pR(6B_?do2~67l1DJ|kaJU96umAu607*qoM6N<$ Ef>87VFaQ7m literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-styles.png b/media/images/administrator/icon-48-styles.png new file mode 100644 index 0000000000000000000000000000000000000000..26c5327e11f7f1970fd8c33de0a8d5f86b0a388a GIT binary patch literal 3085 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 M07*qoM6N<$f_+Ky&j0`b literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-uploads.png b/media/images/administrator/icon-48-uploads.png new file mode 100644 index 0000000000000000000000000000000000000000..f2dde80fffa5b433735535f5aec56602b18d2a9d GIT binary patch literal 2234 zcmV;r2u1gaP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00Csezf@LDV*N2~Q_(6JX)B1S+L)$H>()x^)KSziF$$GhZGvu~1*dBXgv4><#P+-Q z?2p)Pe%m2&U|%Vc^L+j8`J8j^Irl!Bm>K`i62-hZg}eO}zUUNlj-ml<3h#dKSNOv3 z+VQ}fyTXreM3{;)56yH6Q5e?K*tGqAymjDn=&3Rw5M|HcSz7tyJ^1a59C3PQbiSDc zm=k`p_8A;Fa5taZK3@>(%z79w5p^%3QzdYo?tJ|f?AY^8WY_yMHRp^0Yz*&N{T2Sr z^9ymYsn#k-jTHhw02m;FtLaY=O@53HuDSGQdT8Iv`1!9nf@x1aZ2$_xvlowk>pp$r znFXS!BIK_{sZ|cJ8ZtgN&_Kfd6qoxu(CK=TXGQZ*cjJ{8ITGr=X#h3hKi2KT51w7B z-+OGnO<3S8fF*4}s|jY4(Cnf!-igkE1TN4We>z5w?|v)t-o~XwN5GKIn@9tIRagD01CsuA79>i zKfkkYf!SMDH)kGveg|+}K=Q+}jTTH=S-vXIt5X&?ZPWdZr_M+Db((cKq^AvDrTp*t4GAOjy_aeElY zztI<2)?cViM#0tt_&m;%gFgSK2wdrf#O0XgGz%l3dV+V5Yu1!h0V+=xNP&2w9~Z7% zSG}?#CP}0WF^42H`H-+H5jB8i1=}+$cGOt?l`m?;;=?N9J?ho$J7 z2h#;89{@v07fBg#UzOXQjw1B7AN>}<`a|4)t5>i71rhC^2x3BjHEY(~wRi8{XKQL|%3aq5jkDgQ zlt{tCppc(cAzf$+5jjrKtf;6kwQ|P{V`fMxZOgKr42Q#S19)vp0PEMU-#B;f+;V1y z5aXXbi3miQ_of8Exz7tBzhL0AAB1q@7XKRkf&0AN6hj01S`(pyzk6>M#7{c1q~MC5O8Z{HjY1}F7? z7Qiq}7?ecfW1#z87nuAbfB_8t7myeL44F3q0ALsfmM&fTNGKHgSu`5$m=s{kmM!(?+GpscK{^3b6}I|6|KT-Tj)XlF~z4AV5Rc=6&b&CSh6PoF;h4+8+2nwpk2Ha6Z< zS66qlZ7fJ0kEf=wv2hiEAppm5V49}ZT2HC^+zd%6hx(7>Xdsh9$z-w@z+gI^w)1u0 z*%b5G#;CQ1QVK-W17rZ0S!=DeQVL2<@LY2imDx(?US|v*@jo(WR|6QT$*$|>{%)qS zUXR6M={@JWFyZq?Cfz8a+Kdh{xj-p2B8A z*_^JetsT=eQ>hgEem}fkFO*V{Qetp$5b<~%wrzu%N9>_S04Sv}Fff3wuCAgsvvfKQ z$8n&w9^uVwio{|ucsw5Xd_E+TNyK8Y5l$Wx0bnR}sZ!bE!9O1eh7uu3f|R>(`4O0V2YZB}>MwdPD@%G@-SIX__FS zT!Wpc3PCAF>2w;lZNumD6?HdiSr$r4N{~vW@}37qFZ5x306+#{U|=ArwH8V#SeAwA z>gpnxJyO|Ro~om=i&!a@1Tp}pPMx~k+1dFA!!R}>^U&i~6%lb)SJ&UpojdnFFzh?B zMT-`dx3#t1W7~Ggt@;a=OsWr_IdkTNlP6Dp1Qg-760@!U0U4vAP|-&si~s-t07*qo IM6N<$f)+mZo&W#< literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-user-stat.png b/media/images/administrator/icon-48-user-stat.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6cc156dc66456ab16d24ab3492bfb148da67fe GIT binary patch literal 2047 zcmV7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00&n| zL_t(&f$f@2Y+P3r$A9O(_vXv?jAJ(+cGKpAB&AeMAR=udL=ZHzi_#6PT0jB`5D+0D z5G+`*VgVAWkPzx7n@X$@NVHIi@~I?cLDVRfqEK1Tq%kBmt)0Zlcs}0D`?!b2n;DOt z@%W8n6jkaOJ&io?-t*4?o^$@^-1{u5%6nPN-8SG(#oY)cU-|C$cUsrmk7^c3<5CO! z>le@eXiC$KUsW~)z`Oe&|Mrc&kA6pNI$P9%k^f$L^>m@|H1&GpPM*CX08A8b3A4k9 zO*h^;fR%gZd_M==eE?XEB_uTfu|TYG%He%wg8%?=>wAzn8z378AY!m|d`|;V5|3?w zECGK24rAY4w#k&I$(I};54eOu^S2igGI5}fdHuJ(uxiUK%6`4 zgJ2l|K|7!Hc4*rJgVLylEem(fMYjQ1mj|r$2OzCml8jLWViW!D3;TBe;Dv7-%><11 znY~Pp6{e4z;iaGa>O}Q60P6{%WjWBp1Qoym*Mf-y)VKs+_ZrdQ! zh=5o$^vJh=THyh^t`L$H02D9|jL)8A^QrHVnLVF`O>3pcF1&&ajUH$m{J58ocExqm za8f-q3Bk^~!LnM|zH7UZIo+p|#H~vd#;^RDv0pz;{PuZj3U#1vp{}i~e5=5zS3kP{ zFVn`e*(GXCb9KooG@90@B-XZRR6z|CEB|5m_s3~myM^X}CWt`TOr|()5?&IJt{Uz|n@boN_*9VYhPhei<# zbJqx)5vt(U1MYq49J3D`qn3^P*Ak(h2ijg-XA(!r19FwCMCX1<5Q8)!48Zr{@Z$$L z{;g-odvJB;1`9VU1VKbDtYL>J0CKR020jwQDgXe&<#6m%!JUkh& z^_fSRz80|Wf$bc7>>&>98^_TA!Y<3YAK^NDIG2HjK%UjZXzdUhybg5S8beSEd3bNg z*PeZnX3Zn(31|dy{q|Mu{#%u;o?xnA`|T^%3ZeCSphIu5;u3-N$(p#;UZhzL#TAQD zu*+EfwqgB4Xk9tbW+4TvOS$QRjld4J-6}^B5%lExj`Ry5=@ha7SxA<8A%nw}Tbm$` zTB_4)y4Z-oxdQ-ZSu;0y2uYmm5T|b3N2OvI84e*%sVB1htscN8>3>?$Hoi-3$Ir5C zKQKTWA+3|P2pkJnYrA=EdMjiar0NS?%jH`Er)&hS4BSd|0q9QRw4XQu(QYMTFiw#d z-#9|OEZ~GoH+o$XgN^v{l{yQn>3pg|FFk3FNW6@yBQ9?s&HFmvNC<&o<8mE&agjC~D)bp>gXW}dme((xgCL(5T zj`Q-H0Z;8+#LWSbEK#77@a36Hc}`X*`0R&@)P0`|3)eYaxyI#E1bL@-GOtz#WF0gr zDD|+A+w7d*y!X&s?A&u56%Ri&Qa4S>fpV!6DdMDsKEA8=f#*23kQyAs@|DTP;j)iGh-*cie^vlFE_Mr3uhssd6O$rj@IARh*{ z4uEAORq{YWUqTfjY|ZO=P8}yzzA@>UN=1`BUnb;j$J)7$s?M8w5prLAVsa#4hv~B{ znjGWE{R_4@R@UK0Ggw3*HzDAnH$b+avZ1U`(*_*it43Bf5G+R z5D-&s&dnZwWcu_EPuS%E01=r0CRZw29ShyBDF!{~6ngfTJ;!x>wydg`Iyc|{Ux~Xc d?*q8o@;~5NO?NVzML_@n002ovPDHLkV1lo#ywLyv literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-users.png b/media/images/administrator/icon-48-users.png new file mode 100644 index 0000000000000000000000000000000000000000..173f4af0f31e979b7aff15ee7f17544b993a2fcf GIT binary patch literal 2029 zcmV7IZ~ebVG7wVRUJ4ZXi@?ZDjy4FfTJOFEBam3nhvG00%`$ zL_t(&f$f@Ya8%V9$N%Tt-J8w6gzRRMKnOAH5YiGFh0qeLf`XBusF5lIMmn^DaV#BL z9fs)?I!?#d_5($x7^Tn-)hQMSwc1u|bimS3C@7MNG{rQ6A#c0cY_jif_uljL!x9bA z(A>=i!c6}&=hMCSJpbQ$dCto&BO+YS;@8^1cy-+a7$&OX@1BN*&YaE$0Dfy#w4of) ziHO58IR`ese9@l#>-O8o`_WRw2IfFZH~j#5z17|i~#%| z;7#=#?$tg%_I(O=-vTAVAx6B!86aB~Hl_Go!|bIy_cT1yIPSp60Km3Wuz7y5Y@5>Y z{$q#+Wnuu>C@)j$5i{GvMpyOEZ`l9l&g~Y&#}j{C08h5Tdj7GmKb^er-bPZCv8Mz9 zFgXiZWjF7b|Jspl-vg5AdPqA9eF*ULTWfw4X?t&DGNwQkfU1tM2p}0vAoA}MTh6Sh z-JGrmU>rU0Nd3dBd`Ax+)FNRy-DV&SFy`7r`8D6U_t{;)Jd#cwX@!2`wqK-3!^TTf1$6|D1gw z9#+5%0EUe~#sHxK;Sgxvl1h4f>jP}&G%LJ=QFQeN;Pwn+a3F+OEDj+ElEh)Lno&AE zm-~|PgNzluLDZvbLhA--*|&3k#M8Gx)c`hP`Xpk2N}xMe-%gtzUBQa%oIylUWM?SK za{ym);!-00lo=pE0=l}xw=cSL>6ZYsOejF-sedjE`GVOJ2cQ9h03`_|04ly=D(W_@ zz^WBbfiX0cm$ZT7|M%GH|p`D8=&p2qqa4N7R_3JcR5a-xd;F# zDRE*>c_E6OCI(6ZYJ7B~R}u&Eb0imI#WGRXnCF2m07JrADa!^_>v_L`3aw<&2UP0L!3xCJ;?%Xzf;-_4v^Z z003{Ejvx1h)i8Jl0l0uSsJag|MNdsUz^mStcDHgIL)j=3g$U<*ly}b_Yiply0HW7p zZ#5?lgd-ZjhbHqlibNO;s>-V;6E6}SS0@|*0DiV3_7A`YkT+hy_1fY zv;c@+3_SU~?+PS4Tq ze`KD&z+wiVxATpJ!63)pmc0IuYIr-+-QU>S*!s7|=EjS9su?rDl9DA;s~)WSrgN6F z&gQf&%(BXcP=sI`=tbRZFRWGo${0IT78vj|9B40uT2KIMHb*k1AUYWRXrN=@mG-0U z2M)b`s5K)1jIpdun>XDzt#aBAYz4Nj8cYU|AP^B4X9$G_Onx8knc;=2Pz8ts8vFc0 z%>YQL%yq6;#-F?M0jC3I6HC>_7#L>|sz78Qa?#u7-FtG+$$d?proOZRY8TeJDpprK z;cz*=C0k@hTFUqcK*SY7+!sZKX#mwzBPh<%03$v-d=Wqj(BU`WgxiX9iUZcXY{&+D zu089=cNFF~-0ohL|tr?K$1EwP9Do@5T)9P~Ahf zmMklI-dtdwDYTKdw4-YXL{Wick{~WYbBRHg8DuH-o}R?PC5~h$necqzd3^Vd-Ov6{ zfORX^%`LsB^c8cVdA1(&m)8og5r=mIrM-dW5=SzejC)RazWrRob1z*MYB<31+~u~) z?UjG9mReU5T?#nbP4m?h0nEUV=udQZ{iW+0FZ}6+vqO(AI}gm-Fsn|UDz8*DCG*?; z@hS;OQ=}Pr)p=WPVmEDUre+lw2C(MFHO}G<#SaUE0I8GBeM*co7z>Q|FIcx=AAo-V z!vO5J*l&gf^AvRww*HU=02vmO%XAk;0!U7&T9Y)cdrNS&#Q|nx)ob(Dnh$ypMhyT^ z!)jRBQ)T5U)XCfWLn44=a#`kDasi|OT=gyzBrb@M=z{>C6q)CXG?Wz;v`Z!_4h&19 z^=s?xAQXXP#HINp69LfR<;C2y=jlBnqrVeh3tjhrHTXZkwbp+Dr~mR0Zlykj00000 LNkvXXu0mjfI47P^ literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-48-vote-file.png b/media/images/administrator/icon-48-vote-file.png new file mode 100644 index 0000000000000000000000000000000000000000..60aa0171f0be4e6e73c55dc2bc1cc8238580358a GIT binary patch literal 2592 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 K%T>sjh5QGzLOufk literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pcm.png b/media/images/administrator/icon-box-pcm.png new file mode 100644 index 0000000000000000000000000000000000000000..26f3e87c32c05939fb9e0a56276a31783584d326 GIT binary patch literal 10657 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ΞEH8gQ_1u`ty|6E2EQ^FT$lEg{^nzPP)LKd>eBM^VynwX zzBPX?z)$DrE{3&pOzs&R*l6KXNdQOZ%k-nA|DU9CwAS58zjd+)*&1s!Ab$ zVcGbp&50S-ANlt3tp9DYa=Adzi*U;`2M>)ezCjWxBszr z;GY02BWnFI(2b_2NQx8LtrznLWa7nxyrBPxBF*6Q-D6O&<&O$i!hUW*77CyBAZS+4 zYH?jVr*URt@~ybP7xFr>e7rd(5%Rng9 zuXw-(JS;ErUs2!jC0nB8Z|-x673}V))CVk+o>i)tBEtm=$E(Lspz^zJp_&oYEQHBd zS~rVgN;)n(4f0)HUdFB&?9Sc>Fs7n&ad9;^HK{SQn@zT#etmRzI^F#N>1#MDLsQ$8V08+W#Quwr_tW`MW>(fl zPY8nW?O(SX5x=zNX5O3AwFwOsk%4xPLw=tN>Xubsrua?6=0*!33_1KR@UR9zE|>-e zk}Wq2d|3y{GxV`@9|Y?L)0g56K6vB-xu#10XK`_4FpijzknrFAZoZA9Bj&_q>voy} zYqqCt(wwYt0>?R#@MX8!8A-h2Oe??MdfGUq$zAcp`PC)c*|=9%a=_!wdD}!ld|R7< zQ^zqcAOyYE0{CpkbN>Cve`e0V`$czmk=~8jQ!aYVK<2#;cXP4=dt7^U8xzIXO8+o(2S%nX3Lq?JKnM^#-dTRb5{SFKkK`1KZ5ga}MYWB>Z23 zfxE?%3dt0z{-=hHRyw?_Ht8v;1fP+qztcuUF+_ zV=Z0REC7EWVtc({`~N_~z^N@_x?Ck$u3X^$0j=w*l#N432)4dXk^lG?p=86Q{Xzhc z#$|TKc!Y1?zIA(f@?nM*wX~!|4O)0V8iUquStyjamGKni*N_5R2v{7OO>Pii$(v*N!=ytYpM_9eK);m7uaL)+=9-(-l& zw*%^FH{4Fo2z{tLR}+f_0pzdeGT1Qa`5I6O$z!Z9@in5=ws0d449O8GUT#))lIohz z$nWb?)c*mkngF)#Iyyf7-$Vl_WWdDImKHB*gr-mEPn^F^_RtN`Aa4oylxI#5A=117Dr~rkb{R!g-}tGd*qTQ&`Lvgis~Wy zhl~m0WEEt5eB62g#9eN9c1wC{RWbSYXeQTx zed6Qi_-_-tZRdl;_)tcDrdfL)Utiz54gBr};Tz$%LoQKzF(Gov`HGNmoDBkr3Ns@^ zf?CF#W{2iM-1)L%wz*BuE0?rIDu%dg7c*eODo%hXK5+Y-boz)iaf#k_Izb}fx((bdzw)ME;KmL;ML1a3oFYOZ<{(7oYfT&P_=rp1`LXx}7gz?yEu zl=|DTRGmS)dba5Fahn~pTAqO|RlXAVR@qWa7!Ogv7EV@wwp<+fUC`C!=Ly4r>)D`{ z*;$Vs_OE$^>JxzXb{KdvkjtcoJ0q`JySfy(5jn(6%i&lr4Ocg<)M!2x7zt1%7C@m`%gqDL zU=AgXOFfSUF(v$fru0S;=$b}vs|jlA5# zM&>{@_1*5v2Mu8qpQMJZf0z}jR(R*>TnIbY=tJ?UW)BpLBY_+%RIg02pS5Q|4Xv7M zx6YC=HP9w-Gm0KCl>22kRhiO2Wj)Zq3{9Czv)cC-X0182hcz^s5iD_!mBHa+_j8X4 z6pU^odr~S_#x~7N+P9XoC(3GSRHkS$rd|NOIp2$9cTY>lsHwA~<1x49&=^V;vtCoJ z_YU!{%LItVk*qE@r+hO4e7vG^tUjVZ|D{6)rh7Mkyt2vYh zICyn+EIVdBvx4IEhiUF6GXnE$NZy&E$l>R�)&*3s`7MV$2o_ZbDWTs;by_Z11+ ze@v%mL=Q$CsLIRv`E>-|{fh)fi=VGfRyt_N5?~|AbN~_zqln#!yO0b43|HrgP^X%5 zN4^q55CJl1c4Y9$;}hcH*>?Bv5QvuQQz}*WB!Jw^%*@p582fDRl`5pOV@d++t~G}^ z2}2{+KNgymB)?~l#`zvof*1NAMT_;`%8&hx)HB5B`S&lLJ5p`Ob_Rvu7}W; z-&_;IAFp{{l9bD(rBdc#Pj@i%q$&1{F~TvnpnKS?dA+XxMl{`#yCC><@yF1~!9fEs z_!61mdVG8w1M0dUWeV%lVdpAhk;j^ckq9p@?b_20-!_1-Nh6l-?+|eyg`P$_>LcM@ zOXt*wN-=gqMM@fh-g}fjFH@lH`y@>SmU87>yk*YqjREZY8?P6({fTBdsCKd-B~{Xx zHBF-I7oepAgS)B8Ny^;ZTyP)ym@n(zfAv4cw<@X6K!XK35M-6F-09ln-+1f-C~;H zWWIZTIsV65XnhsC9fCp`d6|g_-Dj~47DLJ}z>HV^C4J(h))mImG8`%PWHz#Ux$*c? zgoGr|pq#@`2~eo1*;yK@zMh_7055`+jBZ*~rC6$A2vy;6T3@ z7Bc+rVI~_I`424@_Y*oh&|bZ+@dCIx^;^-q0^!S1u8YJ3|M2qsK>asl!t{XBnegA?a^3iarY1kq74Qh8 zHV)*U)hU$NnHRi7ts;6~a(8r!qUtcft>tT+@%HCeS)}UqF@6>P2;RV+H6ibL0 za{qGMy>@VNGFN7orGHqLr`G-5jKXvf5r$)ca%ZeXTO9%fc?TWo9w1l6;AK4QM6suS zv6Sn>c^F^!y;3}h0F})|UTQ+n)28bXsn<8!5Wsn|%NIzQA3~d)x2p!#mS&*24p}MsR6St8y9RAa6Y;zGGd=wgV9P*-46uLQ zack07nh)`JC~#b9*Aja?`q4BwspbZ(P0R_c-79xG%(GrrmghB8&DvLJx={{ptg1s) zv)?~%cmEo_89v{f7=fakY@V!!`|rq#2VUkqZuN-V?z3ZVcRilGpXM&ru9gcRao3w@ zq0aJv@pN7pm!=?!Q)KgklK{@i(!>KA+s|mhlo!p%FV#Gb<6EtRKp^fWCi$zKel7PQ zZ~Z^%RBLe=4kNH?lUv1PkxTA2M|GV9wmIB5-%T^9#EYKi7}_9hta*3XisPdroeQgk zQs~M&r->M2zdOh)Klgzxm*R>89;X93#YMBzN>wBTa#e3Jbfpq_@%~3`t%~zv!vHs) zy0iM*+hQ3;aRCMw8RHK@JIwQ|PYxHe_<1;&>n1UW^bA2;o*Yt*c3G~^*YmMv1kkB3 z(yD2+EkSsV2UTHj1NJ0Ay})waH6R48?(SNBfOZQg)PRZ<&Vw*=yK7PTZ|rG_M-tI2KcFown}^U(7TS6KaYQLMBQ6#j|F{paYjOE2@+ zr`$;uu2(PQK6T&e*WYF0Y@Jt0^#PBbRE5z!_s%pYV&I2Ykofz0$^{DLb>Nvlkesx# KRE>mb=>Gu7(ntva literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pe.png b/media/images/administrator/icon-box-pe.png new file mode 100644 index 0000000000000000000000000000000000000000..429e682464d27809a36e0e537ff6ee6db121db6e GIT binary patch literal 10585 zcmWk!1ymbL6s0&6XrWk(7I(Me65Jhv6?Z6B+#L$E5Zs;M?k>gM-J!U<{rx#-vuAQP zZ)SF$+R9X!g_;?|kgaK`o zA5z**Ffi}2{=eQ$t@=CzKjJ!zYdMQKni@J=+S`$;S=ySyu(C323tG(@1)d=M z{|QxlGiO&rM^hLP6MG|5QVB~(Q&)ROYbR1MRSv}J=`0u+QW$BFh?-m4Xq$T)g{I5? zQ(KkEPKLI&j;8vVXTuDZ6}X5p&unr4F2Tfvf*`W*e$;bhBmNJIu^{4y*H)wqcP)|x zR(zfDz|N3&T?{=X(C-3XArsxwQkx%=eA|8Ki3jVg!ZFP zN~&+5r~26TCKG=qS#r^HcsOQ?;Z?{qvN*1lzj2r$M4DRQaQZ;7B&>Y%9>h4-V6{?` z@KGTj8{h1T1GW@PEBFTvayGJsJZaAAaYT4`(_!P(W6;#5bp8#dsP6*WieWAbXT4p2 zYC$4WkJlk`1a4KGU-qG}FdT9byTbCBe8`s$?z{KU8yzHRZB&lg=Xs^?_%Mi-uv%Zc zcc-R|MT+|as2W0pt??z!OTv&4kld?%g$+p^{ZYy7&_x4urs7!bp zlnTeFnkGdi@J&{N){vd~zQb7(V43afh(YZ$${QwO%TUrr>dF#f6zX0O@nBA1{h*J6 z|Gd=Gc>}hrSU`WOv&a2);Tgm*E%Xut@*$Mpp^tkE*ui_GP+3)BqCEFb&fAktX@VaS zeT9cP5v6V8`6EUIF7Wx|{;w1}gkdy+6X9C~!exlr1`SyDe%Rj$T%eIIFbdp$7t8fO z2j810kflzmB{Az=QIxOpGKdg~EGDTfM1N0JjtG(5ZIT>ZeG)?P-FN+dbGYmDhB#n> zPv9ADoic@8E3MViiy&My&W$RoEU5(RpA>NkekC>FyV6`a-$6S|mRIF*?ifQz3=Yquqc8s1n<98fn$P`uEYJfu>1=yC#k8( zyo%9$R&*BrP#zWpKdi!JJi-7Lv$t&4MH*LzfO3r=(^y9!`#%xoiOeLWuZx7VMwBGx%cj)sTsz2x zY7QZNE=R8saQZygw%&UykQbQ8gBcjN&Ds9Cfqy3;(8swvEw|^*<`7v&pYwbp6rGJA z_;O>I@l9((v0YHE3d^w^|J=UgN6`A~ma>9;^YiG3{(Ik7yC6|Yn>xK44w4p^uoj{A z@F=k=Q&!jY>FHwu-K~}w1vb5NW-qZoUaO9e=kkHe1{pbgOHsOa7#UuVFiqL=rFU)O z^3~a$SHaV&#BZD28dY|rG9Qu8I@)8@y)gx!%9L-3n70=YeP1VCo_Al&-H-dUC8+hv zS7NscR=*iVcb(eO`aH_`+rLf2cf8QUmDP{qc!@Id)OT@{WNhpjQ?9)hpashe6zhjJ z=w)nnhO_yQ>Q>PXM&F>Qu*MbM?j~NBB%nvo!0l=bP$5-99p?QleHvc^pY0fWC_Nlz zO3KZyhVXqav%kgJ(wxIaksw!vb*ZhH7g57@&dsu7plQ-T#9mkB+pf)yz~}!CzJy8^ z_vSh^4^*MQp7wv@cdG34eV(woC1$#;A7)>9TAL0WrC=Af@~yV-*d9O0!2&&URSZEy5G>P z6tNR39V52_k111E`A#anLWt+Dj%!|cT~kka#Y6fX+NJs1KDb&sGCKpgp{*=5JvH{Z zs{*6SMLq4ntFxk`EwSzegPDY$T@`I0G2m~`BOXEotQZnD9g`*+#lp<)1~VoH;lQ_* z=0fu|`y(V{#v|ipL>Rf{8%UN1!gf zoRJFea5GD5Z=9W^*qg$gKN}f)Iw9vS|2{p0pPbi6z1D!`C-gANdAydfC-l1a#iNF+ z;q<_8Ifds=kgG4+#evRlK=Vwfr+Dp~HC`QhyW{$2!5f26_uZYe8))N~vZJ-b$!T>D zHm;6`il?F(XL>cSs+q;nnRj_kKa7MX#h4v`Y@0VZ5A2M>Iaqb|^(UdL`%b}N%3fI8 zr^eCr_^rRqcFjFx`nZj{->o~lM7zLYd}0?IOd5=8aay3#t>YBu$iY7hue78YY9LA8 zczYS6wQH&;C~8sjA;m*b=*K^~Yrku=&JEvDwKBujW6IL7qc)|d(+>-)^ghyM=qG_xLDc(n-HP1IxwVB61o@nGN-?B*L^s6)XrW z5Yg~jL`F8eyYrL|#+8QA35`;*(LTOkTqxE7Qy2xah-QUOHQvTPGpBfnL&NT25?vg> z=Ki_hW5Em7n`S|*`fQfSjZU7ferw&=!1k0&_I68dNEf-ZupgQW5!tYPK646E;Q!!cEXcjdz!MFDy z6#c-C)ptNly4DdJmixOPwfYyLjxz5a+=7gBEm4P^(ij4wPU#mNr<5S$IOi>p&HKp| z_FSgy1PzKKBeozI3HSmD1?6wogtU5;1TmQ5piX)+<7u@51tqPj@cW2&XaYjLjf7T; zWynP2L_|<>n&4tZF6*guX{B4v9`Q`!Cucre)j~KLc`96EiA5Hle=K9?kv0U!)YEO@ zZv4@<%QX2DVAZklACJfH#+uY~O6H82k_7R{@|P$;dMj;}@H8RW$Q)@y^Ak}Rgwvf| zIN-c^eCylQ@Vx`r_ht&|lT_lUL6k0GtN%2AVzECQfQ4$^JHtcX)mizm zR%ezS&9gLmpfB2ZOHVkHio@q)Pg-F2I{>345R~hqH~LUkSipdGkfx`0LY@9E%1^~$ zou=5o94Uk`F3%QrDi)#;@v|yA{$1bXc4-X#W2nZT;oSs6EwVqP{|+c!?GUM=Cv009 z_2@sdPu~yqZat%hxW6z9pBl{!#b#N+3t_{eXAo>ycl}DP>?Ab!=!MXZbbD<1sCo0} z={#%)s#DS$1VkHl~k^<|^KV-*$Z6#%l|1K%(?ee9E zl%VGD)h`Hs+J~qXBjV>*T7+5AKaj>9505I_R7qm@AT5T!ob$TuXW;ca_sw9ug(_pD z3%4{iI`NP2N%ivMoiMYGf6_EJZ8n^Eq&C2RD6d5KllM&*s-uS?W`9S~;ir|7WU|#f zsZPBt4{9wtnfIl|<(fU8-0n9+o3^9*8eboe+z+9JdpA#Y72Z)gc1^(_yf)x0%B1sE z@I$(qoc1djBGn2awRn3TA%n|POnQdFU~=cml@rlgli7DO!%I~3#Kx2#ME*t4pqXZg zPk8u1{~FD3jEYz$6q$b4#-&zB`~LR&0+Yt;VzqWNF8IV?Y;4Sb-U$a8HjN#mNHA4~ zsv!r!3|IdkL<$G}a2{B;Ni-je=OLFSG{zjib5Sxs%6+G-6+&j1nk2D`y(}})j3G6x z#*7fb!JzEofflbCWH?aPur}25L1+X?@cf-!%SpZayzef(!B?#Ck1_qyRB`Ykek!Q* zE;?Dlxm$y^Ka8mCPs+~+K*3JERd}kcSBTe$!qCWerJGd$vI7yp3>)ZiD!@CJ->4T#LS;e=|=2X zX)`z=8egvIyLvDVaijuC-3G-qY_nYO(d=hA3M?3GRD{>_4{yIU4ZP#6>SXXkysmRe z(&sgrbPK>`Q?s+2<5vPCq=996n9=D_HsjvJp;cYvxUtx|R_=)#a1}V~PsnY$vkqzIE<3ZpOg;L2ak zl94m{P{9F8kB<}JO8Gb&&4j^0X{>Pg=xr8u_MXI!XH&bj8x5wGW44@0n(ggvcoC&L zi$K4N3kRbr{6(93ga|`?XBQV%phL1hSrru(?L&xj`Q)uyKOIK@ZRJCUCuoT%O&d#T z?theTIhB7=`T<8ZtWO`iKJ^uE3BI@T9HF^dyPG8sT!t0d_wV2!TZ>_8dRh#smZL=T zJ%wu43TK+*oA)C}u&DpqnttrygUD|aw!s4VR2H zY8_>}JTf*GJ7~h=dCOovmiG0J6blcJ6vr2V3dp?WmTeUKb7AuX?3Tcbxh3l)^cj-sY z)59jG#nF=)2{dY3XhW6$*j(YX<0E9_rdxlWL09RRMn&v;a{f< zh!?lS=rTz{)yQxot4xP+=gRelxjP=@*^<$kbfYseh=Ej7ezfJj#xK0Yy-LHWnp1@q zC<+D9{CL<++~&cc*QnS8?TWubSt3z&i!(kjw8wfA8sCntAybp;I1S^?3w z6dN&Dz)AK61@0LfFPc4|mEG;kNO6?({8-US&~HiAiB=9?9wr}8?-|&u%*A86*M`Lw zQKBG2tXIe5W(=?$;AeRj&K1QI8>Rg+i`+*`NyEs~9CVU+p38dMd{h(_&5|@oP6le2 zQ>{oaWo73K*I_hHMXk{2Dw$Kp0U+d$jcs>9ocUa>t7HexPyT(ie{u*(y2tYe+}L$} zY?4MxkisR1yykcB)!y+EbS|B9rq7zsdU(Xgd zf(^f*!sTX+iztO?kN5Ee98gF}h!X!oyO4A7lXFL_fb36vLRzTf?O&WOT~+lY{sM=M@XLk~?!?sJL_f>KCugcDUcd^AFBB^@&$CN}?m53h$wgAh@p zAhehrf3q^n*4jW>7=!zR0Z!AJtia!tZVEFv;UncuLvK!dzp7_&0JRn!2nmNw0ixC| z5-d*GPZ2+4q>XFc35WmHjdyZ>c}NFX=E@QD z)UwEZnq~>(W{aRX+(<>~fu_k} z##oA_e%UxKAHQ5AYg`uhft>tjM}p_>uFL{bS`^<+hP|7CW58k}64Do>iAr5nYG~C` z9nI$kD|7lUs&s;sYpREHI`{@7h~pAt)TMfje<^Av(^?jn7eJsft=cAVQJfl2)}Ps2 z`TL!XzXD2-``Ci0S>izvqXZrVyDV6(m%?gxUJzAa+&08RxcCsoCu`BOvC~GIHHrQ6 z=Zec&q#><@sBG-uh{?;KaZkrcmIc~~Tf}=kT*hn*gkhE+Hi2H0z3+o_@K`?DrwT^B z8!P*b(_R5pgM%06|6=Ua(f^(rAxau*6>B*RKe6^V;1q9|mnjlgjuzqjNZDGVD&O?C zu8dJOTs0KY%y^WzB-8Inm}r>r_CAE-@R(6Y!MfFg=oali*DdW9W=Ba{UHz8dt}MrJ zI3He-7ZH2pYu3~-<%wp$v|91mhtMu1S@Zr8-HsQvjC^;{Og#BDNHB;qapDeH0Pm!! z(&gWcKbFudeoUtHm5nCz>LQvqN?>-98O@gJ6xZizn=WDx%38dQmI(DWOyX6(t`h2D zIl099TOs+`?Gm4`Bh;UCk)IH1szOBPNArR{B7S`Qn$6u0+R(VL#tE=W&H`H!%}2P` z>WFx9%CPUB(}}M*`e%W2G-x)|Ws|VB5@Z{9$wbOv4gGBCUOPlzZ~WPu&V0*BK&okj z=tkESJ;yq-dFGT*oRR@sG=fv#Fw2yrg5P1utzISxZ%=&tQoOh#$clv5N<$Qf3kwQq zi5*vXtv{|g8gZUwP&!n4D-uwwa8_i(!B8nB#_bk$(Rp#N#6GGR6q7jCwbyz9{)^6@ zJaQ@p4w*6y;~y5t)3rRTUIB9TkwmH7)2pjJRonfGzUT3j@3gTXxU&%h$vr{l7@t%s zH0Z>QuuqA$w5hx8S6>Ztk`4N3(t22M+PR7zaiJE%ya(q5^WyIR@_#2s1Y1fjyp2{| zUi#-o{)~6FVOwM{n<1+)LZ0SeMGLfGkl_E*sf5VcAR%b5(QIAOcjXPF{sUrg&-FFO zqD=ybtn1}&eY|4*Cp~l9H5Nb(GGDI?OSL=x7&TSzSb08VF-YjgUqW*s{$NAIT4w#LBD7?KkHZshph`9 zpf_h;dAfMAxWV5t`QVXSd#GA*U)nYghzt_|H#%V(-FbC?@0g$06eX3KTUxZ+JUCli z&k8h3SXo)SCUYfqNO4dR0Gvlot;ptc%aJUX0NA67GahY5zjnTxnqQSoyT~q&NVB7Tdi&BcW0hju~c|zuDbnv>t}wk5@mOc~O_@E*h17n*f)+77rgi zVygs#;Fs(F$85lo0&t3ontHL-oqb&3j!>t;Zui9A_o;g65Lrf1@k2%XBOUONuIEV| zOj%(LB&Ve%H6tSfH?W-VZWRx6v;WguVAAL9T7jPOH)n3X$90MG=c`87)nHUuY!`$^ zLI-`O&mmpoKDX?znt+DQFIbih+|5--*JYxP^4pANYJ&7t_CRow; zaeBt8&h!CeINzCf^mMglvEG&-mD_%=(;to}TFlqiH?HD+gt4S_a#~tmM@J@sU8BEP zD2BuHy~9|B!1C06IzA?;8P&kAX9#r+e{ZL{YqjMzapQIaYv4yATx$kG@7vSW$hqe2 zPiiuCIX8y*M$12kJ7^P!ubynrm(p%)YH9!v1jbFTS#Hzt6AwFa%sSI8Ejjr!u=1Mv z?vwy}fOM>Fm7kcKj|b}PwP)?w=NBr zRf^tW<7f0)J-;P0-2x_63zIT3%+A)@D6mj|o-FkReh?gp@qIQfC@gF`C`fhNOE%~E zc?=Mh1ihA@7x&vSHAa1?`kp78K)^L8U|JN8rg8&$DqEvZtq$B*&0yF5UDjE<%AJzN(G$!9BVG#{1cs?j+NGdBDHQsnEu znAfoNm(}%MS%XI`7}pgCB;UtE-=W<^gRz#i8zx|-fb6l~bW#T{i`SORSK)s;u8~tz zRArd!FvkhWhC(8g-qzv@E=~x9>GNyDMv(HqF@k~?7q!XL6`Z!CxK(Jd7dm`}fVKHV ztx)N-KQ=a`EE;yV(Q!Z?WXyaq{PuWa!@&tx#i2J#+um{}JdDtBHOBX_-0`9lP57<* zY3)w%v~e4wy#3J%gM=5v8^1MCQgI&4?Bx&iAt5PoKST1y8m=<1HAm+mCZA0LO3#8#0U|`1UZ)&dWPA7)SjX zAAbYTXLQ|nb?zS&GdDNd6Bn9auwEZeJNA5^$C0FYxCqvqKR2xYq+hy2iS;%?)MU3% z-*;ai6U7fXUaSdC=X0G}U6rR|f0Gr9D$PNl_#%`%65Q(Iv<|_ZZR~_+$X9cl*K-wb zX>LwRPv6ZBB_>N(r~$?YWHCOvqHii2no6%Lxs~zX!MH$d$;r!C*)DSlJ`5@vrBMAJ zPj4@t>$_T2Vcz}s5sCvhbeTVeI<`54K@;l{wUqz&) zP@c+5S3!L<`%+R;P*c_pn_Z3;Dh=U2efpFp=Ng3yoeMOU(IX1!XqQmRj)y*OvBu|ZpkKJCAmza zq-NHtPOD@#qWw&>o28UCztw~d3eY-umzPae>H!e~;VD7y6cd=Lr_+|Rf&4`MM{aL# zZ|*N4tQ${)0s;cpx3~4hFk?0RvPvJ}0e)P2XcDiIRIq5(^C5Wl0){BW&1a)YykpB< z-=X^kb*W_UgSr*_u1wvabGAkaz#qZi(0WqlmTDO2D;Z?@qT5rVUtnO6^Z!2!Kt5>! zapPCuO6{w+t+LgTo1OtuH~?sfC$68n>&spRN<(fe>5}(wVg44YmtaXo6S~_uJ71pz z4W{8;M|&4SbMLsppGf8Itv}Z7ssl-dK?5dihJu;Ed(gb(uK>WzWgXbI;30@UUZx#f zmaqaY!-f};w?0WJz+6bcksy-HQI_0N4pn1=mh#pZX(wpNSPoY^GvI#ecc?YhUSdJB zO)-=8j|ekNF?(0^qdg$~O7+Woe#@*`4n;$L;tI+*X(%vBI3$c`2CVSbR0gfb0Wj-#^uVjcD2s|?jJ$S&8HePRtw z+Wvibiq%sc&&E(?t4hM8)y$m@qF2T9790P5DBC=tENcnLmY>G%VR5F5k5z%@NlHq( z;D=yEN!0rjT^O!)wFQ7gyzPs78wxB3!hQ#@ z_5J&cZRV(7zm5%>9Cw?`%geb5LNK9fbkp%Nlm<+RsYZIvdJR}1+4N-PrrO!I%S#S~ z;eAHeH#e9eUlUBjEmMqA3b@e3Y^EnZl|!%mp^^UC=x74lU@R1LJudllX9ywFH(sUs z>%REYqno~}i6RdI8QO!>)4BDx*Sn^-*Qc9$+hq#e$ib3|cDgC_W*EIK|o~+F|=5& z?{gpokZ-aa;&Q!ZL>*A6@k8nvWIZzq4SXIaX@Sa{tt;R zcj6Rf$o&|hYBC^@~VX$;4(1Z zD}E!T@ z1;}H>KKF*w6j*=&NDhRu3IlE`%HVEb^>3ppEfy9QrH6l#LRNxr&sVqY-cO~vOy(6j z4P)RokGkaH-CqEF_@XF9pPz>!Y#be_QtUz)4(h$)2jn)O{+XDVfB1PKYrbiLjC za@F%}_q^)`D+mlxnOdG69kJ23Yke?VtTv^0UH5MAx{MK`1dwsUvVDi1V^i9F`?@~N zR~cFiVt$$jFMU8m6bIoG6DI%?*JlEPINRm=ixA<1lapCMAhp8}`OCNdF!p^ofpKqO zAdHip-PmrWaq{@^(8?cHDpyn)7$YW9aszCgZ7PWDYoS7VY>fA@F+d%9@4VeN{E>Em zs&tvp?DGczG71mJ=0emT1g?L3-S?2})nvYuuJ}AX?E;}ts$C<|ei>gez};8=P2PrdL%}g&hD=FpzvE6LlS>1@y{hj^47&G&K_m1-%wtCS!a|+IJc4 zQJx+jM^;;0k$^vFP++kV_OlvSY028)VN|}jBG6z$A;Z<~S7!hFKf-UmvsP7N?`viE z$AiM%GJ9`&a`Ie9pg0byDhg1Z`My25KVS6k`Xdqlw&5D47Q8_D_G7~jKjdr6&y%SH zQ)&E={hMW_jsHhZ?ECBhaDbNkc4pwE$;aH>$PNKHTEEID*tG|pJ4sRKrS>zt|3kTJ z+wkGp*?fUz3izlJQ(4IVJLz``gkdZlq0>=Q9pt2@75&kN@xW zJHSrCX48H~oN<5jprqg>=3U?xqQZWZaDto5e7D|amNw5sm?A7UYS|wy-ug~Yg zZe#@Yo7)Dp<7!mHC4C_4L+=$r)Bc=6T&mp*Cs9cD%Fkt6ATKtS(?=!dj(J|%`kSrZ za<`p>^C9peq(^gQaV|%5j5C}tWzHiHXaecbzx=N}GhshI^IRhw2&dpjIsEJXIN+%Nd;mD?sZ zTggc|7!+;q`TQ0L08NLAzRI$fHw+luT+?_XU6)yP;G7xrAE_im z{0PgGf-wBZWMjBIxhUghA8ETI-%Nh)m*2;CF+-eB`k(X|thOA^TQ%wmZI}1k=|2@ zeKDK=y$uyeGq;`xQ~?2cD5{FIZy>YcJ9*s!6S9A*5P4;t2OM&Qkrr0~m5Y84_z%|) B@Pz;X literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pf.png b/media/images/administrator/icon-box-pf.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d847889ef900fad4d654d457e6a6a5a9a9e018 GIT binary patch literal 10594 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 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pfv.png b/media/images/administrator/icon-box-pfv.png new file mode 100644 index 0000000000000000000000000000000000000000..a674f6e5187bea09b33fdf5ef40e192d4d2443e4 GIT binary patch literal 10578 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 z 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 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pg.png b/media/images/administrator/icon-box-pg.png new file mode 100644 index 0000000000000000000000000000000000000000..f85d86321c1f04592180428c512cdc76726a2fae GIT binary patch literal 10763 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 NB`2jUSu1WD_CK>~4GsVR literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pgb.png b/media/images/administrator/icon-box-pgb.png new file mode 100644 index 0000000000000000000000000000000000000000..82eb733fc092480bed63b297bdbeb13b6d12f32c GIT binary patch literal 10614 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 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-ph.png b/media/images/administrator/icon-box-ph.png new file mode 100644 index 0000000000000000000000000000000000000000..96026da9b0ff2287ec7f46e2f09fe0978f5beb89 GIT binary patch literal 10488 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 UZPdeorw?HiWK^VUBuzvA1MESp&;S4c literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pi.png b/media/images/administrator/icon-box-pi.png new file mode 100644 index 0000000000000000000000000000000000000000..a2877e99741814c09fc3fc65c663de7746554c94 GIT binary patch literal 10562 zcmW++1z6i`7iGX0Zo_3b6ff@X#bv-4)&j$ayABw`hC6J?@ZxU6Ww^Tyx8d%8zCX{C zrfKseZ|=SCIp>}vTtiI(3!Mxd0RaI^Nl{h{*vbJb6cq*d46L+612)Jm(n>n0z~YN) z9tP~AIVyf|K|sL3|8IRYx#Ir_{7B>~r|&A`Yyow(cKA%KV{LDNz{SPMEyT&i9kP-= z0vti{-x1mlpIkkl&K3w#<_<6mYI$pC3l9fpTNi2>ZC;e>scZxUY6K-&DIL$uk>A#d zMtVuRcOo9X7d~e&Em^C|ozCPpG-LH0o)bvLl|+6 zXHG2EkKc2`-Z!g_H<>jrmRWw+3qEVC477&er>87~G2`d{m$~u58L^P(ihtS70?s=< zAN@oeL|xXCo?c?6zXmz41w0Md=WB?!K&N&N>+P3dG|fTD__<@CGA2Af>HX8Z$#u;x z(`jrQI^Ff*twH7T)I0XGQ*tKTCV}UXn*e9C4{*+V*z&(f>OsUQgs37^&1?lzRzzxQ z#9TDFSe=uFU`y7wR({gq;yGQXm6M%lbVZakEWKxZ0e%n2YoetAA61M&KlHSYUsk)9 zB4GYBxX0+4VS(5(^>!cQU-uLR%0hJ-UibNedzWd7H7VB7)q+&Q)4<*uI6)_x)5 zRQ$n7|4{|{OhclQJPqx3jz;ys^&lmkIMBUFaK_mxR-;cm1Hwbf%NM&2hH$3E#iw?n{hlj7V>wsK9xPU?4{S_iVL^`A`)bf-=59J3K+GFj@)_;#)yJ5 z?pUKpi(UxYS8Lf9Ms5eF5Y=Fsh&(Jm4s*&%Ou1|~BlKjg7 zqgo`#=2uZ`x{C~)u|nZ?YTD2?*O7$A>lrB80qS6ANSFKTr6>)s=pd(r+;vVC{&PkE z5?qfn>%l`(-mI!BrLmA%RVpK-PT3G4QWgY_fuHB~Kos7|W^2y~i>y3XmnPa7g0-U9 z0T|QM4tPlMM6T=%?pOz?5jiS@QgL7AA?{_jl(Rd#+Y&+`

    6#VxX+uFsmC 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 Xmm|Lox08Uk84;A^)MU%0O@sai@lUP= literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-pm.png b/media/images/administrator/icon-box-pm.png new file mode 100644 index 0000000000000000000000000000000000000000..71642abc7daf7f73e9fb323551cc5e9b054dcc94 GIT binary patch literal 10581 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 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-ppdf.png b/media/images/administrator/icon-box-ppdf.png new file mode 100644 index 0000000000000000000000000000000000000000..f730e23fb4a46e9fb68140a709206499dddb6a16 GIT binary patch literal 10606 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 N$V)4MswGWA{sS>8#XbN4 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-prm.png b/media/images/administrator/icon-box-prm.png new file mode 100644 index 0000000000000000000000000000000000000000..04119cf9569515defbaa8a94bec5f2a261fc353a GIT binary patch literal 11053 zcmW++1yob-8wM3bx}*^#hja*|LCMkGAe{q7_mq-GTBKv(q-!)N-6@O|X^{@;_}|}u z=WO?E`_8%VeZTj8-sgGljn-6GB*3M?#lXNIP*#%D29EN;+Y$#G_A)w<7VgOYw2N&A#3AiWy`4G=wa*Y=Hcwg_*O>A2dr3f-iDfvk$NKw|yB>qmEp6Smw5K@5UGs@QMD>lr!w=9>3pESec*e zj_?hxc_377H_`04J$x8{dVAf)j&hy%=pV}wcS&`P(Nx^Q3(Zy7(Rr8iqc*W<@7d;t zMwagQS;^|u?YINJw0A9f;kfhmf4n@cCwo=*aQU(Ic44Ws zaN;Jaha{Boy;5y&eIiRSu?!|Q0wY=$DWEWv?*l2#c!VH^w;V7?NqN8dthw-l@=Scl zL!D|fyM7AcIVCP8n%?_hgdg(SSTE@Q(zEl>X$@{&_#2)9_7Zzc`Gd-`|9pS1!`1g@ z;+28L&IIBq;xwLX(Mb-8@iR4loC6wUjd)V?#h>5`x#^HhUd1I(QG{HN<9$=#`CZ!ytqe2q-DYRjM!Q< z&nV(%z=FXZ3L4Q<>{{34LsD!*H2p(yw2grtyOAH}U$0fi>0`;O?nN1@*y+o#kYur{ zO|GR1<9u88-D%?8OnCjCEhE@FDT4)Dj@gOWMpJItujXT@JITJYIzNMBL`nMc>2b!ZcI*)F+q=MXu82{QO$vjHK48+3xZD6^hy*ge*s@Hsw?J{9ME) zejTm@h6hZWCqug#{H(rN)i_U&I!WLweY77Zi_7mA2|@`kwS1OoH)1WucdFsh%-LSK zl|Q)4SNth=QTvRzl7-)yakF{~Ru&>ZgT8uL45eyZscJL*za+(1#6 z3=D2gcOzOpj0QSBE$tRkMuR5^?iXwc#Qeo|W~tXA+I#f99#b|d!NneC#rjg2U_ySF z61iVbk_Nd@^xH(xS@atsGVBT|64L&t&#{HGTS5p@@Is6l@_GF=A_yhm0R8@?&>5Tc zjCM{x-K8e6@&iBarnjMb3>Y`62!qUGbpc{I&y&8tR_wv)L&E(ej1(8REE`iL_PQ&sNCLqdP>x57W(W_xhw}5J@6g*-M6m%ZVC3CF4y}* zZ=RTC9Ly)pJ(V7YqTAE;*(8MCQDD*6w9%MNj#7pf#eVdEcWGH0tU+?OX2yu!5PJEO zVk=Y3^U*MBkfH@d6leNxi*hW73HNcNuqok*Mtu6;Mz0XH(m#5gniTP0`!s#R@4`Ai zUB1di3lwGOkYgFH@pBe; zp4s0O&o)b&kwU!po$&s>pVZijBA&|~t^TK*+aT|Y)z`ai$G1An*7F zz+9a^IBZ{J<;UIz^*6jaQ~08!(5@a^Lg%yZXU(v&1P0sjn?q}t?H393K_4c$TL(69 z$sx;JBkCu!oYMJo%dzOMu=_LdCM16FTiUN98tWy3s<~1>Bs(vi9iTN}k@yuCQa^$< zFk6br{7(x(P@&K(2hAa()!)a5zdmn9FF%ky2zUcbiuZA$W zW{=LQM`8GF&a)r2i!r^aX(d9uuG6s>J>Dvdb6JpWua#Lj3W%I_L)7xUEoxCRIAr{= zV&k_i?6c(c^l8YgWFg-Zazw5aSN{(mQzyK-VnI>D&NDjM-&z*g>?WXE|BIWbqNw{M zwLj0Bf=2T(h_S0-BHJ`CXRXp6)(`k;)bb4VHBn4{-2TEaIjYOzI{z^`IG(kYT=>Eo z9gw&H?Ae!npT@S7?LD*UrHAgHN)P@1V`u&_>HDmW%_@9wx_`%_k)-0avB?>J+)*E% zhUe-MSlqQEg%2O+3&D~ucE1`wd{tsT2w0P_o;>F zuwztjOY+fjS2zZ5TV2O2yIa}zs2w}ja~eOvRiQ_-Y=kTlGyX4=t5|pBzDWK1STbG; zC0l_fvSjROTT4i5-7R~dZ#63C2;M_m4X}#T47SK^W#<@egF^hijg9n>6YX=Ae^ynq zlRSQmjdt6i>%8dhoLnGN5IK~SJIW%!P(ba;#TD4Qr*`v74*%?dQEZn`&)28av9H*j zoQW^F-;AFQ)jbSML{=2fx>>GWX8Fa_Wclp>pn40nq*!szZ%})cCeP6e{J-S2&Fj9= zz`#3*Ss{tlCI(^)x1v_>kiD)j5N+G6+cUSX@dc>}3Y1-QmZkh1G49YcM`1PX-X~&I z-<61C%r&hm6!LxdF$Kcx^P$Vu#fFN@S;`oU%aH2!k^CEy0Jafj+DMtYwsfhLd$VQ1 zUu#Q=+lwrEisT-v+3#EY#SCI1z6!sAr!C#QSW{tM^I#Z)(2q%XoPT zd-dr*gI4o|5EBPz5tsOUrEK>D*I;dqt;{)Ld`H=-0amZi6aeXDS3+f!4*K>;Ue(F3 zrr*nW8SAWz+fyo3zqn#r7u3h2_Vn}Zil9%2Jtoo@V`P&tctj5hq3qF-6^MLeG-Ix` zr1A4qlsUlXHBb?vY1j-@z@J4*4h zEK;hprU+8a`uHirgsd))DQ-rS@5Y2f9@Q>ShkeLo#8W08q0%_-k)Z;|vqVazI)?fJ z&I?mLFjcBvuupQErQ?FaPC|wGZc!8!O+iGoglWHQxzNH`ep(p9)M`q|j;$ul*Bwf* zV4f`3^7)&taU+JS=eLL{{jLJ;iTX5*uUsEL#EY2Gf?UNO?+f|7(hxRb)7e7^ zTv4zQl1y*mq}#8jzpv|p$e$=PJu3ScGoxl;kWhI*nw}-wAhE)SAH5d!&%~`zATTmB z`t2WgLbMvUGM{-{Y1GRE>!?R!)J930OOUR1G(N-=_N62K(E8n;oxuE~OqUmEHIgDQ zIPeiaKV=4-cd*JUxmSgdJFJH|$?hfB)C#&gGM*Nx|Ly%dRn@xZt#Jtn$)h#{n~gf4 zD(kfz^w;qhtot|%#;$ifZ0*W&uryeEsh3TWm7+xotKVm@S8BvhqGZJOs~yo&TXw>H zf!B;eW9ubLY16&6UiSVzaPFN=J!omga~K`Wr=!nhnLUAkLuJ*Ndo#vsVG8Twc~-qi zt+kw`JtT@MXys`*IObW{`^-$E+D!aR)pT&e|--W@ks*QZ?bWY!(UA|D3YGgI9BjhEgA1BS@8|MH2YIz zI6xNpvSZs?RU7figZ?@o5JvYAtZtR1`zm66&H+)wrN*;f>$olTMO#j_-iF#&^s)?9 zHt{@N&06M&DNO%U4Y!AS?43AedThD7UWz9Sp}vMe_H@GoOAgYb5(vO0*O#)Y=x zwHA4(L+JPZ(_n#ldy-`61`&~Klkp_aEKo{jKKW~H!8pZKn%HoseH?XCtCk@tTKuAfHn{Z1BP$sV}`PaoMHyAy3Wc7AZ+ab;2c#bQNY+-T6#ygs|$V$9Odb+X#T$H z>S`Gma@R_wrMSu2=U%;t-2*fs#3Rkl0jHa)g1mqvhGPbIi7U1ClWk}ZuHX#E+}|J< z#qZOUCHxA04^UqL0gtN~E4qH&SI_(U`#I8D!1rVPLz@C&VPR1?o}P6-%k*kB$sb;Skv*m%U?Ftpj?H$SOo4%lU0hUHz1`8DsdQwB!#r?prU^?m^0qbx zQw+IF%hfEYw996|L6>|OmAh*_53%!`CrJ*8l z%i0)pIp22g6LY!Qny*;=!TvdZpN3D!oelOOZv~&QQsi!*9(5C~-$*gs%=Hi0@y>ph zxc*b*veMCB^jvA+i{eGG-~hGuFIsAEbc{GnC=% zoz2DnfVOL9(evAr)SYw={|+|fesQl4auG+qq~tMu=i`%(wt(mK z_R6bggJmo9nPZacWr`->xwuEF@E zv7&(#Rbsw+n)=W4P|_QU6%tXHXnlioLiAVTC$R^WJa+cmAPSYAPOlXd6|a6>bo6Hm z+BY3`+<*hmxgy?tI5==EDJ^vrqA9oNe6gthV&2=VcAjf}eLW`xsT;GZCgNTwq^g-C z*PxyLElpQMOQz1_pU2&dtfQV(p3&LYnXEY)IgS=VN3M3d%vieSrK=ILmeO|r}^%VK+T2jfo2M7Qc-m)h6a{r&n(GFs2yj@dEz4$)28+}qc#v< z>z%AtR|C~%p;VhA^Md5D^4Hhb4#HVyXJ?<(O9yQPfF6$~V|Nguahb1;(B3)0^;kqv z)6qR4rPnJHF>Jgse`EIU{w%f_xmFKRM_*Gc=~;y0S{G2W)Fe_;hoAq=A(od?_ZR6s zPy-B!S}!Zl$(-N{?s|mQP@lRj82*PrDUkAWE8pPksC6oY6#y=3T3YLXfG;~cjzG?- zX=v8|OctrCsqqU5^$ZN)=yUGW?{O!qZ#FQcL6RVdqu@l<2UqRQinz`*k-2}$was*u z*6kvi3u3(uLNy2_Bbt8g)G5k&ExBrKd7f-BS=*2=6I9x+F>h*=h*_KUhJA<;99yRw zfsx;Rlov6l>(;X+J2QWIkXYmMc3d(sGc)7k;~)Jks{$+;N8v0W#K_1rptudw7Y}Ee?dq zA34-T*PZ1vH7%{Q@|({-u|u}Nu&ajtTP&W}#Tl##rBq_5&Si{);?mB!d`1RI;Z6T@ z@Ruo1BPL|lZEj#ETF|D>KS;Xgw422#F#?o;6G~iVRBB{VTmz1<5KR;+(VS%RDH%bM ziBr!v5maz**^L#f(MT@)yC_z1oHrL<$|OsHnkXDi$Y_kT{1rPC>EyE|PQ=VB-k@~* zEp<)KaXgF=HZ9StLj}}raepkGaPETR`rlvJQMJE!$f2cJ{ z^EiF;U8^HSJDV(>4uRG6>3Q;=|0C0rFUrZ}G4c+xW#p}afKc6tiS9k3(QC8I3Bom1 zTrZ)EgMoTTU_t4OaiV8;4>Hq0F>ofp~4qk*aTK zT+pBp{W4+uJC4twJhCUi7-gQK*!l{D;GwPZNKoA;N4UHYPkXwE1%=^{PI;w&`rHjg zcP92;iFRD2!4(fD0#Z>*wkLk0*bT;Ms?el2#@^W$70-=Z!3ip2kIh(()5Fyv3Ju@z zl80h?hW_|4klI!?xN_GkE262a$!OnFQFnnD?B+?=`eNeE z`r1Hjeq!3UbXl`u{c=e!qpU*t`iS00NO$2e-7kieec>mABloqrSTtWEWc?M)>2ipEsB2Kg!s$wD9|7U`rhfRSt z%+{!QiaMe5il%bC)^d@cM@xqM5(jt1?bDczyIEF$p43Q> zKyr<+xxJtFseR#M5_GyFA{umb6mtQwKLv2ZgF1Fqn-XPP(7=?Vo-%B!1zEp&5gQx3 zJAdr$ahaK!ZFq>jfZxJi-1icB{{D`6awQ>sHK;*#bCp-BUv^La zs?wlf;QNLtnS(a;GR}v6(;T&{T{WU}V4_H;$Tgz+LEGyeq1B==B-~W^+0?=Zv#d36 z$>;Htn#6nD_V)I+yYt13Q-5LTLQfL2q9&xq8O@VGFWv`mtPbYfmnF2X8q zZoEK%Hg!h8QaQGi0z)n)roH9XjLJ%$FQazb-m7_HAeF(X=&3A8c#JiKUphF_v?lAj zvt~{nwzZP&sSpM4ga}_a!oa72d)O)VQ5pQusMPD$=M&S3%b8AHGQJnwceuRNft`y3bEv;dvpGMwpb>8h1e*Y5xZ47pS{qr`F8~$j<5GdN zJ8K361Q>RPNH#9}(B^LQOG=K4AGS?nBDImgR2KFAE3`ePF{Ssn(2#3N?^TVX3v;_< z@Y%n!$!R?{=_L(VbzU-52f~VJEu6)gqwdSJ*f2ZV2Ww+F=NHNvRe$efH2YlEDa_+F zqX8Cc3=>T}HY!K1H#j&rE-udfV%b-xLZAA@3%l*HoSYBMm4TUddFh@{AXNUIH0B|X z51OAUD2P3FmUal7Uo#HDMXE7{u7k71eG{Uip8@;$A17NxLEFxzRQBd-!iYkS!kk-X zzvTmT+GAsYgpG}@>2ypSQ>?BqwXn4GzBya=T_2Fr*$6JKei$wAi}- zKt$Yrf_rbBSYRwKQn_0hor8uLJLkgh{X351-9C+PQ!_BwKiuB|3}^z4ZnSeXopESP z%KP$VZE@w^N6|)N{H+{L_a{c2^i84SG_FcHJg#q_+QS$M(SMnjC6#V>G?)>j-zH^D zDB=~uG=l%?_~kaTtyos*a#1wzqZa3yJ=uZlSf40(Tdd82jg7sq-ttPk@?guN>Az;Z z_!Y>jm_WDM6HS&a4euyAHlU5dpypKEIn(evm`lOm4@|8vIq&X&FenGHjnwbXzA+EE z+SJGVJtR06?d_$#zYkXL??j?^hYuHNoK5y9DJcH@{aa{UAs`@7`*Xo8%}gJQHEUEr zT3SOaXDi*rwP4;wKv1yz>U6tmAhJ-X(qI)X;fYxr9DYc*eR}gi*=K*Ba1XT((sp)P zJTOc_sXGbL4C~`8KF-O?vWCHu3JP8((1~`fc7Nm`$ECk>-{~d?5tRH z6fD5_(wB`~*c|4W$D-nO1N6aIQa3vq$4hv;o;UlAb@t;gr2Zi_w2-<@yOph9XPhL? zCf)+457!7eNx7YMyVJLCI9g|T0K<=-!oSCh{2BMwFIr*A5;_B!Xh7XlaWy zK}TJ9ynN!~Dh*%S&Zzrq5UC!R87vPZjbF4N)FeiL*~ujr9ua|M29(&t{S8w0RoihN zZO%-qWZ-#uB^_&|3-790r@Dmyd-%C@&?oM6OOQ@+t7x|Y(Tl%LzZ0ddLGWWr_>UUv z{>x2^dt0gdAVQs5OBl}XgLms_u7B{ z{P{N^Nx=!-zkf5Dpj-er_tDO=q*{={tbSiTLq3=|8l?@{V|@oAbuNDY)sSle0P3}Y zB<7`{(@~e@mNY=^obSztK^F}O%bAD-1K5xIE(FOHU5FW6GN$eG&E1Zg$AkYv0recQ z-iZm~{zQgtpl~;P^KPTMpAuDDqh0UMhT%ifx9g3A2s+^vug8fJCwy%9(I;aDq;QIgfEI`W2 z-SSFrEthNaCdK{YN=VxJDE@A%sgq&0Y52uM+2Vka41S+Ln^;+8Ly>TD!p zCmj^?=kTz!v$Jzu7=zy88^Ulg#jW9eb^2a^J%-^Bt8jGr;KqiH>v*nY(4IBJ`dp25 zwuFCjhDAuGNApNUePfFEcaq>wZFFe0+`nsU6VlqCk$md~Z6tIk!i98yOmY z_g=QG3?b&IA)XIEOO}}Hy2AocKzO;^ z+(I<*5q5RW6E4DKx!Zc(d@en(Jq|=@kW`h#coy3v112T4sPUsuT+j1_9T`tA;13u5 zfbws7SXxP!Y;H_R85j; z5VKO!zp1KJ)=`B~eE77MRKh?s_46(BE@O?T*m#Aa(b-XOLNG!X7`!mL{tW>R0VH`u zuInVKC>7NU<2v=}6%H0OHm zQJ=lfBcr2(<9AErnE>XSmrn1rM49pj&QjzFTkVf&31?N<)y-p}y>$TidLH?b9k5;8 zug`Ww6ciNtfQDSLH%d3DLfdDJZdtXPyVZHmT-+(p^>;*FqM-c=>z{RBv1Y19-rt9; zf%{O<8ZH&CVF6=j7#Fl8c$iBe9jUP3P@j1Lg;_)YrrVxyu)3kO*|ZbR?9+A*@mOuG zH3wg(YEMm1TX&o{R2^TgCuZe{`$E`Kk{W*nsC=9GCUN;YY^|koZ2Q#Uj@qDgbPIwM zrtQVZ5^<}IKR+)*NC!T;1_tY-F>ODLB@JRO%aH~F zC%nz7XqYW*5C-;;5oZL*h3onLqCH(d2_h9(S1~7-HLxbts=}psvmogl ztqLs_GOkeF&92)}@J{*8kZtd%jl7&32P+eku`@M2z3u7N=*j&>r$uhyfv6*EH9`{< z6$P@^zdX*+10yQ9#CHqw9&WeWof?dT{~}AX-xU1b`_;a<9KRMXAZc7~Is92wnRXZ?k8iG7v;EP&lH&*Yz$-O_TUUM8iMAo^F=GPes~- zFA1Wpm?0cHyZe?QmRbk!BiZ?m;HMV%CmEZ*@WYEu)S_!jV$cRN;Ks1xciZYkLO1|U z&IOQwDKwg$sq6Bx3E-JS8ym#{-ltqVfmm4N0pj3f9Xxxn_M3z3d8rn6GZveIc~@~jPz-5g?CRB)-Pl)al${{>{WhFu#!1f<4UN6g zCd|-A$^pRuWEF=I4-bz{+-C&XRTGROx*a%b` z<><)BT;;A4+PgxPEoETo1l=RPRS|5836Z1u*8kFWkHN)HK+OE3d$E*yZy<7kbbH-z+JEXL0Bt-e(?P?I%q$6g0F z)>tF~?M9}3ZjxE6k1|!H!0XpD=Y~}|I>6nF(ciz{xgWM)7)#%-5>GPc7C{`QK0z=6w?Evi{qdA0=14y0_IB`+2TbNde`IVw=7VK zUcSD=9lG*LkRFj{7#m$msaiQC_7D zDFh|g)bInH)*4ipU)Sd~nxFcgop1&4twwe>wviU^-H}SO)^eiYKX3a^B{(}S#d60HZ0hVdwWslwrpVX`T zT;Z(19RjQYu*Zf{HNYSQ`S~q@!m%+AI+k|^d;&WF%F?wVjfJ*a`zJ2MsrgHxP21+_ z?)PAkU-#0(l;(c=d+hhR+Lg)Iis!LdeYIT8z|9=71hlbivrzM0T|TEi{eM&&V-kDmRwKYqQaOMvF&^h&j2tCrxuP|8ia~artv4`tI<-ueVT(Bg6igcU$EowX|w5A%(`KD@tKjuU#!Q4 zvVZ;PR<7_)2EOwStJG->(XNVn^#3Tb`lk0*7*BQrspCagdfGAs=dItmP6epw;~ovE ztK!VOyv8_w&Q}YDR?20mUax6Q4Z$qz+e9^Z%u8^Qu{&ROz5DYoZZ{8j?YnT>=@J8r sU_H0xmgkG8#aF9&a=#up{yaRcR?#sKTjpE_SSW_Fyt-WFn|GoA1LPR5TL1t6 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-box-psef.png b/media/images/administrator/icon-box-psef.png new file mode 100644 index 0000000000000000000000000000000000000000..e723f51ca96884a895653e821347a377c632db81 GIT binary patch literal 10647 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 NvQkQt6`u_Q{s)thA$|Y= literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-file.png b/media/images/administrator/icon-file.png new file mode 100644 index 0000000000000000000000000000000000000000..e6881fa29d66f8f262385a9c9f5368f9aee0b02e GIT binary patch literal 408 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 literal 0 HcmV?d00001 diff --git a/media/images/administrator/icon-voting-small.png b/media/images/administrator/icon-voting-small.png new file mode 100644 index 0000000000000000000000000000000000000000..eb33bbc8a6323066d8af329f08a98d9d3368d922 GIT binary patch literal 1940 zcmV;F2W$9=P)7IZ~ebVG7wVRUJ4ZXi@?ZDjy3HZL(ZFEBZzW_$Ml00!(y zL_t(YiItXXY#e75hM$?8z1q9$cl8iX*hK&twON)#bcE=na*8X?iktYp$U5ZmkfZDX(ZGJBbs-I>FW zwTnsCl{nH!Gv|BHtM{AlJx8A+A~cIsDs?s-4!;6m7{-^A$>eXF;nb$pjTlZO62#+i zfZ-icB68QG>-w41)m5=9OKjVgg@pytb^WW&usbOj?&#=XZEcNmxy+tDdv;Wz=(^qm zJO%UseLzn<9`B7rA`}V*{C+=?NQ6u#!|Lkl1h5KB0vTXLxpCu$baZqO4u=T_gQ#jl z)cpKBu~-a`$AjZIw6wG!BDk(grBb0%sgTKJ(ENTsot>SSrpe6A3?hPU+XREb4~t5r z62)S%Az4xIdcAaZc2X!5Pz}TQ-tF7BaU2KBvd}b*csx!bkw8%tR8=Jsi4ciI@cDe? z^LacT4@*l+luD%+w*LBy>+9=c7>10EjY&G4mW_=Ksnu$-73FeSR#sNTvMkBva-!?{ zMG;~9(Vfp`vtk&AjE|4Y+}xb3udhqBS``tI$;nA6l}fU*vLd>!|Df41UM-i)IF5se zV45a{LVh5mRi#p?5Dtd{ z2AdJ=3xz^dt5sB0B^Ha(-`~%`zyK{REfkAIOw%M33IW`^RiterI0cYMBye4qa=FaJ z!~}|>kVqux?(W8QU8>b8z{9{#?j(4-SS)@fm&=jQ=P^z5Y2al*ot&IJ>+|`3(bd&O zy!2Qd6;nTbpVXn z;|$3=&0rrn4>)!SlFv8ZcZy~`E?0O^u75+MUKOd8Mc(+L$Q2I#U-N(?-(~HcUs9ZV z3yxmgQH8d--$7si*aHmG`-O9M9o*VFcFv32a}u@d#4w|Z16{O$=|{syAR&| z4j8k$8Is(cP8=Zq2vX2Nt2Z*GPN;Q3YmT^g1}irO-Jb?H*v!faI+L*Rcc_7qeF&v* z6y@M$l)?cp>aZ~eoyTB@dGG+`W!Qfa#r!7h`Xt==G5Ffyv2m2CR|)xc117-7n-Lts z-;QFJVfrsH{yA{#Uji)j3$OFQb9lRsLvaeAf2-)f?L4ZS-SoRnqu+nWkkmKVyui85 z^$ak=ko@6)3GRqgD%G={FqurQHp6MnlAG~#JRW~mL|9&4jsV|o25PDxl}bfaRV^Go zd>BPh7#kbIb=`0>nJnFj-EkiD_4QHC{0%ez0eyXa0AKsaEu>PZRv^A_-@bo`LLtH- z54R_;;*0KQSN|Zu<$OMWIh{`52P|!=QFLAZ*518)Uvga+(=;(nleV@tLiRtXZM=mq zdO!ZoM=00Y$Y!%>nnoZHKvh*17Z;yZrl+SR8jaE(4dGN5s8!~%iqjY?*Vxq&#nU>7 z>2wi_9Yyi@P_7uOM)nhGJ5DB(L9J9OPfSfsLD%EZeFS28xF=8aV=K7U9AeI*I*WMSS?Z-*2o8ac zPcbnuL8VeTttOMn*DTBW`rNWbz4t1#JPJ+#+RFr5|A|{3!!5s0VfB3+*H2sDS?1^G zsnu#vB$LVCY`&Lq$GAyrYb$JP z=j{Za&@>G^A&@iB{#PoYA5o3|91cxG+vf?mvjhSGfFpM~5jdr38cyImwr#V#uuMMx zuO9-wSStb2fi!@qze$(b7*=%+=7z{q+x-M+H aAN&VP!L{81I+?=&0000!N000004b3#c}2nYxW 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 UFV(CZNdN!<07*qoM6N<$f{G}OPXGV_ literal 0 HcmV?d00001 diff --git a/media/images/administrator/index.html b/media/images/administrator/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/media/images/administrator/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/images/administrator/line.png b/media/images/administrator/line.png new file mode 100644 index 0000000000000000000000000000000000000000..df9aed4e5947fe55adec554f2d1db206a9810a6f GIT binary patch literal 1597 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 literal 0 HcmV?d00001 diff --git a/media/images/administrator/logo.png b/media/images/administrator/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f5b79ab99b5de48f1d792389987da1f4db3b28 GIT binary patch literal 7953 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 literal 0 HcmV?d00001 diff --git a/media/images/bg-details.png b/media/images/bg-details.png new file mode 100644 index 0000000000000000000000000000000000000000..2d81c5a25a461511e98c46e0fc90029f5e01f719 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!VDzkcV~V9Qq09po*^6@9Je3(KLBzK0(?ST z|L@oNy-)x9Zllk;Ox|xdd$Y~*#TM(Qo9!NMbiB9T`Sx1Z8*4nSuJ+#7%CNJMVM`su zr#6FgK)sv=9+AZi3|t>Tn9*sC$qb;NScz*yiE~kEVo7Fxoy;nEJ`iUFUl@fa1J(M+jMyWP@S@;i(?4K%;baw yfrJ1CCw2uNhC^%$F$^v25_$$U2|pV6nHWx1iv%w8lV}1eXYh3Ob6Mw<&;$UpBUQiv literal 0 HcmV?d00001 diff --git a/media/images/bg-download.png b/media/images/bg-download.png new file mode 100644 index 0000000000000000000000000000000000000000..1bda547187e429e24232e2ac95fe3d526506acac GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{M!VDzkcV~V9Qq09po*^6@9Je3(KLB!d1AIbU zjjkE#U)9&Ss$+J}%;cPj^+{{Xla`K09qo?TxgK!!-s|mrz}aJu2g6JThKUU92CFTA z8aWF*B8wRqxITa|qthCb89+g?64!_l=c3falFa-(g^GA@gIz>+x#}JO0$pHxg2?+@W r42M`0au^QrI#e)l=rcTIt`T6kw^~F|d`Hw_pkfA3S3j3^P6;KZ(=!*GbD hjjfH7hx>yggVAZ;#=6VOM5H$aNH*vT`5gM;JtL;nXrE>D0@ zi0jRpH~;_t|NZ;-4<9~g>p%1WigOltL>4nJa0`Jja>QWe}Xi&D$;i?WLqoP$l+ zHeFr-R2Smu;uwzopr07+L<8vphBmZUrI3h^^B%xq`n*~s$cJF{EP7+p8OSnG6|N9H+l{5PNI7gHycx1(yC72enm9f)8d+mhOJrcU@-x zy$}5*xi4;A*t#&=`Fh(r-dO2fW}^b5;W3&VMsvexVK7=2j@AvMRpV&OV6|6H_V+Po~-c6={09IEGZ*O8WQz|9)m+X6D2776%(nxhnsAD5^a9YrmG; h!*Z2f?2Jr23}w1TDGooh7XURec)I$ztaD0e0s!~ADr5iv literal 0 HcmV?d00001 diff --git a/media/images/button-detail-l.png b/media/images/button-detail-l.png new file mode 100644 index 0000000000000000000000000000000000000000..d5a11a2a1e0faa6c70c1e589ff0c739bdbe6527c GIT binary patch literal 1563 zcmV+$2ITpPP)w(E zZ*psMAVX6$2C~zj0000MbVXQnLvm$dbZKvHAXI5>WdJZYFEKSQFgd6gxX1ti1$0S7 zK~#90?cGg}9Y+-g;P;%Wo{u}W<-~S~kU@N95ut2Yus~u1TaZ{FegbQL4qGHv`~Vb* z6^@V)t0ag7#CbX1 zLn@_oSt>~Y=2JQ;v=i;5>`2*ycDP6=BAj9LffyJK-be?L36)a1BsB;nr;(jV5#5ry zCtKHbYfs9qlnzpWpf~!!wu-i7TM}#fNLnUTO6ii+2#{SU;N?rt6!&f zq6MNL5H>7NW&Ve4=BShoS&V&kUHD1d`-Xk z)8!w3Uj02-3u|->Ms}c5N*h-R2_gcjAQjSyZU+(W;fBxji%9f+zq|K^xclSv`m_!! z$T~2R#@wZsQrff{5f%sn6opcXl#by`*JIugNL2v1R^xiHc7A?;|Ndez?#;gQ%IYD@ zIb|Ijvh$Qu+PE52T*MOsAcPcz-#_KsN3$Ywdxk3fa<_bIXF>Az?OU(Cb|?D1#mU=> z$7BH%l$?G_DQ#Arg2^1J5Jv=rFsF`3druytT<193y?*1`HnzHs!0yh@&d$#1@zbZW zJw%16nn*zY^M9q3(*NKho_zWSf)F4W^W#t6d*>c?OSkv7uHCUWzk2tLn-QU^s_Jyt z(nq0d4XFXmd`c;8ROQ8*%;#9MFTH;EN8kT}ma1B`=<7GSS`jQoH6q+1L>tvz=ul)l zrIa?TMnD35wuO!W33Ge(x_s;I76CATAZ)b)L{wEoJe;HxEueu;a%n+IX~QZ>66T;n z99=*O_ZVC2$M!<%lu`sRGj}I2#Zz%KLDsNKDQ#8-!W=;e5ky2pINeFsQa=9xNq2X5 zPM_&1;PWHIlv4VC)M@8R5E6_CcUNoS(OMgZ;f1?Jq?95e?mn8E2P1;acuFa4+{M(m zIVga6X$@mfYaOH3`oi5Jn6k;NwSH~Z%)B^Ukfkn0t)oY^|}Z47Fz&srKvu1TwRRxAnBOMHmrHBFtN$Zs-^Yy+5zUW!Nn5`YsCg1A_6IrWbS>hvh7Km|eg^x`k2ls2dCe&c)d$NSpQRRAb5 z9o<3zO4MmHo&1|>DN`J&pgeydUP>u#ME%Nle|B*2;o0GDt3exd=eeK%n-N<^Q%dPF z$l>APg9i`ZzxRuygJ0X~_^R8JQc4%(^z`)T=;+|!;L)Q;Po6yK``+D|tC&(sSFO%w zvpaY0h{$XEFzP9nn0*6a0Ru~;sb!!Ts;DW&u>_$TJj->sWu2loH~ N002ovPDHLkV1kf^;*bCU literal 0 HcmV?d00001 diff --git a/media/images/button-detail-r.png b/media/images/button-detail-r.png new file mode 100644 index 0000000000000000000000000000000000000000..afaa653340c2ff526e252cb0565fdc25c02d3a7e GIT binary patch literal 572 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 P00000NkvXXu0mjfio}2f literal 0 HcmV?d00001 diff --git a/media/images/button-play-r.png b/media/images/button-play-r.png new file mode 100644 index 0000000000000000000000000000000000000000..b60f73e8208bf9ba940d2b4500352dfd8d12ca5d GIT binary patch literal 568 zcmV-80>}M{P)w(E zZ*psMAVX6$2C~zj0000MbVXQnLvm$dbZKvHAXI5>WdJZYFEKSQFgd6gxX1ti0g*{W zK~yM_byGcS8$l3#b36LDTgfDMhjpMvU~u6gCbPKt|ld$u)9vBTT<=FPB6({E?q7_U_0{k!<{CuWYKh=}O=%U1vZ z-0Y#byOVrBjpLY^)$!#GUHyt~{;Ios_w!;poAJjFjYflh;|%~I5~UV)HQLtOKhBGy zV1WRD2stbu596^PjkMO02mYsc2UuV-nat;N_Nbz~VT@TWmuv&TmT9f`{yC!z5#d$Y z900I_*rzf=J=P?4bzoiAdPs1t0d^DM0}|Unz;9~qAs(QYc0)!az&c$h6*{Q_FSq+T zP)+{KZZ$_}*Fq|(a6j18W20SpmEj>vz&`n^Tv^~2k7jEN01X literal 0 HcmV?d00001 diff --git a/media/images/button-preview-l.png b/media/images/button-preview-l.png new file mode 100644 index 0000000000000000000000000000000000000000..4b11b7071a8278e9aba4c574033d7c76f476eef3 GIT binary patch literal 1415 zcmV;21$g?2P)w(E zZ*psMAVX6$2C~zj0000MbVXQnLvm$dbZKvHAXI5>WdJZYFEKSQFgd6gxX1ti1mH9DVJ=aK*e6m0L zFC+3_Wri7k4r-X0QzZp2TR zd*UK;mK28fkr>J*5jk55NdWM6{4WDwu;cHqmwW_3E&oL1D^kE9)A7pA3tR!@1gKS;0oD6^mt8wP6WD5kTgc6ZOD+VGO00Rst z2}?OG7dt;l%h@s;0Jk!6j%P7x1fn{iLp~8%u)=UKAsmKm)*&rtt_;#ejPIs{I~O|` z9`Co${le~Gh=_1H!>L^;5m~HaAQ*@+L$Wk54zsQJ!H+H-{P^D8D;HNHxV`uC=YM+q z%N?)f{H(Ep5ux>+h%8iz2t)$|u!Jbd&K2Cj-h1!dy}o)Gqye{9FTeM8Jo@c}5r$)n zgaD}>auHdmk{AepVX%ah!R-AvzLqbXTRxo3a)uEGTV1*E)_Fd7Iq8T@nih8=vS0-a z5b#Dbq(ldp`sU4jJe?+_l#qZ)Kb=gbo%f|ORiv<>DWF7TabCw09k2*`pmOlpJ|C@b ze)INCj~ZkGHnv}E_m;zR?Mq9E*(~v>Y*R$!+6GzzQv1A z)-IoWHoX1rD_mGgRt*k-aHvF6L>6K`d*b}gU4&Jdg`>_Y>LIvi-2gsFR zHWu@Mt3*>oPF^w6z%Ta~Cjmpy0yH3C0b|N6$&Kauw>H}B>c+$F>(`jyWSHpyPec}= z0084SU*;c15QNRo=0JdfaI};PO1k#lr=y##X0JU{rX{EVN<>at;r!U{pPTs}h15}p zOoo9pl5Up46hQZ;*VfpFW#odCVM-_wIZ4Ic89s0M^eobvzL{N#&r`N%jBuObZE+4jlcCfEmpIA_8WrEfA5DRmPM4FQWwY9ajw)Xt_^WELu>2&Ju zx}+i^r>+c#!z)*=nAvbR+}YU~kH@Vw#gmAfI*W+b+GH{rjYi|~xbJ(-ok}@P)w(E zZ*psMAVX6$2C~zj0000MbVXQnLvm$dbZKvHAXI5>WdJZYFEKSQFgd6gxX1ti0hLKa zK~yM_b(6tv(?Af0|FMT8_QpuHQzcR)7(Xrn%o4mV_07{P&-0=vj4^!jJ|Utwjwh2zp6AQu zaPN)9JMPIDY`}vF($B=D_#>0000< KMNUMnLSTYvEcRLe literal 0 HcmV?d00001 diff --git a/media/images/category.png b/media/images/category.png new file mode 100644 index 0000000000000000000000000000000000000000..e6703af0e35f31d8277ce160de940910ce3fa725 GIT binary patch literal 932 zcmd6l*-uk>6vr=%O|2RUQwa_a^5Up5m{DWkYBa63#U|PksR(2i3RGDVkx~R=Vq73@ zg8UUZ#tx!UpZTFmhe=D0pF@hUi8ih*Vn{Ds;Z@Udca4mO;Q3{(dCOVJ^PZ=fjfxfmUg&D$;n{w_ZAXR1qW zHb0*<{oZZrFqxh@KPWwKN~VoUr!jN(Wj<(!$Betjp6#A^s02@w#~&!b1K9Dm+|ep? z7$l$t9=j_B&B@?44D`Ez9(LRmgIg&>w_tE%CuoHG>$ihi*#75^(JNcq8uyG|-paDp zwkFjVF1|l>hZN~tUf&B)Y222j?^=Fhe^wa;t%zMxM8D%S%?;yq(o9`?$x&T}TC0J? z`6aoUL|LI$Q&FNVE>jxUDYzXVmxxvI4S8-}6iS%Qt!9aD{y6WV=w0Hj82+)WuISj& z?ip44$ohe2u1J#!X%a~ZLmbE;WY+PL;^qmoK<+eK3X8u zuFZ;1_{n%)T74!`+LDoR@6Ex6hVt^6nJUrQ*iF}*Ld{y9EM_B5Q2+8pyInkwsg)X~$lZBS6)_UcnQJ1eWmD}zwD-_(|ub9Bo4gD|cx@jt$> yAnir_>k3^E!&akJV+v28mG%K%k()L<(bKW2GhkfE9)Q1zJ#266_6y6f~9+ETMovKyY2yAcE^M zyEAX*zWd`Gi#M}E%}q{n&bjydIp^Huz#ASjbFTgP9WkUm{eJaHmYF{K>h1qeMYJA` z-1VZ!Ha|c2JvqP+-+al($5&bVbMp&z&o9PtU5Tiw2&#gr&dg**)y&VmbN=Ls)qSIcStEBDUqhu`VkDBPE{PeeC1{K{zo6A9KdFV<^6U6 zTOFNWJdB8-fQpi$Mi6>}@oot}efVMwdWO-Kg zdZw&OERdc3`rGo+lNWP6vtvK(Z?MQ?;>)|ZXEz9g2e`=&jdQIvju3*P?T8lW04sMM ztgpnT&I;K(oRFNql0+XikbKXs?L-1}$^fjsqGchnFkZegCwg7;ED!9qm8b2a5HL3zS z6TZ@cHAo&z2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4fxrAZ4@_Z>LpB(P=EDgGHs@(H<#3lpZ>Z`kgozhr}u z%ND^SH)bT1ai5(%GhLBQWyc2T{QCEEs*fL)cv-qlud%l7b=JzvYWCyXgSnn09r_m{_v@Z)oh|J@z2BR0prBZZYeb22QEFmIW`3SR zNM>#-gQ0=GfuX*EMT!8&N}vh}kc!~^w370~qErUQl>DSr1-Hzi)bjkI>|+1T@_s-y w;+`&!AsjQ41BB8Tm{J7}K44H|mEd4vkp0Q9a%IDnLqH`Ap00i_>zopr0E{F-UH||9 literal 0 HcmV?d00001 diff --git a/media/images/htr.png b/media/images/htr.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5819eafdaf6491c51c22244f3a74f255dafb2c GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4?3?zm2ODh8@=3*z$5DpHG+YkL80J;1DJ|V78 zKmC9I{XY=A`11eD&;JePZNGt1oCO|{#S9GGLLkg|>2BR0prBZZYeb22QEFmIW`3SR zNM>#-gQ0=GfuX*EMT!8&N}vh}kc!~^w370~qErUQl>DSr1-Hzi)bjkI>|+1T@_s-y zQl2i3AsjQ46A}`{f)W^*(hN>MU{GU~_`t*<-OjMm?AoDdpehDWS3j3^P6Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f7IZ~ebVG7wVRUJ4ZXi@?ZDjy3H!m?YFEBZ%7`Vs)00II@ zL_t(Ijir-4Yg9oLhMzO{dUrP%W0F;3G&YKY#t2DaDK;8QJ6j`m63`!EGXOKhIYP|-<-pATh=_GMe!MEW zLO_{ea)7~w!eSl~U+p7Rz+n3dms_YW{4#l9^2Fk6!4JVG6MEM`EnPr*!yiLCI z9W%uc=*N6F?q;~eVfBe@AHdA)+LhV&8(Vp+k&LD)ViFb(a7pa+9 zv1{YocOPGO@~VAl_F^rBsH*A^3_}b=q({+MB`;sSS?v!WIp}Y62kHj?0tR>}CqUr( QOaK4?07*qoM6N<$f(OnZ^Z)<= literal 0 HcmV?d00001 diff --git a/media/images/icon-document-32.png b/media/images/icon-document-32.png new file mode 100644 index 0000000000000000000000000000000000000000..52b7f2de8c2facc6091117d72cbca6adf334d277 GIT binary patch literal 1464 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 literal 0 HcmV?d00001 diff --git a/media/images/icon-download.png b/media/images/icon-download.png new file mode 100644 index 0000000000000000000000000000000000000000..6906e3a8280b324164509920e763b0e9124c72f2 GIT binary patch literal 775 zcmV+i1Ni)jP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4GA}VVFEBZrgI{_800Li0 zL_t(Ijir*!OH@%DhMzm0xg%j4M<*1WlwvT7J{7^T;6~Jpk!JJ%{61Yx$oh4l?xg zx7tIZnrcx^wQvy;m#25eoPQ4RWk_%PeMD8s`u@wSefyDv0;G{BqxrV}_4i!;9U+}g zv$?rREEdCc-HLoAQCbrkg*F%<4Gj&RwU!_VDz97qVAfi$KR-cds)PBpPrSZ8 zLo^y?V`GEC!NE}>rKC_Okk9AweIH{C)>^dImGP5HZ+I|ylSk*@GCMnq5Q3VT8l;qn zAP78wAPCS}lgVUo9EV6GQmMdN%e~siEG;dOOeWD<)6~?2l+qJH5TKMoDTUS=tu>D0 zV2s&^VvNBUgVq{rEnyfEh9ScD{mMaO3~g;~74x4cd)JLIr2r`<@p!zFTvpjwzI`u_ zwU)-lMwC(r-}lo)Lqj*DlmtP*-oC7IxnUUYL$%hXe*q}Vp|>Hv^7H@z002ovPDHLk FV1g|+NQ3|Y literal 0 HcmV?d00001 diff --git a/media/images/icon-extlink1.png b/media/images/icon-extlink1.png new file mode 100644 index 0000000000000000000000000000000000000000..ee892b539ad29bb3b7a09c75808582e2b793242c GIT binary patch literal 895 zcmV-_1AzRAP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4GA}VVFEBZrgI{_800P%Z zL_t(Ija8COXq-hD$A8bv?7mGl-DG2A+j@wI5?Y8_tO|i_DNP}vMkqy$*soI$4dkE* zy@;oRAqTw(xmZCIp|{e~LyOclv89F_r167@DI{h;8qzJYn`HNW-+4T|o2U=W3_Qd9 zW`6ufRF$ER@0@GP?t0${uK~LNf!3@7>WO^(=hJolUjD9rG&?=oq*bD-j9i+X`DWtK zeq*Fd!J_PxDuA+93;A~LDdpwH#;*&%b^ka$+5m6>#!6q>*{)w6V~q$TmlCNbij>VT z=EzICd9%;)z^}Ed-(M|^U(enB;;n`O5Rnd5wP|Ze8E^u&wTgg20MEW`n$b7*^8AZI zo6Bat0x-z~6K4Y$0VDGNVTIC@O?o>*4s;9W2cE&E>^nOO+pf-nAgBmFRxm=!f>*;I z>q^r{c;BS(LV!3E?Eq9k0Vf7UQ9z6&A$U-0APvR~-dhv{V)z#TcoJVh&{j`9r0jNH z28jhVir-161@KYQ@Y~V1c8vkN;HdIdK}JSK7#<#GqY-jp zd;);Z&d$IAL=EpF@6~kfk-th00JwemQ#6j5oSY<+Nuc$59r4QNpH1npp&?maUEOj3 z;Z|J9q;1a!$6w8SJ$=W_-2Q=g55EkBekzp;i;If{K|pVBFZp~PV+^zR=i*|qSQb^~ z(1ly$QK%;bJ!qPhj-DqsQqSePBnVOn@UY$&M$)dYwEvtIyfzw5Un*6q8@1}Oe*l%o VM@o*MC5Qk3002ovPDHLkV1j>3mCFDC literal 0 HcmV?d00001 diff --git a/media/images/icon-extlink2.png b/media/images/icon-extlink2.png new file mode 100644 index 0000000000000000000000000000000000000000..c3d1610d9c22c872da2a86f3baac032a3abbd23a GIT binary patch literal 907 zcmV;619bd}P)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4GA}VVFEBZrgI{_800QGl zL_t(IjYW}5Xxvp4hre_FcV;@7kaWV7@v(@AMM4OoDJs#7v^0|GLJ38UkE&o1+JZar zi3&nBWT7i@A-WNSxK;#TwTVF$l2h z-^~Dwjh)58x%|Rlb@Srs6R*#Gm+KBdM7qr^a83~e+e;Sk0wMxG+D_tl>VTjMVv1Ra!$Aa86>o;2(3zFn8<_8yC^1ayhzZ`n zX#j+PLnOqkU2EpA1F(*T*4x((O+-*2kN|=Z!T=M`cI!`kXV(sBYqb|nW7k-^v`T)p zNUASM@#+>w9=wCDWQ^IF%cKt_nJZsLtl=`5Oriq_*>0}VY9{$+W|o-k^318Hs8lMf zudnm-h2IFGaZXM=gmVG;e4fZJ&aL&Vyy^CpE#RZ?J|>b2c>2`iyz$}NY|Q_|O*h`a z(9jTt+}})3&yz0{85tSjfy^jtYirLdKp2LE)}(f2hrXT!0LM;esWqBRPEIm9I!ZR1 zWqf>`YQ4$Xb1wkU+uIv+0RL5^KJ?zA$+&DRUIpOm55B^}kg2ID5{WjnQmG)`c>ld= z8#{hna=Bd10pzbNlu`%YN}aqboA~V4&vo|u3!FG|42F+VDwSAXUM3cc(cj-sI-N#U znY%O}=JWZYm>CaGy?bt_{KJHqzmsOGJGycxa&!8i#9|Qy*h;mU*LGIyaD6Z;c&pbN hzECKYtGnf~{{i&|OVXvJ=I8(b002ovPDHLkV1gG3qYVH6 literal 0 HcmV?d00001 diff --git a/media/images/icon-hot.png b/media/images/icon-hot.png new file mode 100644 index 0000000000000000000000000000000000000000..bfc0c02d75ec37e19662709fb21582134d237aac GIT binary patch literal 948 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 literal 0 HcmV?d00001 diff --git a/media/images/icon-loading2.gif b/media/images/icon-loading2.gif new file mode 100644 index 0000000000000000000000000000000000000000..88fac73dca427cd918e7fe9fda891fa7517a0c72 GIT binary patch literal 1569 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 literal 0 HcmV?d00001 diff --git a/media/images/icon-trash.png b/media/images/icon-trash.png new file mode 100644 index 0000000000000000000000000000000000000000..70938c99337b54607d945ac819fc7c7ed37799b0 GIT binary patch literal 854 zcmV-c1F8IpP)7IZ~ebVG7wVRUJ4ZXi@?ZDjy4GA}VVFEBZrgI{_800OQ_ zL_t(IjfIoFOB_)Y#m}2vKW1kfQOPP%P;}OSL=8BNkitSl(`8AzC@<#cnmaj637Zy!+luVVDRSa@x!N-E+T~QVRc5rBeCW+1Y7d zUte#}&(9y-kFkFNN~O|ErPQlJq41_yEEaTKhwHl0_V)JIIF8F38yiRe1e8jpcS@aU8g=`yvJG z@9$@%l*2-Zr$UJK?(S~0R;$6bZRolVDP;=l?d`?E!2tm1DL_j3ObGFbh~|jMjG~C? zx(*^j7=~bsfrwHkBO@blT^9h5-QC?ag%DpRCnuNs`}@(>)`n)YiPO_lTwGkhwrw!R zAcO$t97Kd>vxy{0?&d{A3;BG0X<%Rgx3{;5q6n5{VRm*FU0q$M)oL&d1B@{khJi+- z0i_f;=XU_k`G?WbQFxw*o0}W>zK>R`1;!X0$HDpeIh0b+G!2gD@k|endf&dc}6R6kgs8*}+eIG#(0081R zMjXeGQbI}z&N-x%AfgoT>+I|drfFh&dKxn`Gq5ZR0Khqi5CT0tJ&;mDDTPcXgIq56 z*TKrl%Fk-Gx^sAV2+OiySr&9%M=qB`rBZ=y+sNnh7#tjgWm#BQSU{uE01?&GJ4lk` z?eX#Pj_>=g9mh$nmdj;jnkHLcUk4F^h#-XELWsH$V&=g!t*)-V=bV2gq6QJ&5YdmV gt*vj5zUv?T22}8f#@QPD{r~^~07*qoM6N<$f>=g*=Kufz literal 0 HcmV?d00001 diff --git a/media/images/icon-unpublish-g.png b/media/images/icon-unpublish-g.png new file mode 100644 index 0000000000000000000000000000000000000000..6a0e63664beb9ed22bd1cf2885afa285af02f153 GIT binary patch literal 600 zcmV-e0;m0nP)LlFM%5KoCVww~cK~urY=ONGw?8|G$P0NH&2s z5A$l=cGoOMLqZ-SjplAzYE_-ORk}(<_#cIzKb&)NJRYg*8s{7$LJ$OGSw^1cL{X$Z z)~k;WPN$P>HXC}q9>d{~APDf@(=-jc-Hxv7n9XM7d9J-9?0 zG>8ac7!pMhRaJ35pIIyxj7B4MU%@#io6Uyda7db__h}-6)|#&CxL&VhSw`EoyuQBD z@AoB+W2FI($0J&6(lq68IN-gf>pHymv~5ezeU+jB}2vs@{)S*Y$&KYwfoe z@AZ0EYblBXV+`~8{5PO!8nP_oa=9QPJU>5w3s|jIc<*_7dcqh3fCdl|x~{wL{Wp2< zAKnlk2m-9N1VMmvj@4@QBOpl^c@gIk($kBSZmpCw-iM|nx<&2(ONSY3@FQz z^?J?ud}g^^k|c?OPf_0Q_ww@cf^&|dD2U@20BbGA7_`sL5?JIw-oc($E%(wIBf1W=4=lIU| zr;fcpdGy_h!*5R<`f+IQ^CLTd?pXJ0=h`1zmw(v0?ZcL>UpB9Ny=mQ#b&FqZSo3w= zl3%Old|I>e+p2}%S1tIudcp4%vp+9e^mXZi2dm~kTsiOSqItg-P582K?(OB%zs#R| zd+F3)bGkmxnfhyH+sD~ce@w3XHL33Vq}rboYu`@l{XU`g-Ne2R6Y9S7HvH%={n%Ui zuDjtwciFqnk{_-4?^|m>wB)~QuKCuS{h_JqTVwjGrka;^<&WxW9@o`;u1I=WmH(o$ z-zp!MER zi~S)s7yNAZ1zR5WH{Ka&e89&D7%8*=^?w6KSw~5bUoen67yyIB_G|n=H*pqtL>4nJ za0`Jjf_ z%JP+#OVf70n6|CUVUFIE;P>g7l9$4?nLf*`c5{m@ZsfDRv;71E!^0C1+nygVm literal 0 HcmV?d00001 diff --git a/media/images/icon-voting-small.png b/media/images/icon-voting-small.png new file mode 100644 index 0000000000000000000000000000000000000000..6ded95bf65be565d366460336c340290d61721b6 GIT binary patch literal 1401 zcmV-<1%~>GP)u=QrQ| z&bhxcN<;`7p66Wv@~-RN3ClBffLMlMdh>=|TP*40=n z=EPz#$F}Y7_5|`g@1$+pL(yoISS*H8YS{CdIG^Y}Y#HsG?ZU8cw z3~Os^_o~(EIUw!2ZqNprnVA{1ENfILbqqKPbm_XDux;Dy>FJ5`D#94yPCvAEL+f`Ce;LN=Rab#+xlWI%IW z_koC9+}PO28HRyrnrNC98irvYA`}XRb=$VjxUT!G*`wLn*)iL;ulM)&#|45dQAExU4-emgmR%be8JXPN+`O{5xL62+pkpAl&aRfy_Nws%FqPU8VgN}n@Z-ykPPNFe{37CLln55dh zAxSD5=tW}+i&L2O`3g|t9>O^w&A7B1QYIKgV-!WxkSG%9m_&%9TC(#L@ByKKA_FV{ zPYAfCWP%gu+$DmI0qD@S_-#X|-E?K3h#(ATjLQRri0P#J(* zj7euhGA=%f0qhWv321~HlBCjsULw>QYSc4~mT&-JXF~#UY-+o*4m>BzUzEwzD~bS$ z!z5L>A+bk+xX$PG zmo{wVfnO*RaGo!>8uBZdB*ztgra&>In%BVZWGQpG0ci&Tl(>m7&2k7R4fx#R>zxcK z4A2z-M}T?FuVYsiM=p92rcGE13f)UKi0x!Q#xZ4}GE zJVjn{n*xJW=;IaB{7RWLyEJ5(C`;U@(7})?-ufT%KQrXNwJdmIa>V`T00000NkvXX Hu0mjfi8*^K literal 0 HcmV?d00001 diff --git a/media/images/icon-voting.png b/media/images/icon-voting.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec6df6583a7980aa6df9db2d38bf0895b57ec42 GIT binary patch literal 1735 zcmV;&1~~bNP)!N000004b3#c}2nYxW zdF%)2M2rwgk#L1=U^*mTg$uS?|p3yd1p7_S)VZ zC$5yA^wUaj-+cBv@4em6tk7DMq?A%VAbj61Cz)?0q5_s>T^2$#fT1MwjUgon5H?PlzQg}ft6CWlya<4 zD7dC+VwxuTeBPB(ey)`2xIf(z4_lU1%x1F)ArL~4%jGZ(;}|g9=|Z8kMk&<;{1oVu zQl2ynqbP(p4D|N&^c?U!Z_`D!T8;Vn`KdUL=YWS=>jyy)`~#Q*{^R@pyci!Jzipc4 zpyN29l(HbDWMiAAxox6mvq=yHL{UT-hHJghXf!OX^|)o4=5N9ALRK{rmUlGnq_ccpH@2+1XkYMHhyKhHi?r zuk_u!chALfeC^PoLxprYy({R_(h}8bby{mZGBh;w7iewXS}CR8wr%^?!Gj0$xm+$0 z^u>!8JbLsfjN|yY@B5Xt@lD6g_x&$}AUON<>C-1GD=Qd=(Xs3GIGK!+#YOS5ek01Zqb={-={r%GOJY3f$o6Vj9{@f89$8k{z zL8Vd&mY0_&gCH0Sg5V3^_m=>aQrDv>x=^W9E_$AKB%96J&1Un>c8+Lw-km#l<}AyK z<2e4L(P&)veSc+}rGuQmj}z`ve`bqQ1c*iOU9}tY{a+2wZEe%`-_SVvr#AyUa5uBhT_Ri7>E@66@6mN1X+t4M}&~5m2WFoaZCGZfUNHb7-zn zps?%Y4WPy}Fv73&R!dV7Z)0(bSIFZggsuQ{glLX4s<*c^qxwrC&a%i8nyeqOojL-R zsG@mmBXlcx6+S^sfJ^|kfS4Miy1S(*iPtemBk8_j4gjxF63Hx$LkcTlVw-I(y&d=% z7T%_0bzq8!DI!+dQroOqx(nFl6scCC1~5&?Gwu^GLcqs7zj1lq$qk0K|lDJNj3skvCiX)`4iRo@>u8KKKVlNQlAETvnT*mx=So&3tlG|%b=eWcXGW>)zxxKWs!vMWN zFW@AzbZ2l$*kl>w4O|4PnkwSr@i`^&!~RR-QlyVnzcqn_fc!p|&TtZwA|{8?^ztSL z=xw{|f53gFh?yhiAu$hFYPa+sxQ)#qIYKfNNC6oj1*BPhj@YhN#ku+ewf?%mA{I@? zh5i#~_?8>IgF(K_!gQ+{;NNSOeqZ0jL1G(-cVp=kDdGfRfYfd*ZR2ga \ No newline at end of file diff --git a/media/images/mime/16/icon-7zip.png b/media/images/mime/16/icon-7zip.png new file mode 100644 index 0000000000000000000000000000000000000000..99ae6fc6677bb9c0b47e740778a315a56b1fc3c5 GIT binary patch literal 551 zcmV+?0@(eDP)hnm57*rzi*-_GEo$ne!p+>JU83z z)&xNisx(cXT-QZweNTXTy$(R9)4AP=2(IgLI2@joh)|a0-C+RBvH+OR=Y(MhfH8)$ zED;ebtu+p&-3toAAqW=5E1e`$0~~Ap9a_X zzK`d5x4tY(ilRV?2vt=*G`Qxi!CMP;Jv@qtFdB_++ef1jBEogCs;Uaxw#l;WF5q&x zuvjc^e<31VE*EUueg(vFjN>@;dcFTXeKUADolc*I!y&e9ziYTC3W6X&YyDE2&1T<@ p$K!LFrk_7z&}cM%b-UdkzX4XSEHy8yRp>>VCD?q+4djE zFhLZ?kYNHDo&L{yjWHmtbuK`L3F?!K+qEL*rc1bYtAI!AAI^ET)*x$bE+7hHym>m8 zsh{Hxc z0+?}7%>lS005jv|&N1E(Z{Sz4h)Qh|%#6nmrZ5#s+=(ULKB@ilGIKV;;@z9r-~El* zqJ!7VvtVYdE>*C)R2hE*tu=@UD@_k8O)uB{zl<@bD-e+{gn&}&T)c5lDFq<}h{&f> ssniOBV58gZ&R;k#M}q-)|*zi+m6v_1bBa_z|1dhCL-i{j-n{e zMN$3^-?jH~UCd#bq4f@k=v9L_j*(^AfgodWdv9PLsmu&!#&9?U04Sv}o6Y=2r4+i| zE|?j{7zjfIGEbddz+f=&vm{AsbXSpxAczdAXXXN?)2Sy{Et~-WXsscPC9hu%Ns^>S zuHHL?#|j44a_u2AV>BAo=t`-TDntZfjDe{LxPX4Y?`NG(r$$~1pqjzD7oS_+pn3+* zU_2iCnUoR$P?ja6l)lPSz?!en>-AQM%T@jb(E19_KuYP!aU3HI!_^9!2th+UYv9Ps zbRt3^Tif%S>?cTTSj#@(rE9TRAWc&UA+E&Rz4*(;ul(e4bg>BlUv>0fKU1^WoJ3Ld Z=>bTwJbCQ{8OZd# literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-drawing.png b/media/images/mime/16/icon-drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..8f1da5c333fd0e97559e809da86928bae710b4a5 GIT binary patch literal 679 zcmV;Y0$BZtP)*gHC!F64q@T=P3!^;h%tLYE{MsM_SA$P9D#Bm(T<#JAVo`>goEz9NS>)gDPqstC) zPl}SREZ)o9L(Saug?Nw{VqGSW-%i zF+`@P5&1msAB9pL+B5!y&%n@FFVR>h#u$I3lnBrBFvifBo5R}MBeML4vHDL6?>b2g zrih=l3CDuRQZ{S&6-+#ij>l1{6hpTTs6TzptB>1E=DJB{CTXKTtl%3Q866IB<2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4FVdQ&MBb@02Nbo AR{#J2 literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-folder-open.png b/media/images/mime/16/icon-folder-open.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa5cc7571c872c8f10bbafae65a5ad501bcf519 GIT binary patch literal 431 zcmV;g0Z{&lP)#5i+25Ey z1eW>A(TJZct!&j|`k;COJ3TXtQVsytTJGvML{YngLVrtHtim3w?VOd|_q)l$Cb{vs zkD7(<;r;Y#yI$jXZ+#Ugxz$QB571FQokpWyx1TtpC>W?#ig|UqyIA$73V}a1@wae~ zR`Z(Hy!+)+K6#tHp#5t@~g&mrE6HM-f^~=t^SC=NDJo7J@Va1tE@8 ZegpsFp=+X_I-URk002ovPDHLkV1gz2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4fxrAZ4@_Z>LpB(P=EDgGHs@(H<#3lpZ>Z`kgozhr}u z%ND^SH)bT1ai5(%GhLBQWyc2T{QCEEs*fL)cv-qlud%l7b=JzvYWCyXgSnn09r_m{_v@Z)oh|J@zhnm57*rzi*-_GEo$ne!p+>JU83z z)&xNisx(cXT-QZweNTXTy$(R9)4AP=2(IgLI2@joh)|a0-C+RBvH+OR=Y(MhfH8)$ zED;ebtu+p&-3toAAqW=5E1e`$0~~Ap9a_X zzK`d5x4tY(ilRV?2vt=*G`Qxi!CMP;Jv@qtFdB_++ef1jBEogCs;Uaxw#l;WF5q&x zuvjc^e<31VE*EUueg(vFjN>@;dcFTXeKUADolc*I!y&e9ziYTC3W6X&YyDE2&1T<@ p$K!LFrk_7z&}cM%b-UdkzX4XSEHy8yRpgw0t`#U1?IUf8q|FA_- zEaiDlQ4|0u@bK}!Jl`3z@#=u{Gd0fS8F@A3i%a=2B+qktz21@yArL|U;N|X!pMQHs zty<=j_9d4IXAzVr#)5SNN2qFs461Dz2&FGNy4EMW}6ucvy;>( z5;nH?F($%exV!u(&IeQ#?>)vjhpO`9!@rSe?7`Lf8B!aQSc9mdz+|;VeImugmY;s@ zqpCRPFd>X-8?T0(o2m2VXQydoDK<7Fv7zw7V0Va!awe}(E+wpQ9iXa&5U@uh#Kv%S zeui>tF(x855jHkF-FQvmgw3~aP*w6;nPIH&M>qnUovyLH_m)R%TkH*sW4E(Xf{Di4 z@uG|hPwQ0WBw!*js0eE>_W0$=KRnyo#|Po^g(lx$yGWywA_9}ulq8N$0;cOJJGug;Fo{Xeny9&4@bbvm8-#l=OEB*DfJH?Fk*_lZ;$0OuUt zZWn89&t_S6yWj8M>2|x9KJ1alQ7V=CjYi}4J5=3(H%{8rYXATM07*qoM6N<$g05?9 AwEzGB literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-img.png b/media/images/mime/16/icon-img.png new file mode 100644 index 0000000000000000000000000000000000000000..add1c5915f43ce85974c751787073adbd23028b5 GIT binary patch literal 671 zcmV;Q0$}}#P)Y9xF&lZFV~m-_0C}F%ZnrlQ=N#|$ z4|)FjEwNT1YK2TaGImHAkV!x$5oJIuh!+6fyn2Cij>I`fcQ9c2eiND31T9Q23*yj_ zT7@bjVPv5Uh!vDqh`?EY%)D|W)>>4pM&nKcRn-InPCLSUfQd&8=xL-pFG(vIS*?ar zf>cv%VXquil;-K%v!E3hV?(S(aDrH&W&`fFCqzwcX^||`i1t?zy!R+o;pY(6 z@2zmsA9FXEr=DoeCy|v@b9_8tX}L;NDXWi`h-m`S#e0u(&Ov|}BNOXTQCO|d@#~_b z7)uvk~J_NpOJ=opb!u}#5=%1WYNfUw(n6Y6pDDj0wp$Il!m45~mom>Gn9$o{gQ_G((KTx_t^Z`>$ zaHae2keq#R4QS+bPQQJfX^AWOBK_{a7B-(W`TqXpOn~8V$mji!Buc6F-rnBY`uaLr z>l=x!wX|9-lv3?vVPRqG=;&y>)oQKH;vmbicD-KT`U{mXE~Mg5YPhnm57*rzi*-_GEo$ne!p+>JU83z z)&xNisx(cXT-QZweNTXTy$(R9)4AP=2(IgLI2@joh)|a0-C+RBvH+OR=Y(MhfH8)$ zED;ebtu+p&-3toAAqW=5E1e`$0~~Ap9a_X zzK`d5x4tY(ilRV?2vt=*G`Qxi!CMP;Jv@qtFdB_++ef1jBEogCs;Uaxw#l;WF5q&x zuvjc^e<31VE*EUueg(vFjN>@;dcFTXeKUADolc*I!y&e9ziYTC3W6X&YyDE2&1T<@ p$K!LFrk_7z&}cM%b-UdkzX4XSEHy8yRpWBQ+$<6&=z0Siw>IL9MuT#>jMln6f{7xe^bhjy-?Se8j1%l2dwrZ#-+t;7--7{p z`xbXs5A}MTYPAZ`)}VahTVBUCGKYuAd~uZQ)mxK{ZzHpUPU zl>O)cPOFAQEsW#h?g_EhVvHeP`43rJQ0@0=_@sZ6OrGbVn#aFHPMpA4LvsHPtEaw# z%h#~oJ+QCZH7MfKhUQ52C*r?J+) z2dv-1x_6%WhRTEcxZS%jDuWmh1C_fI#I-8vbebed+5n~0%VM!e9LE~~vRUZdiL9=| z?r;MTul!H_;zhL96pKZaQZH2y1m{bo(vA7~`Hw$TxUMaku~8aMisZvrnVKRihTQOQ dsjI8&{5#5Ng9j%04W0l1002ovPDHLkV1ll-ZH52< literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-php.png b/media/images/mime/16/icon-php.png new file mode 100644 index 0000000000000000000000000000000000000000..22c4df637f8429fb781e167889714665886b027b GIT binary patch literal 757 zcmVwzjr4H8o)v#)inA=aI=| zNT<^ugp{()G)<(G|1$ulX_88%+Jx)6xUTyfn910rzbulsOW3v~ZaC9}j)ffCh9p9M-Q#r~g^s>3yyvk%%^wQcQneqPXG!Fq{2JG#aI4%O(JRWaih^ zt9URdP)cDarN}K7aXk${V}nUJ947s30RYD9u)DZvX2EYh4yoDOGks2$8ZZ3n?X9>kXxp63em>LZn0}6uLY)IoXp; nCU4gRk{tyW9t%H?v#JxNhSup*ke_Y177tfbEU6bS)9 z9LHFvit)O~pvX>wcF^$*QXAdxIpKv1+*zQ}*<|g4r3;TV(N1*C5HAo1; z#TR%rySa{6k)ct3ja}|9R3fndEvN(pu?4_Bys^6$jS*kDlkOD}f`lN6L_|+a@2o722Pa@kqb@l7K}lw zHMH7$kxA}x98<5?vDP;1Naf`1&yDxDKFqHV0Bq+U|JP^A=kv?OV)6PP+-q|zm%SuV P00000NkvXXu0mjfeHs}( literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-rar.png b/media/images/mime/16/icon-rar.png new file mode 100644 index 0000000000000000000000000000000000000000..8a0ff54f4eb81cd34ea804e3388abe1b7352046a GIT binary patch literal 621 zcmV-z0+RiSP)Y6r3(E9x@HK7 zpsr35a8PjUC}_ugf#M=ahr}=8q(m)6B}s=S=?yeZ@#da$?#YcqBtw%*`@-Rc1Hb3@ z!0T+i`1ruu(L0=Ql^G+X!>jktDHe+WY;SM#_Gy_gaB5OIFQw=Co9Qc;^VhT2h)6jN zhzX(}qLfM{0IJn0ch}db?>1LE?SoA@@cn!up5kElh*3D20z~6uXfm0c{B?i#NyJms z{bpVor8(|+Gs6H*biB*uGPPO_fItU$hXF=ugi;FSX|!)i}Ex| zDWp~kqx8&nfLIU#pin4KsZ;czA0uW2cdMn+$ zAYJRR_wZXbwU9bbo_7B*>wfZFDZJe1``32E8-3242Qcqs8^X)Qr7|(K+`pf>mAQiu zku!zEa7d@IlWCb>d(Ne`Cyz$PdlQEG#(4~cm}@$*`PY8|;3*p*@h`O500000NkvXX Hu0mjf^CuH? literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-source.png b/media/images/mime/16/icon-source.png new file mode 100644 index 0000000000000000000000000000000000000000..5bef920766b333d4917efaf794b054b46632771c GIT binary patch literal 586 zcmV-Q0=4~#P)*9Rs1h``+!4`b3(7@xbNY z%Q@%cJNGKxZuhYe;>dBFZEg{&s`fQad#SWqt$r{Vj0FM#R8?K7*>M~ulL_PT_^URZ zPGh>R^XTM+UBlo@ug9)o@HP_R*ZVAY?>zuu8h^C_(RH1{U=ULpjfPAnlee*Vqtof2 z2_cYDl07{oWf-)3JyM3jo2@Op{SrUFwYU?x55Vv3;sQVjfl{m0WICN*$)MS6qS>~M zlyW72ZQJt^a%X1%q~dX2hr?LUE!MN^T;;FGeav0wHdC~RZ7!Z%%txqHDl(JFtYlEH z*XIU>LX|{f2Y`HjgF>MSKq9e2KEH7zKnO7h93MY(6F1%e2T*5#*|HC8>;s#%>Y96& zQnL4HkHhidLhXXVER=T&0GC{%JXKtS^M~jE*tiCkWw}(}2OrK0XJMC8vj2IX(vOl` zXIa+uFO@CEAaEOKZJwYu^nKmh`d-*4mjTj$;Ht04e3YTw5+5 w-aTF&T%LF40HA(d2NBJ5kWQx`T-V+E29xhKZnxnR+W-In07*qoM6N<$g3d?CyZ`_I literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-sql.png b/media/images/mime/16/icon-sql.png new file mode 100644 index 0000000000000000000000000000000000000000..b3b1467bf98bd154dc51b007806acb26795f3110 GIT binary patch literal 510 zcmVL7t`q!MD#7QwHA4vqb$oeGR7>@GzBw*nZMm2O;a3?#|1GnthE@1VGIF;5MX8y zGo$bOQRcgt8RVRUwf4UPoO2)m@H}r6KL9AD002}~6|~j}f?!mDF$Pstf$F-(>2yMt zWiZA(aHN!f)dc_|LJ$NfiUM_AgOVh{^?F5FmbhQ!Uja%f#Bq!yNkEs&1@rkFzVDAh z==&a<%?8xAE%H1^mSyO=?r~Bf#2<$HpZLCyFbq)?1=_X+X{{d!A2;|)_YLAWhSnO? zG!166877m-D1@eIuwJi0Q51FC?KWI4m$24?nK2B*rwBp_D5XF|*zfm2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4`starVhW?6V_7VF+B}sPyZA0eS?@d$ z#eMQj!8uz(S^A z_uV}#-A9?6IzIB7&E}nUdTF_1ph&V~XsE%l3eK?ASL+YHEZS+4yFI!k@rOXp+SY4Q yE+t%LyYEI{HkqG$+wQlBOW>EyaqI2t7#)vK+t0cw<25i089ZJ6T-G@yGywqaxuc5! literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-txt.png b/media/images/mime/16/icon-txt.png new file mode 100644 index 0000000000000000000000000000000000000000..1d48677c65ee9c3c3237780ad1dc32fcde4f0ad9 GIT binary patch literal 463 zcmV;=0WkiFP)+YL!FW8b-ND~^m|(lzR@|=FD?t#{)+z*yF^CAW*{lNU_xmN+-(+hoo`}Rz6rr^y z%d)4A)|x1a5Rq6~t=2M0lGW*SdV6XCKhtbBlXknk{07ed_tgh+a3uf$002ovPDHLk FV1o4Y#MS@+ literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-video.png b/media/images/mime/16/icon-video.png new file mode 100644 index 0000000000000000000000000000000000000000..f92f7e1eb247a75de4ed66bd5b7faec131c7759d GIT binary patch literal 739 zcmV<90v!E`P)_G$Pd)0ltf5e&YhnWvk7c>zU^S{oO8Z2>f++!XYc(R zrPPa;-~2_e(mK0l zw@jx~ep^kbn+k19bXk1y7qWt3x96u{9(j0pplKRR2;oCjRo`o^nH|=-1GPol5@p5= zM)_fIR7N3kM^#m%ls=dkQ5Dzy9%rwjNy?bXk6(V5H<6&N)&_AGOx6{{@fk VbEjPP6gB_=002ovPDHLkV1im-P$mEX literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-xml.png b/media/images/mime/16/icon-xml.png new file mode 100644 index 0000000000000000000000000000000000000000..83a83df91a6742767efeb2be12dcefdb9e5c8d6b GIT binary patch literal 585 zcmV-P0=E5$P)kv~VLT#6P4fg9gd>=S~+fH;pZ&8JNWkXU?2COwjA~cARsE zd7gh{g-}YRTI5kQh8WLehH z-g~_FD-8q8=d^PU5qYIiKm`B<6GLDRuLj?>%aMLUepVcsAs5 zf15liAtHqRd;HrfKCX~QB_8*;3D1T^#}|kQ&bfsL!P680q!bjMgkOi4&bx(2r2v5$ z_JyEOFxlP0Zf>xCbP7{PFn&g7Kbg)6rjGTaQ|#sjlijU92}Fd+UK`ttQ8y2idqZri zj<1#x5!B5Cwiz?oYZv&X6Xx;s=>viFh*pd3fNR#UtvB!+_OAp0q7`|w_EJdE;}xzT zu-2lrUg;B^b2AUL)>)dS7-N>6rwAx%@X)|swWs|SO@;IQBCzh6Z`6h(tLjt_nT XjRR+gDFH-y00000NkvXXu0mjfvlaK* literal 0 HcmV?d00001 diff --git a/media/images/mime/16/icon-zip.png b/media/images/mime/16/icon-zip.png new file mode 100644 index 0000000000000000000000000000000000000000..cc196c1eeeecf71a4ad125c1e8ce6414aa2e7112 GIT binary patch literal 617 zcmV-v0+#)WP)|WK~y-6m5;wq6j2mL&n$NrSwmn&HYkx&LLdPfEhM&9J2w6S zCMIeutf;K0tfa)m%Fc?IIIEqlg_3AkF%(;9ASfY77G{^3H}99l7!t#70$=iqcawX* zbA#rG2e&h0pF8ho=$4?w-G^_f)oK9L>vdLM-l2eAFG=5mbUN*&3)L&rV-u4Uq<9ig zI7h4_?mc<}!0R{fn4G=E&d;@({oSo4QJr*pbfk}6YXA@t78e(DfHhdv zMk|FFmEy9auI>2=IUo!}qA1EwFb0<$VN^=NDAlt)H*f$%QA8Mq{|p>9OE5|yI#akT z>1p7sJz?Oi#bpUPQ;4;KRlNa08Z$pvJ#L?$t76j_s}iggB-I1>Ai$~pt^nU^@?v3% zpm;t1>loc?LNGw8J<@K)nEo3Kj*s`W_&=8@4qYYQ+os+6galGzbL}HX2dz^A@|1^$ z38aizt(lm;$>7D)8sv%hwpri&jCd)r^?jAjpZ8}1oFA#;rG$8OxYH?3ja>_Ci1eLm z*%-^$)o*yUu@k&{eEELsz&%S8)w383^s_rWRCxLqgntx*WUqE=00000NkvXXu0mjf D(KZJc literal 0 HcmV?d00001 diff --git a/media/images/mime/16/index.html b/media/images/mime/16/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/media/images/mime/16/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/images/mime/32/icon-7zip.png b/media/images/mime/32/icon-7zip.png new file mode 100644 index 0000000000000000000000000000000000000000..a59b8fe6ebd6eb6ea28f54c69b129e877afb5df5 GIT binary patch literal 1310 zcmV+(1>yRMP)GCXGnH&bLO5^Uy!qq!@#8<+ zw*5tbuPLUr=HthY)a!Morlx{!x2w0dwu)`8=-c;&~pv?^7rgGE<;|&c?<@RIk^~v;ygf{hAU7sUw8IvMh4B zT(Z4>{W=0VfVS9wS9`a#w6t8QRO+T_TCoS>@Q4Fs)X3A}GUykj6sBq7I1aAsGBGiM zQYw7>`0*>?9T18>WfAxZr~~DL7tvVSU%)G%p|#!>DYMw@zpXew7(fDhTI(LbKj<&A UmhiY=ApigX07*qoM6N<$g2?x4uK)l5 literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-audio.png b/media/images/mime/32/icon-audio.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7c120d6ca2de2392f5011122181daf31fc734b GIT binary patch literal 1251 zcmV<91RVQ`P)C8AQR2v876Y>?Q& zf(5&Z60CZI~910MT+?6X=&Mz)5zE><3 zk3UK8wOVbxQmK3>BA=>iM*sniudc2x9XWEO94!=)$LiQk_0G=D#@yW8i@>@Mc))C_ zR4Q9*W6mF!2vtQyh9XL(QW=;9HlutOR5iBHb$(DGZq(6zRelEQSB;T)@QTY;;%dFy!O&DiW7TM zF@QuVkmNiVrMT6Fw?Dc;nDNOMeC};F`FpEPtr=idu@<_mE`GZ)d^eeYM}$NKhzPjO zN4?kyVCl~~6NLu48BK7=f{ttc%G*S+3oz(~&Hm55>H2D&OJsF~j1? zDSo`(+5y=j2XNm zDf~`A@f3`UJV`*sFki}W?$rXm7d`JgvkF!`#F!X?F(hIskYujL5fGCh47!Mbfs@97Q1JBn${N-s`T}FeC_UERZCDQIpWyKY@^5 z(2WtezuV*E?{;YPpmJlIZl|{&0-h^C_9~e5YLCm68tt~Sz0+c9qBH#M>YXN^{n5na zbKI*o*tSAw3~DW^4~ucH8rajm{H4lL$EO{5+`jvOt*tswAMFeYeD(7->uq7JYgp-I zXr3%_!t0UA?C%UQoP^fe6!IX1Z+@$xg&eC5<>syrXJ(l;8wh>Gr^=Ij^6eV!XO2T5 zM}BRS3$M?UHSrXTpb%@r;n&bwiy2I^AXHXw?{YmmNoVdT9JUlUc6k5%3qzrAy)sQc zpX2-Gf5=L}x$~!ae$D`C0oK}-0HJ>re{*AF8&fP8L!smCX^`v&76j4~p(Pp-jFz4U;GtjB(`~!#dfcje2+F== z_cjo)D~?pE^0j@>ch33FcWx;W;s0rk*@IHb1A_Ur56McP5Ru9OP)dd0`^m#^?%#jo z2VoTN)oWm_mL`WkIMf zr4(8#Jg@$824b8Ve))$Ze)0Rix;3Q~p68LKDXmruV+_q^lU}b!nx>4$W3<*BA0Jbe zB_cA*N(MGrC7h?sXWf{lE$K-j=U@#yE0ve45RaJ3uaY3Hv`tb{MWc?*CvFKPNdWm%GC8P-~S z-zU#=j4?z}#DB6G0Bx-xRuC<76{ry$-d^GG_KK@t6ncE|jo!jW+uPeWI+*PtbLE`* zTr9!svSX(g)8C$+o-!JZu-3A(v%|Az&+vVp{r!EOKYvaXMXao>kmosBmNA)3I5;?< z-|sV-ObEk}s;U6k-`~Hn1ga9L9b3U_RRgd!@;HtW5n8PlRaJ54&YfDSMcCWhqbLgZ zyEu*s!;s6%OV-!dxpnIngTa7Cqj6n`7654LQlzH$*BMBXgyC?AwHB>4T5CMd!}oo{ zFy#FFoMy9GZ=|)0*cju~aXcPVRTZ61=f9Pp24O9(4bwCw3`3G6!5Blg+oj*{(`vP7 zHk)KwhKMj64r#SooSmJ~Znqf>23%cTv9z?rU@&l5oB5ofPyn{FSl24DK$^*9LXspd z!X!zEOM)2680jO(35wKI|RzO*%M1XF$i-@@4lIJ;FTU&HG9frdpolb{l zvq=<1D5dE2dgOWTxUjXgMO9V!zW;BBkrrwRwo@Rg&K)A+#;E6cwA*d+JV$HI($W$| zQJ|D^4vaDG99dNrB0?C36h+}?!%YBiq@RuCxrtboC0AEhG@H$Zbe^A|6UVU=r<0Qt z0E{t+2)^$#91dLzdb2a$4JDWgk;S5BECMXnTGBK{L|o5T)6=q2in1)-sW}WouCA_V zx7$tyl~RmGBg(QQ2!b1>SUC;|$W;H)s-BJ_tgfz7RTYg!!)-j%f;3I>JddiX2!enp ziiqQwMx)_6pxf(fvzmcRl^uu9dcXkWKYmSqG%Kv5KwWr;C{PN(BIFcYLC zNeIL6x-*ngE>rUd)5g?yHaLAYXszE~Rsx~~K}`k8(r&kDx7+WlA22^$0ObI5f hLk5ro6A>{0{{qrjK7DI0&Cmb<002ovPDHLkV1mEmb65ZX literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-drawing.png b/media/images/mime/32/icon-drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..7e6beb5c00d2f5cbfca09ddaf52513fc66896a5d GIT binary patch literal 1153 zcmV-{1b+L8P)kUcR5nWX^>RQc9hOENXf;H#gUEx!kM3ss+S= zTsE8akt?OVc2Y#eXmRC$m^nm8Oui+gek;z zz&g?^fKsW%{QNwXN`=f|4{IyizU*BQ@oo!c9UNKyqfNg2;#)4~$2mVTaJWh=NFJMdQ`!-Z3=|~T5D3NRMaZ))j%vPyG{-qIG~$uP52rR>=6ChCA5sz2|HaE6W@dmxmB~K*a$N-40 zfw}|DhIr?JzaA{JvcAI9^hDdYVAy|ci!kh5c=P&442|@2>GJb58yXc8Mqe3V>Ya%r z34}RdJoDZK%C#fv+-Bm+>lYchbdERPErb$p^GI$s%d&jeW($6VMBSIm<=vT? zneP`D7e4_Wsg~6}KmnKphK}v+$?y=k2P}xlo>%=!sW^vUEA}Z1*asXDsRR52pI9YG T-eN-t00000NkvXXu0mjfYO)Q1 literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-empty.png b/media/images/mime/32/icon-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..75fe5e1614c925300bcc779e3488aa00b80b4269 GIT binary patch literal 678 zcmV;X0$KfuP)@VPwEP>k)I7`6hK^>|j z;tyK|N&=+sI!gi8S z;#f7QfF%$V*vo}SP+OgAFT?Spsq_ z=^m;?T#E0?fd^k$r$PoL?ws41JLkx8NZfg9kLs{R4^4=0HUix2wxfB*mh M07*qoM6N<$g6WwmqyPW_ literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-folder-open.png b/media/images/mime/32/icon-folder-open.png new file mode 100644 index 0000000000000000000000000000000000000000..75e71d9467cdf722c46cb47083d5e44d3e865778 GIT binary patch literal 1042 zcmV+t1nv8YP)wsh;WS`hM!w_r2*h&N&`ur1cL)QDi_1FbDizfv$6IuW^8)C|X~Bbn)$X z&cF24lau+WVL$e&-JAbx|Mvc8#lqGWTZhmS=bQ`$0483X8T(XsZk^iLIdFpPL}oAk zcxB<$UQcd6s`~bQ|L6C={BY&k;?lBn&JO}iuCLvBYPa(WGcTX}--(XH3xwm5Vs&Zp z%{S(sJ#lSuX#rRt1Te3^^})&4&cBEEGJJ*+pBM@-efrE~x7#}s zaR3ov`t+Gez?R=t0C}F9wY!_^1{KAx3ZKvHmFouIG z@vxzwN|#pt&E=0TeE3Om)j9WXS`>u=o|~WRTCMKu7ZikYA5TmpUt z{z?h^adPTd((w;UO&d=d1V90gDohnQM{EG_m|Xh^m5kR0S~}1~OpOd&GN;EoDtKLlgSJgeo2tkHtrUIzX8LO!Q5tf(9%| z*#lGs6+z8@00SVU2Lv!$tzH{Kr~uR>Qq5^<9_XRoW2}O)u@P0EBLjpI4;hFv4thXP z@u6Id#w}<{o>+#V66y`+ArGk0eHEZI6=4fPUl?LS@jX-pV{CwchO22lI!Bmfgq*3d^&0Cx6 zv(JoA9hq(|R_<)C1NQ+ZTb@Be&mtMK_(#qIj~)n}i6?6i(|4m$3E+VV5Qi)&Av`}F14KX}7?zbSwN&aPkm@Cs{sx^K!%#^V#++BI`oeRKvo(L?Jxm9784zMtRKP(YTTZzYJU{DrT0ZTxZ zr_nPs^+AwC;PAkEi6BfaFb$Z7h-!dXuT@|c zD`0{%t$>)0F$+mGhvAT3(moAo8VOjywDmw&fhZA3JNMS(6f_xNs+ipGfvA9n{^f5; z*hB%jUjfk&u%O_;#8MWt{f>g1@GVY*DoU6l5Ocsn^ne0ln8;KX9*shif|h(H4FQ>y zVMy+5pI&-i3#?V4`(O=$%)%J8fQW&(bh%d-CJ!hso@QMF(F3MQ{T zlnJ9dO^Gf{CD>;jc1p30Xu3HNLc3JR)RXs91&}JCS?u=aK+sW4K9RV7OV18yHv3G0 znCgUVQlO_K?l4Ja+>bzfACMU!cQ|0(9B6|mu7-WQe>|K)Be0_zM5c{HTXM5OhfdB! z1r*r%_0P?XCmxwQF(c%ucH^IaH-H^Lvxe5z?R#fWpIUnKw>@2Ts00XPpl51g8@0KWm>1J}Lx+tPfV*L7V074hqMmhB#J*Lyz#_z(DOx&Sz) RX(|8!002ovPDHLkV1n9}&kg_p literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-gzip.png b/media/images/mime/32/icon-gzip.png new file mode 100644 index 0000000000000000000000000000000000000000..afe15a38ba9f40d96a86bf3129da66522a1876dc GIT binary patch literal 1183 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 JPDHLkV1h;wZ#Dn` literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-img.png b/media/images/mime/32/icon-img.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a2ce062e77673a90eff8577f3b9177722461f9 GIT binary patch literal 1468 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-presentation.png b/media/images/mime/32/icon-presentation.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b9827ece65130dbd32f5989ac62b5a56f86607 GIT binary patch literal 1525 zcmVVU@wXsYj>U9 z@y_ge3HVhn<~~=J~$g@AGR#Rr!BfR9%RO1?KAaz9w_PL{;+uKt$&M z^7gB*fA9SIkDqGUjRFxkugtyp3%vJVS@hv>*t>rH`p-n&zD5)lDTeCO$7Z!bT% zeab%oL_iGQD|w!OB>*a^lO*Y$J9q9!z!eecMSulPt+nz~I#MtOq;N5UNa0^LxQGN0 ztE;PPz$xJ4O78`{15psb7{o+~8URFuUatp0nx+f}1Lo)F$+C`u#pDD=Q2J z1IFVqi;Igm=Sb6(g@py;IOgoxv((Do08%j^>K#-Mg(44_qV0COm41i_-g~UIY;JC% zs#t3g5u9`3locc1`$i&{AfzsVfs%m=M9D~{S;fHJyLU0hV6DYD$I{Xg{eGV$NyxGc zRb_d3nZ3O|E?v45WH83yy+6!A03f2C3PhcX zMo7L|;??t@!2tL?oEpsm4|=rxM1(kw8~3cW;j{ki^R)S?1ezCt)fetP1T~)gB1vyS zyo%c8#{I+P_ZSJL!9_i2jyx*x!v}EVZ*cbpOvdP?ZKCw|n9=`m>u=y!UI1V)7;x>{ zHBO#9NtR`#Y08BQ7Xs!6fI zJwV1|WIQIi{aYj-k!2Z4k}x+n$8b2rT6;u-3V;Y637M}{-|O1xm7hZ9A(yFdK7;A~ z14+}V5BK1c|FE>Qg!i5_O^M?;B@&Qi8!f*u7c9Tv&eQBJ%M+ z@%~#y)p!9B%)vgbl~!m}l^>d{(@t2>Ed}k~gXB=_1G;+yd^0$J$woYEKM%*I_jL2y z$Wv?e(>9r$(Fv{iycj?w1E_^M^5i&@<p{3VCC1%30^nBym>-)C2otpg~k06=U} z0h&W?7@0HYnaCn>{^_ij19 zgM02J)Y!*@tXt@W1-ZUaiq$NrP|v^oI)e{xkbL-GqC=~zbC7O6!{RG%psHNGdX-kI zg)xTR-Cee~w@H$u&O)OT7Spg|z`J5ERMVtQgvB5JoY9~E!06w9hkLzZu&i{k&puE4 z#a9c+s%&j-9g(1#hO+<^Ev>4A;779_U}0+;wzg+J8;wRB930@iC(m=@I1al*r_*_) z1m!GHinYCJM&`&e@g&Q#EUaqIIjprzCKHk*3GbQJh)i<|`jU|uv)~EVZntT-+uXTx z2V)FbmL1s*N^7iS#YXHa394Bjv%1&kvTnEA0AAmQ>WgVa!FRf|pZC9c+%Ka=D+Mhu zeL)ExWpyw&Z{F+!DP^Z|z|K2=z4z|UV17ul49N*N)|3+w<+${no@d>8mWu<@mj`*`~Zcn`R)st=^5OHA==W&Udh@DLcO bY6kEb(TQ3NZw%u000000NkvXXu0mjfj^5XG literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-rar.png b/media/images/mime/32/icon-rar.png new file mode 100644 index 0000000000000000000000000000000000000000..21f751aa06aa618b336024ea23cf95dab3614c2c GIT binary patch literal 1384 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 JPDHLkV1hVEaV`J= literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-sql.png b/media/images/mime/32/icon-sql.png new file mode 100644 index 0000000000000000000000000000000000000000..57dd5719ee351405ee947f8bfe7283254351c6e9 GIT binary patch literal 933 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/32/icon-xml.png b/media/images/mime/32/icon-xml.png new file mode 100644 index 0000000000000000000000000000000000000000..8de9233e26f8878e96cd828c5472cd2ab8bcb816 GIT binary patch literal 1628 zcmV-i2BZ0jP)e{c83ZCMHCX4sw9n5$DVjRKRiF)k9%2+@AI3n z-J&WLM;gt2^WMAX-0wN(d%h!#G5kNxu?r!D0=)WfUy>C-W{fGT0E7_!ojZ4ay1l*q zvqqzF@yqny@Ar4_-Mja5A;jCpn5h5+aPiTjM|W3OSJ&->LWt+;xSr~RgM+76u3Y&# zu3NfL}PxUP%&_a4E!|HA$1MW$P;xH|)ityO{` z0KoTswAMI|vxoro0Aw8^DJ9eCl>PmEwAO@S$m-K6!Mp$Dci`v(`^t<~!eDf0ijZKysjjEQk)>RsgJ7GQrizq}-qj>oRoY;rZrT4v8DFcV*Z$HFscQCb+FYG@TfMmgp zF_;gZ5dP`|a!>NNnj6!ZrJMxzl2ooD!edx9~B-Im8;uSe(EGd__co_^;l#6HQd z@1h>;orl2bE|@#LF?dHgQfnL~S$pLQ&BQ-p$Nq%y;a$ort6aE#72Fdd5`zgwe}pIs zI2?gC7*3&EA#f(o9*suqy%@3kW()R)IB)%dqbK{-CeEM!1CxT{^-CBfPB!n22!8n< zvNK}(gV!m(aT#+ylZ&bbwAR%o{eGXLqa&p6F}$(P(f41&JD70c?Y}@#LaA~7{0YWU z6kltB<@cf_{Kb37y&=;dZj*m&6Qks*8aVEVIUblJ@;HtO!>}S5*4LRh4*olTg{(yM zCdiLE6gM`|i3gU%vJ$b|XY%8lolDZDJf%1$It{ozH}W!2qQcWmyu(G2`)=q9}-NUZTjx6kl1wzy1bB z35NT7G#U+xqQDiBeER|-n^KI5ihj$ooU!H^NK|cDuK_6~S(Z^0#T+W5Y=R$0l&<8+ zNIxN|aKptgN85uEx2Y183Q}MJT1LptRHrFdPnvq6jHv6^K%*QcyOPT5Beg z36A5CrfC(p^}zxW$=Z!771n_e0?+dhLJ-F>Q54Ohcbuwat%g)eRTI$jJfbL?(*fs6 zvg)Qqz&f>1N+~Oi;5be-@9l23q4SAV?)>%!Dw*4>kKyWQK`+FD*j!uS1?hifOX zPUiACuXw8K#R=PPw|l?@FzPq})9rR&y>{)|rM0y+zb?zI46|!nXm(xyEIz*|>xB@s z+wH;a+qd7pfB*hFKt~)yo&ejx8$j#S(Vnk820j4p8DoZZG3qk=x8i@s%g@86z{nVr a1N;}$C25yUV_r-E000078h`~`%C(Xciw3}%c27{h={j7&y`4`+hS(7<$6*FDEYRaaHd46vYy zH@RJPyQ=Sf&-=dT+}mPi{GY8dyb%!}2+QBSqLu)$nYkQ*h*TH8|Mc?%2Rk1JRX+qH z@1~`D171A7duxd!AAUo--F_0sv30xM=08_HBB)IeJ&mFpzuo;(M7}Vys3IZ)OwAtX zd{W_FVA0Di*QLMe_jhvVoWx zrpb7^Ih=DuQN)=uXK>D?43yr<0?#Gz#_Iva%$S*(;oP}%nFk!UnE`SJh9((HSBHqO zxVXsKvu8=!Ezj>ZF@R~2CNJA8%YqRG%oPmh$`=fHW;Qkk*pdOakpZvFfS4(&T)UzIM;Q=i?Am-=67ZQ}x(5p`J z^RJKT_4-Wjo}}XY?AXy@VPTnxM#zbGc4G1UXM<23VPI}}@d- z3cZysOE+)RU3o~WYWO-}ZvGx7^4vl+WZ?Yy^Fa~X)IXn%?YMw^7 zZ$DsaTfm!dOrnGJ;{6SM7-6T=;nb;9nJT6EQxp0dJW!a#ukGRLFfkMMATeAjVeKO4-%SsUX96Q)1e$>sMo6`bpcJ(aVtpJkVBCqcrzVdH+$*Q!y zAO(kQb~^3gfH=+EA%Ju+l7?Q?SG;fvx4uGpaD6pR{3`vZvIzipZr$S0yT?gf4O2^9 zpQV$jOKCU7EXlT8P0f~n@3K@&Pe18z6~p0)AR_n`A#B#Tv(U={pp`h!3`93#YE}CWk%A>$N{M%EoK=IOMwZ3A65zLb*jwl4&kO%l&{-~O<81-J<$VrGa)6F3SS z2VNUj$~~hk1DAnoX7*Tyn}vu3r2kf`uNXiCJT \ No newline at end of file diff --git a/media/images/mime/48/icon-7zip.png b/media/images/mime/48/icon-7zip.png new file mode 100644 index 0000000000000000000000000000000000000000..16a6f5a2ecfa10df78798b5eb597f68ef065b976 GIT binary patch literal 1955 zcmV;U2VD4xP)dvBb>s6&c^Il9cf4Fq@{iu7+J^ypgy|-IPDfxefw$=jtR`}gtgb+R;1n8_k zb!Q%*>3;WHK_7$;ebHH9t5w_~giuBXJ<8F8fRaJC%cjqxgl^r{F{28cUl-cot0Pus~ z@AqZ1+3&mLMGy*wXliOA8jZ4H!v=&90C`LZg+e;;1Mn04qJR$w78>xqq2?1paNxiJ zVzC$t3k!MeOAsU{v!j4mEUT`7f^FNpc<}-u1Sd|MaO#W5wI zHAjygb?VB=<5oa(zi>4ngkWxNj(hj+p=lbUqodfiO$m9N9JMYipzAup$;pwRkoVuj}B zW?EWW=<4cPmOR?h=hdc=60pC&pU00M)7I9Or$B-J>&J=9q0%s_vBo}7h(d+(z~UCe zk=JbjPbSW0v!qffPg?)A2m}H|B9XkEr5pYI{Y*|y($?0-ty{M|N)$j|6mlxnfa&S! z6%ihCi!nVtO-)VBvd1n*0fZ193jjQQ`jnS1Ut(ES!ELq>f|iyRT3cJoDp87_l|~`8 zOI0Wvg`PiuPBNLKrly9*#zx}tINP^xr>UulEnBuQH8sVvXV2DO6jGm=Oa|Mw>FVlY z=gys;zC%MpoIZWJ?CKU<%}P*d6w1rQwr!(n8Vd^xSe8Y5d%Lqgi9{mw_V&`(*N0_U z9$%T5n8=&7wzk%xUolh~gX>D!g^5x5X`}WQ0tH$;A z_5$$!{d=xny~^?9$B|N&RiGG(SipgD2G5DiJ)yFIDwi%@Vr*=TCr_Su>fKH@K0eOP zn>X3DYZqtFp7p%1m=iZQH*@OLDIPp{;E6OvcCQ6bWO)>lQhF@V*x1OPJ$txw=MGB` z|7zU){5;*=-GswoE?&Iogyu>pG&D4XVHkM|6qv{9P}BnIMC7)>!Gi|@=&9MrZO-{w1aSIqzaip{}luWHO0qn!j0izu!-NeSOJxmF0nwyWqtLRoIEs z=`_J$kW3~+G#d5X4y*@gnx>McLw(P+%BN4Ch{a+AgTYl7t{gN?L)Uc@i3Ak6R^h{k z4>UA1P+MD@cY1O=QMu>u)z7jlCMG77Ncov~o2hY)wr~VHgH=b#)a@?8ZvfD+OeU?pd-wX5L!sqRq|&}i>Eou*$jFFA z?l)tP0vRARJUl#_NF?HJ3b~_Dv8$C|L#1Lx)3kyV3IqZqlSzh#hDL$ZqRfs0Y2c^Z zw{JhJt*!m*{{8!FrIh|+6k198EUi~zG!O_l5hxT2A%rkry?XWK?%lf&$^Al^hF>;w z0;mK20Q?bX1XgY*w=zhP6Z}8GAn;!)r4+9Cs{xyU-;oo(_(kU0AWKe(abQYHX~Uug p+z>+e$x&-P{@KHnQhK(>{{xt&To}~br;7jp002ovPDHLkV1l(SsQv%| literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-audio.png b/media/images/mime/48/icon-audio.png new file mode 100644 index 0000000000000000000000000000000000000000..20c14897c231f863dcdfe6227a8ab46ec733734c GIT binary patch literal 2062 zcmV+p2=VucP)E?v6xvm-~2yq(Qv_rD01aVVF|Ym1AEe?EWy{BM*} zD%TpH`t`QtG)99W<}jnj1H6{Ne1`vp)saMZ^SVk^v6R z&d$DNjOiOhDb>B6H{#|J5sWd+&d$CC9PDuJnot6mo}8SVHpcV~IOzUaBdk27RG%^@ zCnu+YXF95?{j3QGV+ZZu zxq8FsF!ImRoJ0gG3M=3#K`923cbQXE039`|v zUS)ZsO1)ta+0mky;lUwnQqfmY0TeMN6bv-T4!6qims{UP z3X33CsMlLmwrd!zy96DPW=Gh5UYbEpJV+ZcZ^>^r$V{Zj=F%w7Lurj@52Y1WX&OzT zTD26n>on?u=p-tskxIP6MnR7gk1C7{$&Am$)EL_Hz|)lLuw8|6)uU=W3>vIO5($*l zprLt+MBeSh!BP#=fNM1}8J}D(&HQ4CmAu9JDO5U(&Wxk>jNw_qahh>O1`*K8qqtGvjYCf zR%4{G2cf4TiyO>UVE5h!D_}#*9zSW|#HQI6pnVGB>KAK5&WdbTCe$~XF<=dL7h0@U z8hy{6bR+9qf$)c;2qV@Y2*$)mA!FN>SF0}3T4akR*U6)gKD*jwe7>F zFs#5YuPkz_mEhp9NfId^3rtLBXd1Vf4C4_-Y$_4A0wQqj=41Z!uM(N5F;Xd?kN&yL z;=*H0vxV(Ca=ZV+dW&26Ca+ElD+}9fRxPU~VJVq`!#=W_M-lJz!_tXZCyv9lj|*J+ zPn9E|pJ8*e#_C#y)Sfi0WD=Sl&1SQ=|IICymdZ#v!&+0ZY<&uT0@pi*sQ_bl7_=mu-+h@PINUY0w-S{XYoOi z|C%&*CI>H#x2L+l%6NX0U;N+{32ztaM})7lq;zGRB0{~TSl*~&?&PT?ldM>ed?JJ0 z2TGU7E~I>ehx;CsQOgUJs-|4tl7Jh<0Nacsu&`yal_O3}ku!P7!6EgZ-xGD(4$ zh~nw?)y+VK*v!=xK3(L)0`wegxhk-rknxn_zy$2eHj$2iUQjX)AT=snE8s{k+y`6H zYAYb`T1s!neYqImoL9h`!AFg z*!e@Z0$u{X0DK8J3gr4!@M2M*P5dTs2Urym>81}#DGlre4$vmQ`$L=Oiw12WR)D;8 s($~KHM=9mgHm%R%KYO%9q!oVnKb!5EQzceSdjJ3c07*qoM6N<$f>v1M82|tP literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-document.png b/media/images/mime/48/icon-document.png new file mode 100644 index 0000000000000000000000000000000000000000..da78212372170494e2a78502c14c1d8d6ea448cd GIT binary patch literal 3298 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-drawing.png b/media/images/mime/48/icon-drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..60c4836c32b8c92d242472328214a458f47e5c84 GIT binary patch literal 1833 zcmV+^2iEwBP)5M~GT!+Qcwu61FdDCnN&Uj8vD*02B1Rjvh#0l4R2HoUD3-E?WtZJO z**`1tr>G#U*9{sM0yr7Vp6=8=(+ z7kYbpA2W%%VjzS-2*I&q$6g;87CHaE-OHJNOUwMx8;}zs|Fs7kJmM$E*;r{r zzF1%;`(JxN#lhSxU#!ch-H?-!QbMNxjPv7HXP7;60ZkJ~BvpY5+OKQi#@nxLjnw3cIocylXqru&lsOkb?yt<%_21n=b*<0Qp1I!4$reJQ@K8i}wV3#6 zhETh83n_57djSFdnzf}_DsGy?^Qxfv#Kn;=z)*n23su!xu6=pXiXL)($|9H9i>~X$ zVlhiyu%Vjyb4yn4g@Uwr!C#{(?UpJkZgv5hU5pbZCnuSnp62l3!_3Ug0MN1}$R87D z^X&5q@=DBNgb%8!*JU#__?k%zFC%d3)F~p72!TL=si`TF$s}7N4I~oFoSlxF;y$lK z=2b}uc!+(s2*`hDjDkgg7wLQV?qzavk_{U+5Q#(>8yjPIc$gdZ)baTTW6aMjUJMz` z6Bq)UN()%UUQo1*dWPTcXUC2mIV(cY+uMtjlBuaFLN}-R=+GfTP1n-5y9dpu8I!m& z0KN+K7?pGOC`u*FaLYu^--W|r!r?H>dzbm_(AT_j;9ZjEs{nZV`TGgf_&gJ}ultJ0 zt6qhi3^{#Pp}M-7`yRTJUAOlbb)SCm3Fnv2y1u)XJ}o=3rye|_{kldppCFr+=$R~U zzIv3dTk2?P*-UqLH-5jr9P`FbY{`YZgpk)T2yd$=ye+po&;OmJwY8a}hex^L$yP>3 zM_E}}p{=crP$&ez+}s=u4Gn;&5L){rUM(^!l1x&kp{bUEyKdtB*M8*jXLl2*t|S(V zF+4m>DwU$LvJzd_>FMb)gm^*86WLnkfE~#Ty0MIIZmMP1z;@n#`5S}~w6(RdXU`s_ zl=S!avvK1_YHDh{^l9)dxseqNc-dUkX@?}Ws9W-(=9YSri7fH?gwby2&Yc`Tew<7u zLm&`v?GwdDCQ!_Qa*HCBwP_MiGp@i7zaXOfJ*b)u?>eW1q@Nygnf$a{`Lb1Cqp2icj7j;lU?% zxrPs@C$Bw(%*mY5Ky{T;>RQE|W~Y{{hnPY+e}0h<-#N;|PxKM$*z9P_Nr<9-aWdy* zNOiqvZ}ah6-vQ9t+{!hfRwHE2%`GrKdXm5XoZ-=DcGDcHa}7nOB~!(<=whoB`BEYd zz4;%Yx`?=wh*Id^7vb(lZgnK)1uo<* za10?Q5oVaZ@zUE*c_!#Y*r`tOz4AODR4=M7T}yRbF5H&UeE-U86@6l2BJRcDr7WfT z2FP>N?E+H3!qCvruc}F^GJYxH)SnQ7p`oE)fdz7$jSxxzu>%JV97(6s8~5+uzqO;I zqsHlX0jHmwoa&uMw$zB*pHH7Yy?F58!Pwy7;1M8}=WP7YEr2FqJ8&bg6{sy5g3F5q za>U1gpMe=Er8Lq9A%q6h0nOydS6v>Sj#wclVj7s2QtF_-N~s_hT36yfdt{`P8FS^o X#P`09H^i%C00000NkvXXu0mjf=JAFF literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-empty.png b/media/images/mime/48/icon-empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ec5c158d0b71565e472ff64eaa809580b88d9e3f GIT binary patch literal 997 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 bW0HRXaU+8uqEuZd00000NkvXXu0mjf4bsiP literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-folder.png b/media/images/mime/48/icon-folder.png new file mode 100644 index 0000000000000000000000000000000000000000..f47e7e13caf09c921cab286694c6d9e5cdb82f7b GIT binary patch literal 1516 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 Uq1DSk&j0`b07*qoM6N<$f?oP8wg3PC literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-pdf.png b/media/images/mime/48/icon-pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb7ab285c58a6498c3c74ea1fc62b29a8aba6ef GIT binary patch literal 2806 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 IM6N<$f=|as+5i9m literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-php.png b/media/images/mime/48/icon-php.png new file mode 100644 index 0000000000000000000000000000000000000000..1bac2ec1b555014024caf83df9c9f8321e56cc21 GIT binary patch literal 3358 zcmV+(4dL>MP)kj73- zLQ_SQI3z$)k_f3$T4(|!ZBZ!%{y_+}ky=#XpD0KXpcX_`6Iv?)B1)hRkhZq#)CQ$# z?ARNxoqc${yR-A2xljI>z2lkLS=)lRDL?6G?w)%d-{1MY&hK|uL{Y^5XOizXfd4CL zt$zq16kq`cKYq-GfD6>3C<@}vCIdnUbKkyw!_PhU-0zQ%k3X15BnICPlp9gGTwa`+ znfb<(Pd@ntA;dxyMRfoXMNxe61FydN>L2gjyZ6yB4B5ywgb>#h=;ij6QgY$-$tcuj$KqZoWEuC+dM4Rcchf;D@HDV0hAkWQx?16of0T1g>3xYp;^-xj9CT5ETs zod7rb?Hu=B0B>Ed8~ASO)X9Ks5fO`viwGg8)oNIl)!d+`r-!p=&oVSLgzx(li^ZmT zIgW$tx=1N;U6-k;Dc*SF4Rl>c2ti+8ABjW)$8o4sDpV?!HkI{#pJXzLloBZ=hGDd- zP3yDl#=yE$0LW&ulu9L}l!ReOB9UNla1hV)&~+WhaWD)6Aq1sT3Bxb|Fin$uKF{Fb zAk}IW0Nb{k>pG4@E|((+0!-7ybzO8_M@osV>$tAlhN)G(Hj+Tw+u`BiraSBD>1k7= z!NKk^ZeU=bYyUJrlTCK*wz(6zhXqra7UPssU4Vi5-;?@^~gM%zBEn(X>x~>yN z5w%*aX$!vZqm;(t(lQt3SE;&!QaK=BtdlRf6iao=6^}~ICkz9Wh)^mb;V6dsml)a9 zgJC)JXVTcVjZ%s*3<-h&-}iA{7fsWUvg@6)*%{x327x;Zg~H#r8jBEurKKf2&ua#? zdfi1SMX}^jEQeHU5ogY?vQns1cLV(3@+#(gKCb8C*6P$M1qQPYciuL^)V3iU$H8%I zR##V1N+G30DTPw1O^s8j)Gq`78AZ`zECJam0l4IkGnowax=X2C<>YjcYAqsP@>p1| z;(F^N^zeX9*1m`kl9fu9xr^22J0TUOsW458p59(O&*$JbPvgCKf*soidGw*%F$@#m z_Zq-9mVj&%MJ$b0gAqc|-``KY?sD?&^Ze^;a~yvw$B9!byfas%T5srjXB$jM{Kn%S z<)2^v1~o70Iwo#HNz&N?21d59=58=Y`rj+e99OynVL7 zzaL$t7Am3$3`23_HVaxjL*0{{K3}6&_wn5#`Fx%mciqh90l2Q;VPOg8E|y6p47QK8 z`;Kx=aOQj!(@vr^lV|?)MIL>4AA4@uhLT-jb!DK9qNs6l-#qjdhmS9zOcQ7T9vMpT z=YRGzhYufaj^8{s#wVWmBxB>dDHrDe_}$Nb8pANqb)8>&;2|D(=wp;>I)Cu=W1Ks8 zt~qyd#||EU;!_A`JMYXz42(|l*ME1Ie4)zEerRX+lkLKQ>{OpZ(dE#$&*P+0gux|U z@3mcy9zDuE`|sl;kNg_G=kjl_yvXnU&Zqh6fq&rb*|PwA?S+4&Tn))B&+^;9_3K=} zb&_4X_i^gfDW3Y|XZXNvcN2v!FMRFGeCnxB@V5tE=1iaf=-+fbUw`Sl?73wd>6FzO z3*@?o_|#(x!-&`aYZjzV5Jqjys~4zLD%|licXRA5!SORD`|o=gfJ!mPYya^rCMG7R z_-T%x*61G`2OtPSip3QGcHO*(eZ z1EQ0eFbp|)W)Y+$2*S2jDdhmL6KVV)L`uQp{0sm?n}#@c?0ek4?@kt$8{^As;|GVY zBe#5^G1uuO2traxgSXy14uIwK;< zdwv>#ty?ye&PI6E6`uK{KVfuqGeRhGxg2};-ofdG0uiv9TLj>`>&E%|fxiS`YH|Y2 zT&7l9$*6$h3^MQ*>;V&vJnd@*tR9hi8n7GTSED!A%}nZ z>LCE`zxP7`c%H|tdv4?NU;I3?^Gg8q_6_1L1dI&#@cnOp7bzvlq|K2d-vQu`+jlo3 z`aS#a<71D1mTw&^wmLTIl@)H7+KW^hS9sbovNi^Q9oq(R%r~jJ9!fQa_NPK#fBhH_ zeB@z%@xjON{Q%9dDAi0}Ig;nzJ2&$eUwMg&pCAm%guc%&Jop&<@Bb*(TAk_XX@2vm z&v4702J^begdf( z5L74>3ViUcpX1f<`)i}CYYkpHw6xY&0^rCL@FZ zAt)6qoI3L^M~+|MjgyNAJ&DkaHurWlq$!Dz0^eU>ICConyz&A!?HuF&{U2a-Qy)@< z7=}R@hHcl0{{H@71^y+9qSFISgw@RcV#3dU6W+{9B#d7 zGdD~Qv9em_+`B6rJ^l`}^ErG!B8VVD5rl$BD5PvG9|j&oJ`x{74({olen{w8->2Bpe+>S15JK1iPh@SGtX^ zGvaunl#)y)gXekJwoScWCy_`{uh;4A?WIz!a{X8zo|{C|bb=^CNsU^41kVdlN}`lR z*A+@gloBL+5*TY0h^r|rZIILpXg6=!IY9_PI-N$>byikZ2*Z#t3~?L>DJ83`s|X+r ze3D5A->+jCishww2y3L08kw|BDrsPw3e%JrhN4!ju;w4G7I3$uzWsrYgr>E{pyRrZ zX__RHNgT()_kB#$q+BjzSr$PMkj-Wp8X6*sB0R5=S;aYT3??q&|8E)_sL+O|p_HP( zzn__z8KjhyN+m4ILQ08cS)@`aOw$A)m&>7P8Vd^x%}T@Q=qU5^^B9J~>gp<~REoK| zITjZeNvG3TmPNH%#kOq*1_r2Bt5}wWrfJk_wPvxbgVsmlZs1#uIWBcHbXQQX*W1K< zsam11EDOuB&~=?^wTe=Ta=DBUqFJt)nwlb?&!d!T7R7`RZPkbka^lMuwmJ)0K@d=_ zR>@>CZRNdWGTD5#Z5x0@BGFZnaeXzWzP`S;d98@1$=p_FQV4GMw)rBs^~I-rnA(efhpmCn==} zf}r!{yD|_?Pfr)NY}u0Pl!Rdz3=a=?6=iR4F974?cI*>nj@Zb--eI48=u)LRTqxD-!2*JUF2Y(3U*DyCFPyx<9`|Pua zT-QxJ^2j3-Teoga#*HAB08o*BgKL9R7Q4}@PNFjs-`hZ~?;IHnI|Dz+91``WFE{dWMI`Uuu oA%sRlwSFA`*~5>bsLfUV4@j&cp7nRp5C8xG07*qoM6N<$g0Fr}D*ylh literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-presentation.png b/media/images/mime/48/icon-presentation.png new file mode 100644 index 0000000000000000000000000000000000000000..d08d1b172fad0dec688a2ecca5b5c7bc67b7b0d4 GIT binary patch literal 2586 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-rar.png b/media/images/mime/48/icon-rar.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b49d1f2a20b3ae0c484d263a473eba9385310d GIT binary patch literal 2309 zcmV+g3HtVlP)L{pS|zEr zSWvJJ$zgVJ`fR;jor3Csx6bq6MB9wk9E!bKL(Qn1lLQ6|Y#bTo@X^d&zST~#9 zY$m(O?q=R+?#p@lVP1A#?re;@yY_+m;hyu%z5nMt|L5hLJ4!_Oe-^#b06wn7+HaIn z7LWkqeEN(tfCp4XBy0}03{Xlr_wT#^#wYGQ^6Rm!<6lf9o%)<=Dzs5efgmWLKH5t| zX&;ley9Q;O%zfwW(>(Rs;{c@7>6aYGVSax85Ww%A{5wPAE&zq4Qf+p2=1;$Tb`@uuwueB)8Am9KMwKAMEcT)Bv{&0!46NtXq>$^njE|4=^wUq1PNy5jN#t)>DX$$ttT!?Sq9^;}(L@C? z08|&DBCUju>5uHWW(-GBh=}f3>i4T;q3etR zr4^`;(T1;@g(3{-a&<=~2Gy~WN-MOrlD0%xsg6?b;gzMZ;+nt<5hJVWM}l0XkVQ3f z4gJVUtW;OjTb5>E^8l8;(lUi!NG<14EBUAxBu5kIxJFq}$$1QHcKhl_<^1Nzhb?4{ zXY>hTR7c@ZTF_c?^cO!NnMe|v5Z4*tv4;<#DjKCV@16TMe|-Hl4j()MidFSPFX%O3 zwWJYI$hy~{Ye&{u2b8J5V8q$X69>OX=o|j_`d>LaJ;{!dU089&^vpEFPKNi-O|pG> z$13`}G1dNY(xlLH&pn5#7prS|Ac8`wI|iDR5<~<)@W_>O>~?P<3=K{q&V}qO2X4EI zsp%j5DmhymNS zv14&!+M?=L2*Td9JG?c`!2>7#z%ykAaok1hMusoMvxi`Y{T(0}=grOmKsrN`S zN?$~xH!%wQz{3xE4UCY;G^+E(97%VOLa_llgwXHhZIqZ`?b~oW9-~sJK%XF1XJ`Jy z?j3vh@6=iHg3gg{a8d0RqxD56`B8_dLU@(X=ElP(Qz^ZUn853KHLQ`^VtP6Ry(41Y<&`UY#CF{A$|$MD$4k1)jXD2J23`~fM^@6 z1jDO<}j(wgm^ax8=Fx9INl+dPzrRqDh zwKYHpMPal9u_QW?#!4zIt4d}56jIL40l5a|mH}m8y7>MdUUkyj9yP_e&32li~;+A+ku;b z)S4o_e#ub>{x9GRFfSsa+CFn?U>Mj+9ejLaaP}3Cx)GOvWs!POQr(@QQYuEBTA#*0 fdjulV(GL6%;13*NuiS)c00000NkvXXu0mjf{rF7X literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-source.png b/media/images/mime/48/icon-source.png new file mode 100644 index 0000000000000000000000000000000000000000..c7bf4344add881dbc398c15a2b4c13446a1a05b6 GIT binary patch literal 2443 zcmV;633T>}P)6TC_6 zUEAy3@mx+H_Tt&yS=)(mL%-5!XMXd$e9z@~=KRizs`CE~bFT?(6?XJNL@Xc$B>3hD z7Xqt5MOA}FtEy6SqvY7w*vRDMZbC*Ztf9`g6HlEcv?h+f9BmYt=aRQ{~*)#1;|1s-tF|wgsZ7_lfI! zH)yp$2a6_s4BT!j^W|q#+r2{)QQ)X z(}D)y`W_en9(P^$Ptk#%=b@_Dwv91{APBH+yRk^6Qo*)uEX!(IIJ#&M1hMby2*VI# zOrvl8zV$iEE169G0QiTh-i&?+Od~Ya2+YpTlFeqBnwlb=P7?$Hxm*t0wizBCW^Qhd zd_GSynIs4T%H=YnqoXV=EU>)13_xFBAFk_CE|)oc_%K(mUS)Q6mchY6Y}-av>Fw>s z_kA*%47ps6rKKen7Z>U7?xw$gZCgex(U3A~ffJQV<&RMft*opdB3PD1GMQ}BpzFFA zV@MW9Ebtrlq81BF6?Y&J_ipQl_d zQ!bauWHQ*cO+KIJ*s)_=xNw2h)m0qFVR(2L-}jlHpC_G8bKt;%HUT;Xg*e}j5^tTR zaZ{6O5Ev_$%i~cEMZ?+uB7{a!Cmpp!om)DcejfNxRr786PAk!{HrNltrsuVl!s=DO z-$ukKv1t=WU#Kd-otVH^C6`RH{vbg&ci) zJ7sBbZOTTYz9u5P{P4pdf)OE5#WsdUj}tF|7$gkPy8qT)Gd_0T5u$F>$}Nhz0EQR~ zygoTeP_uv+hLk-I+p>7+&_49LCLRL5Q!17I zQ12lkgsLduSQab3Puj8wMX*Jnt`QLk0}xaFHCDClF43CG#95%LtLp{eZ>suL$1qyA zfENS|WHNYR$cpEYb{t+D9fmJH1ls}2fg4{yWeIuwM}&p1ko}K>liCvb4bT=whkz$b zrPBGvi`9LUrO~@5dtZYd4T}J2SYBOyv)@66afLQ?=mqr!PtFcO0hGiMCC=8+dwYY3Yr| z3lX#?h!LUWd2}Tb*v5bhQWj9q9$lNx2ZGv_g&+(tVo(%6^s$YN5rY?cIK~00eMAH! zhCl;^wU3~%mf%GN=4J@y$f@qh+iHk%YDOvQ9qQ z2fz}mDcxSDI?~|V(S-osdTWL&R~8u=>1BF)9?P;gbLJTDymJX-3}L8rcPH4px0}(C z9QH45^r%+LPZ^LY!9U|;|Jp|HQ?NmIDCTp+!cP|H9_)@Ix0xu^=0bacXNtw*?^-u+ zspOH(CI~~tvN{**WM0r6kwsQ(>S-O~0Ty^c^^AO{0@O}$XMnd=b+%(R3h?&ZGhDe+ zWOTHTnVBM%C7eEel=t4dg6H|DLQhYEefx5Z?CrrmYoogrxB#?+K!Zaf$tUyh1XjTFs>VrPCHF) zu~-2zonJSg#O$_agkjimFVrd-F9Cm1)!B6mxYhHgT^qOovCWW&4awKnHD+_Q<#jjl z`1lum`QA4BG&1lA=BN+7P_pYpN(X(2NLNstA> ze9v%o=ql+QX+E9(lxGe-bJxr^nG3}xb8RjJ;6LdTJh}FNf|)mX&wI7m>my+gdjL4O z@8p(_lN;qi>$y;)L$p|HrVaM{HW-kS;63kQja$g=YFG@8S3m!=v$Lf8(_AcEWe(09gaFJfgOml`rI@@yE(^hl04y*whHyBChHW1|RL7r+IIyACU8hc++JEri!ED=MKIT69+^M~jX4lhr z>;3ff^z!-h=V#8HJNGUyQ{&u7rv=yrd<%F4*bnr!so>tCNR{{m@HsH2s@g~&M8p7n zzz|jPiTHW$8CIzZ@fEP3TKzMkE&mY_oA|@vy+#Q5s_I7@{|m(j>99w+x%~hD002ov JPDHLkV1n+ynA-pV literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-spreadsheet.png b/media/images/mime/48/icon-spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..af88f8350dd374b10cb587b9537c203610357abf GIT binary patch literal 2007 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-tar.png b/media/images/mime/48/icon-tar.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2a7738328f7fb6cab46131cc26063c85c6bfc1 GIT binary patch literal 1013 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 IM6N<$f?91m%K!iX literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-video.png b/media/images/mime/48/icon-video.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8f79c05ebe2c5e0b58cc77cb595d7e36d0afea GIT binary patch literal 3265 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-xml.png b/media/images/mime/48/icon-xml.png new file mode 100644 index 0000000000000000000000000000000000000000..5cda3e624fdac0f56ddd2cb690b50db0f56675d6 GIT binary patch literal 2954 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 APyhe` literal 0 HcmV?d00001 diff --git a/media/images/mime/48/icon-zip.png b/media/images/mime/48/icon-zip.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2c42ba2732c598104b4c4a54d08601ce5b10d6 GIT binary patch literal 2232 zcmV;p2uJscP)R^f2Xcpb76Xh9$`RdrW&S5F2EGvi54x=x*Qs{a4){J-y+S=fI$fz;yEcB}g%?lkR7zbJkqUqk zk=XM67yt6&vG=}z^(U#_1U>zzESX9d&%Vw2=l;Z|O`GsMk3ylq*|TRkckUe5{`M@n zu6(Nfh4a_{_@OPodJecHB0($@4;Xm&>Q(Edat-lIhz{l_i^lhTcI?=J=XrE@cXQyt z0RTjFOZ&BJdY=XcBFuFO*}ziU?Y3m0s9`E}yi7L%c*Gw~Q?J24C9#Ov0rW8=n+?A^OJ z1?WK}WC(&tFwZ%(@afa1Iez>&+qZ8|6Uc7AxSY6sT}BjA=|yr(zyOSJp*YVI*{l-E zz@rqzcu9|dk_GUAq=atYzRmXS+c|XTP*j;U0tzysP;_$vB*bhI%D`h7(1rjDF#@wn zD1(4%a@$lCBAN&0Gsgt7qEI*!H}whIw~0as$l{TZ%EHqWwK8VnWCsOC6UVkV;_u`K zG(hCUSrU>gCpPNyK+8cq;xu$N*uy{%xC3SS<_Wf3GOqbp;GKQ(v!G$hm-g)*Et z46E5rjHvY5BZ^qReC16pUmiyUfyMDuggJ0u?@Bf<4P74uO_1F@=`|YRj z{bA6xIWm}SV=ZGX)YQD`i%jCxUUXLwf0}Q7@P zZAAQ;==nO5eGNoYp7!bROoZS8!f``FgM)*3o|huf5=KM9nagRFxf)f1kz2waUOUGp zo_dU&IgaT5@cBBRQqvs#$q6RLt9+o?#j^e!{^U%n<=Wy8B~qx-hADLBU}$KFJ$v?quT_ffP6G*QX*__CCe*T=P7b{?OqA(ycdWwUS5Ff}4)@Ya zUyimsrT!~^8MHrV;Bo5hf}LMj&d+`~%2ed{-5mx$-uXeQ!GlM|=CUStND`1hPZi1-h^DP{s)rVla&GmZW1%=hSe6l!(i%H%B!x1V5o zG`gh`9?q(dA}Pb6G7~@>Csucc2U)&)J(Zh(O^{d|NtrH&ljq)O723=L+_*Z*iZy+B z#ZQB=B+)(GqYNi5O?X%lMXdNTn8)Xk}nkKEfkr&J_PMHw#wxaeR+6S@ks*T2?_Wb z9q7>eB_dI`X5*|ZB$pr*S+_wXnuJo;PqeKQQ5dF)VVYRBgXuchITzc}R7+!ADwk5e zk&=+@bTE8rm{rAbY*SI22?(kIK`lTBjh9PZx2@OhW!1ROl3-(`2rX}imUlWlRA&bj zGslgqQ`k;Nri4NQbqS3!dG9`cH9-41%sR5R76e@%iB{<(Wzs6KI^cv9C2_437-kK_ ztYSG8Ot*rQo1v$_Kwm>bnFRFx$-BW5`8DQ1@gr#8!LJ4AT0=s0*|Y`GN+@ii6NDn- zbq6N(thx`_Hl}T3yKXoVu23!A;=z!V}6eG!}CTSPnc6JPE7@dRSa(f)MyWfeXN>h=__07?e^5&i&bFyaNa7}NPvTFr<`WX7ltn15#rS6rUqn)?%l`t>U0LD?u;Fw70000 \ No newline at end of file diff --git a/media/images/mime/64/icon-7zip.png b/media/images/mime/64/icon-7zip.png new file mode 100644 index 0000000000000000000000000000000000000000..b87d6deb3345661e3cb9ae30e05d1db900a13c4a GIT binary patch literal 2976 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 N002ovPDHLkV1jkdl!^cV literal 0 HcmV?d00001 diff --git a/media/images/mime/64/icon-document.png b/media/images/mime/64/icon-document.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b5e6aab46aaa28884db9e732a71e256ca15357 GIT binary patch literal 5273 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/64/icon-drawing.png b/media/images/mime/64/icon-drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..be8b60f93c524d870c6d15039176b79e994c753a GIT binary patch literal 2736 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/64/icon-folder-open.png b/media/images/mime/64/icon-folder-open.png new file mode 100644 index 0000000000000000000000000000000000000000..914976fc6f960a8b020135d36901b73b418cf573 GIT binary patch literal 2339 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 Ac>n+a literal 0 HcmV?d00001 diff --git a/media/images/mime/64/icon-gzip.png b/media/images/mime/64/icon-gzip.png new file mode 100644 index 0000000000000000000000000000000000000000..46d82bfc207a2edf1be4edcbb91b38e0d7260572 GIT binary patch literal 2810 zcmVt_q z1cEE+1CgrZ0dz`AUPzI60rjbG^Z^|zJaCnG0fdl1Q3c{psQ?8kXyv;|ZB-ET=v8Wg zByK`#oHUK?_3q9+II~?lwqqxuO}L*l+Re<)W`5uK{l357jAw4SI zgb;!vK;rfd=Qj}vc(RJAi}HFQgbsuO6VO@vR^kCJU;{ZRrCZV}rSuC$rPqJ*$tMS9 zXJ<2x<9M#?%38&7oQ6xGP-wW=wk=PcIwiy5u#ClGG8&DJ1J41^MWfO2SS%*P;jqkP zGSaqfzhtvncWP>C{Oz~j-Vdw?%%IM`3kV?$AU-rS^tXo}e)yOW0?+gCJnyzlQ@vzt zSr(>g;<|3@fddErkw_$X>7|!sQ&SVRZ7+D2rfFI{9^brw|NfzwnVG*24i26aLQG33 z9hi54d4G=so2I9y&qt%tsN*;*uHjT<*|?bEN5+PZ)V;D(e^D*x623)mcqM53POmAJ-gDNvl<2OoTpbUN+V zZ`iPb&d$z~XDXF=JiY8$w&1$O1h0;=bd*DLLh`#mJ9gEtVRH!XyVh;(_FlG5z{pJ?6c3vWHM-) zRW ziA16irAzb-<^jH}Rtr#L@;r}2hYpcUCVBn!*9nC}Xqx6fQ|H(P+(JT>UGI3_Uu`X* z#@5!>#?wzfjcJ3#6 z@cD8PLNGi$OlxZ^Jv}|FTer?vdO3-ZFRR@GYH$=#sy&{&i)V08Tea%FurU)Sjg+kc2&Ct*g7cN|&wY8PO z!9gOC2)eHG#v5;tOeRbE-Fxr7^!4>Mq~v1b7#<$xfd?MozWeUu!i5WUaX_WEhB852 z*U9JeJoVI5Se8XsR~Ki`o~5s^kK@OWBc){L&Yk`SCBO$Cd_bX4sOmnAh*DrF91z$k zs+kG;Qpx`e!{DvA-Xf7m@aCIuGB7Z}Yp=aVI2`8FPd~+R96CEY>F@7nU|;}U*AYVS z_~VcJ=D!lTK#&8})>u6pP)Qb8K=1|S2pWdL$jAs!Jn;mM!j0Z-hKC71_uX;#bRW$*=75`Qc`iiPe1+S|0G^Mape-IuWA7`kHZKd&@_#y zsVUmq+tGEMY&Og2=qQOq0@F18ZRtoP!iz7y$d)Zzcx^FEFB#kbaizR zi^WRX7VA!pJ;9pW;!+m($BrG0jg2ue zF~Q!wdofLu6DLlvZQC{uA3p5&-M)Q00|Nu(a=E$(R!I_x1U)@HoIH7wa5zjbY0Kqu z^!4?T&1M^VXE^}AOH@L!P$-~j8b^;F<;yR>eNV zm?-(lxunCq8S1)DC=@C=MW%kAt0b=LGB-E3B4nsSa1a2X=7}~n-n;L<`ylWy;J;GJ z8x>cBwM0rup-{ka9P;`6@-$hZ7>40<0n}DJD3w-&3jpvuuj+y(C@UG)Z-)pWREl16 zIV|Sp=7`7Rw{vW_MGV7G{7`!>aQ^&xEX$&$rNs|nYgsf+!?G+iP27N-^ zCrH(`)TTBvPVl5C9*Uj*bpesT8SH z3d1mb)-Mza{?3mAqtd~odhhE2r=DvtEbF?CX_|yWAxzW6vMloXJk!(Dq|<3SIy!;? zP!50wXrrT}?Af!2Y&J_KlOdPO`C+ddfZ&jIWlarGR z`Yiw;5{ZyXrD$(&$8j7y&%<#X|6W-@EiS0`cO&)n)JZ9Q1(h3=TY)O6R7!C`O#plj z7#|jk13I`XC2X1VFt}rcx=H$z+7$fO|8FFPo+{}#Q|#8)r>3iS74}xNG)LMo#ASK*Q!@a z2CX3I3hJ6lrI?wS$y5A#Y;Im>9{>lq3EVh-{P?Nu+qeHU$N|d#YlXt{LDr*mJ^dED zR|FU&zaR&wU7}xp`Gxo2fBzJ4V_w$1mkowW}iKK$=wGI;_x16&3srIgbDa8d|i0&Tz!paa+m z{DI=5GT&X8P7v25o9np5oRuBz`}->bf=7E((7Ka=ul58%@#ZBc~~LXZL^ zes;t8KOqSua)GFe+518W6|evUQ2E7|k_3o>0Pv)g@pR=r0E7?*Q2NeyzVpggzVekn zEffk{nx++gro;V&DT*S;ah&UKyz$1LeC=yr`w=jbQU+Ol4uB9s1FGNp*0)}L?X}nb zPEiy+Ns>=#*qa|EtZ#;ky2796bOQVGiT25=9_PF;lc&3U%yVNRO02AU*_7iYa~g+g$oyGx7$Qf zM7dmMZ*LDpQSx8cb=lh5qTB7Fsw(|{AIEWMG#V5N1=iQsxqJ66mSyGrs;Y`*S^GdS z48sD76JGnX02q^NA2pjz48uUvG)&V((=?JK;oP}%`_NTY6@bmnO>|u+iXwDfN7r?P z5WM>8s|<%j&YwR|9LJ1CBN~kczV9Q1U}a?`Z>!mC5{4mCN>o)PNfJEIqt$8=MG;Ao zu(q~_rfE!6m`bIBZQCSCf?*tBW12EP6?kj|Y~U2|g5x;fotA)Ev6}w>=S3B!^?%kD zO#iQ{DuqJfcY({mM^Z|6VIY*z!-o&)^?F#AMX^{U2vQGn>eMOP?KY0%VB0q1@i<4` zG)=-Vq|@oJva*8fx(FdK3S-G?*ih{1|D2j6ABpn*$WG`2%RiY>&2m)N!%|RFp z1~`s`@B4V3M;L~5yWL!**Vork6a`gP(KL;2w~O!l^m;uSjRxg%nX6Z?vc0`cyWOVK z=`a`!xPALJ0K?%B$8i{s$Jn;by?ggCO_L-^h@vPre4gi_X&PY|qG=jJ2&UZop#V&) zzy@$(JRbjj9LIA-ebMhx03LO3mKKR|HoJ?SU-X-mRaK=}EPfTZ1l&EA3M^vaFxzmP z`x21JWR?`MZ^1GBPG;nQ+|XwCr=QQBd(zeIEC2^ad(>k5{kqACg?4@kumGQE(d0Z;&CR)3Nt!Eqc)rBbec z!{Lx(v52aw`(|mHqBy}1V|M#KZ@hJju@_M=Rc=2Trk$w@iV$?iAy2QX)Jhg!5OMwf zfFIxLQZE_2a&Cp?ih-%CXzF6!pDs%&=a#3QQJ6CR82}3{)1^z7fYjpKwvDQ)L{Wrc z7`*h-OF1aHNCH6+(;j+!|H>oY`QQ=DwIa`-Zcr;)H0wofJQ$z|fe=tMHO{QnkWv!G zI#DbM8-MF{TgIjk?0D4066qQO$dqE#Im(e70n9#LwV8^2a+WcyC<;j^Bc>YS+61`XsW{bQ*}&DrCv5cz|*Y?kg5uRA_P*vcpPx!!GLq? zHO79(t%n18BcH$chj;mdFFwn~Gc_s&lPHQ%RW%Qs7KOiaz}T1NIxvm1dINCt=1m;O z;mnyc42Q#99X|ZZuROEP`BQb0MDotfHfxOnCzpx{0ZV0z zrLvXJqM@i5x(X6{V;@ZwJk_coC0L%yZr@|zT4l*{y@C*eQmKUJ zc?^d`YPA}bN+qAL!{UO40L-JOpMDz8^N6Ad+qUygtJNx%N`=37XSrfgDHzy>nj5~Xv*|dXQ8w|yhzFf9QJj!SnM#I8>k}!7Vw2v`G#t&nDQYSb>1?HNUyLaz09*+U?#fRfKT)1$7%U7;(vmNrmc9&|UK*2Jw z4Gl}zFf@fImefinmNpseWcK$PGC`6^qF90eRTT)CPP?HgB!)&5r}aS?bMs!0>-V~x zswtS7AW0Hj*QHP>pePE8qF@*XLWp^x^Pz!|n1|x>@^apAwOY*=K4BD5Ypn40+wWr- z8n&rp>MFLOVjCJKmy5I-MHB&oboSG0cK+ec?hx0HINPdX=qe98WBN`&6bqzGjb#ue z*rtwaXuR=*8~ovyw$PLW0TheHoayQ8&>Vgi0w889GqP=)lP6E+4Oc1^R##UE!h}#U zc+_<%6>SV%#ncr{U1hUbW~FLP8cmtcR3IIj*atwRkh(`hPviYoy-2NOqAG$rJ0lV) z@xnOm!_fI?cgQ$aSzRh)=*m77I6@s3s=z`3_V)G|jYjCYj&0lczK^PER2s|t)7v+Z zfT64Cnu4LJtTl=(Rnv5oGGX{J^ZP+a|4K|<<$lK@jveAeveqb~3WyWfY?cV3n6Ve7 zeduY3{BQ5xrS{56WatwFKFiC?L{XII0~X{7=K_%5ScIJCdAP0%q^q)C^rUbcDWR1GhP*=&|mXPfE#l;|r{AY?T5V|IHkiU6skB7c8xOq`?(rzn%21`pz`;5wJYn?|ukFgiCxmx8n zKYJ3(P?3_{)#Y%{fRIT9A_aV>=cG&GBzs0q*^0Eh-YDS(eN-XXY*kpR7r4H?htN!< z6l`p40I91yjz`GoSSsMUE{@~m$W3l*?t}I3`QzJc$Zq zG&e=o>2%oL-6cs9mY0_iLh#{x*E##b=O`CU-n-kO=S2M4Gpi{8`}&&h@o^B4sY86s z-6uDQSSp*Cx{9g@p4(g^h!cjxA!-QKa_R+wAjre^%nlsJ@KR&>_a*Ew4C6jVNXRT2r&HqfYKoiCi1eJoxZr>wJ5|Shv@C1nT!Mxlac=X2sVHk6| zRfa@PB(jvscS4(Qe!271c`z`P7K`1IoO%e2+fT0_b$aHTz10{+R zqBvorStg1ll8IMY$nsozvXt1xix<3Y61@^JkK zQ&*9RB#skq?+j2xg+|$$h;(Z3GU+xng|ll_q?9BQY*VA}^isx?l=(19Bf*VkiK3;k z+joIvl2DcVRp$w4*64}D^e3|c>1KwCp$Hl!gOM9fW(4lF$9Q4F;a{$PHkDU+5n4S(XHC15iD$k#8aOHM~df8y9Y_U=?X%GELq^Du&YU<(ytkmp0 z=Re((%uK=r4A)PkXzWLf{gAO6;CT{1jJdzt=lRnOY+XfD)3!2im4PrXBQ(ut_Rm~5 zIF0Ddn>X=&pGu{IX`1Zp?Bv_pXV0FaXlZOVOI*F(;r{N3jaG%1w^sS@8@ufE+WzgOM4tksC2|LtH;%Ta3Rfm?#L5h zD=RD1>vc>sO++@EO+3$|*=(XH0z(s&ZJn2&S>?g*fZeWx<40^Z%M6?}%{6p`$=Y60 zE1GkSUm~ZC9%!my=!Og&pTW?jT+j)_ga^9=UVdhkvaMri`xjMo?GE3H+R$B93klq9KtXrunfutoiAKGfvPB}@td_a6BWo9Xx0k+ z@Y(~$uFu%@S*frIqRs|^~&1MrJM4F9>6Wk!7GYVL1j_Hkj9<+x%zp;X;EA&P_x~8B_ z_60Njl@ogq#R*}Q;P?SM9R~%0CIl}(zs8BB0*#V^ZKS)$+4$x$K5x(PH~_#g1EIlS zK)2h)G|haEAPhrRR#qsO26t}XqoSJp{%>q?^TB}a-7!CY{~;yYpjNRd*~TQ;N!2k< zQpQJaKyTnO_CgdPIlErw)JmC>At~tzp*JFQ69$6;g+c+#vaoG??xBf8=&iKQd<+2Axj2_}Sgv<;53YWVv3!4MN)8HlN!%fh9+T7&x)Xy+>UTnf^{jG|3Ff zB&OLY^X%zWwr{;pQ6>ZfhezIsxL%`LO}EqHIA(8eFL%fFdVSy6kJugFN3$w0m!?(0 zG)-Eq7OhrmGI)`%7PDkTv$=v0f{hcBFqYI_dKNc`@uGzOxJD4hAQW8BN7waU_2fH zP%f4znkrEuX%uy02~i}8V;dm^-ENmgql%0poKc6`Y7;3n3{7B^iU9l8`O{;{4n`dX z&Qy6}D7+7uS;{)~JdfMAZ*%L`Ex!EaFLUF@4T{Ag?RJ}XyNzKOl*?so+on>fP_Nhd zuOGdQ<2XnuaXpWv#uA2UqN*yx;gHXK<}(ZjU35cdJm_+@{V4BuYio<`?QKS*5u?$F z!C*k6(cpy_UO?A%?%%&p9LJnHcaFPv@6u|uNRos&j?r~}-?^fBJZ7iFD!{YAuRnV9 z=+85><{gR2%Kd(yTCJAH;Bg%9JC`>-D{&m>dAjM7UP1`^{eG^)*|Pw?KT!`&V=x#{ zEEY+Ugx%d;R##W^gBn?Tvpd4Glb7|ky1M$uz<&bQq?ChWrNyU3E;}QbZI))t%pyHK zkZCJDd$6Kbs~uQn0$7%nx09ViP!xr=wYB`ds;c=ho!R$~8y6f3z%=9A+uM28wcG7d zuh;Vvob`I0Mx(Lt@YHOZAD5oQ_aD{Yk(;9#2-op+U_svfXF`Ydzi2!Y z-f~{yF#s{(0Kw(Um-iMPZ#{(B<0d6Psq0C{Cxqbg<;#1dUynHxo^t>qU?xHJmPapR>tdDtPn#a83IMM5`zy3pDIN|lcM^jDUEb#f~o_p>K-~8q` zU%GJNLbYD68`BLPRsLz7JFX%7X`btLyTPSPm-^rM#y8%%diCnR0zUw506S7jIsMt3 z0jvXCq(RX$K!rJ<(foo@01SZlfNQ{Y;J%!EJ2?B{WC2(v{jzEqXpnwj^ovX`&;i=O z1E4LXbh65MpU!GP6(|5YzZ{>=hNOls|6nqsh5G;#yP)yQ0YD@dF#5mM2*(qQ*Hn=J O00008z4hp>?iz+}W*BHO;2Dnr8*hw| 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 literal 0 HcmV?d00001 diff --git a/media/images/mime/64/icon-pdf.png b/media/images/mime/64/icon-pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2086ffd88228643a50d49761952a08d0aba362 GIT binary patch literal 4032 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 N002ovPDHLkV1fmho(KQ{ literal 0 HcmV?d00001 diff --git a/media/images/mime/64/icon-tar.png b/media/images/mime/64/icon-tar.png new file mode 100644 index 0000000000000000000000000000000000000000..817cf09239fbcd7c4fc52db91239eaf20aa51fdb GIT binary patch literal 2210 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 L%RsYA-7fln{od%o literal 0 HcmV?d00001 diff --git a/media/images/mime/64/icon-video.png b/media/images/mime/64/icon-video.png new file mode 100644 index 0000000000000000000000000000000000000000..78b9cd573d26428c191832b445918cb78c342dff GIT binary patch literal 5220 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 IM6N<$f-#b4{{R30 literal 0 HcmV?d00001 diff --git a/media/images/mime/64/index.html b/media/images/mime/64/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/media/images/mime/64/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/images/mime/AUTHORS b/media/images/mime/AUTHORS new file mode 100644 index 0000000..bb7475c --- /dev/null +++ b/media/images/mime/AUTHORS @@ -0,0 +1,5 @@ +Faenza is designed and developed by Matthieu James . + +Faenza icons are all licensed under the GPL. + +Thanks to Holger Seelig and clemyeats for their help for having some text preview inside icons in Nautilus. diff --git a/media/images/mime/COPYING b/media/images/mime/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/media/images/mime/COPYING @@ -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. + + + Copyright (C) + + 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: + + Copyright (C) + 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 +. diff --git a/media/images/mime/index.html b/media/images/mime/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/media/images/mime/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/images/next-grey.png b/media/images/next-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..557822a9eac6b3d25c465579e4a762237359cf5f GIT binary patch literal 750 zcmV5lfO${NfgIF^XoeL!o&9-$QG+?3X3hY5I+GvC(H(Gg0ir{4P?0j#xOQc9mzS63fo#kYXN!^73_c>HVAG)qm>Oae$L zos{x@Q51i#udg3H3OGJKE=Hr#?;(WWa?Vcxgb)DSW`qzo#+W}lozCm!<>dgNZ%L!k zXg7rL0$^rl2Im~kxqEggr6)1Q7nhfp5qJe40S1G?vk=0rloG8qyxT zrlG1TLI{6tZEX$iEm8>KHBjW7f00s7wpy*bACECoRTX7fI_KOUF~&EyeGhJ7e}8{N zYrSi&T_}p8^A%ot??1*E-}L+aga7C60DF6Tw{Hsgq1|pjH^%$~5M%uJ`uh4E@ENE9 gc6N3iH~8NA54q|#gz#ZJV*mgE07*qoM6N<$f+HG8?EnA( literal 0 HcmV?d00001 diff --git a/media/images/next.png b/media/images/next.png new file mode 100644 index 0000000000000000000000000000000000000000..b125123e633b40566ec619facbd117085b9ca2d7 GIT binary patch literal 835 zcmV-J1HAl+P)5lh1Dybr{A!?{|LB&d%t8{;KyF1g_ znfZFqLPG1o=lncRp7(w7h}N17kc)hfzdq8O&xg=Z8Bw=S8{f{OU)e}~*x=}F@Ireb ze>aQtSh|LX2Gb=n9GNK&sn5UKxq5k1gL9Pa>7SC1qPl)BiwTqhQGkHXK<6M1t6o(; z+4Zt}>Nt%AK&?AXPxWijl0Io_33fg862p%V;|GEt2!)amlm$x&;(C5^=3-o1*C~L* zzXZFJMpkoe2uh0Qs(bl#|11ZeJwa%fQ36Ox=mz+@NZi!5Lzn#B0P5|eWF)O@+)ACI zXE{KE@o%ozMnB~2{_E`BdWf=J6{H=RML#^CMD>{`i$1(`@2nGRJ z{@_WT8FJ+LFF5hykL-AI8fCkRP`@6{vna|YR+1$4 z-2&UI+Zk|20hn!G;KCp8b1(i4&k89ykC2PdilR7L%_e^TIL#Em`Gd)1yR&w7p|gbR zyR2q6`MLfXcX~5~PKA;?NX6MgDt+eKw`jI|=e~QRKM7#2N9``NXnn<@U8s zD?Kwgu7B8c3-X{l0~i?G#~$x7h5>qiv3O^SOTYq<0^HYaI_Lj^zX7GVEB3 literal 0 HcmV?d00001 diff --git a/media/images/phoca-download.png b/media/images/phoca-download.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf92fb7b8e9b1917513bd6cd5da450a450e020d GIT binary patch literal 9257 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 literal 0 HcmV?d00001 diff --git a/media/images/prev-grey.png b/media/images/prev-grey.png new file mode 100644 index 0000000000000000000000000000000000000000..f75a83500ef8c361fd23c5644125aaea4ba574e8 GIT binary patch literal 741 zcmV5lD|t^Q546&_uTtl-h(6%ctgR0EeImmO&mhI z2tp}3Wbr?6YnKWx1*ZyiNGWvh-{91x0hctDP(ivX7E8LQ#Aj08y}3W$?cxiKap{4( zT+aEN@A;m?y!W^polXaw^T$f5hX4>oQO`N|vtF-H<+8hggM)+mXf%42=lN2e=P>{f zktCw;VHkc~Sy}1a3+Q&cVVb6IwAQb^_hkTJi~#_O9LCt6APC;qYPH?v3q9CPd zx~;X|0RSPyzfBOwG2%GJ<>h7B7_)PIeQf}|9V=+HT2GZypNXhKMB~CB2rxT4i@CWu zoSdBC?CcDAp2ImeER{+xR##Ws;_&d0TWdFqV(&c|W0;wl!NS7ASPkbKaU4TR3GaQy zTD#e9x4(%j%W43YhzL;>pV2t6m(UMZCCakrw_rAm!Ly{y| zTwI)5RRJiTwHDUek})PG=bQqdIp?^#x1Aq0pBj4^GkRiu>a12`_^ z4F&@o9UY<9>%loU0U;s;K>)@Wy!Xda%04w34dug9ii?Yj zv58?A0sySF$~pIGV`IY+0IaR8wTv;%(P#uA#Mp7pIc{!laDILcV+`^_M*_%4$BKG(9p9>+jqbPb3hGFd% z-d9TfFvjdP8jUX#<`#fvvswIc01v9w>a!pS9sz(c=J#MQ_zK_`01E(HTU+-l_}};o XB=Ro&JHSF}00000NkvXXu0mjfO^8AA literal 0 HcmV?d00001 diff --git a/media/images/prev.png b/media/images/prev.png new file mode 100644 index 0000000000000000000000000000000000000000..6a1e73c405e469d126288d7e0632f5c7777132c3 GIT binary patch literal 835 zcmV-J1HAl+P)5lgn#eRTRd5d!P5Y=bU?QoBALPrikOW`o29-chgaXx&iT(NNtXZ=Etexq*IRAUfYK3*gQQi70x09}AqARKz$ zHgR_EbMDkJnkj%>C)F=zwRl;dG_?qVil9^$_`zQ_`rs&gAASZ)5F{(=SN#s_T*m;6;&tGHr(33=NfUiT6maZL`_4fmqhtsl=wu?zC zcS6q-Xa-n@&A#C`d41OzJTn5oHA-wX9-$RpM`a?++G6tUKf>?K)$4gx=VIKo3?lsy z!&^ppZRZpt(b&I^>)Rzt)gHZg4L>pH=EZn>KChbbUF{hP$MX9;e*e=PeDs5jZv_Io zM9J|8^AN52=uA6#OL;Qw7l|oE>R2vwOJ8%Q{xS>QpEm%cG%%%&ZwJ_>jT9msbW|d5 zEoM!Hx{5FfDlv`D51hL^!EEDW(qixr0EuNdL{0@Q3>50>{I9wxe>|j$I4-7F(=_qj z5_`7o;jzjqEUjJQi-i;X()<(v({Ly|TTnvKj^iZm71O`HmlqP?vx#)3(_MSN(Ot&% zUCNPWs5FdkMJx~MT)KUhtmu%7jQP$2t5=Wk>)0OtCN{be<^s9Sbg)Q>zd;&~1> zhG8LvNi)02Ppe-txA=X0`%ddrcSWDRXBJ+Z7B2-AyLMkS9E<#FRUl~ho6VKGow;s1 zKRq+4zuGhlLWuRA0X#7LEKhkui~;3=*#Y$WwN}P*Q6H7Al^Atid zb5j`%4fG8R^$jdi1UOa#Rmgx;1m~xflqVLYGB~E>C#5R5WfrBD=NDxcD>w(6ux+}$ z0H{vK)5S4FVrnu+YXbvYPS1)^hYbykPR$ZG|2sZlc7DOc#=&uyBe>@vhjbMW!_D0@ zi0jRpH~;_t|NZ;-4<9~g>p%1WigOltL>4nJa0`Jj9U%67*p|{y$|eP z-kS0F^y8A=JF)t5<$1*dKYpw|wCQ!!g{=#-lPybhU)%z*oUga75lS^n_RTPH5efD|ZbMC#TZ9>~bFoibQ8lezD zYKoQ!ir|xu(m+RPK@_QjA_O`z&tnIj{|l`(0}@yHSiLjWysJjh5RDo4&&n%z(bI#i{|2166&z}> zst<}-Pv#qVXfR!3>4@v$sPWn76WyP-1YDwOFMprT$94Ttkq{UL2m=tH3(yLLL)RM; zpFV%YT{uM}1u&nGmak=}gn)PV%>!`xw*}CUCOSy!>df`4NyapvY;JJ; z=U}Q|%fGP@q3cUj0lrn?;*nbboceB@Zn}=ED0M794W%ACFV{(3Z?P*P9Eu8OgfgNtjCZ9 z>?%FSq20$e4>dJ9%d^9WDMei@e*@o<=t57nR`SS**R`hzpmX*8jbjk#hGl$0QmZ7y43D$TwLv};rcF>vSvqV zgo?A1?cN9#cZA3pCKnki?Rzxa{Y#58+0s9Z)LT;vHQlt+V)^|Sp7J~g8!0UeVbaf9 z+)M6ov-V5;@Q>!%PFn{$Zn2Vh}LpV4%Za?&Y0OYa- z_=LFr2ZPX>uQ@;w&H|6fVg?3oArNM~bhqvgP*AMIHKN41C^fMpGe1uuBr`Xa!N6SK z$W-6JV#fYYeLxiwAQi#+X(i=}MX3yqDfvmM3T~N2spa`a*~R{w<^6zaj(WN{hE&XX qdytV4$ZJygzdp~y0mK|a;62;HX$*`aSC3r;Ioi|J&t;ucLK6U|Tt4jp literal 0 HcmV?d00001 diff --git a/media/index.html b/media/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/media/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/media/js/index.html b/media/js/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/media/js/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/models/fields/index.html b/models/fields/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/models/fields/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/models/fields/phocaaccesslevel.php b/models/fields/phocaaccesslevel.php new file mode 100644 index 0000000..0aff87d --- /dev/null +++ b/models/fields/phocaaccesslevel.php @@ -0,0 +1,103 @@ +element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $attr .= ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : ''; + $attr .= $this->element['size'] ? ' size="'.(int) $this->element['size'].'"' : ''; + $attr .= $this->multiple ? ' multiple="multiple"' : ''; + + // Initialize JavaScript field attributes. + $attr .= $this->element['onchange'] ? ' onchange="'.(string) $this->element['onchange'].'"' : ''; + + // Get the field options. + $options = $this->getOptions(); + + + return $this->_level( $this->name, $this->value, $attr, $options, $this->id); + } + + + public static function _level($name, $selected, $attribs = '', $params = true, $id = false) { + + $db = JFactory::getDbo(); + $query = $db->getQuery(true); + + $query->select('a.id AS value, a.title AS text'); + $query->from('#__viewlevels AS a'); + //PHOCAEDIT + $query->where('a.id <> 1'); + //ENDPHOCAEDIT + $query->group('a.id'); + $query->order('a.ordering ASC'); + $query->order('`title` ASC'); + + // Get the options. + $db->setQuery($query); + $options = $db->loadObjectList(); + + // Check for a database error. + if ($db->getErrorNum()) { + JError::raiseWarning(500, $db->getErrorMsg()); + return null; + } + + // If params is an array, push these options to the array + if (is_array($params)) { + $options = array_merge($params,$options); + } + // If all levels is allowed, push it into the array. + elseif ($params) { + array_unshift($options, JHtml::_('select.option', '', JText::_('JOPTION_ACCESS_SHOW_ALL_LEVELS'))); + } + + return JHtml::_('select.genericlist', $options, $name, + array( + 'list.attr' => $attribs, + 'list.select' => $selected, + 'id' => $id + ) + ); + } +} diff --git a/models/fields/phocacolortext.php b/models/fields/phocacolortext.php new file mode 100644 index 0000000..d46dd38 --- /dev/null +++ b/models/fields/phocacolortext.php @@ -0,0 +1,90 @@ +_getPhocaParams( $this->element['name'] ); + + JHTML::stylesheet( 'administrator/components/com_phocadownload/assets/jcp/picker.css' ); + $document->addScript(JURI::base(true).'/components/com_phocadownload/assets/jcp/picker.js'); + + // Initialize some field attributes. + $size = $this->element['size'] ? ' size="'.(int) $this->element['size'].'"' : ''; + $class = $this->element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $maxLength = $this->element['maxlength'] ? ' maxlength="'.(int) $this->element['maxlength'].'"' : ''; + $readonly = ((string) $this->element['readonly'] == 'true') ? ' readonly="readonly"' : ''; + $disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : ''; + // Initialize JavaScript field attributes. + $onchange = $this->element['onchange'] ? ' onchange="'.(string) $this->element['onchange'].'"' : ''; + + $value = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8'); + + // TODO 1.6 + // MENU - Set Default value to "" because of saving "" value into the menu link ( use global = "") + if ($option == "com_menus") { + $DefaultValue = (string)$this->element['default']; + if ($value == $DefaultValue) { + $value = ''; + } + } + + $html =''; + + // Color Picker + $nameCP = str_replace('[', '_', $this->name); + $nameCP = str_replace(']', '', $nameCP); + $html .= '' . JText::_('COM_PHOCADOWNLOAD_PICK_COLOR') . ''; + + // MENU - Display the global value + if ($option == "com_menus") { + $html .= '[ ' . $globalValue . ' ]'; + } + return $html; + + } + + protected function getLabel() { + echo '

    '; + return parent::getLabel(); + echo '
    '; + } + + protected function _setPhocaParams(){ + + $component = 'com_phocadownload'; + $table = JTable::getInstance('extension'); + $idCom = $table->find( array('element' => $component )); + $table->load($idCom); + $phocaParams = new JParameter( $table->params ); + $this->phocaParams = $phocaParams; + } + + protected function _getPhocaParams( $name ){ + + // Don't call sql query by every param item (it will be loaded only one time) + if (!$this->phocaParams) { + $params = $this->_setPhocaParams(); + } + $globalValue = $this->phocaParams->get( $name, '' ); + return $globalValue; + } +} +?> \ No newline at end of file diff --git a/models/fields/phocadownloadcategory.php b/models/fields/phocadownloadcategory.php new file mode 100644 index 0000000..0a33d6f --- /dev/null +++ b/models/fields/phocadownloadcategory.php @@ -0,0 +1,64 @@ +setQuery( $query ); + $data = $db->loadObjectList(); + + // TODO - check for other views than category edit + $view = JRequest::getVar( 'view' ); + $catId = -1; + if ($view == 'phocadownloadcat') { + $id = $this->form->getValue('id'); // id of current category + if ((int)$id > 0) { + $catId = $id; + } + } + /*if ($view == 'phocadownloadfile') { + $id = $this->form->getValue('catid'); // id of current category + if ((int)$id > 0) { + $catId = $id; + } + }*/ + + + + $required = ((string) $this->element['required'] == 'true') ? TRUE : FALSE; + + $tree = array(); + $text = ''; + $tree = PhocaDownloadCategory::CategoryTreeOption($data, $tree, 0, $text, $catId); + + //if ($required == TRUE) { + + //} else { + + array_unshift($tree, JHTML::_('select.option', '', '- '.JText::_('COM_PHOCADOWNLOAD_SELECT_CATEGORY').' -', 'value', 'text')); + //} + return JHTML::_('select.genericlist', $tree, $this->name, 'class="inputbox"', 'value', 'text', $this->value, $this->id ); + } +} +?> \ No newline at end of file diff --git a/models/fields/phocadownloadeditor.php b/models/fields/phocadownloadeditor.php new file mode 100644 index 0000000..1cc3124 --- /dev/null +++ b/models/fields/phocadownloadeditor.php @@ -0,0 +1,128 @@ +element['rows']; + $cols = (int) $this->element['cols']; + $height = ((string) $this->element['height']) ? (string) $this->element['height'] : '250'; + $width = ((string) $this->element['width']) ? (string) $this->element['width'] : '100%'; + + // Build the buttons array. + $buttons = (string) $this->element['buttons']; + if ($buttons == 'true' || $buttons == 'yes' || $buttons == '1') { + $buttons = true; + } else if ($buttons == 'false' || $buttons == 'no' || $buttons == '0') { + $buttons = false; + } else { + $buttons = explode(',', $buttons); + } + + $hide = ((string) $this->element['hide']) ? explode(',',(string) $this->element['hide']) : array(); + + $globalValue = $this->_getPhocaParameter( 'display_editor' ); + if ($globalValue == '') { + $globalValue = 1; + } + $widthE = $width + 200; + if ($globalValue == 1) { + // Get an editor object. + $editor = $this->getEditor(); + + $editorOutput = '
    '. $editor->display($this->name, htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8'), $width, $height, $cols, $rows, $buttons ? (is_array($buttons) ? array_merge($buttons,$hide) : $hide) : false, $this->id).'
    '; + + return '
    ' .$editorOutput; + } + else { + $style = ''; + if ($width != '' && $height != '') { + $style = 'style="width:'.$width.'; height:'.$height.'"'; + } + return ''; + } + + } + + protected function & getEditor() + { + // Only create the editor if it is not already created. + if (empty($this->editor)) { + + // Initialize variables. + $editor = null; + + // Get the editor type attribute. Can be in the form of: editor="desired|alternative". + $type = trim((string) $this->element['editor']); + if ($type) { + // Get the list of editor types. + $types = explode('|', $type); + + // Get the database object. + $db = JFactory::getDBO(); + + // Iterate over teh types looking for an existing editor. + foreach ($types as $element) { + // Build the query. + $query = $db->getQuery(true); + $query->select('element'); + $query->from('#__extensions'); + $query->where('element = '.$db->quote($element)); + $query->where('folder = '.$db->quote('editors')); + $query->where('enabled = 1'); + + // Check of the editor exists. + $db->setQuery($query, 0, 1); + $editor = $db->loadResult(); + + // If an editor was found stop looking. + if ($editor) { + break; + } + } + } + + // Create the JEditor intance based on the given editor. + $this->editor = JFactory::getEditor($editor ? $editor : null); + } + + return $this->editor; + } + + public function save() + { + return $this->getEditor()->save($this->id); + } + + protected function _setPhocaParams(){ + $component = 'com_phocadownload'; + $paramsC = JComponentHelper::getParams($component) ; + $this->phocaParams = $paramsC; + } + + protected function _getPhocaParameter( $name ){ + + // Don't call sql query by every param item (it will be loaded only one time) + if (!$this->phocaParams) { + $params = $this->_setPhocaParams(); + } + $globalValue = $this->phocaParams->get( $name, '' ); + return $globalValue; + } +} diff --git a/models/fields/phocadownloadfile.php b/models/fields/phocadownloadfile.php new file mode 100644 index 0000000..cceef6e --- /dev/null +++ b/models/fields/phocadownloadfile.php @@ -0,0 +1,42 @@ +setQuery( $query ); + + $messages = $db->loadObjectList(); + $options = array(); + if ($messages) + { + foreach($messages as $message) + { + $options[] = JHtml::_('select.option', $message->id, $message->title); + } + } + array_unshift($options, JHTML::_('select.option', '', '- '.JText::_('COM_PHOCADOWNLOAD_SELECT_FILE').' -', 'value', 'text')); + return JHTML::_('select.genericlist', $options, $this->name, 'class="inputbox"', 'value', 'text', $this->value, $this->id ); + + } +} +?> \ No newline at end of file diff --git a/models/fields/phocadownloadlicense.php b/models/fields/phocadownloadlicense.php new file mode 100644 index 0000000..c38fa33 --- /dev/null +++ b/models/fields/phocadownloadlicense.php @@ -0,0 +1,37 @@ +setQuery( $query ); + $licenses = $db->loadObjectList(); + + $id = $this->form->getValue('id'); // id of current license + $required = ((string) $this->element['required'] == 'true') ? TRUE : FALSE; + + array_unshift($licenses, JHTML::_('select.option', '', '- '.JText::_('COM_PHOCADOWNLOAD_SELECT_LICENSE').' -', 'value', 'text')); + + return JHTML::_('select.genericlist', $licenses, $this->name, 'class="inputbox"', 'value', 'text', $this->value, $this->id ); + } +} +?> \ No newline at end of file diff --git a/models/fields/phocadownloadordering.php b/models/fields/phocadownloadordering.php new file mode 100644 index 0000000..91e01d2 --- /dev/null +++ b/models/fields/phocadownloadordering.php @@ -0,0 +1,88 @@ +form->getValue('id'); + + if ($this->element['table']) { + switch (strtolower($this->element['table'])) { + + case "category": + $whereLabel = 'parent_id'; + $whereValue = (int) $this->form->getValue('parent_id'); + $table = '#__phocadownload_categories'; + break; + + case "tag": + $whereLabel = ''; + $whereValue = ''; + $table = '#__phocadownload_tags'; + break; + + case "file": + default: + $whereLabel = 'catid'; + $whereValue = (int) $this->form->getValue('catid'); + $table = '#__phocadownload'; + break; + + } + } else { + $whereLabel = 'catid'; + $whereValue = (int) $this->form->getValue('catid'); + $table = '#__phocadownload'; + } + + // Initialize some field attributes. + $attr .= $this->element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $attr .= ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : ''; + $attr .= $this->element['size'] ? ' size="'.(int) $this->element['size'].'"' : ''; + + // Initialize JavaScript field attributes. + $attr .= $this->element['onchange'] ? ' onchange="'.(string) $this->element['onchange'].'"' : ''; + + + + // Build the query for the ordering list. + $query = 'SELECT ordering AS value, title AS text' . + ' FROM ' . $table; + if ($whereLabel != '') { + $query .= ' WHERE '.$whereLabel.' = ' . (int) $whereValue; + } + $query .= ' ORDER BY ordering'; + + // Create a read-only list (no name) with a hidden input to store the value. + if ((string) $this->element['readonly'] == 'true') { + $html[] = JHtml::_('list.ordering', '', $query, trim($attr), $this->value, $id ? 0 : 1); + $html[] = ''; + } + // Create a regular list. + else { + $html[] = JHtml::_('list.ordering', $this->name, $query, trim($attr), $this->value, $id ? 0 : 1); + } + + return implode($html); + } +} \ No newline at end of file diff --git a/models/fields/phocadownloadtoken.php b/models/fields/phocadownloadtoken.php new file mode 100644 index 0000000..83732a6 --- /dev/null +++ b/models/fields/phocadownloadtoken.php @@ -0,0 +1,51 @@ +element['size'] ? ' size="'.(int) $this->element['size'].'"' : ''; + $maxLength = $this->element['maxlength'] ? ' maxlength="'.(int) $this->element['maxlength'].'"' : ''; + $class = $this->element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $readonly = ((string) $this->element['readonly'] == 'true') ? ' readonly="readonly"' : ''; + $disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : ''; + + $maptype = ( (string)$this->element['maptype'] ? $this->element['maptype'] : '' ); + + // Initialize JavaScript field attributes. + $onchange = (string) $this->element['onchange']; + $onchangeOutput = ' onChange="'.(string) $this->element['onchange'].'"'; + + + + $html[] = '
    '. "\n"; + return implode("\n", $html); + + } +} +?> \ No newline at end of file diff --git a/models/fields/phocahead.php b/models/fields/phocahead.php new file mode 100644 index 0000000..d0b7661 --- /dev/null +++ b/models/fields/phocahead.php @@ -0,0 +1,48 @@ +'; + $phocaImage = ( (string)$this->element['phocaimage'] ? $this->element['phocaimage'] : '' ); + $image = ''; + + if ($phocaImage != ''){ + $image = JHTML::_('image', $ti . $phocaImage, '' ); + } + + if ($this->element['default']) { + if ($image != '') { + return '
    ' + .'
    '. $image.' '. JText::_($this->element['default']) . '
    ' + .'
    '; + } else { + return '
    ' + .''. JText::_($this->element['default']) . '' + .'
    '; + } + } else { + return parent::getLabel(); + } + echo '
    '; + } +} +?> \ No newline at end of file diff --git a/models/fields/phocaheadexpert.php b/models/fields/phocaheadexpert.php new file mode 100644 index 0000000..b86acae --- /dev/null +++ b/models/fields/phocaheadexpert.php @@ -0,0 +1,48 @@ +'; + $phocaImage = ( (string)$this->element['phocaimage'] ? $this->element['phocaimage'] : '' ); + $image = ''; + + if ($phocaImage != ''){ + $image = JHTML::_('image', $ti . $phocaImage, '' ); + } + + if ($this->element['default']) { + if ($image != '') { + return '
    ' + .'
    '. $image.' '. JText::_($this->element['default']) . '
    ' + .'
    '; + } else { + return '
    ' + .''. JText::_($this->element['default']) . '' + .'
    '; + } + } else { + return parent::getLabel(); + } + echo '
    '; + } +} +?> \ No newline at end of file diff --git a/models/fields/phocainfotext.php b/models/fields/phocainfotext.php new file mode 100644 index 0000000..6d99f12 --- /dev/null +++ b/models/fields/phocainfotext.php @@ -0,0 +1,33 @@ +element['class'] != '') { + $class = $this->element['class']; + } + + return '
    '.$this->value.'
    '; + } + + + protected function getLabel() + { + echo '
    '; + + return parent::getLabel(); + + echo '
    '; + } + +} \ No newline at end of file diff --git a/models/fields/phocalongtext.php b/models/fields/phocalongtext.php new file mode 100644 index 0000000..d5ee5d8 --- /dev/null +++ b/models/fields/phocalongtext.php @@ -0,0 +1,83 @@ +_getPhocaParams( $this->element['name'] ); + + // Initialize some field attributes. + $size = $this->element['size'] ? ' size="'.(int) $this->element['size'].'"' : ''; + $class = $this->element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $maxLength = $this->element['maxlength'] ? ' maxlength="'.(int) $this->element['maxlength'].'"' : ''; + $readonly = ((string) $this->element['readonly'] == 'true') ? ' readonly="readonly"' : ''; + $disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : ''; + // Initialize JavaScript field attributes. + $onchange = $this->element['onchange'] ? ' onchange="'.(string) $this->element['onchange'].'"' : ''; + + $value = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8'); + + // TODO 1.6 + // MENU - Set Default value to "" because of saving "" value into the menu link ( use global = "") + if ($option == "com_menus") { + $DefaultValue = (string)$this->element['default']; + if ($value == $DefaultValue) { + $value = ''; + } + } + + // MENU - Display the global value + if ($option == "com_menus") { + $html =''; + $html .='
    []
    '; + } else { + $html =''; + } + return $html; + } + + protected function getLabel() { + echo '
    '; + return parent::getLabel(); + echo '
    '; + } + + protected function _setPhocaParams(){ + + $component = 'com_phocadownload'; + $table = JTable::getInstance('extension'); + $idCom = $table->find( array('element' => $component )); + $table->load($idCom); + $phocaParams = new JParameter( $table->params ); + $this->phocaParams = $phocaParams; + } + + protected function _getPhocaParams( $name ){ + + // Don't call sql query by every param item (it will be loaded only one time) + if (!$this->phocaParams) { + $params = $this->_setPhocaParams(); + } + $globalValue = $this->phocaParams->get( $name, '' ); + return $globalValue; + } +} +?> \ No newline at end of file diff --git a/models/fields/phocaselectfilename.php b/models/fields/phocaselectfilename.php new file mode 100644 index 0000000..3129bd0 --- /dev/null +++ b/models/fields/phocaselectfilename.php @@ -0,0 +1,87 @@ +element['manager'] ? '&manager='.(string) $this->element['manager'] : ''; + + $group = PhocaDownloadSettings::getManagerGroup((string) $this->element['manager']); + $textButton = 'COM_PHOCADOWNLOAD_FORM_SELECT_'.strtoupper($group['t']); + + $link = 'index.php?option=com_phocadownload&view=phocadownloadmanager'.$group['c'].$managerOutput.'&field='.$this->id; + + // Initialize some field attributes. + $attr = $this->element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $attr .= $this->element['size'] ? ' size="'.(int) $this->element['size'].'"' : ''; + + // Initialize JavaScript field attributes. + $onchange = (string) $this->element['onchange']; + + // Load the modal behavior script. + JHtml::_('behavior.modal', 'a.modal_'.$this->id); + + // If external image, we don't need the filename will be required + $extId = (int) $this->form->getValue('extid'); + if ($extId > 0) { + $readonly = ' readonly="readonly"'; + return ''; + } + + // Build the script. + $script = array(); + $script[] = ' function phocaSelectFileName_'.$this->id.'(title) {'; + $script[] = ' document.getElementById("'.$this->id.'_id").value = title;'; + $script[] = ' '.$onchange; + $script[] = ' SqueezeBox.close();'; + $script[] = ' }'; + + // Add the script to the document head. + JFactory::getDocument()->addScriptDeclaration(implode("\n", $script)); + + + /*$html[] = '
    '; + $html[] = ' '; + $html[] = '
    '; + + // Create the user select button. + $html[] = '
    '; + $html[] = '
    '; + $html[] = ' '; + $html[] = ' '.JText::_($textButton).''; + $html[] = '
    '; + $html[] = '
    ';*/ + + $html[] = '
    '; + $html[] = ''; + $html[] = '' + . JText::_($textButton).''; + $html[] = '
    '. "\n"; + + + return implode("\n", $html); + } +} \ No newline at end of file diff --git a/models/fields/phocatags.php b/models/fields/phocatags.php new file mode 100644 index 0000000..873631b --- /dev/null +++ b/models/fields/phocatags.php @@ -0,0 +1,34 @@ +form->getValue('id'); + + $activeTags = array(); + if ((int)$id > 0) { + $activeTags = PhocaDownloadTag::getTags($id, 1); + } + + + return PhocaDownloadTag::getAllTagsSelectBox($this->name, $this->id, $activeTags, NULL,'id' ); + + + } +} +?> \ No newline at end of file diff --git a/models/fields/phocatext.php b/models/fields/phocatext.php new file mode 100644 index 0000000..448b078 --- /dev/null +++ b/models/fields/phocatext.php @@ -0,0 +1,75 @@ +_getPhocaParams( $this->element['name'] ); + + // Initialize some field attributes. + $size = $this->element['size'] ? ' size="'.(int) $this->element['size'].'"' : ''; + $class = $this->element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $maxLength = $this->element['maxlength'] ? ' maxlength="'.(int) $this->element['maxlength'].'"' : ''; + $readonly = ((string) $this->element['readonly'] == 'true') ? ' readonly="readonly"' : ''; + $disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : ''; + // Initialize JavaScript field attributes. + $onchange = $this->element['onchange'] ? ' onchange="'.(string) $this->element['onchange'].'"' : ''; + + $value = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8'); + + // TODO 1.6 + // MENU - Set Default value to "" because of saving "" value into the menu link ( use global = "") + if ($option == "com_menus") { + $DefaultValue = (string)$this->element['default']; + if ($value == $DefaultValue) { + $value = ''; + } + } + + $html =''; + + // MENU - Display the global value + if ($option == "com_menus") { + $html .= '[ ' . $globalValue . ' ]'; + } + + return $html; + } + + protected function getLabel() { + echo '
    '; + return parent::getLabel(); + echo '
    '; + } + + protected function _setPhocaParams(){ + $component = 'com_phocadownload'; + $paramsC = JComponentHelper::getParams($component) ; + $this->phocaParams = $paramsC; + } + + protected function _getPhocaParams( $name ){ + // Don't call sql query by every param item (it will be loaded only one time) + if (!$this->phocaParams) { + $params = $this->_setPhocaParams(); + } + $globalValue = $this->phocaParams->get( $name, '' ); + return $globalValue; + } +} +?> \ No newline at end of file diff --git a/models/fields/phocatextarea.php b/models/fields/phocatextarea.php new file mode 100644 index 0000000..da2298b --- /dev/null +++ b/models/fields/phocatextarea.php @@ -0,0 +1,81 @@ +_getPhocaParams( $this->element['name'] ); + + // Initialize some field attributes. + $class = $this->element['class'] ? ' class="'.(string) $this->element['class'].'"' : ''; + $disabled = ((string) $this->element['disabled'] == 'true') ? ' disabled="disabled"' : ''; + $columns = $this->element['cols'] ? ' cols="'.(int) $this->element['cols'].'"' : ''; + $rows = $this->element['rows'] ? ' rows="'.(int) $this->element['rows'].'"' : ''; + + // Initialize JavaScript field attributes. + $onchange = $this->element['onchange'] ? ' onchange="'.(string) $this->element['onchange'].'"' : ''; + + $value = htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8'); + + // TODO 1.6 + // MENU - Set Default value to "" because of saving "" value into the menu link ( use global = "") + if ($option == "com_menus") { + $DefaultValue = (string)$this->element['default']; + if ($value == $DefaultValue) { + $value = ''; + } + } + + // MENU - Display the global value + if ($option == "com_menus") { + $html =''; + $html .='
    []
    '; + } else { + $html = ''; + } + return $html; + } + + protected function getLabel() { + echo '
    '; + return parent::getLabel(); + echo '
    '; + } + + protected function _setPhocaParams(){ + $component = 'com_phocadownload'; + $paramsC = JComponentHelper::getParams($component) ; + $this->phocaParams = $paramsC; + } + + protected function _getPhocaParams( $name ){ + + // Don't call sql query by every param item (it will be loaded only one time) + if (!$this->phocaParams) { + $params = $this->_setPhocaParams(); + } + $globalValue = $this->phocaParams->get( $name, '' ); + return $globalValue; + } +} +?> \ No newline at end of file diff --git a/models/fields/phocausers.php b/models/fields/phocausers.php new file mode 100644 index 0000000..6aeff37 --- /dev/null +++ b/models/fields/phocausers.php @@ -0,0 +1,28 @@ +form->getValue($this->element['name']); + + return PhocaDownloadUser::usersList($this->name, $this->id, $userId, 1, NULL,'name', 0 ); + + + } +} +?> \ No newline at end of file diff --git a/models/forms/index.html b/models/forms/index.html new file mode 100644 index 0000000..42682b4 --- /dev/null +++ b/models/forms/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/models/forms/phocadownloadcat.xml b/models/forms/phocadownloadcat.xml new file mode 100644 index 0000000..6a1da9d --- /dev/null +++ b/models/forms/phocadownloadcat.xml @@ -0,0 +1,88 @@ + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + + + + + + + + + +
    + + +
    + +
    +
    + + +
    diff --git a/models/forms/phocadownloadfile.xml b/models/forms/phocadownloadfile.xml new file mode 100644 index 0000000..a695e8c --- /dev/null +++ b/models/forms/phocadownloadfile.xml @@ -0,0 +1,157 @@ + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + +
    +
    + +
    diff --git a/models/forms/phocadownloadlayout.xml b/models/forms/phocadownloadlayout.xml new file mode 100644 index 0000000..ee00a7f --- /dev/null +++ b/models/forms/phocadownloadlayout.xml @@ -0,0 +1,22 @@ + +
    + +
    + + + + + + + + + + + +
    + + + + + +
    diff --git a/models/forms/phocadownloadlic.xml b/models/forms/phocadownloadlic.xml new file mode 100644 index 0000000..65a5178 --- /dev/null +++ b/models/forms/phocadownloadlic.xml @@ -0,0 +1,33 @@ + +
    + +
    + + + + + + + + + + + + + + + +
    + + +
    + + + + + + + +
    + +
    diff --git a/models/forms/phocadownloadmanager.xml b/models/forms/phocadownloadmanager.xml new file mode 100644 index 0000000..8742e42 --- /dev/null +++ b/models/forms/phocadownloadmanager.xml @@ -0,0 +1,33 @@ + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    diff --git a/models/forms/phocadownloadstyle.xml b/models/forms/phocadownloadstyle.xml new file mode 100644 index 0000000..81c2e3c --- /dev/null +++ b/models/forms/phocadownloadstyle.xml @@ -0,0 +1,32 @@ + +
    + +
    + + + + + + + + + + + + + + + + +
    + + +
    + + + + + + +
    +
    diff --git a/models/forms/phocadownloadtag.xml b/models/forms/phocadownloadtag.xml new file mode 100644 index 0000000..5ce177d --- /dev/null +++ b/models/forms/phocadownloadtag.xml @@ -0,0 +1,37 @@ + +
    + +
    + + + + + + + + + + + + + + + +
    + + +
    + + + + + + + + + + +
    + + +
    diff --git a/models/index.html b/models/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/models/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/models/phocadownloadcat.php b/models/phocadownloadcat.php new file mode 100644 index 0000000..495323f --- /dev/null +++ b/models/phocadownloadcat.php @@ -0,0 +1,627 @@ +catid)) { + return $user->authorise('core.delete', 'com_phocadownload.phocadownloadcat.'.(int) $record->catid); + } else { + return parent::canDelete($record); + } + } + + protected function canEditState($record){ + $user = JFactory::getUser(); + + if (!empty($record->catid)) { + return $user->authorise('core.edit.state', 'com_phocadownload.phocadownloadcat.'.(int) $record->catid); + } else { + return parent::canEditState($record); + } + } + + public function getTable($type = 'PhocaDownloadCat', $prefix = 'Table', $config = array()){ + return JTable::getInstance($type, $prefix, $config); + } + + public function getForm($data = array(), $loadData = true) { + + $app = JFactory::getApplication(); + $form = $this->loadForm('com_phocadownload.phocadownloadcat', 'phocadownloadcat', array('control' => 'jform', 'load_data' => $loadData)); + if (empty($form)) { + return false; + } + return $form; + } + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownload.edit.phocadownloadcat.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + + public function getItem($pk = null) { + if ($item = parent::getItem($pk)) { + // Convert the params field to an array. + $registry = new JRegistry; + $registry->loadString($item->metadata); + $item->metadata = $registry->toArray(); + } + + return $item; + } + + protected function prepareTable($table){ + jimport('joomla.filter.output'); + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + $table->title = htmlspecialchars_decode($table->title, ENT_QUOTES); + $table->alias = JApplication::stringURLSafe($table->alias); + + if (empty($table->alias)) { + $table->alias = JApplication::stringURLSafe($table->title); + } + + if (empty($table->id)) { + // Set the values + //$table->created = $date->toSql(); + + // Set ordering to the last item if not set + if (empty($table->ordering)) { + $db = JFactory::getDbo(); + $db->setQuery('SELECT MAX(ordering) FROM #__phocadownload_categories'); + $max = $db->loadResult(); + + $table->ordering = $max+1; + } + } + else { + // Set the values + //$table->modified = $date->toSql(); + //$table->modified_by = $user->get('id'); + } + } + + + protected function getReorderConditions($table = null) + { + $condition = array(); + $condition[] = 'parent_id = '. (int) $table->parent_id; + //$condition[] = 'state >= 0'; + return $condition; + } + + + + + + + /* + * Custom Save method - libraries/joomla/application/component/modeladmin.php + */ + public function save($data) + { + + // = = = = = = = = = = + // Default VALUES FOR Rights in FRONTEND + // ACCESS - 0: all users can see the category (registered or not registered) + // if registered or not registered it will be set in ACCESS LEVEL not here) + // if -1 - user was not selected so every registered or special users can see category + // UPLOAD - -2: nobody can upload or add images in front (if 0 - every users can do it) + // DELETE - -2: nobody can upload or add images in front (if 0 - every users can do it) + if(!isset($data['accessuserid'])) { $data['accessuserid'] = array();} + if(!isset($data['uploaduserid'])) { $data['uploaduserid'] = array();} + if(!isset($data['deleteuserid'])) { $data['deleteuserid'] = array();} + $accessUserIdArray = PhocaDownloadUtils::toArray($data['accessuserid']); + $uploadUserIdArray = PhocaDownloadUtils::toArray($data['uploaduserid']); + $deleteUserIdArray = PhocaDownloadUtils::toArray($data['deleteuserid']); + + if (isset($data['access']) && (int)$data['access'] > 0 && (int)$accessUserIdArray[0] == 0) { + $accessUserId[0] = -1; + } + $data['accessuserid'] = implode(',',$accessUserIdArray); + $data['uploaduserid'] = implode(',',$uploadUserIdArray); + $data['deleteuserid'] = implode(',',$deleteUserIdArray); + + // = = = = = = = = = = + + + // Initialise variables; + $dispatcher = JDispatcher::getInstance(); + $table = $this->getTable(); + $pk = (!empty($data['id'])) ? $data['id'] : (int)$this->getState($this->getName().'.id'); + $isNew = true; + + // Include the content plugins for the on save events. + JPluginHelper::importPlugin('content'); + + // Load the row if saving an existing record. + if ($pk > 0) { + $table->load($pk); + $isNew = false; + } + + // Bind the data. + if (!$table->bind($data)) { + $this->setError($table->getError()); + return false; + } + + if(intval($table->date) == 0) { + $table->date = JFactory::getDate()->toSql(); + } + + // Prepare the row for saving + $this->prepareTable($table); + + // Check the data. + if (!$table->check()) { + $this->setError($table->getError()); + return false; + } + + // Trigger the onContentBeforeSave event. + /*$result = $dispatcher->trigger($this->event_before_save, array($this->option.'.'.$this->name, $table, $isNew)); + if (in_array(false, $result, true)) { + $this->setError($table->getError()); + return false; + }*/ + + // Store the data. + if (!$table->store()) { + $this->setError($table->getError()); + return false; + } + + // Clean the cache. + $cache = JFactory::getCache($this->option); + $cache->clean(); + + // Trigger the onContentAfterSave event. + //$dispatcher->trigger($this->event_after_save, array($this->option.'.'.$this->name, $table, $isNew)); + + $pkName = $table->getKeyName(); + if (isset($table->$pkName)) { + $this->setState($this->getName().'.id', $table->$pkName); + } + $this->setState($this->getName().'.new', $isNew); + + + + return true; + } + + + + + + + function delete(&$cid = array()) { + $app = JFactory::getApplication(); + $db = JFactory::getDBO(); + + $result = false; + if (count( $cid )) { + JArrayHelper::toInteger($cid); + $cids = implode( ',', $cid ); + + // FIRST - if there are subcategories - - - - - + $query = 'SELECT c.id, c.name, c.title, COUNT( s.parent_id ) AS numcat' + . ' FROM #__phocadownload_categories AS c' + . ' LEFT JOIN #__phocadownload_categories AS s ON s.parent_id = c.id' + . ' WHERE c.id IN ( '.$cids.' )' + . ' GROUP BY c.id' + ; + $db->setQuery( $query ); + + if (!($rows2 = $db->loadObjectList())) { + JError::raiseError( 500, $db->stderr('Load Data Problem') ); + return false; + } + + // Add new CID without categories which have subcategories (we don't delete categories with subcat) + $err_cat = array(); + $cid = array(); + foreach ($rows2 as $row) { + if ($row->numcat == 0) { + $cid[] = (int) $row->id; + } else { + $err_cat[] = $row->title; + } + } + // - - - - - - - - - - - - - - - + + // Images with new cid - - - - - + if (count( $cid )) { + JArrayHelper::toInteger($cid); + $cids = implode( ',', $cid ); + + // Select id's from phocadownload tables. If the category has some images, don't delete it + $query = 'SELECT c.id, c.name, c.title, COUNT( s.catid ) AS numcat' + . ' FROM #__phocadownload_categories AS c' + . ' LEFT JOIN #__phocadownload AS s ON s.catid = c.id' + . ' WHERE c.id IN ( '.$cids.' )' + . ' GROUP BY c.id'; + + $db->setQuery( $query ); + + if (!($rows = $db->loadObjectList())) { + JError::raiseError( 500, $db->stderr('Load Data Problem') ); + return false; + } + + $err_img = array(); + $cid = array(); + foreach ($rows as $row) { + if ($row->numcat == 0) { + $cid[] = (int) $row->id; + } else { + $err_img[] = $row->title; + } + } + + if (count( $cid )) { + $cids = implode( ',', $cid ); + $query = 'DELETE FROM #__phocadownload_categories' + . ' WHERE id IN ( '.$cids.' )'; + $db->setQuery( $query ); + if (!$db->query()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Delete items in phocadownload_user_category + /* $query = 'DELETE FROM #__phocadownload_user_category' + . ' WHERE catid IN ( '.$cids.' )'; + $db->setQuery( $query ); + if (!$db->query()) { + $this->setError($this->_db->getErrorMsg()); + return false; + }*/ + } + } + + // There are some images in the category - don't delete it + $msg = ''; + if (count( $err_cat ) || count( $err_img )) { + if (count( $err_cat )) { + $cids_cat = implode( ", ", $err_cat ); + $msg .= JText::plural( 'COM_PHOCADOWNLOAD_ERROR_DELETE_CONTAIN_CAT', $cids_cat ); + } + + if (count( $err_img )) { + $cids_img = implode( ", ", $err_img ); + $msg .= JText::plural( 'COM_PHOCADOWNLOAD_ERROR_DELETE_CONTAIN_FILE', $cids_img ); + } + $link = 'index.php?option=com_phocadownload&view=phocadownloadcats'; + $app->redirect($link, $msg); + } + } + return true; + } + + protected function batchCopy($value, $pks, $contexts) + { + $categoryId = (int) $value; + + + $table = $this->getTable(); + $db = $this->getDbo(); + + // Check that the category exists + if ($categoryId) { + $categoryTable = JTable::getInstance('PhocaDownloadCat', 'Table'); + + if (!$categoryTable->load($categoryId)) { + if ($error = $categoryTable->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + } + } + + //if (empty($categoryId)) { + if (!isset($categoryId)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + + // Check that the user has create permission for the component + $extension = JRequest::getCmd('option'); + $user = JFactory::getUser(); + if (!$user->authorise('core.create', $extension)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE')); + return false; + } + + $i = 0; + + // Parent exists so we let's proceed + while (!empty($pks)) + { + // Pop the first ID off the stack + $pk = array_shift($pks); + + $table->reset(); + + // Check that the row actually exists + if (!$table->load($pk)) { + if ($error = $table->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // Alter the title & alias + $data = $this->generateNewTitle($categoryId, $table->alias, $table->title); + $table->title = $data['0']; + $table->alias = $data['1']; + + // Reset the ID because we are making a copy + $table->id = 0; + + // New category ID + $table->parent_id = $categoryId; + + // Ordering + $table->ordering = $this->increaseOrdering($categoryId); + + $table->hits = 0; + + // Check the row. + if (!$table->check()) { + $this->setError($table->getError()); + return false; + } + + // Store the row. + if (!$table->store()) { + $this->setError($table->getError()); + return false; + } + + // Get the new item ID + $newId = $table->get('id'); + + // Add the new ID to the array + $newIds[$i] = $newId; + $i++; + } + + // Clean the cache + $this->cleanCache(); + + return $newIds; + } + + protected function batchMove($value, $pks, $contexts) + { + $categoryId = (int) $value; + + $table = $this->getTable(); + //$db = $this->getDbo(); + + // Check that the category exists + if ($categoryId) { + $categoryTable = JTable::getInstance('PhocaDownloadCat', 'Table'); + if (!$categoryTable->load($categoryId)) { + if ($error = $categoryTable->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + } + } + + //if (empty($categoryId)) { + if (!isset($categoryId)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + + // Check that user has create and edit permission for the component + $extension = JRequest::getCmd('option'); + $user = JFactory::getUser(); + if (!$user->authorise('core.create', $extension)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE')); + return false; + } + + if (!$user->authorise('core.edit', $extension)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + return false; + } + + // Parent exists so we let's proceed + foreach ($pks as $pk) + { + // Check that the row actually exists + if (!$table->load($pk)) { + if ($error = $table->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // Set the new category ID + $table->parent_id = $categoryId; + + + // Cannot move the node to be a child of itself. + if ((int)$table->id == (int)$categoryId) { + $e = new JException(JText::sprintf('JLIB_DATABASE_ERROR_INVALID_NODE_RECURSION', get_class($pk))); + $this->setError($e); + return false; + } + + // Check the row. + if (!$table->check()) { + $this->setError($table->getError()); + return false; + } + + // Store the row. + if (!$table->store()) { + $this->setError($table->getError()); + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + + public function increaseOrdering($categoryId) { + + $ordering = 1; + $this->_db->setQuery('SELECT MAX(ordering) FROM #__phocadownload_categories WHERE parent_id='.(int)$categoryId); + $max = $this->_db->loadResult(); + $ordering = $max + 1; + return $ordering; + } + + + public function batch($commands, $pks, $contexts) + { + + // Sanitize user ids. + $pks = array_unique($pks); + JArrayHelper::toInteger($pks); + + // Remove any values of zero. + if (array_search(0, $pks, true)) { + unset($pks[array_search(0, $pks, true)]); + } + + if (empty($pks)) { + $this->setError(JText::_('JGLOBAL_NO_ITEM_SELECTED')); + return false; + } + + $done = false; + + if (!empty($commands['assetgroup_id'])) { + if (!$this->batchAccess($commands['assetgroup_id'], $pks)) { + return false; + } + + $done = true; + } + + //PHOCAEDIT - Parent is by Phoca 0 not 1 like by Joomla! + $comCat =false; + if ($commands['category_id'] == '') { + $comCat = false; + } else if ( $commands['category_id'] == '0') { + $comCat = true; + } else if ((int)$commands['category_id'] > 0) { + $comCat = true; + } + + if ($comCat) + //if (isset($commands['category_id'])) + { + $cmd = JArrayHelper::getValue($commands, 'move_copy', 'c'); + + if ($cmd == 'c') + { + $result = $this->batchCopy($commands['category_id'], $pks, $contexts); + if (is_array($result)) + { + $pks = $result; + } + else + { + return false; + } + } + elseif ($cmd == 'm' && !$this->batchMove($commands['category_id'], $pks, $contexts)) + { + return false; + } + $done = true; + } + + if (!empty($commands['language_id'])) + { + if (!$this->batchLanguage($commands['language_id'], $pks, $contexts)) + { + return false; + } + + $done = true; + } + + if (!$done) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_INSUFFICIENT_BATCH_INFORMATION')); + return false; + } + + // Clear the cache + $this->cleanCache(); + + return true; + } + + + protected function generateNewTitle($category_id, $alias, $title) + { + // Alter the title & alias + $table = $this->getTable(); + while ($table->load(array('alias' => $alias, 'parent_id' => $category_id))) + { + $title = JString::increment($title); + $alias = JString::increment($alias, 'dash'); + } + + return array($title, $alias); + } + +} +?> \ No newline at end of file diff --git a/models/phocadownloadcats.php b/models/phocadownloadcats.php new file mode 100644 index 0000000..aee535a --- /dev/null +++ b/models/phocadownloadcats.php @@ -0,0 +1,237 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId); + + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); + + $categoryId = $app->getUserStateFromRequest($this->context.'.filter.parent_id', 'filter_parent_id', null); + $this->setState('filter.parent_id', $categoryId); + + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language); + + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('a.title', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + $id .= ':'.$this->getState('filter.access'); + $id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.category_id'); + $id .= ':'.$this->getState('filter.file_id'); + + return parent::getStoreId($id); + } + + /* + * Because of tree we need to load all the items + * + * We need to load all items because of creating tree + * After creating tree we get info from pagination + * and will set displaying of categories for current pagination + * E.g. pagination is limitstart 5, limit 5 - so only categories from 5 to 10 will be displayed (in Default.php) + */ + + public function getItems() + { + // Get a storage key. + $store = $this->getStoreId(); + + // Try to load the data from internal storage. + if (!empty($this->cache[$store])) { + return $this->cache[$store]; + } + + // Load the list items. + $query = $this->getListQuery(); + //$items = $this->_getList($query, $this->getState('list.start'), $this->getState('list.limit')); + + $items = $this->_getList($query); + + // Check for a database error. + if ($this->_db->getErrorNum()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Add the items to the internal cache. + $this->cache[$store] = $items; + + return $this->cache[$store]; + } + + protected function getListQuery() + { + /* + $query = ' SELECT a.*, cc.title AS parentname, u.name AS editor, v.average AS ratingavg, ua.username AS usercatname, c.countid AS countid, ag.title AS access_level' + . ' FROM #__phocadownload_categories AS a ' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out ' + . ' LEFT JOIN #__viewlevels AS ag ON ag.id = a.access ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = a.parent_id' + . ' LEFT JOIN #__phocadownload_votes_statistics AS v ON v.catid = a.id' + . ' LEFT JOIN #__users AS ua ON ua.id = a.owner_id' + . ' JOIN (SELECT c.parent_id, count(*) AS countid' + . ' FROM #__phocadownload_categories AS c' + .' GROUP BY c.parent_id ) AS c' + .' ON a.parent_id = c.parent_id' + . $where + . $orderby; + */ + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload_categories` AS a'); + + // Join over the language + $query->select('l.title AS language_title'); + $query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + + + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + + // Join over the categories. + $query->select('c.title AS parentcat_title, c.id AS parentcat_id'); + $query->join('LEFT', '#__phocadownload_categories AS c ON c.id = a.parent_id'); + + //$query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + //$query->join('LEFT', '#__users AS ua ON ua.id = a.owner_id'); + + + + $query->select('cc.countid AS countid'); + $query->join('LEFT', '(SELECT cc.parent_id, count(*) AS countid' + . ' FROM #__phocadownload_categories AS cc' + .' GROUP BY cc.parent_id ) AS cc' + .' ON a.parent_id = cc.parent_id'); + + + // Filter by access level. + if ($access = $this->getState('filter.access')) { + $query->where('a.access = '.(int) $access); + } + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by category. + $categoryId = $this->getState('filter.parent_id'); + if (is_numeric($categoryId)) { + $query->where('a.parent_id = ' . (int) $categoryId); + } + + // Filter on the language. + if ($language = $this->getState('filter.language')) { + $query->where('a.language = ' . $db->quote($language)); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( a.title LIKE '.$search.' OR a.alias LIKE '.$search.')'); + } + } + + $query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering', 'title'); + $orderDirn = $this->state->get('list.direction', 'asc'); + /*if ($orderCol == 'a.ordering' || $orderCol == 'parentcat_title') { + $orderCol = 'parentcat_title '.$orderDirn.', a.ordering'; + }*/ + $query->order($db->escape($orderCol.' '.$orderDirn)); + + //echo nl2br(str_replace('#__', 'jos_', $query->__toString())); + + + return $query; + } + +} +?> \ No newline at end of file diff --git a/models/phocadownloaddownloads.php b/models/phocadownloaddownloads.php new file mode 100644 index 0000000..89e6f8f --- /dev/null +++ b/models/phocadownloaddownloads.php @@ -0,0 +1,211 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); +/* + $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId); + + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); +*/ + $id = JRequest::getVar( 'id', '', '', 'int'); + if ((int)$id > 0) { + $this->setState('filter.filestat_id', $id); + } else { + //$fileStatId = $app->getUserStateFromRequest($this->context.'.filter.filestat_id', 'filter_filestat_id', $id); + $this->setState('filter.filestat_id', 0); + } +/* + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language);*/ + + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('uc.name', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + /*$id .= ':'.$this->getState('filter.access'); + $id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.category_id');*/ + $id .= ':'.$this->getState('filter.filestat_id'); + + return parent::getStoreId($id); + } + + + protected function getListQuery() + { + /*$query = ' SELECT a.id, a.userid, a.fileid, d.filename AS filename, d.title AS filetitle, a.count, a.date, u.name AS uname, u.username AS username, 0 AS checked_out' + . ' FROM #__phocadownload_user_stat AS a ' + . ' LEFT JOIN #__phocadownload AS d ON d.id = a.fileid ' + . ' LEFT JOIN #__users AS u ON u.id = a.userid ' + . $where + . ' GROUP by a.id' + . $orderby; + */ + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload_user_stat` AS a'); + + // Join over the language + //$query->select('l.title AS language_title'); + //$query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + + + //$query->select('uc.name AS editor'); + //$query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + + + // Join over the asset groups. + //$query->select('ag.title AS access_level'); + //$query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + + // Join over the categories. + $query->select('d.filename AS filename, d.title AS filetitle'); + $query->join('LEFT', '#__phocadownload AS d ON d.id = a.fileid'); + + $query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + $query->join('LEFT', '#__users AS ua ON ua.id = a.userid'); + + //$query->select('v.average AS ratingavg'); + //$query->join('LEFT', '#__phocadownload_img_votes_statistics AS v ON v.imgid = a.id'); + + // Filter by access level. + //if ($access = $this->getState('filter.access')) { + // $query->where('a.access = '.(int) $access); + //} + + // Filter by published state. + /*$published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by category.*/ + /*$fileStatId = $this->getState('filter.filestat_id'); + + if (is_numeric($fileStatId)) { + $query->where('a.fileid = ' . (int) $fileStatId); + }*/ + + // Filter by search in title + $search = $this->getState('filter.search'); + + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( ua.username LIKE '.$search.' OR ua.name LIKE '.$search.' OR d.filename LIKE '.$search.' OR d.title LIKE '.$search.')'); + } + } + + $query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + + if ($orderCol == 'uc.name' ) { + $orderCol = 'a.ordering'; + } + + $query->order($db->escape($orderCol.' '.$orderDirn)); + + return $query; + } + + + function reset($cid = array()) { + if (count( $cid )) { + JArrayHelper::toInteger($cid); + $cids = implode( ',', $cid ); + $date = gmdate('Y-m-d H:i:s'); + //Delete it from DB + $query = 'UPDATE #__phocadownload_user_stat' + .' SET count = 0,' + .' date = '.$this->_db->Quote($date) + .' WHERE id IN ( '.$cids.' )'; + + $this->_db->setQuery( $query ); + if(!$this->_db->query()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + } + return true; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadfile.php b/models/phocadownloadfile.php new file mode 100644 index 0000000..7a7bb43 --- /dev/null +++ b/models/phocadownloadfile.php @@ -0,0 +1,662 @@ +catid)) { + return $user->authorise('core.delete', 'com_phocadownload.phocadownloadfile.'.(int) $record->catid); + } else { + return parent::canDelete($record); + } + } + + protected function canEditState($record) + { + $user = JFactory::getUser(); + + if (!empty($record->catid)) { + return $user->authorise('core.edit.state', 'com_phocadownload.phocadownloadfile.'.(int) $record->catid); + } else { + return parent::canEditState($record); + } + } + + public function getTable($type = 'PhocaDownload', $prefix = 'Table', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + public function getForm($data = array(), $loadData = true) { + + $app = JFactory::getApplication(); + $form = $this->loadForm('com_phocadownload.phocadownloadfile', 'phocadownloadfile', array('control' => 'jform', 'load_data' => $loadData)); + + if (empty($form)) { + return false; + } + return $form; + } + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownload.edit.phocadownload.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + + public function getItem($pk = null) + { + if ($item = parent::getItem($pk)) { + // Convert the params field to an array. + $registry = new JRegistry; + $registry->loadString($item->metadata); + $item->metadata = $registry->toArray(); + } + + return $item; + } + + protected function prepareTable($table) + { + jimport('joomla.filter.output'); + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + $table->title = htmlspecialchars_decode($table->title, ENT_QUOTES); + $table->alias = JApplication::stringURLSafe($table->alias); + + if (empty($table->alias)) { + $table->alias = JApplication::stringURLSafe($table->title); + } + + if (empty($table->id)) { + // Set the values + //$table->created = $date->toSql(); + + // Set ordering to the last item if not set + if (empty($table->ordering)) { + $db = JFactory::getDbo(); + //$db->setQuery('SELECT MAX(ordering) FROM #__phocadownload'); + $db->setQuery('SELECT MAX(ordering) FROM #__phocadownload WHERE catid = '.(int)$table->catid); + $max = $db->loadResult(); + + $table->ordering = $max+1; + } + } + else { + // Set the values + //$table->modified = $date->toSql(); + //$table->modified_by = $user->get('id'); + } + } + + + + protected function getReorderConditions($table = null) + { + $condition = array(); + $condition[] = 'catid = '. (int) $table->catid; + //$condition[] = 'state >= 0'; + return $condition; + } + + function approve(&$pks, $value = 1) + { + // Initialise variables. + $dispatcher = JDispatcher::getInstance(); + $user = JFactory::getUser(); + $table = $this->getTable('phocadownload'); + $pks = (array) $pks; + + // Include the content plugins for the change of state event. + JPluginHelper::importPlugin('content'); + + // Access checks. + foreach ($pks as $i => $pk) { + if ($table->load($pk)) { + if (!$this->canEditState($table)) { + // Prune items that you can't change. + unset($pks[$i]); + JError::raiseWarning(403, JText::_('JLIB_APPLICATION_ERROR_EDIT_STATE_NOT_PERMITTED')); + } + } + } + + // Attempt to change the state of the records. + if (!$table->approve($pks, $value, $user->get('id'))) { + $this->setError($table->getError()); + return false; + } + + $context = $this->option.'.'.$this->name; + + // Trigger the onContentChangeState event. + /* $result = $dispatcher->trigger($this->event_change_state, array($context, $pks, $value)); + if (in_array(false, $result, true)) { + $this->setError($table->getError()); + return false; + } */ + + return true; + } + + function save($data) { + + //$data['filesize'] = PhocaDownloadUtils::getFileSize($data['filename'], 0); + + if ($data['alias'] == '') { + $data['alias'] = $data['title']; + } + + //$data['alias'] = PhocaDownloadText::get AliasName($data['alias']); + + + // Initialise variables; + $dispatcher = JDispatcher::getInstance(); + $table = $this->getTable(); + $pk = (!empty($data['id'])) ? $data['id'] : (int)$this->getState($this->getName().'.id'); + $isNew = true; + + // Include the content plugins for the on save events. + JPluginHelper::importPlugin('content'); + + // Load the row if saving an existing record. + if ($pk > 0) { + $table->load($pk); + $isNew = false; + } + + // ================================================= + // Make a copy for play and preview + $paramsC = JComponentHelper::getParams('com_phocadownload') ; + $papCopy = $paramsC->get( 'pap_copy', 0 ); + $overwriteExistingFiles = $paramsC->get( 'overwrite_existing_files', 0 ); + $path = PhocaDownloadPath::getPathSet(); + + if ($papCopy == 2 || $papCopy == 3) { + $canPlay = PhocaDownloadFile::canPlay($data['filename']); + $canPreview = PhocaDownloadFile::canPreview($data['filename']); + $filepath = JPath::clean($path['orig_abs_ds'] . DS.$data['filename']); + $filepathPAP = JPath::clean($path['orig_abs_pap_ds'] . DS.$data['filename']); + $filepathPAPFolder = JPath::clean($path['orig_abs_pap_ds'] . DS. PhocaDownloadFile::getFolderFromTheFile($data['filename'])); + + if ($canPlay || $canPreview) { + + $uploadPAP = 1;// upload file for preview and play + if (JFile::exists($filepathPAP) && $overwriteExistingFiles == 0) { + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS"); + //return false; + $uploadPAP = 0; // don't upload if it exists, it is not main file, don't do false and exit + + if ($canPlay == 1) { + $data['filename_play'] = $data['filename']; + } else if ($canPreview == 1) { + $data['filename_preview'] = $data['filename']; + } + } + + // Overwrite file and add no new item to database + $fileExistsPAP = 0; + if (JFile::exists($filepathPAP) && $overwriteExistingFiles == 1) { + $fileExistsPAP = 1; + + if ($canPlay == 1) { + $data['filename_play'] = $data['filename']; + } else if ($canPreview == 1) { + $data['filename_preview'] = $data['filename']; + } + } + + if ($uploadPAP == 0) { + + } else { + if (!JFolder::exists($filepathPAPFolder)) { + if (JFolder::create($filepathPAPFolder)) { + $dataFile = "\n\n\n"; + JFile::write($filepathPAPFolder . DS ."index.html", $dataFile); + } + // else { + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_UNABLE_TO_CREATE_FOLDER"); + //return false; + //} + } + + if (!JFile::copy($filepath, $filepathPAP)) { + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_UNABLE_TO_UPLOAD_FILE"); + //return false; + } else { + + + if ($canPlay == 1) { + $data['filename_play'] = $data['filename']; + } else if ($canPreview == 1) { + $data['filename_preview'] = $data['filename']; + } + } + } + } + } + // ============================================== + + + // Bind the data. + if (!$table->bind($data)) { + $this->setError($table->getError()); + return false; + } + + // Date - - - - - + $nullDate = $this->_db->getNullDate(); + $config = JFactory::getConfig(); + $tzoffset = $config->get('offset'); + //$date = JFactory::getDate($table->date, $tzoffset); + //$table->date = $date->toSql(); + + // Append time if not added to publish date + //if (strlen(trim($table->publish_up)) <= 10) { + // $table->publish_up .= ' 00:00:00'; + //} + //$date = JFactory::getDate($table->publish_up, $tzoffset); + //$table->publish_up = $date->toSql(); + + if ($table->id) { + + } else { + if (!intval($table->date)) { + $date = JFactory::getDate(); + $table->date = $date->toSql(); + } + } + + if(intval($table->publish_up) == 0) { + $table->publish_up = JFactory::getDate()->toSql(); + } + + // Handle never unpublish date + if (trim($table->publish_down) == JText::_('Never') || trim( $table->publish_down ) == '') { + $table->publish_down = $nullDate; + } else { + if (strlen(trim( $table->publish_down )) <= 10) { + $table->publish_down .= ' 00:00:00'; + } + //$date = JFactory::getDate($table->publish_down, $tzoffset); + $date = JFactory::getDate($table->publish_down); + $table->publish_down = $date->toSql(); + } + // - - - - - - + + + // if new item, order last in appropriate group + if (!$table->id) { + $where = 'catid = ' . (int) $table->catid ; + $table->ordering = $table->getNextOrder( $where ); + } + + + + + + + + // Prepare the row for saving + $this->prepareTable($table); + + // Check the data. + if (!$table->check()) { + $this->setError($table->getError()); + return false; + } + + // Trigger the onContentBeforeSave event. + /* $result = $dispatcher->trigger($this->event_before_save, array($this->option.'.'.$this->name, $table, $isNew)); + if (in_array(false, $result, true)) { + $this->setError($table->getError()); + return false; + } */ + + // Store the data. + if (!$table->store()) { + $this->setError($table->getError()); + return false; + } + + // Store to ref table + if (!isset($data['tags'])) { + $data['tags'] = array(); + } + if ((int)$table->id > 0) { + PhocaDownloadTag::storeTags($data['tags'], (int)$table->id); + } + + // Clean the cache. + $cache = JFactory::getCache($this->option); + $cache->clean(); + + // Trigger the onContentAfterSave event. + //$dispatcher->trigger($this->event_after_save, array($this->option.'.'.$this->name, $table, $isNew)); + + $pkName = $table->getKeyName(); + if (isset($table->$pkName)) { + $this->setState($this->getName().'.id', $table->$pkName); + } + $this->setState($this->getName().'.new', $isNew); + + + + + + return true; + } + + + + function delete(&$cid = array()) { + + $result = false; + + $paramsC = JComponentHelper::getParams('com_phocadownload'); + $deleteExistingFiles = $paramsC->get( 'delete_existing_files', 0 ); + + if (count( $cid )) { + JArrayHelper::toInteger($cid); + $cids = implode( ',', $cid ); + + // - - - - - - - - - - - - - + // Get all filenames we want to delete from database, we delete all thumbnails from server of this file + $queryd = 'SELECT filename as filename FROM #__phocadownload WHERE id IN ( '.$cids.' )'; + $this->_db->setQuery($queryd); + $fileObject = $this->_db->loadObjectList(); + // - - - - - - - - - - - - - + + + //Delete it from DB + $query = 'DELETE FROM #__phocadownload' + . ' WHERE id IN ( '.$cids.' )'; + $this->_db->setQuery( $query ); + if(!$this->_db->query()) { + $this->setError($this->_db->getErrorMsg); + return false; + } + + //Delete tags from DB + $query = 'DELETE FROM #__phocadownload_tags_ref' + . ' WHERE fileid IN ( '.$cids.' )'; + $this->_db->setQuery( $query ); + if(!$this->_db->query()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // - - - - - - - - - - - - - - + // DELETE FILES ON SERVER + if ($deleteExistingFiles == 1) { + $path = PhocaDownloadPath::getPathSet(); + foreach ($fileObject as $key => $value) { + //The file can be stored in other category - don't delete it from server because other category use it + $querys = "SELECT id as id FROM #__phocadownload WHERE filename='".$value->filename."' "; + $this->_db->setQuery($querys); + $sameFileObject = $this->_db->loadObject(); + // same file in other category doesn't exist - we can delete it + if (!$sameFileObject) { + JFile::delete(JPath::clean($path['orig_abs_ds'].$value->filename)); + } + } + } + + } + return true; + } + + protected function batchCopy($value, $pks, $contexts) + { + $categoryId = (int) $value; + + $table = $this->getTable(); + $db = $this->getDbo(); + + // Check that the category exists + if ($categoryId) { + $categoryTable = JTable::getInstance('PhocaDownloadCat', 'Table'); + if (!$categoryTable->load($categoryId)) { + if ($error = $categoryTable->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + } + } + + if (empty($categoryId)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + + // Check that the user has create permission for the component + $extension = JRequest::getCmd('option'); + $user = JFactory::getUser(); + if (!$user->authorise('core.create', $extension)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE')); + return false; + } + + $i = 0; + + // Parent exists so we let's proceed + while (!empty($pks)) + { + // Pop the first ID off the stack + $pk = array_shift($pks); + + $table->reset(); + + // Check that the row actually exists + if (!$table->load($pk)) { + if ($error = $table->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // Alter the title & alias + $data = $this->generateNewTitle($categoryId, $table->alias, $table->title); + $table->title = $data['0']; + $table->alias = $data['1']; + + // Reset the ID because we are making a copy + $table->id = 0; + + // New category ID + $table->catid = $categoryId; + + // Ordering + $table->ordering = $this->increaseOrdering($categoryId); + + $table->hits = 0; + + // Check the row. + if (!$table->check()) { + $this->setError($table->getError()); + return false; + } + + // Store the row. + if (!$table->store()) { + $this->setError($table->getError()); + return false; + } + + $newId = $table->get('id'); + + // Add the new ID to the array + $newIds[$i] = $newId; + $i++; + } + + // Clean the cache + $this->cleanCache(); + + return $newIds; + } + + /** + * Batch move articles to a new category + * + * @param integer $value The new category ID. + * @param array $pks An array of row IDs. + * + * @return booelan True if successful, false otherwise and internal error is set. + * + * @since 11.1 + */ + protected function batchMove($value, $pks, $contexts) + { + $categoryId = (int) $value; + + $table = $this->getTable(); + //$db = $this->getDbo(); + + // Check that the category exists + if ($categoryId) { + $categoryTable = JTable::getInstance('PhocaDownloadCat', 'Table'); + if (!$categoryTable->load($categoryId)) { + if ($error = $categoryTable->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + } + } + + if (empty($categoryId)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_MOVE_CATEGORY_NOT_FOUND')); + return false; + } + + // Check that user has create and edit permission for the component + $extension = JRequest::getCmd('option'); + $user = JFactory::getUser(); + if (!$user->authorise('core.create', $extension)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_CREATE')); + return false; + } + + if (!$user->authorise('core.edit', $extension)) { + $this->setError(JText::_('JLIB_APPLICATION_ERROR_BATCH_CANNOT_EDIT')); + return false; + } + + // Parent exists so we let's proceed + foreach ($pks as $pk) + { + // Check that the row actually exists + if (!$table->load($pk)) { + if ($error = $table->getError()) { + // Fatal error + $this->setError($error); + return false; + } + else { + // Not fatal error + $this->setError(JText::sprintf('JLIB_APPLICATION_ERROR_BATCH_MOVE_ROW_NOT_FOUND', $pk)); + continue; + } + } + + // Set the new category ID + $table->catid = $categoryId; + + // Check the row. + if (!$table->check()) { + $this->setError($table->getError()); + return false; + } + + // Store the row. + if (!$table->store()) { + $this->setError($table->getError()); + return false; + } + } + + // Clean the cache + $this->cleanCache(); + + return true; + } + + + public function increaseOrdering($categoryId) { + + $ordering = 1; + $this->_db->setQuery('SELECT MAX(ordering) FROM #__phocadownload WHERE catid='.(int)$categoryId); + $max = $this->_db->loadResult(); + $ordering = $max + 1; + return $ordering; + } + /* + function copyQuick($cid) { + $table = $this->getTable(); + + + foreach ($cid as $id) { + $table->load($id); + + // Find last ordering + $this->_db->setQuery('SELECT MAX(ordering) FROM #__phocadownload WHERE catid='.(int)$table->catid); + $max = $this->_db->loadResult(); + $table->ordering = $max+1; + // End Ordering + $table->id = null; + $table->hits = 0; + + if ( !$table->check() ) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + if ( !$table->store() ) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + } + return true; + }*/ + +} +?> \ No newline at end of file diff --git a/models/phocadownloadfiles.php b/models/phocadownloadfiles.php new file mode 100644 index 0000000..df5608e --- /dev/null +++ b/models/phocadownloadfiles.php @@ -0,0 +1,201 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId); + + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); + + $categoryId = $app->getUserStateFromRequest($this->context.'.filter.category_id', 'filter_category_id', null); + $this->setState('filter.category_id', $categoryId); + + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language); + + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('a.title', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + $id .= ':'.$this->getState('filter.access'); + $id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.category_id'); + $id .= ':'.$this->getState('filter.image_id'); + + return parent::getStoreId($id); + } + + + protected function getListQuery() + { + /* + SELECT a.*, cc.title AS categorytitle, s.title AS sectiontitle, u.name AS editor, g.name AS groupname, us.id AS ownerid, us.username AS ownername ' + . ' FROM #__phocadownload AS a ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = a.catid' + . ' LEFT JOIN #__phocadownload_sections AS s ON s.id = a.sectionid' + . ' LEFT JOIN #__groups AS g ON g.id = a.access' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out' + . ' LEFT JOIN #__users AS us ON us.id = a.owner_id' + */ + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload` AS a'); + + // Join over the language + $query->select('l.title AS language_title'); + $query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + + + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + $query->select('uua.id AS uploaduserid, uua.username AS uploadusername, uua.name AS uploadname'); + $query->join('LEFT', '#__users AS uua ON uua.id=a.userid'); + + // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + + // Join over the categories. + $query->select('c.title AS category_title, c.id AS category_id'); + $query->join('LEFT', '#__phocadownload_categories AS c ON c.id = a.catid'); + + $query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + $query->join('LEFT', '#__users AS ua ON ua.id = a.owner_id'); + + //$query->select('v.average AS ratingavg'); + //$query->join('LEFT', '#__phocadownload_img_votes_statistics AS v ON v.imgid = a.id'); + + // Filter by access level. + if ($access = $this->getState('filter.access')) { + $query->where('a.access = '.(int) $access); + } + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by category. + $categoryId = $this->getState('filter.category_id'); + if (is_numeric($categoryId)) { + $query->where('a.catid = ' . (int) $categoryId); + } + + // Filter on the language. + if ($language = $this->getState('filter.language')) { + $query->where('a.language = ' . $db->quote($language)); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( a.title LIKE '.$search.' OR a.filename LIKE '.$search.')'); + } + } + + $query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { + $orderCol = 'category_title '.$orderDirn.', a.ordering'; + } + $query->order($db->escape($orderCol.' '.$orderDirn)); + + + return $query; + } + + public function getNotApprovedFile() { + + $query = 'SELECT COUNT(a.id) AS count' + .' FROM #__phocadownload AS a' + .' WHERE approved = 0'; + $this->_db->setQuery($query, 0, 1); + $countNotApproved = $this->_db->loadObject(); + return $countNotApproved; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadlayout.php b/models/phocadownloadlayout.php new file mode 100644 index 0000000..0e9cc27 --- /dev/null +++ b/models/phocadownloadlayout.php @@ -0,0 +1,50 @@ +loadForm('com_phocadownload.phocadownloadlayout', 'phocadownloadlayout', array('control' => 'jform', 'load_data' => $loadData)); + if (empty($form)) { + return false; + } + return $form; + } + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownload.edit.phocadownloadlayout.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + +} +?> \ No newline at end of file diff --git a/models/phocadownloadlic.php b/models/phocadownloadlic.php new file mode 100644 index 0000000..a46429a --- /dev/null +++ b/models/phocadownloadlic.php @@ -0,0 +1,93 @@ +loadForm('com_phocadownload.phocadownloadlic', 'phocadownloadlic', array('control' => 'jform', 'load_data' => $loadData)); + if (empty($form)) { + return false; + } + return $form; + } + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownload.edit.phocadownloadlic.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + + protected function prepareTable($table) + { + jimport('joomla.filter.output'); + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + $table->title = htmlspecialchars_decode($table->title, ENT_QUOTES); + $table->alias = JApplication::stringURLSafe($table->alias); + + if (empty($table->alias)) { + $table->alias = JApplication::stringURLSafe($table->title); + } + + if (empty($table->id)) { + // Set the values + //$table->created = $date->toSql(); + + // Set ordering to the last item if not set + if (empty($table->ordering)) { + $db = JFactory::getDbo(); + $db->setQuery('SELECT MAX(ordering) FROM #__phocadownload_licenses'); + $max = $db->loadResult(); + + $table->ordering = $max+1; + } + } + else { + // Set the values + //$table->modified = $date->toSql(); + //$table->modified_by = $user->get('id'); + } + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadlics.php b/models/phocadownloadlics.php new file mode 100644 index 0000000..8b52013 --- /dev/null +++ b/models/phocadownloadlics.php @@ -0,0 +1,152 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + +/* $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId);*/ + + + + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); + + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language); + + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('a.title', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + //$id .= ':'.$this->getState('filter.access'); + $id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.lic_id'); + + + return parent::getStoreId($id); + } + + protected function getListQuery() + { + /* + $query = ' SELECT a.*, u.name AS editor ' + . ' FROM #__phocadownload_licenses AS a ' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out ' + */ + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload_licenses` AS a'); + + // Join over the language + $query->select('l.title AS language_title'); + $query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + + // Filter by access level. +/* if ($access = $this->getState('filter.access')) { + $query->where('a.access = '.(int) $access); + }*/ + + + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( a.title LIKE '.$search.' OR a.alias LIKE '.$search.')'); + } + } + + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + $query->order($db->escape($orderCol.' '.$orderDirn)); + + //echo nl2br(str_replace('#__', 'jos_', $query->__toString())); + return $query; + + } + + +} +?> \ No newline at end of file diff --git a/models/phocadownloadlinkcat.php b/models/phocadownloadlinkcat.php new file mode 100644 index 0000000..0a659fb --- /dev/null +++ b/models/phocadownloadlinkcat.php @@ -0,0 +1,81 @@ +_loadDataSec()) { + + } else { + $this->_initDataSec(); + } + return $this->_data_sec; + }*/ + + function &getDataCat($sectionList) { + if ($this->_loadDataCat($sectionList)) { + + } else { + $this->_initDataCat(); + } + return $this->_data_cat; + } + /* + function _loadDataSec() { + if (empty($this->_data_sec)) { + $query = 'SELECT s.id, s.title' + . ' FROM #__phocadownload_sections AS s' + . ' WHERE s.published = 1' + . ' ORDER BY s.ordering'; + $this->_db->setQuery($query); + $this->_data_sec = $this->_db->loadObjectList(); + return (boolean) $this->_data_sec; + } + return true; + }*/ + /* + function _loadDataCat($sectionList) { + if (empty($this->_data_cat)) { + $query = 'SELECT c.id, c.title, c.section' + .' FROM #__phocadownload_categories AS c' + .' WHERE c.section IN ( \''.$sectionList.'\' )' + .' AND c.published = 1' + .' ORDER BY c.ordering'; + $this->_db->setQuery($query); + $this->_data_cat = $this->_db->loadObjectList(); + return (boolean) $this->_data_cat; + } + return true; + }*/ + /* + function _initDataSec() { + if (empty($this->_data_sec)) { + return (boolean) array(); + } + return true; + }*/ + function _initDataCat() { + if (empty($this->_data_cat)) { + return (boolean) array(); + } + return true; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadlinkfile.php b/models/phocadownloadlinkfile.php new file mode 100644 index 0000000..e8f8048 --- /dev/null +++ b/models/phocadownloadlinkfile.php @@ -0,0 +1,123 @@ +getUserStateFromRequest( $this->_context.'.list.limit', 'limit', $app->getCfg('list_limit'), 'int' ); + $limitstart = $app->getUserStateFromRequest( $this->_context.'.limitstart', 'limitstart', 0, 'int' ); + // In case limit has been changed, adjust limitstart accordingly + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + function getData() { + if (empty($this->_data)) { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + return $this->_data; + } + + function getTotal() { + if (empty($this->_total)) { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + return $this->_total; + } + + function getPagination() { + if (empty($this->_pagination)) { + jimport('joomla.html.pagination'); + $this->_pagination = new JPagination( $this->getTotal(), $this->getState('limitstart'), $this->getState('limit') ); + } + return $this->_pagination; + } + + function _buildQuery() { + $where = $this->_buildContentWhere(); + $orderby = $this->_buildContentOrderBy(); + + $query = ' SELECT a.*, cc.title AS categorytitle, ag.title AS access_level ' + . ' FROM #__phocadownload AS a ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = a.catid ' + //. ' LEFT JOIN #__phocadownload_sections AS s ON s.id = a.sectionid ' + . ' LEFT JOIN #__viewlevels AS ag ON ag.id = a.access ' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out ' + . $where + . $orderby + ; + + return $query; + } + + function _buildContentOrderBy() { + $app = JFactory::getApplication(); + $filter_order = $app->getUserStateFromRequest( $this->_context.'.filter_order', 'filter_order', 'a.ordering','cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context.'.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + + if ($filter_order == 'a.ordering'){ + $orderby = ' ORDER BY categorytitle, a.ordering '.$filter_order_Dir; + } else { + $orderby = ' ORDER BY '.$filter_order.' '.$filter_order_Dir.', categorytitle, a.ordering '; + } + return $orderby; + } + + function _buildContentWhere() { + $app = JFactory::getApplication(); + $filter_state = $app->getUserStateFromRequest( $this->_context.'.filter_state', 'filter_state', '', 'word' ); + $filter_catid = $app->getUserStateFromRequest( $this->_context.'.catid','catid',0, 'int' ); + //$filter_sectionid = $app->getUserStateFromRequest( $this->_context.'.filter_sectionid', 'filter_sectionid', 0, 'int' ); + $filter_order = $app->getUserStateFromRequest( $this->_context.'.filter_order', 'filter_order', 'a.ordering', 'cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context.'.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + $search = $app->getUserStateFromRequest( $this->_context.'.search','search','','string' ); + $search = JString::strtolower( $search ); + + $where = array(); + + if ($filter_catid > 0) { + $where[] = 'a.catid = '.(int) $filter_catid; + } + if ($search) { + $where[] = 'LOWER(a.title) LIKE '.$this->_db->Quote('%'.$search.'%'); + } + if ( $filter_state ) { + if ( $filter_state == 'P' ) { + $where[] = 'a.published = 1'; + } else if ($filter_state == 'U' ) { + $where[] = 'a.published = 0'; + } + } + + + $where[] = 'a.published = 1'; + $where[] = 'a.approved = 1'; + $where[] = 'a.textonly <> 1'; + + $where = ( count( $where ) ? ' WHERE '. implode( ' AND ', $where ) : '' ); + return $where; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadlog.php b/models/phocadownloadlog.php new file mode 100644 index 0000000..4b90887 --- /dev/null +++ b/models/phocadownloadlog.php @@ -0,0 +1,28 @@ +_db->setQuery( $query ); + if (!$this->_db->query()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + return true; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadlogs.php b/models/phocadownloadlogs.php new file mode 100644 index 0000000..d0789fc --- /dev/null +++ b/models/phocadownloadlogs.php @@ -0,0 +1,192 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); +/* + $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId); +*/ + //$state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + // $this->setState('filter.state', $state); +/* + $categoryId = $app->getUserStateFromRequest($this->context.'.filter.category_id', 'filter_category_id', null); + $this->setState('filter.category_id', $categoryId); + + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language); +*/ + + $type = $app->getUserStateFromRequest($this->context.'.filter.type', 'filter_type', '', 'string'); + $this->setState('filter.type', $type); + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('f.title', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + $id .= ':'.$this->getState('filter.type'); + //$id .= ':'.$this->getState('filter.access'); + //$id .= ':'.$this->getState('filter.state'); + + return parent::getStoreId($id); + } + + protected function getListQuery() + { + + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('#__phocadownload_logging AS a'); + + // Join over the language + //$query->select('l.title AS language_title'); + //$query->join('LEFT', '#__languages AS l ON l.lang_code = a.language'); + + + $query->select('f.id as file_id, f.title as file_title, f.filename as filename'); + $query->join('LEFT', '#__phocadownload AS f ON f.id = a.fileid'); + + $query->select('cc.id as category_id'); + $query->join('LEFT', '#__phocadownload_categories AS cc ON cc.id = f.catid'); + + // Join over the users for the checked out user. + //$query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + //$query->join('LEFT', '#__users AS ua ON ua.id=a.userid'); + + $query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + $query->join('LEFT', '#__users AS ua ON ua.id = a.userid'); + + //$query->select('uc.name AS editor'); + //$query->join('LEFT', '#__users AS uc ON uc.id=f.checked_out'); + + + + + +/* // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); +*/ + + // Filter by access level. + /* if ($access = $this->getState('filter.access')) { + $query->where('a.access = '.(int) $access); + }*/ + + // Filter by published state. + /*$published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + }*/ + + + // Filter by published type. + $type = $this->getState('filter.type'); + + if (is_numeric($type)) { + $query->where('a.type = '.(int) $type); + + } + else if ($type === '') { + $query->where('(a.type IN (1, 2))'); + + } + + + // Filter by category. + /*$categoryId = $this->getState('filter.category_id'); + if (is_numeric($categoryId)) { + $query->where('a.catid = ' . (int) $categoryId); + }*/ + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( ua.username LIKE '.$search.' OR ua.name LIKE '.$search.' OR f.title LIKE '.$search.' OR f.filename LIKE '.$search.' or a.ip LIKE '.$search.')'); + } + } + + //$query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + if ($orderCol == 'a.id' || $orderCol == 'username') { + $orderCol = 'username '.$orderDirn.', a.id'; + } + $query->order($db->escape($orderCol.' '.$orderDirn)); + + //echo nl2br(str_replace('#__', 'jos_', $query->__toString())); + return $query; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadm.php b/models/phocadownloadm.php new file mode 100644 index 0000000..5235139 --- /dev/null +++ b/models/phocadownloadm.php @@ -0,0 +1,513 @@ +fileCount = 0; + $this->categoryCount = 0; + parent::__construct(); + } + + function setFileCount($count) { + $this->fileCount = $this->fileCount + $count; + } + + function setCategoryCount($count) { + $this->categoryCount = $this->categoryCount + $count; + } + + function save($data) { + + $app = JFactory::getApplication(); + + $post = JRequest::get('post'); + $data = JRequest::getVar('jform', array(0), 'post', 'array'); + + // ================================================= + // Make a copy for play and preview + $paramsC = JComponentHelper::getParams('com_phocadownload') ; + $papCopy = $paramsC->get( 'pap_copy', 0 ); + $data['pap_copy_m'] = 0; + if ($papCopy == 2 || $papCopy == 3) { + $data['pap_copy_m'] = 1; + } + // ================================================= + + + if(isset($post['foldercid'])) { + $data['foldercid'] = $post['foldercid']; + } + if(isset($post['cid'])) { + $data['cid'] = $post['cid']; + } + + if (isset($data['catid']) && (int)$data['catid'] > 0) { + $data['catid'] = (int)$data['catid']; + } else { + $data['catid'] = 0; + } + + //Get folder variables from Helper + $path = PhocaDownloadPath::getPathSet(); + $origPath = $path['orig_abs_ds']; + $origPathServer = str_replace(DS, '/', JPath::clean($path['orig_abs_ds'])); + + + + // Cache all existing categories + $query = 'SELECT id, title, parent_id' + . ' FROM #__phocadownload_categories' ; + $this->_db->setQuery( $query ); + $existingCategories = $this->_db->loadObjectList() ; + + // Cache all existing files + $query = 'SELECT catid, filename' + . ' FROM #__phocadownload'; + $this->_db->setQuery( $query ); + $existingFiles = $this->_db->loadObjectList() ; + + $result = new StdClass(); + $result->category_count = 0; + $result->image_count = 0; + + + + // Category will be saved - Files will be saved in recursive function + if (isset($data['foldercid'])) { + foreach ($data['foldercid'] as $foldername) { + if (strlen($foldername) > 0) { + $fullPath = $path['orig_abs_ds'].$foldername; + + $result = $this->_createCategoriesRecursive( $origPathServer, $fullPath, $existingCategories, $existingFiles, $data['catid'], $data ); + } + } + } + + // Only Files will be saved + + if (isset($data['cid'])) { + + // Make a copy for play and preview (1) -------- + if (isset($data['pap_copy_m']) && $data['pap_copy_m'] == 1) { + //$paramsC = JComponentHelper::getParams('com_phocadownload') ; + $overwriteExistingFiles = $paramsC->get( 'overwrite_existing_files', 0 ); + } + // ------------------------------------------------ + + foreach ($data['cid'] as $filename) { + if ($filename) { + //$ext = strtolower(JFile::getExt($filename)); + $row = $this->getTable('phocadownload'); + + $datam = array(); + $datam['published'] = $data['published']; + $datam['catid'] = $data['catid']; + $datam['approved'] = $data['approved']; + $datam['language'] = $data['language']; + $datam['filename'] = $filename; + + + if ($data['title'] != '') { + $datam['title'] = $data['title']; + } else { + $datam['title'] = PhocaDownloadFile::getTitleFromFilenameWithoutExt($filename); + } + + if ($data['alias'] != '') { + $datam['alias'] = $data['alias']; + } else { + $datam['alias'] = $data['alias']; // PhocaDownloadFile::getAliasName($datam['title']); + } + $datam['token'] = PhocaDownloadUtils::getToken($datam['title'].$datam['filename']); + // Make a copy for play and preview (2) + if (isset($data['pap_copy_m']) && $data['pap_copy_m'] == 1) { + $filenameExt = PhocaDownloadFile::getTitleFromFilenameWithExt($filename); + $storedfilename = $filename; + $storedfoldername = str_replace($filenameExt, '', $storedfilename); + $o = $this->_copyPreviewAndPlay($filenameExt, $storedfilename, $storedfoldername, $path, $overwriteExistingFiles); + $datam['filename_play'] = $o['filename_play']; + $datam['filename_preview'] = $o['filename_preview']; + } + + // Save + // Bind the form fields to the Phoca download table + if (!$row->bind($datam)) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Create the timestamp for the date + $row->date = gmdate('Y-m-d H:i:s'); + + // if new item, order last in appropriate group + + if (!$row->id) { + $where = 'catid = ' . (int) $row->catid ; + $row->ordering = $row->getNextOrder( $where ); + } + + + // Make sure the Phoca download table is valid + if (!$row->check()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Store the Phoca download table to the database + if (!$row->store()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + $result->image_count++; + + } + } + $this->setfileCount($result->image_count); + + } + + $msg = $this->categoryCount. ' ' .JText::_('COM_PHOCADOWNLOAD_CATEGORIES_ADDED') .', '.$this->fileCount. ' ' . JText::_('COM_PHOCADOWNLOAD_FILES_ADDED'); + $app->enqueueMessage($msg); + $app->redirect(JRoute::_('index.php?option=com_phocadownload&view=phocadownloadfiles', false)); + + return true; + + } + + protected function _createCategoriesRecursive(&$origPathServer, $path, &$existingCategories, &$existingFiles, $parentId = 0, $data = array() ) { + + $totalresult = new StdClass(); + $totalresult->files_count = 0 ; + $totalresult->category_count = 0 ; + + $categoryName = basename($path); + $id = $this->_getCategoryId( $existingCategories, $categoryName, $parentId ) ; + $category = null; + + // Full path: eg. "/home/www/joomla/files/categ/subcat/" + $fullPath = str_replace(DS, '/', JPath::clean(DS . $path)); + // Relative path eg "categ/subcat" + $relativePath = str_replace($origPathServer, '', $fullPath); + + // Category doesn't exist + if ( $id == -1 ) { + $row =& $this->getTable('phocadownloadcat'); + + $row->published = $data['published']; + // $row->approved = $data['approved']; + $row->language = $data['language']; + $row->parent_id = $parentId; + $row->title = $categoryName; + + // Create the timestamp for the date + $row->date = gmdate('Y-m-d H:i:s'); + // $row->alias = $row->title; //PhocaDownloadFile::getAliasName($categoryName); + //$row->userfolder = ltrim(str_replace(DS, '/', JPath::clean($relativePath )), '/'); + $row->ordering = $row->getNextOrder( "parent_id = " . $this->_db->Quote($row->parent_id) ); + + if (!$row->check()) { + JError::raiseError(500, $row->getError('Check Problem') ); + } + + if (!$row->store()) { + JError::raiseError(500, $row->getError('Store Problem') ); + } + + $category = new JObject(); + $category->title = $categoryName ; + $category->parent_id = $parentId; + $category->id = $row->id; + $totalresult->category_count++; + $id = $category->id; + $existingCategories[] = &$category ; + $this->setCategoryCount(1);//This subcategory was added + } + + + + // Add all files from this folder + $totalresult->image_count += $this->_addAllFilesFromFolder( $existingFiles, $id, $path, $relativePath, $data ); + $this->setfileCount($totalresult->image_count); + + // Do sub folders + $parentId = $id; + $folderList = JFolder::folders( $path, $filter = '.', $recurse = false, $fullpath = true, $exclude = array() ); + // Iterate over the folders if they exist + if ($folderList !== false) { + foreach ($folderList as $folder) { + //$this->setCategoryCount(1);//This subcategory was added + $folderName = $relativePath .'/' . str_replace($origPathServer, '', $folder); + $result = $this->_createCategoriesRecursive( $origPathServer, $folder, $existingCategories, $existingFiles, $id , $data); + $totalresult->image_count += $result->image_count ; + $totalresult->category_count += $result->category_count ; + } + } + return $totalresult ; + } + + protected function _getCategoryId( &$existingCategories, &$title, $parentId ) { + $id = -1; + $i = 0; + $count = count($existingCategories); + while ( $id == -1 && $i < $count ) { + + if ( $existingCategories[$i]->title == $title && + $existingCategories[$i]->parent_id == $parentId ) { + $id = $existingCategories[$i]->id ; + } + $i++; + } + return $id; + } + + protected function _FileExist( &$existing_image, &$filename, $catid ) { + $result = false ; + $i = 0; + $count = count($existing_image); + + while ( $result == false && $i < $count ) { + if ( $existing_image[$i]->filename == $filename && + $existing_image[$i]->catid == $catid ) { + $result = true; + } + $i++; + } + return $result; + } + + protected function _addAllFilesFromFolder(&$existingImages, $category_id, $fullPath, $rel_path, $data = array()) { + $count = 0; + $fileList = JFolder::files( $fullPath ); + natcasesort($fileList); + // Iterate over the files if they exist + //file - abc.img, file_no - folder/abc.img + + // Make a copy for play and preview (1) -------- + if (isset($data['pap_copy_m']) && $data['pap_copy_m'] == 1) { + $path = PhocaDownloadPath::getPathSet(); + $storedfoldername = ltrim(str_replace(DS, '/', JPath::clean($rel_path )), '/'); + $paramsC = JComponentHelper::getParams('com_phocadownload') ; + $overwriteExistingFiles = $paramsC->get( 'overwrite_existing_files', 0 ); + } + // ------------------------------------------------ + + if ($fileList !== false) { + foreach ($fileList as $filename) { + $storedfilename = ltrim(str_replace(DS, '/', JPath::clean($rel_path . DS . $filename )), '/'); + + //$ext = strtolower(JFile::getExt($filename)); + + if (JFile::exists($fullPath.DS.$filename) && + substr($filename, 0, 1) != '.' && + strtolower($filename) !== 'index.html' && + !$this->_FileExist($existingImages, $storedfilename, $category_id) ) { + + $row =& $this->getTable('phocadownload'); + + $datam = array(); + $datam['published'] = $data['published']; + $datam['catid'] = $category_id; + $datam['filename'] = $storedfilename; + $datam['approved'] = $data['approved']; + $datam['language'] = $data['language']; + + if ($data['title'] != '') { + $datam['title'] = $data['title']; + } else { + $datam['title'] = PhocaDownloadFile::getTitleFromFilenameWithoutExt($filename); + } + + if ($data['alias'] != '') { + $datam['alias'] = $data['alias']; + } else { + $datam['alias'] = $data['alias'];//PhocaDownloadFile::get AliasName($datam['title']); + } + $datam['token'] = PhocaDownloadUtils::getToken($datam['title'].$datam['filename']); + + $image = new JObject(); + + // Make a copy for play and preview (2) + if (isset($data['pap_copy_m']) && $data['pap_copy_m'] == 1) { + $o = $this->_copyPreviewAndPlay($filename, $storedfilename, $storedfoldername, $path, $overwriteExistingFiles); + $datam['filename_play'] = $o['filename_play']; + $datam['filename_preview'] = $o['filename_preview']; + } + + + // Save + // Bind the form fields to the Phoca download table + if (!$row->bind($datam)) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Create the timestamp for the date + $row->date = gmdate('Y-m-d H:i:s'); + + // if new item, order last in appropriate group + if (!$row->id) { + $where = 'catid = ' . (int) $row->catid ; + $row->ordering = $row->getNextOrder( $where ); + } + + // Make sure the Phoca download table is valid + if (!$row->check()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Store the Phoca download table to the database + if (!$row->store()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + // -------------------------------------------- + + /*if ($this->firstImageFolder == '') { + $this->setFirstImageFolder($row->filename); + }*/ + + $image->filename = $storedfilename; + $image->catid = $category_id; + + $existingImages[] = &$image ; + $count++ ; + + } + + } + } + + // $this->setfileCount($count); + return $count; + } + + protected function _copyPreviewAndPlay($filename, $storedfilename, $storedfoldername, $path, $overwriteExistingFiles) { + + $o['filename_play'] = ''; + $o['filename_preview'] = ''; + $canPlay = PhocaDownloadFile::canPlay($filename); + $canPreview = PhocaDownloadFile::canPreview($filename); + $filepathPAP = JPath::clean($path['orig_abs_pap_ds']. $storedfilename); + //$filepathUserFolderPAP = JPath::clean($path['orig_abs_pap_ds']. $storedfoldername); + $filepath = JPath::clean($path['orig_abs_ds']. $storedfilename); + $filepathPAPFolder = JPath::clean($path['orig_abs_pap_ds'] . DS. PhocaDownloadFile::getFolderFromTheFile($storedfilename)); + + if ($canPlay || $canPreview) { + + $uploadPAP = 1;// upload file for preview and play + if (JFile::exists($filepathPAP) && $overwriteExistingFiles == 0) { + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS"); + //return false; + $uploadPAP = 0; // don't upload if it exists, it is not main file, don't do false and exit + + if ($canPlay == 1) { + $o['filename_play'] = $storedfilename; + } else if ($canPreview == 1) { + $o['filename_preview'] = $storedfilename; + } + } + + // Overwrite file and add no new item to database + $fileExistsPAP = 0; + if (JFile::exists($filepathPAP) && $overwriteExistingFiles == 1) { + $fileExistsPAP = 1; + if ($canPlay == 1) { + $o['filename_play'] = $storedfilename; + } else if ($canPreview == 1) { + $o['filename_preview'] = $storedfilename; + } + } + + if ($uploadPAP == 0) { + + } else { + + // First create folder if not exists + if (!JFolder::exists($filepathPAPFolder)) { + if (JFolder::create($filepathPAPFolder)) { + $data = "\n\n\n"; + JFile::write($filepathPAPFolder . DS ."index.html", $data); + } + // else { + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_UNABLE_TO_CREATE_FOLDER"); + //return false; + //} + } + + if (!JFile::copy($filepath, $filepathPAP)) { + + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_UNABLE_TO_UPLOAD_FILE"); + //return false; + } else { + // Saving file name into database with relative path + /*if (!JFile::exists($filepathUserFolderPAP . DS ."index.html")) { + $data = "\n\n\n"; + JFile::write($filepathUserFolderPAP . DS ."index.html", $data); + }*/ + + if ($canPlay == 1) { + //$image->filename_play = $storedfilename; + $o['filename_play'] = $storedfilename; + } else if ($canPreview == 1) { + //$image->filename_preview = $storedfilename; + $o['filename_preview'] = $storedfilename; + } + } + } + } + return $o; + } + + + public function getForm($data = array(), $loadData = true) { + + $form = $this->loadForm('com_phocadownload.phocadownloadmanager', 'phocadownloadmanager', array('control' => 'jform', 'load_data' => $loadData)); + if (empty($form)) { + return false; + } + return $form; + } + + public function getTable($type = 'PhocaDownload', $prefix = 'Table', $config = array()) + { + return JTable::getInstance($type, $prefix, $config); + } + + + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownloadm.edit.phocadownloadm.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + +} +?> \ No newline at end of file diff --git a/models/phocadownloadmanager.php b/models/phocadownloadmanager.php new file mode 100644 index 0000000..914a009 --- /dev/null +++ b/models/phocadownloadmanager.php @@ -0,0 +1,168 @@ +loadForm('com_phocadownload.phocadownloadmanager', 'phocadownloadmanager', array('control' => 'jform', 'load_data' => $loadData)); + if (empty($form)) { + return false; + } + return $form; + } + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownloadm.edit.phocadownloadm.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + + function getFolderState($property = null) { + static $set; + + if (!$set) { + $folder = JRequest::getVar( 'folder', '', '', 'path' ); + $upload = JRequest::getVar( 'upload', '', '', 'int' ); + $manager = JRequest::getVar( 'manager', '', '', 'path' ); + + $this->setState('folder', $folder); + $this->setState('manager', $manager); + + $parent = str_replace("\\", "/", dirname($folder)); + $parent = ($parent == '.') ? null : $parent; + $this->setState('parent', $parent); + + $set = true; + } + return parent::getState($property); + } + + function getFiles() { + $list = $this->getList(); + return $list['files']; + } + + function getFolders() { + $list = $this->getList(); + return $list['folders']; + } + + function getList() { + static $list; + + //Params + $params = JComponentHelper::getParams( 'com_phocadownload' ); + + // Only process the list once per request + if (is_array($list)) { + return $list; + } + + // Get current path from request + $current = $this->getState('folder'); + + // If undefined, set to empty + if ($current == 'undefined') { + $current = ''; + } + + // File Manager, Icon Manager + $manager = $this->getState('manager'); + if ($manager == 'undefined') { + $manager = ''; + } + $path = PhocaDownloadPath::getPathSet($manager); + $group = PhocaDownloadSettings::getManagerGroup($manager); + + //$path = PhocaDownloadPath::getPathSet(); + + // Initialize variables + if (strlen($current) > 0) { + $orig_path = $path['orig_abs_ds'].$current; + } else { + $orig_path = $path['orig_abs_ds']; + } + $orig_path_server = str_replace(DS, '/', $path['orig_abs'] .'/'); + + + // Absolute Path defined by user + $absolutePath = $params->get('absolute_path', ''); + $absolutePath = str_replace(DS, '/', $absolutePath); + // Be aware - absolute path is not set for images folder and for preview and play folder - see documentation + if ($absolutePath != '' && $group['f'] == 1) { + $orig_path_server = str_replace(DS, '/', JPath::clean($absolutePath .'/') );//$absolutePath ; + } + + $files = array (); + $folders = array (); + + // Get the list of files and folders from the given folder + $file_list = JFolder::files($orig_path); + $folder_list = JFolder::folders($orig_path, '', false, false, array()); + + // Iterate over the files if they exist + //file - abc.img, file_no - folder/abc.img + if ($file_list !== false) { + foreach ($file_list as $file) { + if (is_file($orig_path.DS.$file) && substr($file, 0, 1) != '.' && strtolower($file) !== 'index.html') { + $tmp = new JObject(); + $tmp->name = basename($file); + $tmp->path_with_name = str_replace(DS, '/', JPath::clean($orig_path . DS . $file)); + $tmp->path_without_name_relative= $path['orig_rel_ds'] . str_replace($orig_path_server, '', $tmp->path_with_name); + + $tmp->path_with_name = str_replace(DS, '/', JPath::clean($orig_path . DS . $file)); + $tmp->path_with_name_relative_no= str_replace($orig_path_server, '', $tmp->path_with_name); + + $files[] = $tmp; + + } + } + } + + // Iterate over the folders if they exist + if ($folder_list !== false) { + foreach ($folder_list as $folder) + { + $tmp = new JObject(); + $tmp->name = basename($folder); + $tmp->path_with_name = str_replace(DS, '/', JPath::clean($orig_path . DS . $folder)); + $tmp->path_without_name_relative= $path['orig_rel_ds'] . str_replace($orig_path_server, '', $tmp->path_with_name); + $tmp->path_with_name_relative_no= str_replace($orig_path_server, '', $tmp->path_with_name); + + $folders[] = $tmp; + } + } + + $list = array('folders' => $folders, 'files' => $files); + return $list; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadrafile.php b/models/phocadownloadrafile.php new file mode 100644 index 0000000..f58cf56 --- /dev/null +++ b/models/phocadownloadrafile.php @@ -0,0 +1,250 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); +/* + $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId); + + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); +*/ + $categoryId = $app->getUserStateFromRequest($this->context.'.filter.category_id', 'filter_category_id', null); + $this->setState('filter.category_id', $categoryId); +/* + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language); +*/ + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('uc.username', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + //$id .= ':'.$this->getState('filter.access'); + //$id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.category_id'); + + return parent::getStoreId($id); + } + + protected function getListQuery() + { + /* + $query = ' SELECT a.*, cc.title AS categorytitle, cc.id AS categoryid, i.title AS imagetitle, i.id AS imageid, ua.name AS editor, u.id AS ratinguserid, u.username AS ratingusername ' + . ' FROM #__phocadownload_file_votes AS a ' + . ' LEFT JOIN #__phocadownload AS i ON i.id = a.imgid ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = i.catid ' + . ' LEFT JOIN #__users AS ua ON ua.id = a.checked_out ' + . ' LEFT JOIN #__users AS u ON u.id = a.userid' + . $where + . ' GROUP by a.id' + . $orderby; + */ + + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload_file_votes` AS a'); + + // Join over the language + $query->select('l.title AS language_title'); + $query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + $query->select('ua.id AS ratinguserid, ua.username AS ratingusername, ua.name AS ratingname'); + $query->join('LEFT', '#__users AS ua ON ua.id=a.userid'); + + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + $query->select('i.title AS file_title, i.id AS file_id'); + $query->join('LEFT', '#__phocadownload AS i ON i.id = a.fileid'); + +/* // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); +*/ + // Join over the categories. + $query->select('c.title AS category_title, c.id AS category_id'); + $query->join('LEFT', '#__phocadownload_categories AS c ON c.id = i.catid'); + + // Filter by access level. + /* if ($access = $this->getState('filter.access')) { + $query->where('a.access = '.(int) $access); + }*/ + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by category. + $categoryId = $this->getState('filter.category_id'); + if (is_numeric($categoryId)) { + $query->where('i.catid = ' . (int) $categoryId); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( ua.name LIKE '.$search.' OR ua.username LIKE '.$search.')'); + } + } + + $query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { + $orderCol = 'category_title '.$orderDirn.', a.ordering'; + } + $query->order($db->escape($orderCol.' '.$orderDirn)); + + //echo nl2br(str_replace('#__','jos_',$query)); + return $query; + } + + + function delete($cid = array()) { + + if (count( $cid )) { + JArrayHelper::toInteger($cid); + $cids = implode( ',', $cid ); + + //Select affected catids + $query = 'SELECT v.fileid AS imgid' + . ' FROM #__phocadownload_file_votes AS v' + . ' WHERE v.id IN ( '.$cids.' )'; + $images = $this->_getList($query); + + //Delete it from DB + $query = 'DELETE FROM #__phocadownload_file_votes' + . ' WHERE id IN ( '.$cids.' )'; + $this->_db->setQuery( $query ); + if(!$this->_db->query()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + foreach ($images as $valueImgId) { + $updated = PhocaDownloadRateHelper::updateVoteStatisticsFile( $valueImgId->imgid ); + if(!$updated) { + return false; + } + } + } + return true; + } + + protected function prepareTable(&$table) + { + jimport('joomla.filter.output'); + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + $table->title = htmlspecialchars_decode($table->title, ENT_QUOTES); + $table->alias = JApplication::stringURLSafe($table->alias); + + if (empty($table->alias)) { + $table->alias = JApplication::stringURLSafe($table->title); + } + + if (empty($table->id)) { + // Set the values + //$table->created = $date->toSql(); + + // Set ordering to the last item if not set + if (empty($table->ordering)) { + $db = JFactory::getDbo(); + $db->setQuery('SELECT MAX(ordering) FROM #__phocadownload_file_votes'); + $max = $db->loadResult(); + + $table->ordering = $max+1; + } + } + else { + // Set the values + //$table->modified = $date->toSql(); + //$table->modified_by = $user->get('id'); + } + } + + public function saveorder($pks, $order) { + return true; + } + +} +?> \ No newline at end of file diff --git a/models/phocadownloadstat.php b/models/phocadownloadstat.php new file mode 100644 index 0000000..098101f --- /dev/null +++ b/models/phocadownloadstat.php @@ -0,0 +1,248 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + + + + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + + $this->setState('filter.state', $state); + + $categoryId = $app->getUserStateFromRequest($this->context.'.filter.category_id', 'filter_category_id', null); + $this->setState('filter.category_id', $categoryId); + + + + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + //parent::populateState('uc.name', 'asc'); + parent::populateState('a.hits', 'desc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + $id .= ':'.$this->getState('filter.access'); + $id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.category_id'); + $id .= ':'.$this->getState('filter.file_id'); + + return parent::getStoreId($id); + } + + + protected function getListQuery() + { + /* + $query = ' SELECT a.*, cc.title AS categorytitle, s.title AS sectiontitle, u.name AS editor, g.name AS groupname, MAX(a.hits) AS maxhit ' + . ' FROM #__phocadownload AS a ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = a.catid ' + . ' LEFT JOIN #__phocadownload_sections AS s ON s.id = a.sectionid ' + . ' LEFT JOIN #__groups AS g ON g.id = a.access ' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out ' + . $where + . ' GROUP by a.id' + . $orderby + */ + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload` AS a'); + + // Join over the language + //$query->select('l.title AS language_title'); + //$query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + + + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + + + // Join over the asset groups. + //$query->select('ag.title AS access_level'); + //$query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); + + // Join over the categories. + $query->select('c.title AS category_title, c.id AS category_id'); + $query->join('LEFT', '#__phocadownload_categories AS c ON c.id = a.catid'); + + //$query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + //$query->join('LEFT', '#__users AS ua ON ua.id = a.owner_id'); + + //$query->select('v.average AS ratingavg'); + //$query->join('LEFT', '#__phocadownload_img_votes_statistics AS v ON v.imgid = a.id'); + + // Filter by access level. + //if ($access = $this->getState('filter.access')) { + // $query->where('a.access = '.(int) $access); + //} + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by category. + $categoryId = $this->getState('filter.category_id'); + if (is_numeric($categoryId)) { + $query->where('a.catid = ' . (int) $categoryId); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( a.title LIKE '.$search.' OR a.filename LIKE '.$search.')'); + } + } + + //$query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { + $orderCol = 'category_title '.$orderDirn.', a.ordering'; + } + $query->order($db->escape($orderCol.' '.$orderDirn)); + + //echo nl2br(str_replace('#__', 'jos_', $query->__toString())); + return $query; + } + + function getMaxAndSum() { + + $db = $this->getDbo(); + $query = $db->getQuery(true); + + $query->select( + $this->getState( + 'list.select', + 'MAX(a.hits) AS maxhit, SUM(a.hits) AS sumhit' + ) + ); + + $query->from('`#__phocadownload` AS a'); + + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + //$query->select('c.title AS category_title, c.id AS category_id'); + //$query->join('LEFT', '#__phocadownload_categories AS c ON c.id = a.catid'); + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by category. + $categoryId = $this->getState('filter.category_id'); + if (is_numeric($categoryId)) { + $query->where('a.catid = ' . (int) $categoryId); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('a.title LIKE '.$search.' OR a.filename LIKE '.$search); + } + } + + //$query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { + $orderCol = 'category_title '.$orderDirn.', a.ordering'; + } + $query->order($db->escape($orderCol.' '.$orderDirn)); + + $db->setQuery($query, 0, 1); + $maxAndSum = $db->loadObject(); + + //echo nl2br(str_replace('#__', 'jos_', $query->__toString())); + return $maxAndSum; + + } + + +} +?> \ No newline at end of file diff --git a/models/phocadownloadstyle.php b/models/phocadownloadstyle.php new file mode 100644 index 0000000..c598db6 --- /dev/null +++ b/models/phocadownloadstyle.php @@ -0,0 +1,278 @@ +loadForm('com_phocadownload.phocadownloadstyles', 'phocadownloadstyle', array('control' => 'jform', 'load_data' => $loadData)); + if (empty($form)) { + return false; + } + return $form; + } + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownload.edit.phocadownloadstyles.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + + protected function prepareTable(&$table) + { + jimport('joomla.filter.output'); + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + $table->title = htmlspecialchars_decode($table->title, ENT_QUOTES); + $table->alias = JApplication::stringURLSafe($table->alias); + + if (empty($table->alias)) { + $table->alias = JApplication::stringURLSafe($table->title); + } + + if (empty($table->id)) { + // Set the values + //$table->created = $date->toSql(); + + // Set ordering to the last item if not set + if (empty($table->ordering)) { + $db = JFactory::getDbo(); + $db->setQuery('SELECT MAX(ordering) FROM #__phocadownload_styles WHERE type = '.(int)$table->type); + $max = $db->loadResult(); + + $table->ordering = $max+1; + } + } + else { + // Set the values + //$table->modified = $date->toSql(); + //$table->modified_by = $user->get('id'); + } + } + + protected function getReorderConditions($table = null) + { + $condition = array(); + $condition[] = 'type = '. (int) $table->type; + //$condition[] = 'state >= 0'; + return $condition; + } + + public function increaseOrdering($categoryId) { + + $ordering = 1; + $this->_db->setQuery('SELECT MAX(ordering) FROM #__phocadownload_styles WHERE type='.(int)$categoryId); + $max = $this->_db->loadResult(); + $ordering = $max + 1; + return $ordering; + } + + public function &getSource($id, $filename, $type) { + $item = new stdClass; + + $filePath = PhocaDownloadFile::existsCSS($filename, $type); + if ($filePath) { + //$item->id = $id; + //$item->type = $type; + //$item->filname = $filename; + $item->source = file_get_contents($filePath); + } else { + $this->setError(JText::_('COM_PHOCADOWNLOAD_FILE_DOES_NOT_EXIST')); + } + return $item; + } + + public function save($data) { + jimport('joomla.filesystem.file'); + + // New + if ($data['id'] < 1) { + $data['type'] = 2;// Custom in every case + if ($data['title'] != '') { + $filename = JApplication::stringURLSafe($data['title']); + + if (trim(str_replace('-','',$filename)) == '') { + $filename = JFactory::getDate()->toFormat("%Y-%m-%d-%H-%M-%S"); + } + } else { + $filename = JFactory::getDate()->toFormat("%Y-%m-%d-%H-%M-%S"); + } + $filename = $filename . '.css'; + $data['filename'] = $filename; + + $filePath = PhocaDownloadFile::existsCSS($filename, $data['type']); + if ($filePath) { + $this->setError(JText::sprintf('COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS', $fileName)); + return false; + } else { + $filePath = PhocaDownloadFile::getCSSPath($data['type']) . $filename; + } + } else { + + $filename = PhocaDownloadFile::getCSSFile($data['id']); + + $filePath = PhocaDownloadFile::existsCSS($filename, $data['type']); + } + + //$dispatcher = JEventDispatcher::getInstance(); + $fileName = $filename; + + + // Include the extension plugins for the save events. + //JPluginHelper::importPlugin('extension'); + + // Set FTP credentials, if given. + JClientHelper::setCredentialsFromRequest('ftp'); + $ftp = JClientHelper::getCredentials('ftp'); + + // Try to make the template file writeable. + if (!$ftp['enabled'] && JPath::isOwner($filePath) && !JPath::setPermissions($filePath, '0644')) { + $this->setError(JText::_('COM_PHOCADOWNLOAD_ERROR_SOURCE_FILE_NOT_WRITABLE')); + return false; + } + + // Trigger the onExtensionBeforeSave event. + /*$result = $dispatcher->trigger('onExtensionBeforeSave', array('com_phocadownload.source', &$data, false)); + if (in_array(false, $result, true)) { + $this->setError($table->getError()); + return false; + }*/ + + $return = JFile::write($filePath, $data['source']); + + // Try to make the template file unwriteable. + if (!$ftp['enabled'] && JPath::isOwner($filePath) && !JPath::setPermissions($filePath, '0444')) { + $this->setError(JText::_('COM_PHOCADOWNLOAD_ERROR_SOURCE_FILE_NOT_UNWRITABLE')); + return false; + } elseif (!$return) { + $this->setError(JText::sprintf('COM_PHOCADOWNLOAD_ERROR_FAILED_TO_SAVE_FILENAME', $fileName)); + return false; + } + + // Trigger the onExtensionAfterSave event. + //$dispatcher->trigger('onExtensionAfterSave', array('com_templates.source', &$table, false)); + + //return true; + return parent::save($data); + } + + public function delete(&$pks) + { + $dispatcher = JEventDispatcher::getInstance(); + $pks = (array) $pks; + $table = $this->getTable(); + + // Include the content plugins for the on delete events. + JPluginHelper::importPlugin('content'); + + // Iterate the items to delete each one. + foreach ($pks as $i => $pk) + { + + if ($table->load($pk)) + { + + if ($this->canDelete($table)) + { + + $context = $this->option . '.' . $this->name; + + // Trigger the onContentBeforeDelete event. + $result = $dispatcher->trigger($this->event_before_delete, array($context, $table)); + if (in_array(false, $result, true)) + { + $this->setError($table->getError()); + return false; + } + + //PHOCAEDIT + $filePath = PhocaDownloadFile::getCSSFile($pk, true); + //END PHOCAEDIT + + if (!$table->delete($pk)) + { + $this->setError($table->getError()); + return false; + } + + //PHOCAEDIT + if (file_exists($filePath)) { + JFile::delete($filePath); + } + //END PHOCAEDIT + + // Trigger the onContentAfterDelete event. + $dispatcher->trigger($this->event_after_delete, array($context, $table)); + + } + else + { + + // Prune items that you can't change. + unset($pks[$i]); + $error = $this->getError(); + if ($error) + { + JLog::add($error, JLog::WARNING, 'jerror'); + return false; + } + else + { + JLog::add(JText::_('JLIB_APPLICATION_ERROR_DELETE_NOT_PERMITTED'), JLog::WARNING, 'jerror'); + return false; + } + } + + } + else + { + $this->setError($table->getError()); + return false; + } + } + + // Clear the component's cache + $this->cleanCache(); + + return true; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadstyles.php b/models/phocadownloadstyles.php new file mode 100644 index 0000000..d0e21ea --- /dev/null +++ b/models/phocadownloadstyles.php @@ -0,0 +1,249 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); +/* + $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId); +*/ + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); + + $categoryId = $app->getUserStateFromRequest($this->context.'.filter.category_id', 'filter_category_id', null); + $this->setState('filter.category_id', $categoryId); + + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language); + + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('a.ordering', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + $id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.category_id'); + + return parent::getStoreId($id); + } + + + protected function getListQuery() + { + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload_styles` AS a'); + + // Join over the language + $query->select('l.title AS language_title'); + $query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + // Filter by category. + $categoryId = $this->getState('filter.category_id'); + if (is_numeric($categoryId)) { + $query->where('a.type = ' . (int) $categoryId); + } + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( a.title LIKE '.$search.' OR a.filename LIKE '.$search.')'); + } + } + + $query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + /*if ($orderCol == 'a.ordering' || $orderCol == 'category_title') { + $orderCol = 'category_title '.$orderDirn.', a.ordering'; + }*/ + $query->order($db->escape($orderCol.' '.$orderDirn)); + + + return $query; + } + + protected function getItemsCheck() { + $db = JFactory::getDBO(); + $query = 'SELECT a.id, a.filename, a.type' + .' FROM #__phocadownload_styles AS a'; + $db->setQuery($query); + $items = $db->loadObjectList(); + return $items; + } + + public function checkItems() { + + $db = JFactory::getDBO(); + $files = $this->getFiles(); + $items = $this->getItemsCheck(); + if (!empty($files)) { + foreach ($files as $fk => $fv) { + if ($fv->exists) { + $exists = 0; + foreach ($items as $ik => $iv) { + if ($fv->filename == $iv->filename && $fv->type == $iv->type){ + // we cannot break because there are two types + $exists = 1; + } + } + if ($exists == 0) { + + $query = 'SELECT a.ordering' + .' FROM #__phocadownload_styles AS a' + .' WHERE a.type = '.(int) $fv->type; + $db->setQuery($query, 0, 1); + $ordO = $db->loadObject(); + if (!isset($ordO->ordering)) { + $ordering = 1; + } else { + $ordering = (int)$ordO->ordering + 1; + } + + $title = ucfirst(str_replace('.css', '', htmlspecialchars($fv->filename))); + $published = 1; + $query = 'INSERT into #__phocadownload_styles' + .' (id, title, filename, type, published, ordering, language)' + .' VALUES (null, '. $db->quote($title) + .' , '.$db->quote(htmlspecialchars($fv->filename)) + .' , '.(int)$fv->type + .' , '.(int)$published + .' , '.(int)$ordering + .' , '.$db->quote('*') + .')'; + $db->setQuery($query); + + if (!$db->query()) { + $this->setError('Database Error - Inserting CSS Style'); + return false; + } + } + + } + + } + + } + return true; + + } + + public function getFiles() + { + $result = array(); + jimport('joomla.filesystem.folder'); + + $paths = PhocaDownloadPath::getPathMedia(); + $path = JPath::clean($paths->media_css_abs . '/main/'); + + if (is_dir($path)) { + $files = JFolder::files($path, '\.css$', false, false); + + foreach ($files as $file) { + $fileO = new stdClass; + $fileO->filename = $file; + $fileO->exists = file_exists($path.$file); + $fileO->type = 1; + $result[] = $fileO; + } + } else { + $this->setError(JText::_('COM_PHOCADOWNLOAD_ERROR_CSS_FOLDER_NOT_FOUND') . ' (1)'); + return false; + } + + $path = JPath::clean($paths->media_css_abs . '/custom/'); + if (is_dir($path)) { + $files = JFolder::files($path, '\.css$', false, false); + + foreach ($files as $file) { + $fileO = new stdClass; + $fileO->filename = $file; + $fileO->exists = file_exists($path.$file); + $fileO->type = 2; + $result[] = $fileO; + } + } else { + $this->setError(JText::_('COM_PHOCADOWNLOAD_ERROR_CSS_FOLDER_NOT_FOUND') . ' (2)'); + return false; + } + return $result; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadtag.php b/models/phocadownloadtag.php new file mode 100644 index 0000000..7ea8509 --- /dev/null +++ b/models/phocadownloadtag.php @@ -0,0 +1,93 @@ +loadForm('com_phocadownload.phocadownloadtag', 'phocadownloadtag', array('control' => 'jform', 'load_data' => $loadData)); + if (empty($form)) { + return false; + } + return $form; + } + + protected function loadFormData() + { + // Check the session for previously entered form data. + $data = JFactory::getApplication()->getUserState('com_phocadownload.edit.phocadownloadtag.data', array()); + + if (empty($data)) { + $data = $this->getItem(); + } + + return $data; + } + + protected function prepareTable($table) + { + jimport('joomla.filter.output'); + $date = JFactory::getDate(); + $user = JFactory::getUser(); + + $table->title = htmlspecialchars_decode($table->title, ENT_QUOTES); + $table->alias = JApplication::stringURLSafe($table->alias); + + if (empty($table->alias)) { + $table->alias = JApplication::stringURLSafe($table->title); + } + + if (empty($table->id)) { + // Set the values + //$table->created = $date->toSql(); + + // Set ordering to the last item if not set + if (empty($table->ordering)) { + $db = JFactory::getDbo(); + $db->setQuery('SELECT MAX(ordering) FROM #__phocadownload_tags'); + $max = $db->loadResult(); + + $table->ordering = $max+1; + } + } + else { + // Set the values + //$table->modified = $date->toSql(); + //$table->modified_by = $user->get('id'); + } + } +} +?> \ No newline at end of file diff --git a/models/phocadownloadtags.php b/models/phocadownloadtags.php new file mode 100644 index 0000000..5e6f53a --- /dev/null +++ b/models/phocadownloadtags.php @@ -0,0 +1,151 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); + +/* $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId);*/ + + + + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); + + //$language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + //$this->setState('filter.language', $language); + + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('a.title', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + //$id .= ':'.$this->getState('filter.access'); + $id .= ':'.$this->getState('filter.state'); + $id .= ':'.$this->getState('filter.tag_id'); + + + return parent::getStoreId($id); + } + + protected function getListQuery() + { + /* + $query = ' SELECT a.*, u.name AS editor ' + . ' FROM #__phocadownload_licenses AS a ' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out ' + */ + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('`#__phocadownload_tags` AS a'); + + // Join over the language + //$query->select('l.title AS language_title'); + //$query->join('LEFT', '`#__languages` AS l ON l.lang_code = a.language'); + + // Join over the users for the checked out user. + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out'); + + + // Filter by access level. +/* if ($access = $this->getState('filter.access')) { + $query->where('a.access = '.(int) $access); + }*/ + + + + // Filter by published state. + $published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + } + + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( a.title LIKE '.$search.' OR a.alias LIKE '.$search.')'); + } + } + + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + $query->order($db->escape($orderCol.' '.$orderDirn)); + + //echo nl2br(str_replace('#__', 'jos_', $query->__toString())); + return $query; + + } + + +} +?> \ No newline at end of file diff --git a/models/phocadownloadupload.php b/models/phocadownloadupload.php new file mode 100644 index 0000000..f2050ff --- /dev/null +++ b/models/phocadownloadupload.php @@ -0,0 +1,30 @@ +get('id').' ) )'; + $this->_db->setQuery( $query ); + if (!$this->_db->query()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + return true; + } +} +?> \ No newline at end of file diff --git a/models/phocadownloaduploads.php b/models/phocadownloaduploads.php new file mode 100644 index 0000000..9ce378f --- /dev/null +++ b/models/phocadownloaduploads.php @@ -0,0 +1,217 @@ +getUserStateFromRequest($this->context.'.filter.search', 'filter_search'); + $this->setState('filter.search', $search); +/* + $accessId = $app->getUserStateFromRequest($this->context.'.filter.access', 'filter_access', null, 'int'); + $this->setState('filter.access', $accessId); +*/ + $state = $app->getUserStateFromRequest($this->context.'.filter.state', 'filter_published', '', 'string'); + $this->setState('filter.state', $state); +/* + $categoryId = $app->getUserStateFromRequest($this->context.'.filter.category_id', 'filter_category_id', null); + $this->setState('filter.category_id', $categoryId); + + $language = $app->getUserStateFromRequest($this->context.'.filter.language', 'filter_language', ''); + $this->setState('filter.language', $language); +*/ + // Load the parameters. + $params = JComponentHelper::getParams('com_phocadownload'); + $this->setState('params', $params); + + // List state information. + parent::populateState('uc.username', 'asc'); + } + + protected function getStoreId($id = '') + { + // Compile the store id. + $id .= ':'.$this->getState('filter.search'); + //$id .= ':'.$this->getState('filter.access'); + $id .= ':'.$this->getState('filter.state'); + + return parent::getStoreId($id); + } + + protected function getListQuery() + { + /* + $query = ' SELECT a.*, fa.countfaid, fn.countfnid, 0 AS checked_out' + . ' FROM #__users AS a' + . ' LEFT JOIN #__phocadownload AS f ON f.owner_id = a.id ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = f.catid ' + . ' LEFT JOIN #__phocadownload_sections AS s ON s.id = f.sectionid ' + . ' LEFT JOIN #__groups AS g ON g.id = f.access ' + . ' LEFT JOIN #__users AS aa ON aa.id = f.checked_out ' + + + . ' LEFT JOIN (SELECT fa.owner_id, fa.id, count(*) AS countfaid' + . ' FROM #__phocadownload AS fa' + . ' WHERE fa.approved = 1' + . ' GROUP BY fa.owner_id) AS fa ' + . ' ON a.id = fa.owner_id' + + . ' LEFT JOIN (SELECT fn.owner_id, fn.id, count(*) AS countfnid' + . ' FROM #__phocadownload AS fn' + . ' WHERE fn.approved = 0' + . ' GROUP BY fn.owner_id) AS fn ' + . ' ON a.id = fn.owner_id' + + . $where + . ' GROUP by a.id' + . $orderby; + */ + // Create a new query object. + $db = $this->getDbo(); + $query = $db->getQuery(true); + + // Select the required fields from the table. + $query->select( + $this->getState( + 'list.select', + 'a.*' + ) + ); + $query->from('#__users AS a'); + + // Join over the language + //$query->select('l.title AS language_title'); + //$query->join('LEFT', '#__languages AS l ON l.lang_code = a.language'); + + + $query->select('f.id as file_id'); + $query->join('LEFT', '#__phocadownload AS f ON f.owner_id = a.id'); + + $query->select('cc.id as category_id'); + $query->join('LEFT', '#__phocadownload_categories AS cc ON cc.id = f.catid'); + + // Join over the users for the checked out user. + //$query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + //$query->join('LEFT', '#__users AS ua ON ua.id=a.userid'); + + $query->select('ua.id AS userid, ua.username AS username, ua.name AS usernameno'); + $query->join('LEFT', '#__users AS ua ON ua.id=f.owner_id'); + + $query->select('uc.name AS editor'); + $query->join('LEFT', '#__users AS uc ON uc.id=f.checked_out'); + + $query->select('fa.countfaid'); + $query->join('LEFT', '(SELECT fa.owner_id, fa.id, count(*) AS countfaid' + . ' FROM #__phocadownload AS fa' + . ' WHERE fa.approved = 1' + . ' GROUP BY fa.owner_id) AS fa ' + . ' ON a.id = fa.owner_id '); + + + $query->select('fn.countfnid'); + $query->join('LEFT', '(SELECT fn.owner_id, fn.id, count(*) AS countfnid' + . ' FROM #__phocadownload AS fn' + . ' WHERE fn.approved = 0' + . ' GROUP BY fn.owner_id) AS fn ' + . ' ON a.id = fn.owner_id'); + + + +/* // Join over the asset groups. + $query->select('ag.title AS access_level'); + $query->join('LEFT', '#__viewlevels AS ag ON ag.id = a.access'); +*/ + + // Filter by access level. + /* if ($access = $this->getState('filter.access')) { + $query->where('a.access = '.(int) $access); + }*/ + + // Filter by published state. + /*$published = $this->getState('filter.state'); + if (is_numeric($published)) { + $query->where('a.published = '.(int) $published); + } + else if ($published === '') { + $query->where('(a.published IN (0, 1))'); + }*/ + + $query->where('a.id > 0'); + $query->where('(fa.countfaid > 0 OR fn.countfnid > 0)'); + + // Filter by category. + /*$categoryId = $this->getState('filter.category_id'); + if (is_numeric($categoryId)) { + $query->where('a.catid = ' . (int) $categoryId); + }*/ + + // Filter by search in title + $search = $this->getState('filter.search'); + if (!empty($search)) + { + if (stripos($search, 'id:') === 0) { + $query->where('a.id = '.(int) substr($search, 3)); + } + else + { + $search = $db->Quote('%'.$db->escape($search, true).'%'); + $query->where('( ua.username LIKE '.$search.' OR ua.name LIKE '.$search.')'); + } + } + + $query->group('a.id'); + + // Add the list ordering clause. + $orderCol = $this->state->get('list.ordering'); + $orderDirn = $this->state->get('list.direction'); + if ($orderCol == 'a.id' || $orderCol == 'username') { + $orderCol = 'username '.$orderDirn.', a.id'; + } + $query->order($db->escape($orderCol.' '.$orderDirn)); + + //echo nl2br(str_replace('#__', 'jos_', $query->__toString())); + return $query; + } +} +?> \ No newline at end of file diff --git a/phocadownload.php b/phocadownload.php new file mode 100644 index 0000000..8573fae --- /dev/null +++ b/phocadownload.php @@ -0,0 +1,42 @@ +authorise('core.manage', 'com_phocadownload')) { + return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR')); +} +if (! class_exists('PhocaDownloadLoader')) { + require_once( JPATH_ADMINISTRATOR.DS.'components/com_phocadownload/libraries/loader.php'); +} + +require_once( JPATH_COMPONENT.DS.'controller.php' ); +jimport( 'joomla.filesystem.folder' ); +jimport( 'joomla.filesystem.file' ); +phocadownloadimport('phocadownload.path.path'); +phocadownloadimport('phocadownload.utils.utils'); +phocadownloadimport('phocadownload.utils.settings'); +phocadownloadimport('phocadownload.utils.exception'); +phocadownloadimport('phocadownload.render.renderadmin'); +phocadownloadimport('phocadownload.render.renderadminview'); +phocadownloadimport('phocadownload.render.renderadminviews'); +phocadownloadimport('phocadownload.html.category'); +phocadownloadimport('phocadownload.html.jgrid'); +phocadownloadimport('phocadownload.html.batch'); +phocadownloadimport('phocadownload.file.file'); +phocadownloadimport('phocadownload.file.fileupload'); +phocadownloadimport('phocadownload.file.fileuploadmultiple'); +phocadownloadimport('phocadownload.file.fileuploadsingle'); +phocadownloadimport('phocadownload.category.category'); +phocadownloadimport('phocadownload.tag.tag'); + +jimport('joomla.application.component.controller'); +$controller = JControllerLegacy::getInstance('PhocaDownloadCp'); +$controller->execute(JFactory::getApplication()->input->get('task')); +$controller->redirect(); +?> \ No newline at end of file diff --git a/phocadownload.xml b/phocadownload.xml new file mode 100644 index 0000000..78d6f96 --- /dev/null +++ b/phocadownload.xml @@ -0,0 +1,98 @@ + + + com_phocadownload + Jan Pavelka (www.phoca.cz) + 07/11/2014 + + www.phoca.cz + Jan Pavelka + GNU/GPL + 3.0.6 + Phoca Download + install/script.php + + + + install/sql/mysql/install.utf8.sql + + + + + + install/sql/mysql/uninstall.utf8.sql + + + + + + update/sql/mysql + + + + + controller.php + index.html + phocadownload.php + router.php + assets + controllers + helpers + models + views + + + + index.html + css + images + js + + + + language/en-GB/en-GB.com_phocadownload.ini + language/en-GB/en-GB.com_phocadownload.sys.ini + + + + COM_PHOCADOWNLOAD + + COM_PHOCADOWNLOAD_CONTROLPANEL + COM_PHOCADOWNLOAD_FILES + COM_PHOCADOWNLOAD_CATEGORIES + COM_PHOCADOWNLOAD_LICENSES + COM_PHOCADOWNLOAD_STATISTICS + COM_PHOCADOWNLOAD_DOWNLOADS + COM_PHOCADOWNLOAD_UPLOADS + COM_PHOCADOWNLOAD_FILE_RATING + COM_PHOCADOWNLOAD_TAGS + COM_PHOCADOWNLOAD_LAYOUT + COM_PHOCADOWNLOAD_STYLES + COM_PHOCADOWNLOAD_LOGGING + COM_PHOCADOWNLOAD_INFO + + + + access.xml + config.xml + controller.php + index.html + phocadownload.php + phocadownload.xml + controllers + help + helpers + install + libraries + models + tables + update + views + + + + language/en-GB/en-GB.com_phocadownload.ini + language/en-GB/en-GB.com_phocadownload.sys.ini + + + + diff --git a/site/assets/index.html b/site/assets/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/assets/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/assets/jquery/index.html b/site/assets/jquery/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/assets/jquery/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/assets/jquery/jquery-1.6.4.min.js b/site/assets/jquery/jquery-1.6.4.min.js new file mode 100644 index 0000000..3684c36 --- /dev/null +++ b/site/assets/jquery/jquery-1.6.4.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.6.4 http://jquery.com/ | http://jquery.org/license */ +(function(a,b){function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cr(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
    a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
    ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
    t
    ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
    ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/site/controller.php b/site/controller.php new file mode 100644 index 0000000..4f712b1 --- /dev/null +++ b/site/controller.php @@ -0,0 +1,39 @@ +get( 'enable_cache', 0 ); + $cachable = false; + if ($cache == 1) { + $cachable = true; + } + + $document = JFactory::getDocument(); + + $safeurlparams = array('catid'=>'INT','id'=>'INT','cid'=>'ARRAY','year'=>'INT','month'=>'INT','limit'=>'INT','limitstart'=>'INT', + 'showall'=>'INT','return'=>'BASE64','filter'=>'STRING','filter_order'=>'CMD','filter_order_Dir'=>'CMD','filter-search'=>'STRING','print'=>'BOOLEAN','lang'=>'CMD'); + + parent::display($cachable,$safeurlparams); + + return $this; + } +} +?> \ No newline at end of file diff --git a/site/controllers/index.html b/site/controllers/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/controllers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/controllers/user.php b/site/controllers/user.php new file mode 100644 index 0000000..00b4440 --- /dev/null +++ b/site/controllers/user.php @@ -0,0 +1,147 @@ +registerTask( 'unpublish', 'unpublish' ); + $app = JFactory::getApplication(); + $this->itemId = $app->input->get( 'Itemid', 0, 'int' ); + $this->loginUrl = JRoute::_('index.php?option=com_users&view=login', false); + $this->loginString = JText::_('COM_PHOCADOWNLOAD_NOT_AUTHORISED_ACTION'); + $this->url = 'index.php?option=com_phocadownload&view=user&Itemid='. $this->itemId; + } + /* + function display() { + if ( ! JRequest::getCmd( 'view' ) ) { + $this->input->set('view', 'user' ); + } + parent::display(); + }*/ + + function unpublish() { + + $app = JFactory::getApplication(); + $post['id'] = $app->input->get( 'actionid', '', 'int', 0 ); + $post['limitstart'] = $app->input->get( 'limitstart', '', 'int', 0 ); + $model = $this->getModel('user'); + //$isOwnerCategory = 1;//$model->isOwnerCategoryImage((int)$this->_user->id, (int)$id); + // USER RIGHT - Delete - - - - - - - - - - - + // 2, 2 means that user access will be ignored in function getUserRight for display Delete button + $user = JFactory::getUser(); + $rightDisplayDelete = 0; + $catAccess = PhocaDownloadAccess::getCategoryAccessByFileId((int)$post['id']); + if (!empty($catAccess)) { + $rightDisplayDelete = PhocaDownloadAccess::getUserRight('deleteuserid', $catAccess->deleteuserid, 2, $user->getAuthorisedViewLevels(), $user->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplayDelete) { + if(!$model->publish((int)$post['id'], 0)) { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_UNPUBLISHING_ITEM'); + } else { + $msg = JText::_('COM_PHOCADOWNLOAD_SUCCESS_UNPUBLISHING_ITEM'); + } + } else { + $app->redirect($this->loginUrl, $this->loginString); + exit; + } + + $lSO = ''; + if ($post['limitstart'] != '') { + $lSO = '&limitstart='.(int)$post['limitstart']; + } + + $this->setRedirect( JRoute::_($this->url. $lSO, false), $msg ); + } + + function publish() { + $app = JFactory::getApplication(); + $post['id'] = $app->input->get( 'actionid', '', 'int', 0 ); + $post['limitstart'] = $app->input->get( 'limitstart', '', 'int', 0 ); + $model = $this->getModel('user'); + //$isOwnerCategory = 1;//$model->isOwnerCategoryImage((int)$this->_user->id, (int)$id); + + // USER RIGHT - Delete - - - - - - - - - - - + // 2, 2 means that user access will be ignored in function getUserRight for display Delete button + $user = JFactory::getUser(); + $rightDisplayDelete = 0; + $catAccess = PhocaDownloadAccess::getCategoryAccessByFileId((int)$post['id']); + + if (!empty($catAccess)) { + $rightDisplayDelete = PhocaDownloadAccess::getUserRight('deleteuserid', $catAccess->deleteuserid, 2, $user->getAuthorisedViewLevels(), $user->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplayDelete) { + if(!$model->publish((int)$post['id'], 1)) { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_PUBLISHING_ITEM'); + } else { + $msg = JText::_('COM_PHOCADOWNLOAD_SUCCESS_PUBLISHING_ITEM'); + } + } else { + $app->redirect($this->loginUrl, $this->loginString); + exit; + } + + $lSO = ''; + if ($post['limitstart'] != '') { + $lSO = '&limitstart='.(int)$post['limitstart']; + } + + $this->setRedirect( JRoute::_($this->url. $lSO, false), $msg ); + } + + function delete() { + + $app = JFactory::getApplication(); + $post['id'] = $app->input->get( 'actionid', '', 'int', 0 ); + $post['limitstart'] = $app->input->get( 'limitstart', '', 'int', 0 ); + $model = $this->getModel('user'); + //$isOwnerCategory = 1;//$model->isOwnerCategoryImage((int)$this->_user->id, (int)$id); + + // USER RIGHT - Delete - - - - - - - - - - - + // 2, 2 means that user access will be ignored in function getUserRight for display Delete button + $user = JFactory::getUser(); + $rightDisplayDelete = 0; + $catAccess = PhocaDownloadAccess::getCategoryAccessByFileId((int)$post['id']); + if (!empty($catAccess)) { + $rightDisplayDelete = PhocaDownloadAccess::getUserRight('deleteuserid', $catAccess->deleteuserid, 2, $user->getAuthorisedViewLevels(), $user->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplayDelete) { + if(!$model->delete((int)$post['id'])) { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_DELETING_ITEM'); + } else { + $msg = JText::_('COM_PHOCADOWNLOAD_SUCCESS_DELETING_ITEM'); + } + } else { + $app->redirect($this->loginUrl, $this->loginString); + exit; + } + + $lSO = ''; + if ($post['limitstart'] != '') { + $lSO = '&limitstart='.(int)$post['limitstart']; + } + + $this->setRedirect( JRoute::_($this->url. $lSO, false), $msg ); + } +} +?> \ No newline at end of file diff --git a/site/helpers/index.html b/site/helpers/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/helpers/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/models/categories.php b/site/models/categories.php new file mode 100644 index 0000000..08843ce --- /dev/null +++ b/site/models/categories.php @@ -0,0 +1,260 @@ +setState('filter.language',$app->getLanguageFilter()); + } + + function getCategoriesList() { + if (empty($this->_categories)) { + $query = $this->_getCategoriesListQuery(); + + //$this->_categories = $this->_getList( $query ); + $categories = $this->_getList( $query ); + + if (!empty($categories)) { + + // Parent Only + foreach ($categories as $k => $v) { + if ($v->parent_id == 0) { + $this->_categories[$v->id] = $categories[$k]; + } + } + + // Subcategories + foreach ($categories as $k => $v) { + if (isset($this->_categories[$v->parent_id])) { + $this->_categories[$v->parent_id]->subcategories[] = $categories[$k]; + $this->_categories[$v->parent_id]->numsubcat++; + } + } + } + /* + $this->categories = $this->_getList( $query ); + if (!empty($this->categories)) { + foreach ($this->categories as $key => $value) { + $query = $this->getCategoriesListQuery( $value->id, $categoriesOrdering ); + $this->categories[$key]->subcategories = $this->_getList( $query ); + } + }*/ + + } + + return $this->_categories; + } + + + + /* + * Get only parent categories + */ + function _getCategoriesListQuery( ) { + + $wheres = array(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + + $pQ = $params->get( 'enable_plugin_query', 0 ); + $display_categories = $params->get('display_categories', ''); + $hide_categories = $params->get('hide_categoriess', ''); + + if ( $display_categories != '' ) { + $wheres[] = " cc.id IN (".$display_categories.")"; + } + + if ( $hide_categories != '' ) { + $wheres[] = " cc.id NOT IN (".$hide_categories.")"; + } + //$wheres[] = " cc.parent_id = 0"; + $wheres[] = " cc.published = 1"; + $wheres[] = " cc.access IN (".$userLevels.")"; + + if ($this->getState('filter.language')) { + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + $categoriesOrdering = $this->_getCategoryOrdering(); + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetCategoriesList', array (&$wheres, &$joins, $params)); + // END GWE MOD + } + + $query = " SELECT cc.id, cc.parent_id, cc.title, cc.alias, cc.access, cc.description, cc.accessuserid, COUNT(c.id) AS numdoc, 0 AS numsubcat" + . " FROM #__phocadownload_categories AS cc" + . " LEFT JOIN #__phocadownload AS c ON c.catid = cc.id AND c.published = 1 AND c.textonly = 0" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " GROUP BY cc.id" + . " ORDER BY cc.".$categoriesOrdering; + + return $query; + } + + + /* + * Get only first level under parent categories + */ + function _getCategoryListQuery( $parentCatId ) { + + $wheres = array(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $pQ = $params->get( 'enable_plugin_query', 0 ); + $display_categories = $params->get('display_categories', ''); + $hide_categories = $params->get('hide_categoriess', ''); + + if ( $display_categories != '' ) { + $wheres[] = " cc.id IN (".$display_categories.")"; + } + + if ( $hide_categories != '' ) { + $wheres[] = " cc.id NOT IN (".$hide_categories.")"; + } + $wheres[] = " cc.parent_id = ".(int)$parentCatId; + $wheres[] = " cc.published = 1"; + $wheres[] = " cc.access IN (".$userLevels.")"; + + if ($this->getState('filter.language')) { + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + $categoryOrdering = $this->_getCategoryOrdering(); + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetCategoryList', array (&$wheres, &$joins, $params)); + // END GWE MOD + } + + $query = " SELECT cc.id, cc.title, cc.alias, cc.access, cc.accessuserid, COUNT(c.id) AS numdoc" + . " FROM #__phocadownload_categories AS cc" + . " LEFT JOIN #__phocadownload AS c ON c.catid = cc.id AND c.published = 1 AND c.textonly = 0" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " GROUP BY cc.id" + . " ORDER BY cc.".$categoryOrdering; + + return $query; + + + } + + function getMostViewedDocsList() { + + if (empty($this->_most_viewed_docs)) { + $query = $this->_getMostViewedDocsListQuery(); + $this->_most_viewed_docs = $this->_getList( $query ); + } + return $this->_most_viewed_docs; + } + + function _getMostViewedDocsListQuery() { + + $wheres = array(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $pQ = $params->get( 'enable_plugin_query', 0 ); + $most_viewed_docs_num = $params->get( 'most_viewed_docs_num', 5 ); + $display_categories = $params->get('display_categories', ''); + $hide_categories = $params->get('hide_categoriess', ''); + + if ( $display_categories != '' ) { + $wheres[] = " cc.id IN (".$display_categories.")"; + } + + if ( $hide_categories != '' ) { + $wheres[] = " cc.id NOT IN (".$hide_categories.")"; + } + + + $wheres[] = " c.catid= cc.id"; + $wheres[] = " c.published= 1"; + $wheres[] = " c.approved= 1"; + $wheres[] = " c.textonly= 0"; + $wheres[] = " cc.access IN (".$userLevels.")"; + $wheres[] = " c.access IN (".$userLevels.")"; + + + if ($this->getState('filter.language')) { + $wheres[] = ' c.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + // Active + $jnow = JFactory::getDate(); + $now = $jnow->toSql(); + $nullDate = $this->_db->getNullDate(); + $wheres[] = ' ( c.publish_up = '.$this->_db->Quote($nullDate).' OR c.publish_up <= '.$this->_db->Quote($now).' )'; + $wheres[] = ' ( c.publish_down = '.$this->_db->Quote($nullDate).' OR c.publish_down >= '.$this->_db->Quote($now).' )'; + + + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetMostViewedDocs', array (&$wheres, &$joins, 0, $params)); + // END GWE MOD + } + + $query = " SELECT c.id, c.title, c.alias, c.filename, c.date, c.hits, c.image_filename, cc.id AS categoryid, cc.access as cataccess, cc.accessuserid as cataccessuserid, cc.title AS categorytitle, cc.alias AS categoryalias " + ." FROM #__phocadownload AS c, #__phocadownload_categories AS cc" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " ORDER BY c.hits DESC" + . " LIMIT ".(int)$most_viewed_docs_num; + return $query; + } + + function _getCategoryOrdering() { + if (empty($this->_category_ordering)) { + + $app = JFactory::getApplication(); + $params = $app->getParams(); + $ordering = $params->get( 'category_ordering', 1 ); + $this->_category_ordering = PhocaDownloadOrdering::getOrderingText($ordering); + + } + return $this->_category_ordering; + } +} +?> \ No newline at end of file diff --git a/site/models/category.php b/site/models/category.php new file mode 100644 index 0000000..d694a71 --- /dev/null +++ b/site/models/category.php @@ -0,0 +1,235 @@ +get( 'default_pagination', '20' ); + + // Get the pagination request variables + $this->setState('limit', $app->getUserStateFromRequest('com_phocadownload.limit', 'limit', $defaultPagination, 'int')); + $this->setState('limitstart', $app->input->get('limitstart', 0, 'int')); + + // In case limit has been changed, adjust limitstart accordingly + $this->setState('limitstart', ($this->getState('limit') != 0 ? (floor($this->getState('limitstart') / $this->getState('limit')) * $this->getState('limit')) : 0)); + + $this->setState('filter.language',$app->getLanguageFilter()); + + // Get the filter request variables + $this->setState('filter_order', JRequest::getCmd('filter_order', 'ordering')); + $this->setState('filter_order_dir', JRequest::getCmd('filter_order_Dir', 'ASC')); + + } + + function getPagination($categoryId, $tagId) { + if (empty($this->_pagination)) { + jimport('joomla.html.pagination'); + $this->_pagination = new PhocaDownloadPagination( $this->getTotal($categoryId, $tagId), $this->getState('limitstart'), $this->getState('limit') ); + } + return $this->_pagination; + } + + function getTotal($categoryId, $tagId) { + if (empty($this->_total)) { + $query = $this->_getFileListQuery($categoryId, $tagId); + $this->_total = $this->_getListCount($query); + } + return $this->_total; + } + + function getFileList($categoryId, $tagId) { + if (empty($this->_document)) { + $query = $this->_getFileListQuery( $categoryId, $tagId); + $this->_document= $this->_getList( $query ,$this->getState('limitstart'), $this->getState('limit')); + } + return $this->_document; + } + + function getCategory($categoryId) { + if (empty($this->_category)) { + $query = $this->_getCategoriesQuery( $categoryId, FALSE ); + $this->_category = $this->_getList( $query, 0, 1 ); + } + return $this->_category; + } + + function getSubcategories($categoryId) { + if (empty($this->_subcategories)) { + $query = $this->_getCategoriesQuery( $categoryId, TRUE ); + $this->_subcategories = $this->_getList( $query ); + } + return $this->_subcategories; + } + + function _getFileListQuery( $categoryId, $tagId = 0 ) { + + $wheres = array(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + if ((int)$tagId > 0) { + $wheres[] = ' t.tagid= '.(int)$tagId; + } else { + $wheres[] = ' c.catid= '.(int)$categoryId; + } + + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND c.access IN ('.$userLevels.') ) )'; + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND cc.access IN ('.$userLevels.') ) )'; + + $wheres[] = ' c.published = 1'; + $wheres[] = ' c.approved = 1'; + $wheres[] = ' cc.published = 1'; + + if ($this->getState('filter.language')) { + $wheres[] = ' c.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + // Active + $jnow = JFactory::getDate(); + $now = $jnow->toSql(); + $nullDate = $this->_db->getNullDate(); + $wheres[] = ' ( c.publish_up = '.$this->_db->Quote($nullDate).' OR c.publish_up <= '.$this->_db->Quote($now).' )'; + $wheres[] = ' ( c.publish_down = '.$this->_db->Quote($nullDate).' OR c.publish_down >= '.$this->_db->Quote($now).' )'; + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetFileList', array (&$wheres, &$joins,$categoryId , $params)); + // END GWE MOD + } + + $fileOrdering = $this->_getFileOrdering(); + + $query = ' SELECT c.*, cc.id AS categoryid, cc.title AS categorytitle, cc.alias AS categoryalias, cc.access as cataccess, cc.accessuserid as cataccessuserid ' + .' FROM #__phocadownload AS c' + .' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = c.catid'; + if ((int)$tagId > 0) { + $query .= ' LEFT JOIN #__phocadownload_tags_ref AS t ON t.fileid = c.id'; + } + $query .= ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . ' WHERE ' . implode( ' AND ', $wheres ) + . ' ORDER BY c.'.$fileOrdering; + + return $query; + } + + + + function _getCategoriesQuery( $categoryId, $subcategories = FALSE ) { + + $wheres = array(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + + // Get the current category or get parent categories of the current category + if ($subcategories) { + $wheres[] = " cc.parent_id = ".(int)$categoryId; + $categoryOrdering = $this->_getCategoryOrdering(); + } else { + $wheres[] = " cc.id= ".(int)$categoryId; + } + + $wheres[] = " cc.access IN (".$userLevels.")"; + $wheres[] = " cc.published = 1"; + + if ($this->getState('filter.language')) { + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetCategory', array (&$wheres, &$joins,$categoryId , $params)); + // END GWE MOD + } + + if ($subcategories) { + $query = " SELECT cc.id, cc.title, cc.alias, cc.access as cataccess, cc.accessuserid as cataccessuserid, COUNT(c.id) AS numdoc" + . " FROM #__phocadownload_categories AS cc" + . " LEFT JOIN #__phocadownload AS c ON c.catid = cc.id AND c.published = 1 AND c.textonly = 0" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " GROUP BY cc.id" + . " ORDER BY cc.".$categoryOrdering; + } else { + $query = " SELECT cc.id, cc.title, cc.alias, cc.access as cataccess, cc.accessuserid as cataccessuserid, cc.description, cc.metakey, cc.metadesc, pc.title as parenttitle, cc.parent_id as parentid, pc.alias as parentalias" + . " FROM #__phocadownload_categories AS cc" + . " LEFT JOIN #__phocadownload_categories AS pc ON pc.id = cc.parent_id" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " ORDER BY cc.ordering"; + } + + return $query; + } + + + function _getFileOrdering() { + if (empty($this->_file_ordering)) { + $app = JFactory::getApplication(); + $params = $app->getParams(); + $ordering = $params->get( 'file_ordering', 1 ); + $this->_file_ordering = PhocaDownloadOrdering::getOrderingText($ordering); + + } + return $this->_file_ordering; + } + + function _getCategoryOrdering() { + if (empty($this->_category_ordering)) { + + + $app = JFactory::getApplication(); + $params = $app->getParams(); + $ordering = $params->get( 'category_ordering', 1 ); + $this->_category_ordering = PhocaDownloadOrdering::getOrderingText($ordering); + + } + return $this->_category_ordering; + } +} +?> \ No newline at end of file diff --git a/site/models/download.php b/site/models/download.php new file mode 100644 index 0000000..5b308df --- /dev/null +++ b/site/models/download.php @@ -0,0 +1,80 @@ +setState('filter.language',$app->getLanguageFilter()); + } + + function getFile( $downloadToken) { + if (empty($this->_file)) { + $query = $this->_getFileQuery( $downloadToken); + $this->_file = $this->_getList( $query, 0 , 1 ); + + // Don't display file if user has no access + // - - - - - - - - - - - - - - - + if (empty($this->_file)) { + return null; + } + // - - - - - - - - - - - - - - - - + } + return $this->_file; + } + + function _getFileQuery( $downloadToken ) { + + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + $wheres[] = " c.approved = 1"; + $wheres[] = " c.published = 1"; + $wheres[] = " c.token = " . $this->_db->Quote($downloadToken); + + + // Active + $jnow = JFactory::getDate(); + $now = $jnow->toSql(); + $nullDate = $this->_db->getNullDate(); + $wheres[] = ' ( c.publish_up = '.$this->_db->Quote($nullDate).' OR c.publish_up <= '.$this->_db->Quote($now).' )'; + $wheres[] = ' ( c.publish_down = '.$this->_db->Quote($nullDate).' OR c.publish_down >= '.$this->_db->Quote($now).' )'; + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetFile', array (&$wheres, &$joins, $fileId, $params)); + // END GWE MOD + } + + $query = ' SELECT c.*, lc.title AS licensetitle, lc.description AS licensetext, lc.id AS licenseid' + .' FROM #__phocadownload AS c' + .' LEFT JOIN #__phocadownload_licenses AS lc ON lc.id = c.confirm_license' + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + .' WHERE ' . implode( ' AND ', $wheres ) + .' ORDER BY c.ordering'; + + return $query; + } +} +?> \ No newline at end of file diff --git a/site/models/file.php b/site/models/file.php new file mode 100644 index 0000000..e4d7d59 --- /dev/null +++ b/site/models/file.php @@ -0,0 +1,170 @@ +setState('filter.language',$app->getLanguageFilter()); + } + + function getFile( $fileId, $limitstartUrl) { + if (empty($this->_file)) { + $query = $this->_getFileQuery( $fileId ); + $this->_file = $this->_getList( $query, 0 , 1 ); + + // Don't display file if user has no access + // - - - - - - - - - - - - - - - + if (empty($this->_file)) { + return null; + } + + if (isset($this->_file[0]->access)) { + $app = JFactory::getApplication(); + $user = JFactory::getUser(); + + + if (!in_array($this->_file[0]->access, $user->getAuthorisedViewLevels())) { + //$app->redirect(JRoute::_('index.php?option=com_user&view=login', false), JText::_("Please login to download the file")); + // Return URL + $return = 'index.php?option=com_phocadownload&view=file&id='.$this->_file[0]->id.':'.$this->_file[0]->alias. $limitstartUrl . '&Itemid='. $app->input->get('Itemid', 0, 'int'); + $returnUrl = 'index.php?option=com_users&view=login&return='.base64_encode($return); + $app->redirect(JRoute::_($returnUrl, false), JText::_('COM_PHOCADOWNLOAD_PLEASE_LOGIN_DOWNLOAD_FILE')); + return; + } + } else { + return null; + } + // - - - - - - - - - - - - - - - - + } + return $this->_file; + } + + function _getFileQuery( $fileId ) { + + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + $categoryId = 0; + $category = $this->getCategory($fileId); + if (isset($category[0]->id)) { + $categoryId = $category[0]->id; + } + + $wheres[] = " c.catid= ".(int) $categoryId; + $wheres[] = " c.catid= cc.id"; + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND c.access IN ('.$userLevels.') ) )'; + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND cc.access IN ('.$userLevels.') ) )'; + $wheres[] = " c.published = 1"; + $wheres[] = " c.approved = 1"; + $wheres[] = " cc.published = 1"; + $wheres[] = " c.id = " . (int) $fileId; + + if ($this->getState('filter.language')) { + $wheres[] = ' c.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + // Active + $jnow = JFactory::getDate(); + $now = $jnow->toSql(); + $nullDate = $this->_db->getNullDate(); + $wheres[] = ' ( c.publish_up = '.$this->_db->Quote($nullDate).' OR c.publish_up <= '.$this->_db->Quote($now).' )'; + $wheres[] = ' ( c.publish_down = '.$this->_db->Quote($nullDate).' OR c.publish_down >= '.$this->_db->Quote($now).' )'; + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetFile', array (&$wheres, &$joins, $fileId, $params)); + // END GWE MOD + } + + $query = ' SELECT c.*, cc.id AS categoryid, cc.title AS categorytitle, cc.alias AS categoryalias, cc.access as cataccess, cc.accessuserid as cataccessuserid, lc.title AS licensetitle, lc.description AS licensetext, lc.id AS licenseid' + .' FROM #__phocadownload AS c' + .' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = c.catid' + .' LEFT JOIN #__phocadownload_licenses AS lc ON lc.id = c.confirm_license' + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + .' WHERE ' . implode( ' AND ', $wheres ) + .' ORDER BY c.ordering'; + + return $query; + } + + function getCategory($fileId) { + if (empty($this->_category)) { + $query = $this->_getCategoryQuery( $fileId ); + $this->_category= $this->_getList( $query, 0, 1 ); + } + return $this->_category; + } + + function _getCategoryQuery( $fileId ) { + + $wheres = array(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + + $wheres[] = " c.id= ".(int)$fileId; + $wheres[] = " cc.access IN (".$userLevels.")"; + $wheres[] = " cc.published = 1"; + + if ($this->getState('filter.language')) { + $wheres[] = ' c.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetCategory', array (&$wheres, &$joins, $fileId, $params)); + // END GWE MOD + } + + $query = " SELECT cc.id, cc.title, cc.alias, cc.description, cc.access as cataccess, cc.accessuserid as cataccessuserid" + . " FROM #__phocadownload_categories AS cc" + . " LEFT JOIN #__phocadownload AS c ON c.catid = cc.id" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " ORDER BY cc.ordering"; + + + return $query; + } + +} +?> \ No newline at end of file diff --git a/site/models/index.html b/site/models/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/models/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/models/phocadownloadlinkcat.php b/site/models/phocadownloadlinkcat.php new file mode 100644 index 0000000..be70623 --- /dev/null +++ b/site/models/phocadownloadlinkcat.php @@ -0,0 +1,81 @@ +_loadDataSec()) { + + } else { + $this->_initDataSec(); + } + return $this->_data_sec; + }*/ + + function &getDataCat($sectionList) { + if ($this->_loadDataCat($sectionList)) { + + } else { + $this->_initDataCat(); + } + return $this->_data_cat; + } + /* + function _loadDataSec() { + if (empty($this->_data_sec)) { + $query = 'SELECT s.id, s.title' + . ' FROM #__phocadownload_sections AS s' + . ' WHERE s.published = 1' + . ' ORDER BY s.ordering'; + $this->_db->setQuery($query); + $this->_data_sec = $this->_db->loadObjectList(); + return (boolean) $this->_data_sec; + } + return true; + }*/ + /* + function _loadDataCat($sectionList) { + if (empty($this->_data_cat)) { + $query = 'SELECT c.id, c.title, c.section' + .' FROM #__phocadownload_categories AS c' + .' WHERE c.section IN ( \''.$sectionList.'\' )' + .' AND c.published = 1' + .' ORDER BY c.ordering'; + $this->_db->setQuery($query); + $this->_data_cat = $this->_db->loadObjectList(); + return (boolean) $this->_data_cat; + } + return true; + }*/ + /* + function _initDataSec() { + if (empty($this->_data_sec)) { + return (boolean) array(); + } + return true; + }*/ + function _initDataCat() { + if (empty($this->_data_cat)) { + return (boolean) array(); + } + return true; + } +} +?> \ No newline at end of file diff --git a/site/models/phocadownloadlinkfile.php b/site/models/phocadownloadlinkfile.php new file mode 100644 index 0000000..a545932 --- /dev/null +++ b/site/models/phocadownloadlinkfile.php @@ -0,0 +1,214 @@ +toString(); + + // Build the additional URL parameters string. + $params = ''; + + if (!empty($this->additionalUrlParams)) + { + foreach ($this->additionalUrlParams as $key => $value) + { + $params .= '&' . $key . '=' . $value; + } + } + + $data->all = new JPaginationObject(JText::_('JLIB_HTML_VIEW_ALL'), $this->prefix); + + if (!$this->viewall) + { + $data->all->base = '0'; + $data->all->link = $uriS . '' .$params . '&' . $this->prefix . 'limitstart='; + } + + // Set the start and previous data objects. + $data->start = new JPaginationObject(JText::_('JLIB_HTML_START'), $this->prefix); + $data->previous = new JPaginationObject(JText::_('JPREV'), $this->prefix); + + if ($this->pagesCurrent > 1) + { + $page = ($this->pagesCurrent - 2) * $this->limit; + + // Set the empty for removal from route + // @todo remove code: $page = $page == 0 ? '' : $page; + + + + $data->start->base = '0'; + $data->start->link = $uriS . '' . $params . '&' . $this->prefix . 'limitstart=0'; + $data->previous->base = $page; + $data->previous->link = $uriS . '' .$params . '&' . $this->prefix . 'limitstart=' . $page; + + + + } + + // Set the next and end data objects. + $data->next = new JPaginationObject(JText::_('JNEXT'), $this->prefix); + $data->end = new JPaginationObject(JText::_('JLIB_HTML_END'), $this->prefix); + + if ($this->pagesCurrent < $this->pagesTotal) + { + $next = $this->pagesCurrent * $this->limit; + $end = ($this->pagesTotal - 1) * $this->limit; + + $data->next->base = $next; + $data->next->link = $uriS . '' .$params . '&' . $this->prefix . 'limitstart=' . $next; + $data->end->base = $end; + $data->end->link = $uriS . '' .$params . '&' . $this->prefix . 'limitstart=' . $end; + } + + $data->pages = array(); + $stop = $this->pagesStop; + + for ($i = $this->pagesStart; $i <= $stop; $i++) + { + $offset = ($i - 1) * $this->limit; + + $data->pages[$i] = new JPaginationObject($i, $this->prefix); + + if ($i != $this->pagesCurrent || $this->viewall) + { + $data->pages[$i]->base = $offset; + $data->pages[$i]->link = $uriS . '' .$params . '&' . $this->prefix . 'limitstart=' . $offset; + } + else + { + $data->pages[$i]->active = true; + } + } + + return $data; + } +} + +class PhocaDownloadModelPhocaDownloadLinkFile extends JModelLegacy +{ + var $_data = null; + var $_total = null; + var $_pagination = null; + var $_context = 'com_phocadownload.phocadownloadlinkfile'; + + function __construct() { + parent::__construct(); + $app = JFactory::getApplication(); + // Get the pagination request variables + $limit = $app->getUserStateFromRequest( $this->_context.'.list.limit', 'limit', $app->getCfg('list_limit'), 'int' ); + $limitstart = $app->getUserStateFromRequest( $this->_context.'.limitstart', 'limitstart', 0, 'int' ); + // In case limit has been changed, adjust limitstart accordingly + $limitstart = ($limit != 0 ? (floor($limitstart / $limit) * $limit) : 0); + + + $this->setState('limit', $limit); + $this->setState('limitstart', $limitstart); + } + + function getData() { + if (empty($this->_data)) { + $query = $this->_buildQuery(); + $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); + } + return $this->_data; + } + + function getTotal() { + if (empty($this->_total)) { + $query = $this->_buildQuery(); + $this->_total = $this->_getListCount($query); + } + return $this->_total; + } + + function getPagination() { + if (empty($this->_pagination)) { + jimport('joomla.html.pagination'); + $this->_pagination = new PhocaDownloadViewPhocaDownloadLinkFilePagination( $this->getTotal(), $this->getState('limitstart'), $this->getState('limit') ); + } + return $this->_pagination; + } + + function _buildQuery() { + $where = $this->_buildContentWhere(); + $orderby = $this->_buildContentOrderBy(); + + $query = ' SELECT a.*, cc.title AS categorytitle, ag.title AS access_level ' + . ' FROM #__phocadownload AS a ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = a.catid ' + //. ' LEFT JOIN #__phocadownload_sections AS s ON s.id = a.sectionid ' + . ' LEFT JOIN #__viewlevels AS ag ON ag.id = a.access ' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out ' + . $where + . $orderby + ; + + return $query; + } + + function _buildContentOrderBy() { + $app = JFactory::getApplication(); + $filter_order = $app->getUserStateFromRequest( $this->_context.'.filter_order', 'filter_order', 'a.ordering','cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context.'.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + + if ($filter_order == 'a.ordering'){ + $orderby = ' ORDER BY categorytitle, a.ordering '.$filter_order_Dir; + } else { + $orderby = ' ORDER BY '.$filter_order.' '.$filter_order_Dir.', categorytitle, a.ordering '; + } + return $orderby; + } + + function _buildContentWhere() { + $app = JFactory::getApplication(); + $filter_state = $app->getUserStateFromRequest( $this->_context.'.filter_state', 'filter_state', '', 'word' ); + $filter_catid = $app->getUserStateFromRequest( $this->_context.'.catid','catid',0, 'int' ); + //$filter_sectionid = $app->getUserStateFromRequest( $this->_context.'.filter_sectionid', 'filter_sectionid', 0, 'int' ); + $filter_order = $app->getUserStateFromRequest( $this->_context.'.filter_order', 'filter_order', 'a.ordering', 'cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context.'.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + $search = $app->getUserStateFromRequest( $this->_context.'.search','search','','string' ); + $search = JString::strtolower( $search ); + + $where = array(); + + if ($filter_catid > 0) { + $where[] = 'a.catid = '.(int) $filter_catid; + } + if ($search) { + $where[] = 'LOWER(a.title) LIKE '.$this->_db->Quote('%'.$search.'%'); + } + if ( $filter_state ) { + if ( $filter_state == 'P' ) { + $where[] = 'a.published = 1'; + } else if ($filter_state == 'U' ) { + $where[] = 'a.published = 0'; + } + } + + + $where[] = 'a.published = 1'; + $where[] = 'a.approved = 1'; + $where[] = 'a.textonly <> 1'; + + $where = ( count( $where ) ? ' WHERE '. implode( ' AND ', $where ) : '' ); + return $where; + } +} +?> \ No newline at end of file diff --git a/site/models/play.php b/site/models/play.php new file mode 100644 index 0000000..a45e6f8 --- /dev/null +++ b/site/models/play.php @@ -0,0 +1,169 @@ +setState('filter.language',$app->getLanguageFilter()); + + } + + function getFile( $fileId) { + if (empty($this->_file)) { + $query = $this->_getFileQuery( $fileId ); + $this->_file = $this->_getList( $query, 0 , 1 ); + + /* // Don't display file if user has no access + // - - - - - - - - - - - - - - - + if (empty($this->_file)) { + return null; + } + + if (isset($this->_file[0]->access)) { + if ($aid !== null) { + if ($this->_file[0]->access > (int) $aid) { + $app->redirect(JRoute::_('index.php?option=com_users&view=login', false), JText::_("Please login to download the file")); + exit; + } + } else { + return null; + } + } else { + return null; + } + // - - - - - - - - - - - - - - - -*/ + } + return $this->_file; + } + + function _getFileQuery( $fileId ) { + + $app = JFactory::getApplication(); + $params = $app->getParams(); + $categoryId = 0; + $category = $this->getCategory($fileId); + if (isset($category[0]->id)) { + $categoryId = $category[0]->id; + } + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + $wheres[] = " c.catid= ".(int) $categoryId; + $wheres[] = " c.catid= cc.id"; + /*if ($aid !== null) { + + // Should be not displayed, only in case user will add direct url + // IF unaccessible file = 1 then display unaccessible file for all + // IF unaccessible file = 0 then display it only for them who have access to this file + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND c.access <= ' . (int) $aid.') )'; + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND cc.access <= ' . (int) $aid.') )'; + //$wheres[] = "c.access <= " . (int) $aid; + //$wheres[] = "cc.access <= " . (int) $aid; + }*/ + $wheres[] = " c.published = 1"; + $wheres[] = " c.approved = 1"; + $wheres[] = " cc.published = 1"; + + $wheres[] = " c.id = " . (int) $fileId; + + if ($this->getState('filter.language')) { + $wheres[] = ' c.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + // Active + $jnow = JFactory::getDate(); + $now = $jnow->toSql(); + $nullDate = $this->_db->getNullDate(); + $wheres[] = ' ( c.publish_up = '.$this->_db->Quote($nullDate).' OR c.publish_up <= '.$this->_db->Quote($now).' )'; + $wheres[] = ' ( c.publish_down = '.$this->_db->Quote($nullDate).' OR c.publish_down >= '.$this->_db->Quote($now).' )'; + + + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetFile', array (&$wheres, &$joins, $fileId, $params)); + // END GWE MOD + } + + $query = ' SELECT c.*, cc.id AS categoryid, cc.title AS categorytitle, cc.alias AS categoryalias, cc.access as cataccess, cc.accessuserid as cataccessuserid, lc.title AS licensetitle, lc.description AS licensetext' + .' FROM #__phocadownload AS c' + .' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = c.catid' + .' LEFT JOIN #__phocadownload_licenses AS lc ON lc.id = c.confirm_license' + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + .' WHERE ' . implode( ' AND ', $wheres ) + .' ORDER BY c.ordering'; + + return $query; + } + + function getCategory($fileId) { + + if (empty($this->_category)) { + $query = $this->_getCategoryQuery( $fileId ); + $this->_category= $this->_getList( $query, 0, 1 ); + } + return $this->_category; + } + + function _getCategoryQuery( $fileId ) { + + $wheres = array(); + $app = JFactory::getApplication(); + $params = $app->getParams(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $pQ = $params->get( 'enable_plugin_query', 0 ); + + $wheres[] = " c.id= ".(int)$fileId; + $wheres[] = " cc.access IN (".$userLevels.")"; + $wheres[] = " cc.published = 1"; + + if ($this->getState('filter.language')) { + $wheres[] = ' c.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + $wheres[] = ' cc.language IN ('.$this->_db->Quote(JFactory::getLanguage()->getTag()).','.$this->_db->Quote('*').')'; + } + + if ($pQ == 1) { + // GWE MOD - to allow for access restrictions + JPluginHelper::importPlugin("phoca"); + $dispatcher =& JDispatcher::getInstance(); + $joins = array(); + $results = $dispatcher->trigger('onGetCategory', array (&$wheres, &$joins,$categoryId, $params)); + // END GWE MOD + } + + $query = " SELECT cc.id, cc.title, cc.alias, cc.image, cc.image_position, cc.description" + . " FROM #__phocadownload_categories AS cc" + . " LEFT JOIN #__phocadownload AS c ON c.catid = cc.id" + . ($pQ == 1 ? ((count($joins)>0?( " LEFT JOIN " .implode( " LEFT JOIN ", $joins )):"")):"") // GWE MOD + . " WHERE " . implode( " AND ", $wheres ) + . " ORDER BY cc.ordering"; + return $query; + } + +} +?> \ No newline at end of file diff --git a/site/models/ratingfilea.php b/site/models/ratingfilea.php new file mode 100644 index 0000000..832c8bc --- /dev/null +++ b/site/models/ratingfilea.php @@ -0,0 +1,53 @@ +getTable('phocadownloadfilevotes'); + + if (!$row->bind($data)) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + $row->date = gmdate('Y-m-d H:i:s'); + + $row->published = 1; + + if (!$row->id) { + $where = 'fileid = ' . (int) $row->fileid ; + $row->ordering = $row->getNextOrder( $where ); + } + + if (!$row->check()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + if (!$row->store()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Update the Vote Statistics + if (!PhocaDownloadRate::updateVoteStatisticsFile( $data['fileid'])) { + return false; + } + + return true; + } +} +?> diff --git a/site/models/user.php b/site/models/user.php new file mode 100644 index 0000000..c6ccd36 --- /dev/null +++ b/site/models/user.php @@ -0,0 +1,580 @@ +getUserStateFromRequest( $this->_context_files.'.list.limit', 'limit', 20, 'int' ); + $limitstart_files = $app->input->get('limitstart', 0, 'int'); + $limitstart_files = ($limit_files != 0 ? (floor($limitstart_files / $limit_files) * $limit_files) : 0); + $this->setState($this->_context_files.'.list.limit', $limit_files); + $this->setState($this->_context_files.'.list.limitstart', $limitstart_files); + + } + + function getDataFiles($userId) { + if (empty($this->_data_files)) { + $query = $this->_buildQueryFiles($userId); + $this->_data_files = $this->_getList($query, $this->getState($this->_context_files.'.list.limitstart'), $this->getState($this->_context_files.'.list.limit')); + + } + return $this->_data_files; + } + + function getTotalFiles($userId) { + if (empty($this->_total_files)) { + $query = $this->_buildQueryFiles($userId); + $this->_total_files = $this->_getListCount($query); + } + return $this->_total_files; + } + + function getPaginationFiles($userId) { + if (empty($this->_pagination_files)) { + jimport('joomla.html.pagination'); + $this->_pagination_files = new JPagination( $this->getTotalFiles($userId), $this->getState($this->_context_files.'.list.limitstart'), $this->getState($this->_context_files.'.list.limit') ); + } + return $this->_pagination_files; + } + + function _buildQueryFiles($userId) { + $where = $this->_buildContentWhereFiles($userId); + $orderby = $this->_buildContentOrderByFiles(); + + $query = ' SELECT a.*, cc.title AS categorytitle, u.name AS editor, ag.title AS access_level, us.id AS ownerid, us.username AS ownername ' + . ' FROM #__phocadownload AS a ' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = a.catid' + . ' LEFT JOIN #__viewlevels AS ag ON ag.id = a.access' + . ' LEFT JOIN #__users AS u ON u.id = a.checked_out' + . ' LEFT JOIN #__users AS us ON us.id = a.owner_id' + . $where + . $orderby; + return $query; + } + + + function _buildContentOrderByFiles() { + $app = JFactory::getApplication(); + $filter_order = $app->getUserStateFromRequest( $this->_context_files.'.filter_order', 'filter_order', 'a.ordering', 'cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context_files.'.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + + if ($filter_order == 'a.ordering'){ + $orderby = ' ORDER BY categorytitle, a.ordering '.$filter_order_Dir; + } else { + $orderby = ' ORDER BY '.$filter_order.' '.$filter_order_Dir.' , categorytitle, a.ordering '; + } + return $orderby; + } + + function _buildContentWhereFiles($userId) { + $app = JFactory::getApplication(); + $filter_state = $app->getUserStateFromRequest( $this->_context_files.'.filter_state','filter_state','', 'word' ); + $filter_catid = $app->getUserStateFromRequest( $this->_context_files.'.catid','catid',0,'int' ); + //$filter_sectionid = $app->getUserStateFromRequest( $this->_context_files.'.filter_sectionid', 'filter_sectionid', 0, 'int' ); + $filter_order = $app->getUserStateFromRequest( $this->_context_files.'.filter_order','filter_order','a.ordering','cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context_files.'.filter_order_Dir','filter_order_Dir_files', '', 'word' ); + $search = $app->getUserStateFromRequest( $this->_context_files.'.search', 'search', '', 'string' ); + $search = JString::strtolower( $search ); + + $where = array(); + + $where[] = 'a.owner_id = '.(int)$userId; + $where[] = 'a.owner_id > 0'; // Ignore -1 + + if ($filter_catid > 0) { + $where[] = 'a.catid = '.(int) $filter_catid; + } + if ($search) { + $where[] = 'LOWER(a.title) LIKE '.$this->_db->Quote('%'.$search.'%'); + } + if ( $filter_state ) { + if ( $filter_state == 'P' ) { + $where[] = 'a.published = 1'; + } else if ($filter_state == 'U' ) { + $where[] = 'a.published = 0'; + } + } + //if ( $filter_sectionid ) { + // $where[] = 'cc.section = '.(int)$filter_sectionid; + //} + $where = ( count( $where ) ? ' WHERE '. implode( ' AND ', $where ) : '' ); + return $where; + } + + + + + + /* + * Add Image + */ +/* + function storefile($data, $return, $edit = false) { + + if (!$edit) { + //If this file doesn't exists don't save it + if (!phocadownloadFile::existsFileOriginal($data['filename'])) { + $this->setError('File not exists'); + return false; + } + + $data['imgorigsize'] = phocadownloadFile::getFileSize($data['filename'], 0); + + //If there is no title and no alias, use filename as title and alias + if (!isset($data['title']) || (isset($data['title']) && $data['title'] == '')) { + $data['title'] = phocadownloadFile::getTitleFromFile($data['filename']); + } + + if (!isset($data['alias']) || (isset($data['alias']) && $data['alias'] == '')) { + $data['alias'] = phocadownloadFile::getTitleFromFile($data['filename']); + } + + //clean alias name (no bad characters) + $data['alias'] = phocadownloadText::getAliasName($data['alias']); + + } else { + $data['alias'] = phocadownloadText::getAliasName($data['title']); + } + + $row = $this->getTable('phocadownload'); + + + if(isset($data['id']) && $data['id'] > 0) { + if (!$row->load($data['id'])) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + } + + // Bind the form fields to the Phoca gallery table + if (!$row->bind($data)) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Create the timestamp for the date + $row->date = gmdate('Y-m-d H:i:s'); + + // if new item, order last in appropriate group + if (!$row->id) { + $where = 'catid = ' . (int) $row->catid ; + $row->ordering = $row->getNextOrder( $where ); + } + + // Make sure the Phoca gallery table is valid + if (!$row->check()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Store the Phoca gallery table to the database + if (!$row->store()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + if(!$edit) { + //Create thumbnail small, medium, large + $returnFrontMessage = phocadownloadFileThumbnail::getOrCreateThumbnail($row->filename, $return, 1, 1, 1, 1); + + if ($returnFrontMessage == 'Success') { + return true; + } else { + return false; + } + } else { + if (isset($row->id)) { + return $row->id; + } else { + return false; + } + } + } + */ + + function singleFileUpload(&$errUploadMsg, $file, $post) { + + $app = JFactory::getApplication();; + JRequest::checkToken( 'request' ) or jexit( 'Invalid Token' ); + jimport('joomla.client.helper'); + $user = JFactory::getUser(); + $ftp = JClientHelper::setCredentialsFromRequest('ftp'); + $path = PhocaDownloadPath::getPathSet(); + $folder = $app->input->get( 'folder', '', '', 'path' ); + $format = $app->input->get( 'format', 'html', '', 'cmd'); + $return = $app->input->get( 'return-url', null, 'post', 'base64' ); + $viewBack = $app->input->get( 'viewback', '', 'post', 'string' ); + //$catid = $app->input->get( 'catid', '', '', 'int' ); + $paramsC = JComponentHelper::getParams('com_phocadownload') ; + + $overwriteExistingFiles = $paramsC->get( 'overwrite_existing_files', 0 ); + + // USER RIGHT - UPLOAD - - - - - - - - - - - + // 2, 2 means that user access will be ignored in function getUserRight for display Delete button + $rightDisplayUpload = 0; + $catAccess = PhocaDownloadAccess::getCategoryAccess((int)$post['catidfiles']); + if (!empty($catAccess)) { + $rightDisplayUpload = PhocaDownloadAccess::getUserRight('uploaduserid', $catAccess->uploaduserid, 2, array(0 => 2), $user->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + + /*$post['sectionid'] = $this->getSection((int)$post['catidfiles']); + if(!$post['sectionid']) { + $errUploadMsg = JText::_('COM_PHOCADOWNLOAD_WRONG_SECTION'); + return false; + }*/ + + //$userFolder = substr(md5($user->username),0, 10); + $userFolder = htmlspecialchars(strip_tags($user->username)); + if ($rightDisplayUpload == 1) { + + // Make the filename safe + if (isset($file['name'])) { + $file['name'] = JFile::makeSafe($file['name']); + } + + if($file['tmp_name'] == '') { + $errUploadMsg = JText::_("COM_PHOCADOWNLOAD_ERROR_SERVER_NOT_ABLE_TO_STORE_FILE_TEMP_FOLDER"); + return false; + } + + if (isset($file['name'])) { + $filepath = JPath::clean($path['orig_abs_user_upload']. DS. $userFolder . DS.$file['name']); + $filepathUserFolder = JPath::clean($path['orig_abs_user_upload']. DS. $userFolder); + if (!PhocaDownloadFileUpload::canUpload( $file, $errUploadMsg, 'file', 2 )) { + + if ($errUploadMsg == 'COM_PHOCADOWNLOAD_WARNUSERFILESTOOLARGE') { + $errUploadMsg = JText::_($errUploadMsg) . ' ('.PhocaDownloadFile::getFileSizeReadable($file['size']).')'; + } else { + $errUploadMsg = JText::_($errUploadMsg); + } + + return false; + } + + if (JFile::exists($filepath) && $overwriteExistingFiles == 0) { + $errUploadMsg = JText::_("COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS"); + return false; + } + + // Overwrite file and add no new item to database + $fileExists = 0; + if (JFile::exists($filepath) && $overwriteExistingFiles == 1) { + $fileExists = 1; + } + + if (!JFile::upload($file['tmp_name'], $filepath)) { + $errUploadMsg = JText::_("COM_PHOCADOWNLOAD_UNABLE_TO_UPLOAD_FILE"); + return false; + } else { + + // Saving file name into database with relative path + if (!JFile::exists($filepathUserFolder . DS ."index.html")) { + $data = "\n\n\n"; + JFile::write($filepathUserFolder . DS ."index.html", $data); + } + $file['namepap'] = $file['name']; + $file['name'] = 'userupload/'.$userFolder.'/' . $file['name']; + $succeeded = false; + + // ================================================= + // Make a copy for play and preview + $papCopy = $paramsC->get( 'pap_copy', 0 ); + if ($papCopy == 1 || $papCopy == 3) { + $canPlay = PhocaDownloadFile::canPlay($file['namepap']); + $canPreview = PhocaDownloadFile::canPreview($file['namepap']); + $filepathPAP = JPath::clean($path['orig_abs_user_upload_pap']. DS. $userFolder . DS.$file['namepap']); + $filepathUserFolderPAP = JPath::clean($path['orig_abs_user_upload_pap']. DS. $userFolder); + + if ($canPlay || $canPreview) { + + $uploadPAP = 1;// upload file for preview and play + if (JFile::exists($filepathPAP) && $overwriteExistingFiles == 0) { + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_FILE_ALREADY_EXISTS"); + //return false; + $uploadPAP = 0; // don't upload if it exists, it is not main file, don't do false and exit + } + + // Overwrite file and add no new item to database + $fileExistsPAP = 0; + if (JFile::exists($filepathPAP) && $overwriteExistingFiles == 1) { + $fileExistsPAP = 1; + } + + if ($uploadPAP == 0) { + + } else { + if (!JFolder::exists($filepathUserFolderPAP)) { + if (JFolder::create($filepathUserFolderPAP)) { + $data = "\n\n\n"; + JFile::write($filepathUserFolderPAP . DS ."index.html", $data); + } + // else { + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_UNABLE_TO_CREATE_FOLDER"); + //return false; + //} + } + + if (!JFile::copy($filepath, $filepathPAP)) { + + //$errUploadMsg = JText::_("COM_PHOCADOWNLOAD_UNABLE_TO_UPLOAD_FILE"); + //return false; + } else { + // Saving file name into database with relative path + if (!JFile::exists($filepathUserFolderPAP . DS ."index.html")) { + $data = "\n\n\n"; + JFile::write($filepathUserFolderPAP . DS ."index.html", $data); + } + + if ($canPlay == 1) { + $post['filename_play'] = 'userupload/'.$userFolder.'/' . $file['namepap']; + } else if ($canPreview == 1) { + $post['filename_preview'] = 'userupload/'.$userFolder.'/' . $file['namepap']; + } + } + } + } + } + // ============================================== + + if ($this->_save($post, $file['name'], $errUploadMsg, $fileExists)) { + + return true; + } else { + return false; + } + } + } else { + $errUploadMsg = JText::_("COM_PHOCADOWNLOAD_WARNFILETYPE"); + $redirectUrl = $return; + return false; + } + } else { + $errUploadMsg = JText::_("COM_PHOCADOWNLOAD_NOT_AUTHORISED_TO_UPLOAD"); + + return false; + } + return false; + + + } + + function _save($data, $filename, &$errSaveMsg, $fileExists = 0) { + + $user = JFactory::getUser(); + $fileId = false; + if ($fileExists == 1) { + // We not only owerwrite the file but we must update it + if (isset($filename) && $filename != '') { + + $db = JFactory::getDBO(); + + $query = 'SELECT a.id AS id' + .' FROM #__phocadownload AS a' + .' WHERE a.filename = '.$db->Quote($filename); + + $db->setQuery($query, 0, 1); + $fileId = $db->loadObject(); + + if (!$db->query()) { + $this->setError($db->getErrorMsg()); + return false; + } + } + } + + $row = $this->getTable('phocadownload'); + + if (isset($fileId->id) && (int)$fileId->id > 0) { + $data['id'] = (int)$fileId->id; + } + + + + $data['filesize'] = PhocaDownloadFile::getFileSize($filename, 0); + + $data['userid'] = $user->id; + $data['author_email'] = $data['email']; + $data['author_url'] = $data['website']; + + $data['token'] = PhocaDownloadUtils::getToken($data['title'].$filename); + //$data['token'] = PhocaDownloadUtils::getToken($data['title'].$data['filename']); + + // Bind the form fields to the Phoca gallery table + if (!$row->bind($data)) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + + + // Create the timestamp for the date + //$row->date = gmdate('Y-m-d H:i:s'); + //$row->publish_up = gmdate('Y-m-d H:i:s'); + //$jnow =JFactory::getDate(); + /*$jnowU = $jnow->toUnix(); + if (isset($jnowU)) { + $jnowU = (int)$jnowU - 2; // to not display pending because of 1 second + }*/ + + $unow = time(); + $unow = $unow - 2;//Frontend will display pending if standard $jnow->toSql(); will be used + $jnow = JFactory::getDate($unow);// the class JDate construct works with unix date + $now = $jnow->toSql(); + + $row->date = $now; + $row->publish_up = $now; //date('Y-m-d H:i:s', $jnowU); + $row->publish_down = null; + $row->filename = $filename; + $row->catid = $data['catidfiles']; + + // Lang + $userLang = PhocaDownloadUser::getUserLang(); + $row->language = $userLang['lang']; + + + // if new item, order last in appropriate group + if (!$row->id) { + $where = 'catid = ' . (int) $row->catid ; + $row->ordering = $row->getNextOrder( $where ); + } + + // Make sure the Phoca gallery table is valid + if (!$row->check()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // Store the Phoca gallery table to the database + if (!$row->store()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + PhocaDownloadLog::log($row->id, 2); + + return true; + } + /* + function getSection($catid) { + + $query = 'SELECT c.section' + . ' FROM #__phocadownload_categories AS c' + . ' WHERE c.id = '.(int)$catid; + + $this->_db->setQuery( $query ); + $sectionId = $this->_db->loadObject(); + + if (isset($sectionId->section)) { + return $sectionId->section; + } + return false; + }*/ + + function isOwnerCategoryFile($userId, $fileId) { + + $query = 'SELECT cc.id' + . ' FROM #__phocadownload_categories AS cc' + . ' LEFT JOIN #__phocadownload AS a ON a.catid = cc.id' + . ' WHERE cc.owner_id = '.(int)$userId + . ' AND a.id = '.(int)$fileId; + + $this->_db->setQuery( $query ); + $ownerCategoryId = $this->_db->loadObject(); + if (isset($ownerCategoryId->id)) { + return $ownerCategoryId->id; + } + return false; + } + + function publish($id = 0, $publish = 1) { + + //$user = JFactory::getUser(); + $query = 'UPDATE #__phocadownload AS a' + //. ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = a.catid ' + . ' SET a.published = '.(int) $publish + . ' WHERE a.id = '.(int)$id; + //. ' AND cc.owner_id = '.(int) $user->get('id'); + + $this->_db->setQuery( $query ); + if (!$this->_db->query()) { + $this->setError('Database Error Publishing'); + return false; + } + return true; + } + + function delete($id = 0) { + + $paramsC = JComponentHelper::getParams('com_phocadownload'); + $deleteExistingFiles = $paramsC->get( 'delete_existing_files', 0 ); + + // - - - - - - - - - - - - - + // Get all filenames we want to delete from database, we delete all thumbnails from server of this file + $queryd = 'SELECT filename as filename FROM #__phocadownload WHERE id = '.(int)$id; + $this->_db->setQuery($queryd); + $fileObject = $this->_db->loadObjectList(); + // - - - - - - - - - - - - - + + $query = 'DELETE FROM #__phocadownload' + . ' WHERE id ='.(int)$id; + + $this->_db->setQuery( $query ); + if(!$this->_db->query()) { + $this->setError('Database Error - Delete Files'); + return false; + } + + // Delete tags + $query = 'DELETE FROM #__phocadownload_tags_ref' + . ' WHERE fileid ='.(int)$id; + + $this->_db->setQuery( $query ); + if(!$this->_db->query()) { + $this->setError('Database Error - Delete Tags (Files)'); + return false; + } + + // - - - - - - - - - - - - - - + // DELETE FILES ON SERVER + if ($deleteExistingFiles == 1) { + $path = PhocaDownloadPath::getPathSet(); + foreach ($fileObject as $key => $value) { + //The file can be stored in other category - don't delete it from server because other category use it + $querys = "SELECT id as id FROM #__phocadownload WHERE filename='".$value->filename."' "; + $this->_db->setQuery($querys); + $sameFileObject = $this->_db->loadObject(); + // same file in other category doesn't exist - we can delete it + if (!$sameFileObject) { + JFile::delete(JPath::clean($path['orig_abs_ds'].$value->filename)); + } + } + } + + return true; + } +} +?> \ No newline at end of file diff --git a/site/phocadownload.php b/site/phocadownload.php new file mode 100644 index 0000000..f9415d4 --- /dev/null +++ b/site/phocadownload.php @@ -0,0 +1,54 @@ +execute( JFactory::getApplication()->input->get('task') ); +$controller->redirect(); +?> \ No newline at end of file diff --git a/site/router.php b/site/router.php new file mode 100644 index 0000000..96bd3bc --- /dev/null +++ b/site/router.php @@ -0,0 +1,228 @@ +getMenu(); + $items = $menu->getItems('component', 'com_phocadownload'); + + } + + // Search for an appropriate menu item. + if (is_array($items)) + { + // If only the option and itemid are specified in the query, return that item. + if (!isset($query['view']) && !isset($query['id']) && !isset($query['catid']) && !isset($query['download']) && isset($query['Itemid'])) { + $itemid = (int) $query['Itemid']; + } + + + // ------------------------------------------------------ + // Search for a specific link based on the critera given. + if (!$itemid) + { + foreach ($items as $item) + { + // Check if this menu item links to this view. + if (isset($item->query['view']) && $item->query['view'] == 'category' + + && isset($query['view']) && $query['view'] != 'file' + && isset($query['view']) && $query['view'] != 'play' + && isset($item->query['id']) && isset($query['id']) && $item->query['id'] == $query['id']) { + $itemid = $item->id; + } + + else if (isset($item->query['view']) && $item->query['view'] == 'file' + && isset($query['view']) && $query['view'] != 'category' + + && isset($query['view']) && $query['view'] != 'play' + && isset($item->query['id']) && isset($query['id']) && $item->query['id'] == $query['id']) { + $itemid = $item->id; + } + else if (isset($item->query['view']) && $item->query['view'] == 'play' + && isset($query['view']) && $query['view'] != 'category' + + && isset($query['view']) && $query['view'] != 'file' + && isset($item->query['id']) && isset($query['id']) && $item->query['id'] == $query['id']) { + $itemid = $item->id; + } + } + + } + } + + // Check if the router found an appropriate itemid. + if (!$itemid) { + // Check if a category was specified + if (isset($query['id'])) { // Check if a id was specified. + if (isset($query['alias'])) { + $query['id'] .= ':'.$query['alias']; + } + + // Push the id onto the stack. + //$segments[] = $query['id']; + if(isset($query['view'])) {$segments[] = $query['view'];} + $segments[] = $query['id']; + unset($query['view']); + unset($query['id']); + unset($query['alias']); + unset($query['catid']); + unset($query['catalias']); + + } else { + // Categories view. + unset($query['view']); + } + } else { + $query['Itemid'] = $itemid; + // Remove the unnecessary URL segments. + unset($query['view']); + unset($query['id']); + unset($query['alias']); + } + + return $segments; +} + +/** + * Method to parse Route + * @param array $segments + */ +function PhocaDownloadParseRoute($segments) +{ + $vars = array(); + + //Get the active menu item + $app = JFactory::getApplication(); + $menu = $app->getMenu(); + $item = $menu->getActive(); + + + // Count route segments + $count = count($segments); + + //Standard routing + if(!isset($item)) { + if($count == 3 ) { + $vars['view'] = $segments[$count - 3]; + } else if ($count == 2) { + $vars['view'] = $segments[$count - 2]; + } else { + $vars['view'] = 'category'; + } + $vars['id'] = $segments[$count - 1]; + + } else { + //Handle View and Identifier + + switch($item->query['view']) + { + case 'categories' : + if($count == 1) { + $vars['view'] = 'categories'; + $vars['id'] = $segments[$count-1]; + } + + if($count == 2) { + $vars['view'] = $segments[$count-2]; + $vars['id'] = $segments[$count-1]; + } + break; + + + + case 'category' : + if($count == 1) { + $vars['view'] = 'category'; + } + + if($count == 2) { + $vars['view'] = $segments[$count-2]; + $vars['id'] = $segments[$count-1]; + } + break; + + case 'file' : + if($count == 1) { + $vars['view'] = 'file'; + } + + if($count == 2) { + $vars['view'] = $segments[$count-2]; + $vars['id'] = $segments[$count-1]; + } + + break; + case 'play' : + if($count == 1) { + $vars['view'] = 'play'; + } + + if($count == 2) { + $vars['view'] = $segments[$count-2]; + $vars['id'] = $segments[$count-1]; + } + + break; + + // Guestbook Report + case 'guestbook' : + if($count == 1) { + $vars['view'] = 'guestbook'; + } + + if($count == 2) { + $vars['view'] = $segments[$count-2]; + $vars['id'] = $segments[$count-1]; + } + + break; + case 'download' : + if($count == 1) { + $vars['view'] = 'download'; + } + + if($count == 2) { + $vars['view'] = $segments[$count-2]; + $vars['id'] = $segments[$count-1]; + } + + break; + + } + } + return $vars; +} +?> \ No newline at end of file diff --git a/site/views/categories/index.html b/site/views/categories/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/categories/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/categories/metadata.xml b/site/views/categories/metadata.xml new file mode 100644 index 0000000..b6b6249 --- /dev/null +++ b/site/views/categories/metadata.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/site/views/categories/tmpl/default.php b/site/views/categories/tmpl/default.php new file mode 100644 index 0000000..c338343 --- /dev/null +++ b/site/views/categories/tmpl/default.php @@ -0,0 +1,204 @@ +t['p']->get( 'pageclass_sfx' ).'">'; + +if ( $this->t['p']->get( 'show_page_heading' ) ) { + echo '

    '. $this->escape($this->t['p']->get('page_heading')) . '

    '; +} + +if ( $this->t['description'] != '') { + echo '
    '. $this->t['description']. '
    '; +} + + +if (!empty($this->t['categories'])) { + $i = 1; + foreach ($this->t['categories'] as $value) { + + // Categories + $numDoc = 0; + $numSubcat = 0; + $catOutput = ''; + if (!empty($value->subcategories)) { + foreach ($value->subcategories as $valueCat) { + + // USER RIGHT - Access of categories - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (!empty($valueCat)) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $valueCat->accessuserid, $valueCat->access, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); + + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplay == 1) { + + $catOutput .= '
    '; + $catOutput .= ''. $valueCat->title.''; + + if ($this->t['displaynumdocsecs'] == 1) { + $catOutput .=' ('.$valueCat->numdoc .')'; + } + $catOutput .= '
    ' . "\n"; + $numDoc = (int)$valueCat->numdoc + (int)$numDoc; + $numSubcat++; + } + } + } + + // Don't display parent category + // - if there is no catoutput + // - if there is no rigths for it + + // USER RIGHT - Access of parent category - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (!empty($value)) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $value->accessuserid, $value->access, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); + + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplay == 1) { + +// ===================================================================================== +// BEGIN LAYOUT AREA +// ===================================================================================== + + $pdTitle = ''. $value->title.''; + + if ($this->t['displaynumdocsecsheader'] == 1) { + $numDocAll = (int)$numDoc + (int)$value->numdoc; + //$numDoc ... only files in subcategories + //$value->numdoc ... only files in the main category + //$numDocAll ... files in category and in subcategories + $pdTitle .= ' ('.$numSubcat.'/' . $numDocAll .')'; + } + + + $pdDesc = ''; + $pdSubcategories = ''; + if ($this->t['displaymaincatdesc'] == 1) { + $pdDesc .= $value->description; + } else { + if ($catOutput != '') { + $pdSubcategories .= $catOutput; + } else { + $pdSubcategories .= '
    '.JText::_('COM_PHOCADOWNLOAD_NO_SUBCATEGORIES').'
    '; + } + } + + $pdClear = ''; + if ($i%3==0) { + $pdClear .= '
    '; + } + $i++; + + + + + // --------------------------------------------------- + //Convert + // --------------------------------------------------- + if ($this->t['display_specific_layout'] == 0) { + echo '
    '; + echo '
    '.$pdTitle.'
    '; + if ($pdDesc != '') { echo '
    '.$pdDesc.'
    ';} + echo $pdSubcategories; + echo '
    '; + echo $pdClear; + } else { + $categoriesLayout = PhocaDownloadSettings::getLayoutText('categories'); + + /*'
    +
    {pdtitle}
    + {pdsubcategories} + {pdclear} +
    '; + //
    {pdDescription}
    */ + + $categoriesLayoutParams = PhocaDownloadSettings::getLayoutParams('categories'); + + $replace = array($pdTitle, $pdDesc, $pdSubcategories, $pdClear); + $output = str_replace($categoriesLayoutParams['search'], $replace, $categoriesLayout); + + echo $output; + } + } + } +} +echo '' + .'
    '; + + +// - - - - - - - - - - +// Most viewed docs (files) +// - - - - - - - - - - +$outputFile = ''; + +if (!empty($this->t['mostvieweddocs']) && $this->t['displaymostdownload'] == 1) { + $l = new PhocaDownloadLayout(); + foreach ($this->t['mostvieweddocs'] as $value) { + // USER RIGHT - Access of categories (if file is included in some not accessed category) - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (!empty($value)) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $value->cataccessuserid, $value->cataccess, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplay == 1) { + // FILESIZE + if ($value->filename !='') { + $absFile = str_replace('/', DS, JPath::clean($this->t['absfilepath'] . $value->filename)); + if (JFile::exists($absFile)) { + $fileSize = PhocaDownloadFile::getFileSizeReadable(filesize($absFile)); + } else { + $fileSize = ''; + } + } + + // IMAGE FILENAME + //$imageFileName = ''; + //if ($value->image_filename !='') { + $imageFileName = $l->getImageFileName($value->image_filename, $value->filename, 2); + /*$thumbnail = false; + $thumbnail = preg_match("/phocathumbnail/i", $value->image_filename); + if ($thumbnail) { + $imageFileName = ''; + } else { + $imageFileName = 'style="background: url(\''.$this->t['cssimgpath'].$value->image_filename.'\') 0 center no-repeat;"'; + }*/ + //} + + //$outputFile .= '
    '; + + $outputFile .= '
    '. $imageFileName['filenamethumb'] + . '
    '; + + $outputFile .= ''. $value->title.'' + .' (' .$value->categorytitle.')'; + + $outputFile .= PhocaDownloadRenderFront::displayNewIcon($value->date, $this->t['displaynew']); + $outputFile .= PhocaDownloadRenderFront::displayHotIcon($value->hits, $this->t['displayhot']); + + $outputFile .= '
    ' . "\n"; + } + } + + if ($outputFile != '') { + echo '
     
    '; + echo '
    '; + echo '

    '. JText::_('COM_PHOCADOWNLOAD_MOST_DOWNLOADED_FILES').'

    '; + echo $outputFile; + echo '
    '; + } +} +echo '
     
    '; +echo $this->t['dw']; +?> diff --git a/site/views/categories/tmpl/default.xml b/site/views/categories/tmpl/default.xml new file mode 100644 index 0000000..1362469 --- /dev/null +++ b/site/views/categories/tmpl/default.xml @@ -0,0 +1,30 @@ + + + + + + + + + COM_PHOCADOWNLOAD_CATEGORIES_LIST_LAYOUT + COM_PHOCADOWNLOAD_CATEGORIES_LIST_LAYOUT_DESC + + +
    + + + + + + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/site/views/categories/tmpl/index.html b/site/views/categories/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/categories/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/categories/view.html.php b/site/views/categories/view.html.php new file mode 100644 index 0000000..23a55ea --- /dev/null +++ b/site/views/categories/view.html.php @@ -0,0 +1,112 @@ +getModel(); + $document = JFactory::getDocument(); + $this->t['dw'] = PhocaDownloadRenderFront::renderPhocaDownload(); + $this->t['p'] = $app->getParams(); + $this->t['user'] = JFactory::getUser(); + $this->t['categories'] = $model->getCategoriesList(); + $this->t['mostvieweddocs'] = $model->getMostViewedDocsList($this->t['p']); + + $this->t['displaynew'] = $this->t['p']->get( 'display_new', 0 ); + $this->t['displayhot'] = $this->t['p']->get( 'display_hot', 0 ); + $this->t['displaymostdownload'] = $this->t['p']->get( 'display_most_download', 1 ); + $this->t['displaynumdocsecs'] = $this->t['p']->get( 'display_num_doc_secs', 0 ); + $this->t['displaynumdocsecsheader'] = $this->t['p']->get( 'display_num_doc_secs_header', 1 ); + $this->t['file_icon_size_md'] = $this->t['p']->get( 'file_icon_size_md', 16 ); + $this->t['download_metakey'] = $this->t['p']->get( 'download_metakey', '' ); + $this->t['download_metadesc'] = $this->t['p']->get( 'download_metadesc', '' ); + $this->t['description'] = $this->t['p']->get( 'description', '' ); + $this->t['displaymaincatdesc'] = $this->t['p']->get( 'display_main_cat_desc', 0 ); + $this->t['display_specific_layout'] = $this->t['p']->get( 'display_specific_layout', 0 ); + + PhocaDownloadRenderFront::renderAllCSS(); + + $imagePath = PhocaDownloadPath::getPathSet('icon'); + $this->t['cssimgpath'] = str_replace ( '../', JURI::base(true).'/', $imagePath['orig_rel_ds']); + $filePath = PhocaDownloadPath::getPathSet('file'); + $this->t['absfilepath'] = $filePath['orig_abs_ds']; + + $this->_prepareDocument(); + parent::display($tpl); + + } + + protected function _prepareDocument() { + + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $menu = $menus->getActive(); + $pathway = $app->getPathway(); + $title = null; + + $this->t['downloadmetakey'] = $this->t['p']->get( 'download_metakey', '' ); + $this->t['downloadmetadesc'] = $this->t['p']->get( 'download_metadesc', '' ); + + if ($menu) { + $this->t['p']->def('page_heading', $this->t['p']->get('page_title', $menu->title)); + } else { + $this->t['p']->def('page_heading', JText::_('JGLOBAL_ARTICLES')); + } +/* + $title = $this->t['p']->get('page_heading', ''); + if (empty($title)) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0)) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + } + //$this->document->setTitle($title); + + if (empty($title) || (isset($title) && $title == '')) { + $title = $this->item->title; + } + $this->document->setTitle($title);*/ + + $title = $this->t['p']->get('page_title', ''); + if (empty($title)) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0) == 1) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + } else if ($app->getCfg('sitename_pagetitles', 0) == 2) { + $title = JText::sprintf('JPAGETITLE', $title, htmlspecialchars_decode($app->getCfg('sitename'))); + } + $this->document->setTitle($title); + + + + if ($this->t['downloadmetadesc'] != '') { + $this->document->setDescription($this->t['downloadmetadesc']); + } else if ($this->t['p']->get('menu-meta_description', '')) { + $this->document->setDescription($this->t['p']->get('menu-meta_description', '')); + } + + if ($this->t['downloadmetakey'] != '') { + $this->document->setMetadata('keywords', $this->t['downloadmetakey']); + } else if ($this->t['p']->get('menu-meta_keywords', '')) { + $this->document->setMetadata('keywords', $this->t['p']->get('menu-meta_keywords', '')); + } + + if ($app->getCfg('MetaTitle') == '1' && $this->t['p']->get('menupage_title', '')) { + $this->document->setMetaData('title', $this->t['p']->get('page_title', '')); + } + } +} +?> \ No newline at end of file diff --git a/site/views/category/index.html b/site/views/category/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/category/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/category/metadata.xml b/site/views/category/metadata.xml new file mode 100644 index 0000000..5c8f97c --- /dev/null +++ b/site/views/category/metadata.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/site/views/category/tmpl/default.php b/site/views/category/tmpl/default.php new file mode 100644 index 0000000..fb41157 --- /dev/null +++ b/site/views/category/tmpl/default.php @@ -0,0 +1,126 @@ +t['p']->get( 'pageclass_sfx' ).'">'; + +if ( $this->t['p']->get( 'show_page_heading' ) ) { + echo '

    '. $this->escape($this->t['p']->get('page_heading')) . '

    '; +} +// Search by tags - the category rights must be checked for every file +$this->checkRights = 1; +// ------------------------------------------------------------------- +if ((int)$this->t['tagid'] > 0) { + + echo $this->loadTemplate('files'); + $this->checkRights = 1; + if (count($this->files)) { + echo $this->loadTemplate('pagination'); + } +} else { + if (!empty($this->category[0])) { + echo '
    '; + if ($this->t['display_up_icon'] == 1) { + + if (isset($this->category[0]->parentid)) { + if ($this->category[0]->parentid == 0) { + + $linkUp = JRoute::_(PhocaDownloadRoute::getCategoriesRoute()); + $linkUpText = JText::_('COM_PHOCADOWNLOAD_CATEGORIES'); + } else if ($this->category[0]->parentid > 0) { + $linkUp = JRoute::_(PhocaDownloadRoute::getCategoryRoute($this->category[0]->parentid, $this->category[0]->parentalias)); + $linkUpText = $this->category[0]->parenttitle; + } else { + $linkUp = '#'; + $linkUpText = ''; + } + echo ''; + } + } + } else { + echo '
    '; + } + + if (!empty($this->category[0])) { + + // USER RIGHT - Access of categories (if file is included in some not accessed category) - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (!empty($this->category[0])) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $this->category[0]->cataccessuserid, $this->category[0]->cataccess, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + if ($rightDisplay == 1) { + $this->checkRights = 0; + $l = new PhocaDownloadLayout(); + + echo '

    '.$this->category[0]->title. '

    '; + + // Description + /*if ($l->isValueEditor($this->category[0]->description)) { + echo '
    '.$this->category[0]->description.'
    '; + }*/ + + // Description + if ($l->isValueEditor($this->category[0]->description)) { + echo '
    '; + echo JHTML::_('content.prepare', $this->category[0]->description); + echo '
    '; + } + + // Subcategories + + if (!empty($this->subcategories)) { + foreach ($this->subcategories as $valueSubCat) { + + echo '
    '; + echo ''. $valueSubCat->title.''; + echo ' ('.$valueSubCat->numdoc.')
    ' . "\n"; + $subcategory = 1; + } + + echo '
    '; + } + + // ===================================================================================== + // BEGIN LAYOUT AREA + // ===================================================================================== + + echo $this->loadTemplate('files'); + + // ===================================================================================== + // END LAYOUT AREA + // ===================================================================================== + + if (count($this->category[0])) { + echo $this->loadTemplate('pagination'); + } + + if ($this->t['display_category_comments'] == 1) { + if (JComponentHelper::isEnabled('com_jcomments', true)) { + include_once(JPATH_BASE.DS.'components'.DS.'com_jcomments'.DS.'jcomments.php'); + echo JComments::showComments($this->category[0]->id, 'com_phocadownload', JText::_('COM_PHOCADOWNLOAD_CATEGORY') .' '. $this->category[0]->title); + } + } + + if ($this->t['display_category_comments'] == 2) { + echo '
    '.$this->loadTemplate('comments-fb').'
    '; + } + + } else { + echo '

    '.JText::_('COM_PHOCADOWNLOAD_CATEGORY'). '

    '; + echo '
    '.JText::_('COM_PHOCADOWNLOAD_NO_RIGHTS_ACCESS_CATEGORY').'
    '; + } + + echo '
    '; + } else { + //echo '

     

    '; + echo '
    '; + } +} +echo '
     
    '; +echo $this->t['dg']; +?> diff --git a/site/views/category/tmpl/default.xml b/site/views/category/tmpl/default.xml new file mode 100644 index 0000000..84bd2e3 --- /dev/null +++ b/site/views/category/tmpl/default.xml @@ -0,0 +1,32 @@ + + + + + + + + COM_PHOCADOWNLOAD_CATEGORY_LIST_LAYOUT + COM_PHOCADOWNLOAD_CATEGORY_LIST_LAYOUT_DESC + +
    + + +
    +
    + + +
    + + + + + + + + + + + +
    +
    +
    \ No newline at end of file diff --git a/site/views/category/tmpl/default_comments-fb.php b/site/views/category/tmpl/default_comments-fb.php new file mode 100644 index 0000000..970b397 --- /dev/null +++ b/site/views/category/tmpl/default_comments-fb.php @@ -0,0 +1,42 @@ +
    $value) { + $uri->delVar($value); + } + } + + if ($this->t['fb_comment_app_id'] == '') { + echo JText::_('COM_PHOCADOWNLOAD_ERROR_FB_APP_ID_EMPTY'); + } else { + + $cCount = ''; + if ((int)$this->t['fb_comment_count'] > 0) { + $cCount = 'numposts="'.$this->t['fb_comment_count'].'"'; + } + +?> width="t['fb_comment_width'] ?>"> +
    + + +
    diff --git a/site/views/category/tmpl/default_files.php b/site/views/category/tmpl/default_files.php new file mode 100644 index 0000000..2252b7c --- /dev/null +++ b/site/views/category/tmpl/default_files.php @@ -0,0 +1,441 @@ +files)) { + foreach ($this->files as $v) { + + if ($this->checkRights == 1) { + // USER RIGHT - Access of categories (if file is included in some not accessed category) - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (isset($v->catid) && isset($v->cataccessuserid) && isset($v->cataccess)) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $v->cataccessuserid, $v->cataccess, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + } else { + $rightDisplay = 1; + } + + if ($rightDisplay == 1) { + + // General + $linkDownloadB = ''; + $linkDownloadE = ''; + if ((int)$v->confirm_license > 0 || $this->t['display_file_view'] == 1) { + $linkDownloadB = ''; // we need pagination to go back + $linkDownloadE =''; + } else { + if ($v->link_external != '' && $v->directlink == 1) { + $linkDownloadB = ''; + $linkDownloadE =''; + } else { + $linkDownloadB = ''; + $linkDownloadE =''; + } + } + + // pdtextonly + $pdTextOnly = '
    '.$v->description.'
    ' . "\n"; + + // pdfile + if ($v->filename != '') { + $imageFileName = $l->getImageFileName($v->image_filename, $v->filename); + + $pdFile = '
    '; + if ($this->t['filename_or_name'] == 'filenametitle') { + $pdFile .= '
    '. $v->title . '
    '; + } + + $pdFile .= '
    '. $imageFileName['filenamethumb'] + . '
    '; + + $pdFile .= '
    '; + $pdFile .= $linkDownloadB .$l->getName($v->title, $v->filename) .$linkDownloadE; + $pdFile .= '
    '; + + $pdFile .= PhocaDownloadRenderFront::displayNewIcon($v->date, $this->t['displaynew']); + $pdFile .= PhocaDownloadRenderFront::displayHotIcon($v->hits, $this->t['displayhot']); + + //Specific icons + if (isset($v->image_filename_spec1) && $v->image_filename_spec1 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec1).'
    '; + } + if (isset($v->image_filename_spec2) && $v->image_filename_spec2 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec2).'
    '; + } + + $pdFile .= '
    ' . "\n"; + } + + // pdbuttonplay + $pdButtonPlay = ''; + if (isset($v->filename_play) && $v->filename_play != '') { + $fileExt = PhocaDownloadFile::getExtension($v->filename_play); + $canPlay = PhocaDownloadFile::canPlay($v->filename_play); + + if ($canPlay) { + // Special height for music only + $buttonPlOptions = $this->t['buttonpl']->options; + if ($fileExt == 'mp3' || $fileExt == 'ogg') { + $buttonPlOptions = $this->t['buttonpl']->optionsmp3; + } + $playLink = JRoute::_(PhocaDownloadRoute::getFileRoute($v->id,$v->catid,$v->alias, $v->categoryalias,0, 'play').$this->t['limitstarturl']); + $pdButtonPlay .= '
    '; + if ($this->t['play_popup_window'] == 1) { + $pdButtonPlay .= ''. JText::_('COM_PHOCADOWNLOAD_PLAY').''; + } else { + $pdButtonPlay .= ''. JText::_('COM_PHOCADOWNLOAD_PLAY').''; + } + $pdButtonPlay .= '
    '; + } + } + + // pdbuttonpreview + $pdButtonPreview = ''; + if (isset($v->filename_preview) && $v->filename_preview != '') { + $fileExt = PhocaDownloadFile::getExtension($v->filename_preview); + if ($fileExt == 'pdf' || $fileExt == 'jpeg' || $fileExt == 'jpg' || $fileExt == 'png' || $fileExt == 'gif') { + + $filePath = PhocaDownloadPath::getPathSet('filepreview'); + $filePath = str_replace ( '../', JURI::base(true).'/', $filePath['orig_rel_ds']); + $previewLink = $filePath . $v->filename_preview; + $pdButtonPreview .= '
    '; + + if ($this->t['preview_popup_window'] == 1) { + $pdButtonPreview .= ''. JText::_('COM_PHOCADOWNLOAD_PREVIEW').''; + } else { + if ($fileExt == 'pdf') { + // Iframe - modal + $pdButtonPreview .= ''. JText::_('COM_PHOCADOWNLOAD_PREVIEW').''; + } else { + // Image - modal + $pdButtonPreview .= ''. JText::_('COM_PHOCADOWNLOAD_PREVIEW').''; + } + } + $pdButtonPreview .= '
    '; + } + } + + // pdbuttondownload + $pdButtonDownload = '
    '; + $pdButtonDownload .= str_replace('class=""', 'class="btn btn-success"', $linkDownloadB) . JText::_('COM_PHOCADOWNLOAD_DOWNLOAD') .$linkDownloadE; + $pdButtonDownload .= '
    '; + + + + // pdbuttondetails + $d = ''; + + $pdTitle = ''; + if ($v->title != '') { + $pdTitle .= '
    '.$v->title.'
    '; + $d .= $pdTitle; + } + + $pdImage = ''; + if ($v->image_download != '') { + $pdImage .= '
    '.$l->getImageDownload($v->image_download).'
    '; + $d .= $pdImage; + } + + $pdFileSize = ''; + $fileSize = $l->getFilesize($v->filename); + if ($fileSize != '') { + $pdFileSize .= '
    '.JText::_('COM_PHOCADOWNLOAD_FILESIZE').':
    '; + $pdFileSize .= '
    '.$fileSize.'
    '; + $d .= $pdFileSize; + } + + $pdVersion = ''; + if ($v->version != '') { + $pdVersion .= '
    '.JText::_('COM_PHOCADOWNLOAD_VERSION').':
    '; + $pdVersion .= '
    '.$v->version.'
    '; + $d .= $pdVersion; + } + + $pdLicense = ''; + if ($v->license != '') { + if ($v->license_url != '') { + $pdLicense .= '
    '.JText::_('COM_PHOCADOWNLOAD_LICENSE').':
    '; + $pdLicense .= ''; + } else { + $pdLicense .= '
    '.JText::_('COM_PHOCADOWNLOAD_LICENSE').':
    '; + $pdLicense .= '
    '.$v->license.'
    '; + } + $d .= $pdLicense; + } + + $pdAuthor = ''; + if ($v->author != '') { + if ($v->author_url != '') { + $pdAuthor .= '
    '.JText::_('COM_PHOCADOWNLOAD_AUTHOR').':
    '; + $pdAuthor .= ''; + } else { + $pdAuthor .= '
    '.JText::_('COM_PHOCADOWNLOAD_AUTHOR').':
    '; + $pdAuthor .= '
    '.$v->author.'
    '; + } + $d .= $pdAuthor; + } + + $pdAuthorEmail = ''; + if ($v->author_email != '') { + $pdAuthorEmail .= '
    '.JText::_('COM_PHOCADOWNLOAD_EMAIL').':
    '; + $pdAuthorEmail .= '
    '. $l->getProtectEmail($v->author_email).'
    '; + $d .= $pdAuthorEmail; + } + + $pdFileDate = ''; + $fileDate = $l->getFileDate($v->filename, $v->date); + if ($fileDate != '') { + $pdFileDate .= '
    '.JText::_('COM_PHOCADOWNLOAD_DATE').':
    '; + $pdFileDate .= '
    '.$fileDate.'
    '; + $d .= $pdFileDate; + } + + $pdDownloads = ''; + if ($this->t['display_downloads'] == 1) { + $pdDownloads .= '
    '.JText::_('COM_PHOCADOWNLOAD_DOWNLOADS').':
    '; + $pdDownloads .= '
    '.$v->hits.' x
    '; + $d .= $pdDownloads; + } + + $pdDescription = ''; + if ($l->isValueEditor($v->description) && $this->t['display_description'] != 1 & $this->t['display_description'] != 2 & $this->t['display_description'] != 3) { + $pdDescription .= '
    '.$v->description.'
    '; + $d .= $pdDescription; + } + + $pdFeatures = ''; + if ($l->isValueEditor($v->features)) { + $pdFeatures .= '
    '.JText::_('COM_PHOCADOWNLOAD_FEATURES').'
    '; + $pdFeatures .= '
    '.$v->features.'
    '; + } + + $pdChangelog = ''; + if ($l->isValueEditor($v->changelog)) { + $pdChangelog .= '
    '.JText::_('COM_PHOCADOWNLOAD_CHANGELOG').'
    '; + $pdChangelog .= '
    '.$v->changelog.'
    '; + } + + $pdNotes = ''; + if ($l->isValueEditor($v->notes)) { + $pdNotes .= '
    '.JText::_('COM_PHOCADOWNLOAD_NOTES').'
    '; + $pdNotes .= '
    '.$v->notes.'
    '; + } + + + // pdfiledesc + $description = $l->isValueEditor($v->description); + + $pdFileDescTop = ''; + $pdFileDescBottom = ''; + $oFileDesc = ''; + + if ($description) { + switch($this->t['display_description']) { + + case 1: + $pdFileDescTop = '
    '.$v->description.'
    '; + break; + case 2: + $pdFileDescBottom = '
    '.$v->description.'
    '; + break; + case 3: + $oFileDesc = '
    '.$v->description.'
    '; + break; + case 4: + $pdFileDescTop = '
    '.$v->description.'
    '; + $oFileDesc = '
    '.PhocaDownloadUtils::strTrimAll($d).'
    '; + break; + case 5: + $pdFileDescBottom = '
    '.$v->description.'
    '; + $oFileDesc = '
    '.PhocaDownloadUtils::strTrimAll($d).'
    '; + break; + case 6: + $pdFileDescTop = '
    '.$d.'
    '; + $oFileDesc = '
    '.PhocaDownloadUtils::strTrimAll($d).'
    '; + break; + case 7: + $pdFileDescBottom = '
    '.$d.'
    '; + $oFileDesc = '
    '.PhocaDownloadUtils::strTrimAll($d).'
    '; + break; + + case 8: + $oFileDesc = '
    '.PhocaDownloadUtils::strTrimAll($d).'
    '; + break; + + default: + break; + } + } + + // Detail Button + if ($this->t['display_detail'] == 1) { + if ($oFileDesc != '') { + $overlibcontent = $oFileDesc; + } else { + $overlibcontent = $d; + } + + $overlibcontent = str_replace('"', '\'', $overlibcontent); + $sA = array(utf8_encode(chr(11)), utf8_encode(chr(160))); + $eA = array("\t", "\n", "\r", "\0"); + $overlibcontent = str_replace($sA, ' ', $overlibcontent); + $overlibcontent = str_replace($eA, '', $overlibcontent); + + $textO = htmlspecialchars(addslashes('
    '.$overlibcontent.'
    ')); + $overlib = "\n\n" ."onmouseover=\"return overlib('".$textO."', CAPTION, '".JText::_('COM_PHOCADOWNLOAD_DETAILS')."', BELOW, RIGHT, CSSCLASS, TEXTFONTCLASS, 'fontPhocaPDClass', FGCLASS, 'fgPhocaPDClass', BGCLASS, 'bgPhocaPDClass', CAPTIONFONTCLASS,'capfontPhocaPDClass', CLOSEFONTCLASS, 'capfontclosePhocaPDClass', STICKY, MOUSEOFF, CLOSETEXT, '".JText::_('COM_PHOCADOWNLOAD_CLOSE')."');\""; + $overlib .= " onmouseout=\"return nd();\"" . "\n"; + + $pdButtonDetails = '
    '; + $pdButtonDetails .= ''. JText::_('COM_PHOCADOWNLOAD_DETAILS').''; + $pdButtonDetails .= '
    '; + } else if ($this->t['display_detail'] == 2) { + $buttonDOptions = $this->t['buttond']->options; + $detailLink = JRoute::_(PhocaDownloadRoute::getFileRoute($v->id,$this->category[0]->id,$v->alias, $v->categoryalias, 0, 'detail').$this->t['limitstarturl']); + $pdButtonDetails = '
    '; + $pdButtonDetails .= ''. JText::_('COM_PHOCADOWNLOAD_DETAILS').''; + $pdButtonDetails .= '
    '; + } else { + $pdButtonDetails = ''; + } + + + // pdmirrorlink1 + $pdMirrorLink1 = ''; + $mirrorOutput1 = PhocaDownloadRenderFront::displayMirrorLinks(1, $v->mirror1link, $v->mirror1title, $v->mirror1target); + if ($mirrorOutput1 != '') { + + if ($this->t['display_mirror_links'] == 4 || $this->t['display_mirror_links'] == 6) { + $classMirror = 'pd-button-mirror1'; + $mirrorOutput1 = str_replace('class=""', 'class="btn"', $mirrorOutput1); + } else { + $classMirror = 'pd-mirror'; + } + + $pdMirrorLink1 = '
    '.$mirrorOutput1.'
    '; + } + + // pdmirrorlink2 + $pdMirrorLink2 = ''; + $mirrorOutput2 = PhocaDownloadRenderFront::displayMirrorLinks(1, $v->mirror2link, $v->mirror2title, $v->mirror2target); + if ($mirrorOutput2 != '') { + if ($this->t['display_mirror_links'] == 4 || $this->t['display_mirror_links'] == 6) { + $classMirror = 'pd-button-mirror2'; + $mirrorOutput2 = str_replace('class=""', 'class="btn"', $mirrorOutput2); + } else { + $classMirror = 'pd-mirror'; + } + + $pdMirrorLink2 = '
    '.$mirrorOutput2.'
    '; + } + + // pdreportlink + $pdReportLink = PhocaDownloadRenderFront::displayReportLink(1, $v->title); + + + // pdrating + $pdRating = PhocaDownloadRate::renderRateFile($v->id, $this->t['display_rating_file']); + + // pdtags + $pdTags = ''; + if ($this->t['display_tags_links'] == 1 || $this->t['display_tags_links'] == 3) { + if ($l->displayTags($v->id) != '') { + $pdTags .= $l->displayTags($v->id); + } + + } + + //pdvideo + $pdVideo = $l->displayVideo($v->video_filename, 0); + + + // --------------------------------------------------- + //Convert + // --------------------------------------------------- + if ($v->textonly == 1) { + echo '
    '. $pdTextOnly . '
    '; + } else { + + if ($this->t['display_specific_layout'] == 0) { + echo '
    '; + echo $pdFileDescTop; + echo $pdFile; + echo '
    '.$pdButtonDownload.'
    '; + + if ($this->t['display_detail'] == 1 || $this->t['display_detail'] == 2) { + echo '
    '.$pdButtonDetails.'
    '; + } + + if ($this->t['display_preview'] == 1 && $pdButtonPreview != '') { + echo '
    '.$pdButtonPreview.'
    '; + } + + if ($this->t['display_play'] == 1 && $pdButtonPlay != '') { + echo '
    '.$pdButtonPlay.'
    '; + } + + if ($this->t['display_mirror_links'] == 4 || $this->t['display_mirror_links'] == 6) { + if ($pdMirrorLink2 != '') { + echo '
    '.$pdMirrorLink2.'
    '; + } + if ($pdMirrorLink1 != '') { + echo '
    '.$pdMirrorLink1.'
    '; + } + + } else if ($this->t['display_mirror_links'] == 1 || $this->t['display_mirror_links'] == 3) { + echo '
    '.$pdMirrorLink2.$pdMirrorLink1.'
    '; + } + + if ($pdVideo != '') { + echo '
    '.$pdVideo.'
    '; + } + + if ($pdReportLink != '') { + echo '
    '.$pdReportLink.'
    '; + } + + if ($pdRating != '') { + echo '
    '.$pdRating.'
    '; + } + + if ($pdTags != '') { + echo '
    '.$pdTags.'
    '; + } + echo $pdFileDescBottom; + echo '
    '; + echo '
    '; + + } else { + + /*$categoryLayout = '
    + {pdfiledesctop} + {pdfile} +
    {pdbuttondownload}
    +
    {pdbuttondetails}
    +
    {pdbuttonpreview}
    +
    {pdbuttonplay}
    +
    {pdmirrorlink2} {pdmirrorlink1}
    +
    {pdrating}
    +
    {pdtags}
    + {pdfiledescbottom} +
    +
    ';*/ + + $categoryLayout = PhocaDownloadSettings::getLayoutText('category'); + $categoryLayoutParams = PhocaDownloadSettings::getLayoutParams('category'); + + $replace = array($pdTitle, $pdImage, $pdFile, $pdFileSize, $pdVersion, $pdLicense, $pdAuthor, $pdAuthorEmail, $pdFileDate, $pdDownloads, $pdDescription, $pdFeatures, $pdChangelog, $pdNotes, $pdMirrorLink1, $pdMirrorLink2, $pdReportLink, $pdRating, $pdTags, $pdFileDescTop, $pdFileDescBottom, $pdButtonDownload, $pdButtonDetails, $pdButtonPreview, $pdButtonPlay, $pdVideo ); + $output = str_replace($categoryLayoutParams['search'], $replace, $categoryLayout); + + echo $output; + } + // --------------------------------------------------- + } + } + } +} +?> diff --git a/site/views/category/tmpl/default_pagination.php b/site/views/category/tmpl/default_pagination.php new file mode 100644 index 0000000..825b50e --- /dev/null +++ b/site/views/category/tmpl/default_pagination.php @@ -0,0 +1,33 @@ +t['action'] = str_replace('&', '&', $this->t['action']); +//$this->t['action'] = str_replace('&', '&', $this->t['action']); +$this->t['action'] = htmlspecialchars($this->t['action']); + +echo '
    '. "\n"; +echo '
     
    '; +echo '
    '. "\n"; + +//echo ''; +echo JHTML::_( 'form.token' ); +echo '
    '; +?> \ No newline at end of file diff --git a/site/views/category/tmpl/index.html b/site/views/category/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/category/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/category/view.html.php b/site/views/category/view.html.php new file mode 100644 index 0000000..55e3f42 --- /dev/null +++ b/site/views/category/view.html.php @@ -0,0 +1,301 @@ +t['p'] = $app->getParams(); + $this->t['user'] = JFactory::getUser(); + $uri = JFactory::getURI(); + $model = $this->getModel(); + $document = JFactory::getDocument(); + $this->t['categoryid'] = $app->input->get( 'id', 0, 'int' ); + $this->t['tagid'] = $app->input->get( 'tagid', 0, 'int' ); + $limitStart = $app->input->get( 'limitstart', 0, 'int' ); + $this->t['mediapath'] = PhocaDownloadPath::getPathMedia(); + + $this->category = $model->getCategory($this->t['categoryid']); + $this->subcategories = $model->getSubcategories($this->t['categoryid']); + $this->files = $model->getFileList($this->t['categoryid'], $this->t['tagid']); + $this->t['pagination'] = $model->getPagination($this->t['categoryid'], $this->t['tagid']); + + PhocaDownloadRenderFront::renderAllCSS(); + $document->addCustomTag(''); + + if ($limitStart > 0 ) { + $this->t['limitstarturl'] = '&start='.$limitStart; + } else { + $this->t['limitstarturl'] = ''; + } + + $this->t['download_external_link'] = $this->t['p']->get( 'download_external_link', '_self' ); + $this->t['filename_or_name'] = $this->t['p']->get( 'filename_or_name', 'filenametitle' ); + $this->t['display_downloads'] = $this->t['p']->get( 'display_downloads', 0 ); + $this->t['display_description'] = $this->t['p']->get( 'display_description', 3 ); + $this->t['display_detail'] = $this->t['p']->get( 'display_detail', 1 ); + $this->t['display_play'] = $this->t['p']->get( 'display_play', 0 ); + $this->t['playerwidth'] = $this->t['p']->get( 'player_width', 328 ); + $this->t['playerheight'] = $this->t['p']->get( 'player_height', 200 ); + $this->t['playermp3height'] = $this->t['p']->get( 'player_mp3_height', 30 ); + $this->t['previewwidth'] = $this->t['p']->get( 'preview_width', 640 ); + $this->t['previewheight'] = $this->t['p']->get( 'preview_height', 480 ); + $this->t['display_preview'] = $this->t['p']->get( 'display_preview', 0 ); + $this->t['play_popup_window'] = $this->t['p']->get( 'play_popup_window', 0 ); + $this->t['preview_popup_window'] = $this->t['p']->get( 'preview_popup_window', 0 ); + $this->t['file_icon_size'] = $this->t['p']->get( 'file_icon_size', 16 ); + $this->t['displaynew'] = $this->t['p']->get( 'display_new', 0 ); + $this->t['displayhot'] = $this->t['p']->get( 'display_hot', 0 ); + $this->t['display_up_icon'] = $this->t['p']->get( 'display_up_icon', 1 ); + $this->t['allowed_file_types'] = $this->t['p']->get( 'allowed_file_types', '' ); + $this->t['disallowed_file_types'] = $this->t['p']->get( 'disallowed_file_types', '' ); + $this->t['enable_user_statistics'] = $this->t['p']->get( 'enable_user_statistics', 1 ); + $this->t['display_category_comments']= $this->t['p']->get( 'display_category_comments', 0 ); + $this->t['display_date_type'] = $this->t['p']->get( 'display_date_type', 0 ); + $this->t['display_file_view'] = $this->t['p']->get('display_file_view', 0); + $this->t['download_metakey'] = $this->t['p']->get( 'download_metakey', '' ); + $this->t['download_metadesc'] = $this->t['p']->get( 'download_metadesc', '' ); + $this->t['display_rating_file'] = $this->t['p']->get( 'display_rating_file', 0 ); + $this->t['display_mirror_links'] = $this->t['p']->get( 'display_mirror_links', 0 ); + $this->t['display_report_link'] = $this->t['p']->get( 'display_report_link', 0 ); + $this->t['send_mail_download'] = $this->t['p']->get( 'send_mail_download', 0 );// not boolean but id of user + //$this->t['send_mail_upload'] = $this->t['p']->get( 'send_mail_upload', 0 ); + $this->t['display_tags_links'] = $this->t['p']->get( 'display_tags_links', 0 ); + $this->t['display_specific_layout'] = $this->t['p']->get( 'display_specific_layout', 0 ); + $this->t['fb_comment_app_id'] = $this->t['p']->get( 'fb_comment_app_id', '' ); + $this->t['fb_comment_width'] = $this->t['p']->get( 'fb_comment_width', '550' ); + $this->t['fb_comment_lang'] = $this->t['p']->get( 'fb_comment_lang', 'en_US' ); + $this->t['fb_comment_count'] = $this->t['p']->get( 'fb_comment_count', '' ); + $this->t['html5_play'] = $this->t['p']->get( 'html5_play', 0 ); + + + // Rating + if ($this->t['display_rating_file'] == 1 || $this->t['display_rating_file'] == 3) { + JHTML::_('behavior.framework', true); + PhocaDownloadRate::renderRateFileJS(1); + $this->t['display_rating_file'] = 1; + } else { + $this->t['display_rating_file'] = 0; + } + + $this->t['dg'] = PhocaDownloadRenderFront::renderPhocaDownload(); + + // DOWNLOAD + // - - - - - - - - - - - - - - - + $download = $app->input->get( 'download', array(0),'array' ); + $downloadId = (int) $download[0]; + if ($downloadId > 0) { + if (isset($this->category[0]->id) && (int)$this->category[0]->id > 0 ) { + $currentLink = 'index.php?option=com_phocadownload&view=category&id='.$this->category[0]->id.':'.$this->category[0]->alias.$this->t['limitstarturl'] . '&Itemid='. $app->input->get('Itemid', 0, 'int'); + } else { + $currentLink = $uri; + } + $fileData = PhocaDownloadDownload::getDownloadData($downloadId, $currentLink); + PhocaDownloadDownload::download($fileData, $downloadId, $currentLink); + } + // - - - - - - - - - - - - - - - + + // DETAIL + // - - - - - - - - - - - - - - - + if ($this->t['display_detail'] == 2) { + $this->t['buttond'] = new JObject(); + $this->t['buttond']->set('methodname', 'modal-button'); + $this->t['buttond']->set('name', 'detail'); + $this->t['buttond']->set('modal', true); + $this->t['buttond']->set('options', "{handler: 'iframe', size: {x: 600, y: 500}, overlayOpacity: 0.7, classWindow: 'phocadownloaddetailwindow', classOverlay: 'phocadownloaddetailoverlay'}"); + } + + JHTML::_('behavior.modal', 'a.pd-modal-button'); + // PLAY - - - - - - - - - - - - + $windowWidthPl = (int)$this->t['playerwidth'] + 20; + $windowHeightPl = (int)$this->t['playerheight'] + 20; + + if ($this->t['html5_play'] == 1) { + $windowWidthPl = (int)$this->t['playerwidth'] + 40; + } else { + $windowWidthPl = (int)$this->t['playerwidth'] + 50; + } + $windowHeightPlMP3 = (int)$this->t['playermp3height'] + 20; + if ($this->t['play_popup_window'] == 1) { + $this->t['buttonpl'] = new JObject(); + $this->t['buttonpl']->set('methodname', 'js-button'); + $this->t['buttonpl']->set('options', "window.open(this.href,'win2','width=".$windowWidthPl.",height=".$windowHeightPl.",scrollbars=yes,menubar=no,resizable=yes'); return false;"); + $this->t['buttonpl']->set('optionsmp3', "window.open(this.href,'win2','width=".$windowWidthPl.",height=".$windowHeightPlMP3.",scrollbars=yes,menubar=no,resizable=yes'); return false;"); + } else { + $document->addCustomTag( " \n"); + $this->t['buttonpl'] = new JObject(); + $this->t['buttonpl']->set('name', 'image'); + $this->t['buttonpl']->set('modal', true); + $this->t['buttonpl']->set('methodname', 'modal-button'); + $this->t['buttonpl']->set('options', "{handler: 'iframe', size: {x: ".$windowWidthPl.", y: ".$windowHeightPl."}, overlayOpacity: 0.7, classWindow: 'phocadownloadplaywindow', classOverlay: 'phocadownloadplayoverlay'}"); + $this->t['buttonpl']->set('optionsmp3', "{handler: 'iframe', size: {x: ".$windowWidthPl.", y: ".$windowHeightPlMP3."}, overlayOpacity: 0.7, classWindow: 'phocadownloadplaywindow', classOverlay: 'phocadownloadplayoverlay'}"); + } + // - - - - - - - - - - - - - - - + // PREVIEW - - - - - - - - - - - - + $windowWidthPr = (int)$this->t['previewwidth'] + 20; + $windowHeightPr = (int)$this->t['previewheight'] + 20; + if ($this->t['preview_popup_window'] == 1) { + $this->t['buttonpr'] = new JObject(); + $this->t['buttonpr']->set('methodname', 'js-button'); + $this->t['buttonpr']->set('options', "window.open(this.href,'win2','width=".$windowWidthPr.",height=".$windowHeightPr.",scrollbars=yes,menubar=no,resizable=yes'); return false;"); + } else { + $document->addCustomTag( " \n"); + $this->t['buttonpr'] = new JObject(); + $this->t['buttonpr']->set('name', 'image'); + $this->t['buttonpr']->set('modal', true); + $this->t['buttonpr']->set('methodname', 'modal-button'); + $this->t['buttonpr']->set('options', "{handler: 'iframe', size: {x: ".$windowWidthPr.", y: ".$windowHeightPr."}, overlayOpacity: 0.7, classWindow: 'phocadownloadpreviewwindow', classOverlay: 'phocadownloadpreviewoverlay'}"); + $this->t['buttonpr']->set('optionsimg', "{handler: 'image', size: {x: 200, y: 150}, overlayOpacity: 0.7, classWindow: 'phocadownloadpreviewwindow', classOverlay: 'phocadownloadpreviewoverlay'}"); + } + // - - - - - - - - - - - - - - - + + $imagePath = PhocaDownloadPath::getPathSet('icon'); + $this->t['cssimgpath'] = str_replace ( '../', JURI::base(true).'/', $imagePath['orig_rel_ds']); + $filePath = PhocaDownloadPath::getPathSet('file'); + $this->t['absfilepath'] = $filePath['orig_abs_ds']; + $this->t['action'] = $uri->toString(); + + if (isset($this->category[0]) && is_object($this->category[0])){ + $this->_prepareDocument($this->category[0]); + } + + parent::display($tpl); + + } + + protected function _prepareDocument($category) { + + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $pathway = $app->getPathway(); + //$this->t['p'] = &$app->getParams(); + $title = null; + + $this->t['downloadmetakey'] = $this->t['p']->get( 'download_metakey', '' ); + $this->t['downloadmetadesc'] = $this->t['p']->get( 'download_metadesc', '' ); + + + $menu = $menus->getActive(); + if ($menu) { + $this->t['p']->def('page_heading', $this->t['p']->get('page_title', $menu->title)); + } else { + $this->t['p']->def('page_heading', JText::_('JGLOBAL_ARTICLES')); + } + + /* + $title = $this->t['p']->get('page_title', ''); + + if (empty($title) || (isset($title) && $title == '')) { + $title = $this->item->title; + } + + if (empty($title) || (isset($title) && $title == '')) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0)) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + } + //$this->document->setTitle($title); + + + $this->document->setTitle($title);*/ + + $title = $this->t['p']->get('page_title', ''); + $this->tmpl['display_cat_name_title'] = 1; + if (empty($title)) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0) == 1) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + + if ($this->tmpl['display_cat_name_title'] == 1 && isset($category->title) && $category->title != '') { + $title = $title .' - ' . $category->title; + } + + } else if ($app->getCfg('sitename_pagetitles', 0) == 2) { + + if ($this->tmpl['display_cat_name_title'] == 1 && isset($category->title) && $category->title != '') { + $title = $title .' - ' . $category->title; + } + + $title = JText::sprintf('JPAGETITLE', $title, htmlspecialchars_decode($app->getCfg('sitename'))); + } + $this->document->setTitle($title); + + if ($category->metadesc != '') { + $this->document->setDescription($category->metadesc); + } else if ($this->t['downloadmetadesc'] != '') { + $this->document->setDescription($this->t['downloadmetadesc']); + } else if ($this->t['p']->get('menu-meta_description', '')) { + $this->document->setDescription($this->t['p']->get('menu-meta_description', '')); + } + + if ($category->metakey != '') { + $this->document->setMetadata('keywords', $category->metakey); + } else if ($this->t['downloadmetakey'] != '') { + $this->document->setMetadata('keywords', $this->t['downloadmetakey']); + } else if ($this->t['p']->get('menu-meta_keywords', '')) { + $this->document->setMetadata('keywords', $this->t['p']->get('menu-meta_keywords', '')); + } + + if ($app->getCfg('MetaTitle') == '1' && $this->t['p']->get('menupage_title', '')) { + $this->document->setMetaData('title', $this->t['p']->get('page_title', '')); + } + + // Breadcrumbs TODO (Add the whole tree) + /*$pathway = $app->getPathway(); + if (isset($this->category[0]->parentid)) { + if ($this->category[0]->parentid == 0) { + // $pathway->addItem( JText::_('COM_PHOCADOWNLOAD_CATEGORIES'), JRoute::_(PhocaDownloadRoute::getCategoriesRoute())); + } else if ($this->category[0]->parentid > 0) { + $pathway->addItem($this->category[0]->parenttitle, JRoute::_(PhocaDownloadRoute::getCategoryRoute($this->category[0]->parentid, $this->category[0]->parentalias))); + } + } + + if (!empty($this->category[0]->title)) { + $pathway->addItem($this->category[0]->title); + }*/ + + // Breadcrumbs TODO (Add the whole tree) + $pathway = $app->getPathway(); + if (isset($this->category[0]->parentid)) { + if ($this->category[0]->parentid == 0) { + // $pathway->addItem( JText::_('COM_PHOCADOWNLOAD_CATEGORIES'), JRoute::_(PhocaDownloadRoute::getCategoriesRoute())); + } else if ($this->category[0]->parentid > 0) { + $curpath = $pathway->getPathwayNames(); + if($this->category[0]->parenttitle != $curpath[count($curpath)-1]){ + $pathway->addItem($this->category[0]->parenttitle, JRoute::_(PhocaDownloadRoute::getCategoryRoute($this->category[0]->parentid, $this->category[0]->parentalias))); + } + } + } + + if (!empty($this->category[0]->title)) { + $curpath = $pathway->getPathwayNames(); + if($this->category[0]->title != $curpath[count($curpath)-1]){ + $pathway->addItem($this->category[0]->title); + } + } + + } +} +?> \ No newline at end of file diff --git a/site/views/download/index.html b/site/views/download/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/download/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/download/metadata.xml b/site/views/download/metadata.xml new file mode 100644 index 0000000..81b20c7 --- /dev/null +++ b/site/views/download/metadata.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/site/views/download/tmpl/default.php b/site/views/download/tmpl/default.php new file mode 100644 index 0000000..86c2404 --- /dev/null +++ b/site/views/download/tmpl/default.php @@ -0,0 +1,429 @@ +t['p']->get( 'pageclass_sfx' ).'" >'; +echo '
    '; + +if ($this->t['found'] == 1) { + if(isset($this->file[0]->id) && (int)$this->file[0]->id > 0 && isset($this->file[0]->token) && $this->file[0]->token != '') { + + $v = $this->file[0]; + $downloadLink = PhocaDownloadRoute::getDownloadRoute((int)$v->id, (int)$v->catid, $v->token); + $l = new PhocaDownloadLayout(); + + //echo '

    '.$l->getName($v->title, $v->filename, 1). '

    '; + + $pdTitle = ''; + if ($v->title != '') { + $pdTitle .= '
    '.$v->title.'
    '; + } + + $pdImage = ''; + if ($v->image_download != '') { + $pdImage .= '
    '.$l->getImageDownload($v->image_download).'
    '; + } + + if ($v->filename != '') { + $imageFileName = $l->getImageFileName($v->image_filename, $v->filename); + + $pdFile = '
    '; + if ($this->t['filename_or_name'] == 'filenametitle') { + $pdFile .= '
    '. $v->title . '
    '; + } + + $pdFile .= '
    '. $imageFileName['filenamethumb'] + . '
    '; + + $pdFile .= '
    '; + $pdFile .= $l->getName($v->title, $v->filename); + $pdFile .= '
    '; + + $pdFile .= PhocaDownloadRenderFront::displayNewIcon($v->date, $this->t['displaynew']); + $pdFile .= PhocaDownloadRenderFront::displayHotIcon($v->hits, $this->t['displayhot']); + + //Specific icons + if (isset($v->image_filename_spec1) && $v->image_filename_spec1 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec1).'
    '; + } + if (isset($v->image_filename_spec2) && $v->image_filename_spec2 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec2).'
    '; + } + + $pdFile .= '
    ' . "\n"; + } + echo ''; + + } +} else { + echo '
    '.JText::_('COM_PHOCADOWNLOAD_FILE_NOT_FOUND').'
    '; +} + +/* +if ( $this->t['p']->get( 'show_page_heading' ) ) { + echo '

    '. $this->escape($this->t['p']->get('page_heading')) . '

    '; +} + +if (!empty($this->category[0])) { + echo '
    '; + if ($this->t['display_up_icon'] == 1 && $this->t['tmplr'] == 0) { + + if (isset($this->category[0]->id)) { + if ($this->category[0]->id > 0) { + $linkUp = JRoute::_(PhocaDownloadRoute::getCategoryRoute($this->category[0]->id, $this->category[0]->alias)); + $linkUpText = $this->category[0]->title; + } else { + $linkUp = '#'; + $linkUpText = ''; + } + echo ''; + } + } +} else { + +} + + +if (!empty($this->file[0])) { + $v = $this->file[0]; + + // USER RIGHT - Access of categories (if file is included in some not accessed category) - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (!empty($this->category[0])) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $v->cataccessuserid, $v->cataccess, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplay == 1) { + + $l = new PhocaDownloadLayout(); + + echo '

    '.$l->getName($v->title, $v->filename, 1). '

    '; + + +// ===================================================================================== +// BEGIN LAYOUT AREA +// ===================================================================================== + + // Is this direct menu link to File View + $directFv = 0; + $app = JFactory::getApplication(); + $itemId = $app->input->get('Itemid', 0, 'int'); + $menu = $app->getMenu(); + $item = $menu->getItem($itemId); + if (isset($item->query['view']) && $item->query['view'] == 'file') { + $directFv = 1; + } + // End direct menu link to File View + + if ((int)$this->t['display_file_view'] == 1 + || (int)$this->t['display_file_view'] == 2 + || (int)$v->confirm_license > 0 + || (int)$this->t['display_detail'] == 2 + || (int)$directFv == 1) { + + $pdTitle = ''; + if ($v->title != '') { + $pdTitle .= '
    '.$v->title.'
    '; + } + + $pdImage = ''; + if ($v->image_download != '') { + $pdImage .= '
    '.$l->getImageDownload($v->image_download).'
    '; + } + + $pdVideo = ''; + $pdVideo = $l->displayVideo($v->video_filename, 1); + + if ($v->filename != '') { + $imageFileName = $l->getImageFileName($v->image_filename, $v->filename); + + $pdFile = '
    '; + if ($this->t['filename_or_name'] == 'filenametitle') { + $pdFile .= '
    '. $v->title . '
    '; + } + + $pdFile .= '
    '. $imageFileName['filenamethumb'] + . '
    '; + + $pdFile .= '
    '; + $pdFile .= $l->getName($v->title, $v->filename); + $pdFile .= '
    '; + + $pdFile .= PhocaDownloadRenderFront::displayNewIcon($v->date, $this->t['displaynew']); + $pdFile .= PhocaDownloadRenderFront::displayHotIcon($v->hits, $this->t['displayhot']); + + //Specific icons + if (isset($v->image_filename_spec1) && $v->image_filename_spec1 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec1).'
    '; + } + if (isset($v->image_filename_spec2) && $v->image_filename_spec2 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec2).'
    '; + } + + $pdFile .= '
    ' . "\n"; + } + + $pdFileSize = ''; + $fileSize = $l->getFilesize($v->filename); + if ($fileSize != '') { + $pdFileSize .= '
    '.JText::_('COM_PHOCADOWNLOAD_FILESIZE').':
    '; + $pdFileSize .= '
    '.$fileSize.'
    '; + } + + $pdVersion = ''; + if ($v->version != '') { + $pdVersion .= '
    '.JText::_('COM_PHOCADOWNLOAD_VERSION').':
    '; + $pdVersion .= '
    '.$v->version.'
    '; + } + + $pdLicense = ''; + if ($v->license != '') { + if ($v->license_url != '') { + $pdLicense .= '
    '.JText::_('COM_PHOCADOWNLOAD_LICENSE').':
    '; + $pdLicense .= ''; + } else { + $pdLicense .= '
    '.JText::_('COM_PHOCADOWNLOAD_LICENSE').':
    '; + $pdLicense .= '
    '.$v->license.'
    '; + } + } + + $pdAuthor = ''; + if ($v->author != '') { + if ($v->author_url != '') { + $pdAuthor .= '
    '.JText::_('COM_PHOCADOWNLOAD_AUTHOR').':
    '; + $pdAuthor .= ''; + } else { + $pdAuthor .= '
    '.JText::_('COM_PHOCADOWNLOAD_AUTHOR').':
    '; + $pdAuthor .= '
    '.$v->author.'
    '; + } + } + + $pdAuthorEmail = ''; + if ($v->author_email != '') { + $pdAuthorEmail .= '
    '.JText::_('COM_PHOCADOWNLOAD_EMAIL').':
    '; + $pdAuthorEmail .= '
    '. $l->getProtectEmail($v->author_email).'
    '; + } + + $pdFileDate = ''; + $fileDate = $l->getFileDate($v->filename, $v->date); + if ($fileDate != '') { + $pdFileDate .= '
    '.JText::_('COM_PHOCADOWNLOAD_DATE').':
    '; + $pdFileDate .= '
    '.$fileDate.'
    '; + } + + $pdDownloads = ''; + if ($this->t['display_downloads'] == 1) { + $pdDownloads .= '
    '.JText::_('COM_PHOCADOWNLOAD_DOWNLOADS').':
    '; + $pdDownloads .= '
    '.$v->hits.' x
    '; + } + + $pdDescription = ''; + if ($l->isValueEditor($v->description)) { + $pdDescription .= '
    '.$v->description.'
    '; + } + + $pdFeatures = ''; + if ($l->isValueEditor($v->features)) { + $pdFeatures .= '
    '.JText::_('COM_PHOCADOWNLOAD_FEATURES').'
    '; + $pdFeatures .= '
    '.$v->features.'
    '; + } + + $pdChangelog = ''; + if ($l->isValueEditor($v->changelog)) { + $pdChangelog .= '
    '.JText::_('COM_PHOCADOWNLOAD_CHANGELOG').'
    '; + $pdChangelog .= '
    '.$v->changelog.'
    '; + } + + $pdNotes = ''; + if ($l->isValueEditor($v->notes)) { + $pdNotes .= '
    '.JText::_('COM_PHOCADOWNLOAD_NOTES').'
    '; + $pdNotes .= '
    '.$v->notes.'
    '; + } + + + // pdmirrorlink1 + $pdMirrorLink1 = ''; + $mirrorOutput1 = PhocaDownloadRenderFront::displayMirrorLinks(1, $v->mirror1link, $v->mirror1title, $v->mirror1target); + if ($mirrorOutput1 != '') { + + if ($this->t['display_mirror_links'] == 4 || $this->t['display_mirror_links'] == 6) { + $classMirror = 'pd-button-mirror1'; + } else { + $classMirror = 'pd-mirror'; + } + + $pdMirrorLink1 = '
    '.$mirrorOutput1.'
    '; + } + + // pdmirrorlink2 + $pdMirrorLink2 = ''; + $mirrorOutput2 = PhocaDownloadRenderFront::displayMirrorLinks(1, $v->mirror2link, $v->mirror2title, $v->mirror2target); + if ($mirrorOutput2 != '') { + if ($this->t['display_mirror_links'] == 4 || $this->t['display_mirror_links'] == 6) { + $classMirror = 'pd-button-mirror2'; + } else { + $classMirror = 'pd-mirror'; + } + + $pdMirrorLink2 = '
    '.$mirrorOutput2.'
    '; + } + + // pdreportlink + $pdReportLink = PhocaDownloadRenderFront::displayReportLink(1, $v->title); + + + // pdrating + $pdRating = PhocaDownloadRate::renderRateFile($v->id, $this->t['display_rating_file']); + + // pdtags + $pdTags = ''; + if ($this->t['display_tags_links'] == 2 || $this->t['display_tags_links'] == 3) { + if ($l->displayTags($v->id) != '') { + $pdTags .= $l->displayTags($v->id); + } + + } + + + // --------------------------------------------------- + //Convert + // --------------------------------------------------- + if ($this->t['display_specific_layout'] == 0) { + echo '
    '; + //echo $pdTitle; + echo $pdImage; + echo $pdFile; + echo $pdFileSize; + echo $pdVersion; + echo $pdLicense; + echo $pdAuthor; + echo $pdAuthorEmail; + echo $pdFileDate; + echo $pdDownloads; + echo $pdDescription; + echo $pdFeatures; + echo $pdChangelog; + echo $pdNotes; + if ($this->t['display_mirror_links'] == 5 || $this->t['display_mirror_links'] == 6) { + echo '
    '.$pdMirrorLink2.'
    '; + echo '
    '.$pdMirrorLink1.'
    '; + } else if ($this->t['display_mirror_links'] == 2 || $this->t['display_mirror_links'] == 3) { + echo '
    '.$pdMirrorLink2.$pdMirrorLink1.'
    '; + } + + echo '
    '.$pdReportLink.'
    '; + echo '
    '.$pdRating.'
    '; + echo '
    '.$pdTags.'
    '; + echo '
    '.$pdVideo.'
    '; + echo '
    '; + echo '
    '; + } else { + + /*$fileLayout = '
    + {pdimage} + {pdfile} + {pdfilesize} + {pdversion} + {pdlicense} + {pdauthor} + {pdauthoremail} + {pdfiledate} + {pddownloads} + {pddescription} + {pdfeatures} + {pdchangelog} + {pdnotes} +
    {pdmirrorlink2} {pdmirrorlink1}
    +
    {pdreportlink}
    +
    {pdrating}
    +
    {pdtags}
    +
    +
    '; + + + $fileLayout = PhocaDownloadSettings::getLayoutText('file'); + $fileLayoutParams = PhocaDownloadSettings::getLayoutParams('file'); + + $replace = array($pdTitle, $pdImage, $pdFile, $pdFileSize, $pdVersion, $pdLicense, $pdAuthor, $pdAuthorEmail, $pdFileDate, $pdDownloads, $pdDescription, $pdFeatures, $pdChangelog, $pdNotes, $pdMirrorLink1, $pdMirrorLink2, $pdReportLink, $pdRating, $pdTags, $pdVideo); + $output = str_replace($fileLayoutParams['search'], $replace, $fileLayout); + + echo $output; + } + + // --------------------------------------------------- + + + $o = '
     
    '; + + if ((int)$v->confirm_license > 0) { + $o .= '

    '.JText::_('COM_PHOCADOWNLOAD_LICENSE_AGREEMENT').'

    '; + $o .= '
    '.$v->licensetext.'
    '; + + // External link + if ($v->link_external != '' && $v->directlink == 1) { + $o .= '
    '; + $o .= ' '.JText::_('COM_PHOCADOWNLOAD_I_AGREE_TO_TERMS_LISTED_ABOVE').' '; + $o .= ''; + } else { + $o .= ''; + $o .= ' '.JText::_('COM_PHOCADOWNLOAD_I_AGREE_TO_TERMS_LISTED_ABOVE').' '; + $o .= ''; + $o .= ''; + $o .= ''; + } + $o .= '
    '; + + // For users who have disabled Javascript + $o .= ''; + } else { + // External link + if ($v->link_external != '') { + $o .= '
    '; + $o .= ''; + } else { + $o .= ''; + $o .= ''; + $o .= ''; + $o .= ''; + $o .= ''; + } + $o .= '
    '; + } + + + if ($this->t['display_file_comments'] == 1) { + if (JComponentHelper::isEnabled('com_jcomments', true)) { + include_once(JPATH_BASE.DS.'components'.DS.'com_jcomments'.DS.'jcomments.php'); + $o .= JComments::showComments($v->id, 'com_phocadownload_files', JText::_('COM_PHOCADOWNLOAD_FILE') .' '. $v->title); + } + } + + if ($this->t['display_file_comments'] == 2) { + $o .= '
    '.$this->loadTemplate('comments-fb').'
    '; + } + + echo $o; + + } else { + echo '

    '.JText::_('COM_PHOCADOWNLOAD_FILE') .'

    '; + echo '
    '.JText::_('COM_PHOCADOWNLOAD_NO_RIGHTS_ACCESS_CATEGORY').'
    '; + } + } + echo '
     
    ';// end of box +} else { + echo '
     
    '; +} + +*/ + +echo '
     
    '. $this->t['pw']; +?> \ No newline at end of file diff --git a/site/views/download/tmpl/default.xml b/site/views/download/tmpl/default.xml new file mode 100644 index 0000000..d9e6ab0 --- /dev/null +++ b/site/views/download/tmpl/default.xml @@ -0,0 +1,13 @@ + + + + + + + + + COM_PHOCADOWNLOAD_DOWNLOAD_LAYOUT + COM_PHOCADOWNLOAD_DOWNLOAD_LAYOUT_DESC + + + \ No newline at end of file diff --git a/site/views/download/tmpl/index.html b/site/views/download/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/download/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/download/view.html.php b/site/views/download/view.html.php new file mode 100644 index 0000000..ba46a33 --- /dev/null +++ b/site/views/download/view.html.php @@ -0,0 +1,223 @@ +t['p'] = $app->getParams(); + $this->t['user'] = JFactory::getUser(); + $uri = JFactory::getURI(); + $model = $this->getModel(); + $document = JFactory::getDocument(); + $downloadToken = $app->input->get('id', '', 'string');// Token string + $this->t['limitstart'] = $app->input->get( 'start', 0, 'int');// we need it for category back link + $this->t['tmpl'] = $app->input->get( 'tmpl', '', 'string' ); + $this->t['mediapath'] = PhocaDownloadPath::getPathMedia(); + + $this->t['tmplr'] = 0; + if ($this->t['tmpl'] == 'component') { + $this->t['tmplr'] = 1; + } + + if ($this->t['limitstart'] > 0 ) { + $this->t['limitstarturl'] = '&start='.$this->t['limitstart']; + } else { + $this->t['limitstarturl'] = ''; + } + + //$this->category = $model->getCategory($fileId); + //$this->file = $model->getFile($fileId, $this->t['limitstarturl']); + + // Params + $this->t['licenseboxheight'] = $this->t['p']->get( 'license_box_height', 300 ); + $this->t['filename_or_name'] = $this->t['p']->get( 'filename_or_name', 'filename' ); + $this->t['allowed_file_types'] = $this->t['p']->get( 'allowed_file_types', '' ); + $this->t['disallowed_file_types'] = $this->t['p']->get( 'disallowed_file_types', '' ); + $this->t['enable_user_statistics'] = $this->t['p']->get( 'enable_user_statistics', 1 ); + $this->t['file_icon_size'] = $this->t['p']->get( 'file_icon_size', 16 ); + $this->t['pw'] = PhocaDownloadRenderFront::renderPhocaDownload(); + $this->t['download_external_link'] = $this->t['p']->get( 'download_external_link', '_self' ); + $this->t['display_report_link'] = $this->t['p']->get( 'display_report_link', 0 ); + $this->t['send_mail_download'] = $this->t['p']->get( 'send_mail_download', 0 );// not boolean but id of user + $this->t['display_specific_layout'] = $this->t['p']->get( 'display_specific_layout', 0 ); + $this->t['displaynew'] = $this->t['p']->get( 'display_new', 0 ); + $this->t['displayhot'] = $this->t['p']->get( 'display_hot', 0 ); + $this->t['enable_token_download'] = $this->t['p']->get( 'enable_token_download', 0 ); + + PhocaDownloadRenderFront::renderAllCSS(); + + $this->t['found'] = 0; + if ($this->t['enable_token_download'] == 0) { + $this->t['found'] = 0; + } else if ($downloadToken == '') { + $this->t['found'] = 0; + + } else { + $this->file = $model->getFile($downloadToken); + if(isset($this->file[0]->id) && (int)$this->file[0]->id > 0 && isset($this->file[0]->token) && $this->file[0]->token != '') { + $this->t['found'] = 1; + } + + + /*$document->addCustomTag(''); + $js = 'var enableDownloadButtonPD = 0;' + .'function enableDownloadPD() {' + .' if (enableDownloadButtonPD == 0) {' + .' document.forms[\'phocadownloadform\'].elements[\'pdlicensesubmit\'].disabled=false;' + .' enableDownloadButtonPD = 1;' + .' } else {' + .' document.forms[\'phocadownloadform\'].elements[\'pdlicensesubmit\'].disabled=true;' + .' enableDownloadButtonPD = 0;' + .' }' + .'}'; + $document->addScriptDeclaration($js);*/ + + + + + + + + // DOWNLOAD + // - - - - - - - - - - - - - - - + $download = $app->input->get( 'download', 0, 'int' ); + //$licenseAgree = $app->input->get( 'license_agree', '', 'string' ); + $downloadId = (int) $this->file[0]->id; + if ($download == 1) { + if (isset($this->file[0]->id)) { + $currentLink = 'index.php?option=com_phocadownload&view=download&id='.htmlspecialchars($downloadToken). $this->t['limitstarturl'] . '&Itemid='. $app->input->get('Itemid', 0, 'int'); + } else { + $currentLink = 'index.php?option=com_phocadownload&view=categories&Itemid='. $app->input->get('Itemid', 0, 'int'); + } + + // Check Token + $token = JSession::getFormToken(); + if (!JRequest::getInt( $token, 0, 'get' )) { + //JError::raiseError(403, 'Request Forbidden'); + $app->redirect(JRoute::_('index.php', false), JText::_('COM_PHOCADOWNLOAD_INVALID_TOKEN')); + exit; + } + + // Check License Agreement + /*if (empty($licenseAgree)) { + $app->redirect(JRoute::_($currentLink, false), JText::_('COM_PHOCADOWNLOAD_WARNING_AGREE_LICENSE_TERMS')); + exit; + }*/ + + $fileData = PhocaDownloadDownload::getDownloadData($downloadId, $currentLink, 1); + + PhocaDownloadDownload::download($fileData, $downloadId, $currentLink, 1); + } + // - - - - - - - - - - - - - - - + + /*$imagePath = PhocaDownloadPath::getPathSet('icon'); + $this->t['cssimgpath'] = str_replace ( '../', JURI::base(true).'/', $imagePath['orig_rel_ds']); + $filePath = PhocaDownloadPath::getPathSet('file'); + $this->t['absfilepath'] = $filePath['orig_abs_ds']; + $this->t['action'] = $uri->toString(); + + if (isset($this->category[0]) && is_object($this->category[0]) && isset($this->file[0]) && is_object($this->file[0])){ + $this->_prepareDocument($this->category[0], $this->file[0]); + }*/ + } + + parent::display($tpl); + + } + + protected function _prepareDocument( $file) { + + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $menu = $menus->getActive(); + $pathway = $app->getPathway(); + $title = null; + + $this->t['downloadmetakey'] = $this->t['p']->get( 'download_metakey', '' ); + $this->t['downloadmetadesc'] = $this->t['p']->get( 'download_metadesc', '' ); + + if ($menu) { + $this->t['p']->def('page_heading', $this->t['p']->get('page_title', $menu->title)); + } else { + $this->t['p']->def('page_heading', JText::_('JGLOBAL_ARTICLES')); + } + + /*$title = $this->t['p']->get('page_title', ''); + if (empty($title) || (isset($title) && $title == '')) { + $title = $this->item->title; + } + if (empty($title) || (isset($title) && $title == '')) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0)) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + } + //$this->document->setTitle($title); + + $this->document->setTitle($title);*/ + + $title = $this->t['p']->get('page_title', ''); + $this->tmpl['display_file_name_title'] = 1; + if (empty($title)) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0) == 1) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + + if ($this->tmpl['display_file_name_title'] == 1 && isset($file->title) && $file->title != '') { + $title = $title .' - ' . $file->title; + } + + } else if ($app->getCfg('sitename_pagetitles', 0) == 2) { + + if ($this->tmpl['display_file_name_title'] == 1 && isset($file->title) && $file->title != '') { + $title = $title .' - ' . $file->title; + } + + $title = JText::sprintf('JPAGETITLE', $title, htmlspecialchars_decode($app->getCfg('sitename'))); + } + $this->document->setTitle($title); + + + if ($file->metadesc != '') { + $this->document->setDescription($file->metadesc); + } else if ($this->t['downloadmetadesc'] != '') { + $this->document->setDescription($this->t['downloadmetadesc']); + } else if ($this->t['p']->get('menu-meta_description', '')) { + $this->document->setDescription($this->t['p']->get('menu-meta_description', '')); + } + + if ($file->metakey != '') { + $this->document->setMetadata('keywords', $file->metakey); + } else if ($this->t['downloadmetakey'] != '') { + $this->document->setMetadata('keywords', $this->t['downloadmetakey']); + } else if ($this->t['p']->get('menu-meta_keywords', '')) { + $this->document->setMetadata('keywords', $this->t['p']->get('menu-meta_keywords', '')); + } + + if ($app->getCfg('MetaTitle') == '1' && $this->t['p']->get('menupage_title', '')) { + $this->document->setMetaData('title', $this->t['p']->get('page_title', '')); + } + + + + if (!empty($file->title)) { + $pathway->addItem($file->title); + } + } +} +?> \ No newline at end of file diff --git a/site/views/feed/index.html b/site/views/feed/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/feed/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/feed/metadata.xml b/site/views/feed/metadata.xml new file mode 100644 index 0000000..2378613 --- /dev/null +++ b/site/views/feed/metadata.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/site/views/feed/tmpl/index.html b/site/views/feed/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/feed/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/feed/view.feed.php b/site/views/feed/view.feed.php new file mode 100644 index 0000000..02d7368 --- /dev/null +++ b/site/views/feed/view.feed.php @@ -0,0 +1,147 @@ +getAuthorisedViewLevels()); + $db = JFactory::getDBO(); + $menu = $app->getMenu(); + $document = JFactory::getDocument(); + $params = $app->getParams(); + $moduleId = $app->input->get('id', 0, 'int'); + $table = &JTable::getInstance('module'); + + + if ((int)$moduleId > 0) { + $db = JFactory::getDBO(); + $query = 'SELECT a.params' + . ' FROM #__modules AS a' + . ' WHERE a.published = 1' + . ' AND a.id ='.(int)$moduleId + . ' ORDER BY a.ordering'; + + $db->setQuery( $query ); + if (!$db->query()) { + $this->setError($db->getErrorMsg()); + return false; + } + $module = $db->loadObject(); + if (isset($module->params) && $module->params != '') { + jimport( 'joomla.html.parameter' ); + $paramsM = new JRegistry; + $paramsM->loadString($module->params); + //$paramsM->loadJSON($module->params); + + // Params + $categories = $paramsM->get( 'category_ids', '' ); + $ordering = $paramsM->get( 'file_ordering', 6 ); + $fileCount = $paramsM->get( 'file_count', 5 ); + $feedTitle = $paramsM->get( 'feed_title', JText::_('COM_PHOCADOWNLOAD_DOWNLOAD') ); + $displayDateType = $paramsM->get( 'display_date_type', 1 ); + + $document->setTitle($this->escape( html_entity_decode($feedTitle))); + + $wheres = array(); + if (is_array($categories) && count($categories) > 0) { + JArrayHelper::toInteger($categories); + $categoriesString = implode(',', $categories); + $wheres[] = ' c.catid IN ( '.$categoriesString.' ) '; + } else if ((int)$categories > 0) { + $wheres[] = ' c.catid IN ( '.$categories.' ) '; + } + + $wheres[] = ' c.catid= cc.id'; + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND c.access IN ('.$userLevels.') ) )'; + $wheres[] = '( (unaccessible_file = 1 ) OR (unaccessible_file = 0 AND cc.access IN ('.$userLevels.') ) )'; + $wheres[] = ' c.published = 1'; + $wheres[] = ' c.approved = 1'; + $wheres[] = ' cc.published = 1'; + $wheres[] = ' c.textonly = 0'; + // Active + $jnow = JFactory::getDate(); + $now = $jnow->toSql(); + $nullDate = $db->getNullDate(); + $wheres[] = ' ( c.publish_up = '.$db->Quote($nullDate).' OR c.publish_up <= '.$db->Quote($now).' )'; + $wheres[] = ' ( c.publish_down = '.$db->Quote($nullDate).' OR c.publish_down >= '.$db->Quote($now).' )'; + $fileOrdering = PhocaDownloadOrdering::getOrderingText($ordering); + + $query = ' SELECT c.*, cc.id AS categoryid, cc.title AS categorytitle, cc.alias AS categoryalias, cc.access as cataccess, cc.accessuserid as cataccessuserid ' + . ' FROM #__phocadownload AS c' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.id = c.catid' + . ' WHERE ' . implode( ' AND ', $wheres ) + . ' ORDER BY c.'.$fileOrdering; + + + + $db->setQuery( $query , 0, $fileCount ); + $files = $db->loadObjectList( ); + + foreach ($files as $keyDoc => $valueDoc) { + + // USER RIGHT - Access of categories (if file is included in some not accessed category) - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (!empty($valueDoc)) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $valueDoc->cataccessuserid, $valueDoc->cataccess, $user->getAuthorisedViewLevels(), $user->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + if ($rightDisplay == 1) { + + + $item = new JFeedItem(); + + $title = $this->escape( $valueDoc->title . ' ('.PhocaDownloadFile::getTitleFromFilenameWithExt( $valueDoc->filename ).')' ); + $title = html_entity_decode( $title ); + $item->title = $title; + + $link = PhocaDownloadRoute::getCategoryRoute($valueDoc->categoryid, $valueDoc->categoryalias); + $item->link = JRoute::_($link); + + + // FILEDATE + $fileDate = ''; + if ((int)$displayDateType > 0) { + if ($valueDoc->filename !='') { + $fileDate = PhocaDownloadFile::getFileTime($valueDoc->filename, $displayDateType, "Y-m-d H:M:S"); + } + } else { + $fileDate = JHTML::Date($valueDoc->date, "Y-m-d H:i:s"); + } + + if ($fileDate != '') { + $item->date = $fileDate; + } + //$item->description = $valueDoc->description; + // $item->description = '
    New file "' .$valueDoc->title . '" ('. $valueDoc->filename.') released on '. $dateDesc.' is available on Phoca download site
    '.$valueDoc->description; + + $item->description = '
    '.$valueDoc->description; + $item->category = $valueDoc->categorytitle; + // $item->section = $valueDoc->sectiontitle; + if ($valueDoc->author != '') { + $item->author = $valueDoc->author; + } + + $document->addItem( $item ); + } + } + } + } + } +} +?> \ No newline at end of file diff --git a/site/views/file/index.html b/site/views/file/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/file/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/file/metadata.xml b/site/views/file/metadata.xml new file mode 100644 index 0000000..be637e3 --- /dev/null +++ b/site/views/file/metadata.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/site/views/file/tmpl/default.php b/site/views/file/tmpl/default.php new file mode 100644 index 0000000..245784a --- /dev/null +++ b/site/views/file/tmpl/default.php @@ -0,0 +1,366 @@ +t['p']->get( 'pageclass_sfx' ).'" >'; + +if ( $this->t['p']->get( 'show_page_heading' ) ) { + echo '

    '. $this->escape($this->t['p']->get('page_heading')) . '

    '; +} + +if (!empty($this->category[0])) { + echo '
    '; + if ($this->t['display_up_icon'] == 1 && $this->t['tmplr'] == 0) { + + if (isset($this->category[0]->id)) { + if ($this->category[0]->id > 0) { + $linkUp = JRoute::_(PhocaDownloadRoute::getCategoryRoute($this->category[0]->id, $this->category[0]->alias)); + $linkUpText = $this->category[0]->title; + } else { + $linkUp = '#'; + $linkUpText = ''; + } + echo ''; + } + } +} else { + echo '
    '; +} + + +if (!empty($this->file[0])) { + $v = $this->file[0]; + + // USER RIGHT - Access of categories (if file is included in some not accessed category) - - - - - + // ACCESS is handled in SQL query, ACCESS USER ID is handled here (specific users) + $rightDisplay = 0; + if (!empty($this->category[0])) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $v->cataccessuserid, $v->cataccess, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + if ($rightDisplay == 1) { + + $l = new PhocaDownloadLayout(); + + echo '

    '.$l->getName($v->title, $v->filename, 1). '

    '; + + +// ===================================================================================== +// BEGIN LAYOUT AREA +// ===================================================================================== + + // Is this direct menu link to File View + $directFv = 0; + $app = JFactory::getApplication(); + $itemId = $app->input->get('Itemid', 0, 'int'); + $menu = $app->getMenu(); + $item = $menu->getItem($itemId); + if (isset($item->query['view']) && $item->query['view'] == 'file') { + $directFv = 1; + } + // End direct menu link to File View + + if ((int)$this->t['display_file_view'] == 1 + || (int)$this->t['display_file_view'] == 2 + || (int)$v->confirm_license > 0 + || (int)$this->t['display_detail'] == 2 + || (int)$directFv == 1) { + + $pdTitle = ''; + if ($v->title != '') { + $pdTitle .= '
    '.$v->title.'
    '; + } + + $pdImage = ''; + if ($v->image_download != '') { + $pdImage .= '
    '.$l->getImageDownload($v->image_download).'
    '; + } + + $pdVideo = ''; + $pdVideo = $l->displayVideo($v->video_filename, 1); + + if ($v->filename != '') { + $imageFileName = $l->getImageFileName($v->image_filename, $v->filename); + + $pdFile = '
    '; + if ($this->t['filename_or_name'] == 'filenametitle') { + $pdFile .= '
    '. $v->title . '
    '; + } + + $pdFile .= '
    '. $imageFileName['filenamethumb'] + . '
    '; + + $pdFile .= '
    '; + $pdFile .= $l->getName($v->title, $v->filename); + $pdFile .= '
    '; + + $pdFile .= PhocaDownloadRenderFront::displayNewIcon($v->date, $this->t['displaynew']); + $pdFile .= PhocaDownloadRenderFront::displayHotIcon($v->hits, $this->t['displayhot']); + + //Specific icons + if (isset($v->image_filename_spec1) && $v->image_filename_spec1 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec1).'
    '; + } + if (isset($v->image_filename_spec2) && $v->image_filename_spec2 != '') { + $pdFile .= '
    '.$l->getImageDownload($v->image_filename_spec2).'
    '; + } + + $pdFile .= '
    ' . "\n"; + } + + $pdFileSize = ''; + $fileSize = $l->getFilesize($v->filename); + if ($fileSize != '') { + $pdFileSize .= '
    '.JText::_('COM_PHOCADOWNLOAD_FILESIZE').':
    '; + $pdFileSize .= '
    '.$fileSize.'
    '; + } + + $pdVersion = ''; + if ($v->version != '') { + $pdVersion .= '
    '.JText::_('COM_PHOCADOWNLOAD_VERSION').':
    '; + $pdVersion .= '
    '.$v->version.'
    '; + } + + $pdLicense = ''; + if ($v->license != '') { + if ($v->license_url != '') { + $pdLicense .= '
    '.JText::_('COM_PHOCADOWNLOAD_LICENSE').':
    '; + $pdLicense .= ''; + } else { + $pdLicense .= '
    '.JText::_('COM_PHOCADOWNLOAD_LICENSE').':
    '; + $pdLicense .= '
    '.$v->license.'
    '; + } + } + + $pdAuthor = ''; + if ($v->author != '') { + if ($v->author_url != '') { + $pdAuthor .= '
    '.JText::_('COM_PHOCADOWNLOAD_AUTHOR').':
    '; + $pdAuthor .= ''; + } else { + $pdAuthor .= '
    '.JText::_('COM_PHOCADOWNLOAD_AUTHOR').':
    '; + $pdAuthor .= '
    '.$v->author.'
    '; + } + } + + $pdAuthorEmail = ''; + if ($v->author_email != '') { + $pdAuthorEmail .= '
    '.JText::_('COM_PHOCADOWNLOAD_EMAIL').':
    '; + $pdAuthorEmail .= '
    '. $l->getProtectEmail($v->author_email).'
    '; + } + + $pdFileDate = ''; + $fileDate = $l->getFileDate($v->filename, $v->date); + if ($fileDate != '') { + $pdFileDate .= '
    '.JText::_('COM_PHOCADOWNLOAD_DATE').':
    '; + $pdFileDate .= '
    '.$fileDate.'
    '; + } + + $pdDownloads = ''; + if ($this->t['display_downloads'] == 1) { + $pdDownloads .= '
    '.JText::_('COM_PHOCADOWNLOAD_DOWNLOADS').':
    '; + $pdDownloads .= '
    '.$v->hits.' x
    '; + } + + $pdDescription = ''; + if ($l->isValueEditor($v->description)) { + $pdDescription .= '
    '.$v->description.'
    '; + } + + $pdFeatures = ''; + if ($l->isValueEditor($v->features)) { + $pdFeatures .= '
    '.JText::_('COM_PHOCADOWNLOAD_FEATURES').'
    '; + $pdFeatures .= '
    '.$v->features.'
    '; + } + + $pdChangelog = ''; + if ($l->isValueEditor($v->changelog)) { + $pdChangelog .= '
    '.JText::_('COM_PHOCADOWNLOAD_CHANGELOG').'
    '; + $pdChangelog .= '
    '.$v->changelog.'
    '; + } + + $pdNotes = ''; + if ($l->isValueEditor($v->notes)) { + $pdNotes .= '
    '.JText::_('COM_PHOCADOWNLOAD_NOTES').'
    '; + $pdNotes .= '
    '.$v->notes.'
    '; + } + + + // pdmirrorlink1 + $pdMirrorLink1 = ''; + $mirrorOutput1 = PhocaDownloadRenderFront::displayMirrorLinks(1, $v->mirror1link, $v->mirror1title, $v->mirror1target); + if ($mirrorOutput1 != '') { + + if ($this->t['display_mirror_links'] == 4 || $this->t['display_mirror_links'] == 6) { + $classMirror = 'pd-button-mirror1'; + } else { + $classMirror = 'pd-mirror'; + } + + $pdMirrorLink1 = '
    '.$mirrorOutput1.'
    '; + } + + // pdmirrorlink2 + $pdMirrorLink2 = ''; + $mirrorOutput2 = PhocaDownloadRenderFront::displayMirrorLinks(1, $v->mirror2link, $v->mirror2title, $v->mirror2target); + if ($mirrorOutput2 != '') { + if ($this->t['display_mirror_links'] == 4 || $this->t['display_mirror_links'] == 6) { + $classMirror = 'pd-button-mirror2'; + } else { + $classMirror = 'pd-mirror'; + } + + $pdMirrorLink2 = '
    '.$mirrorOutput2.'
    '; + } + + // pdreportlink + $pdReportLink = PhocaDownloadRenderFront::displayReportLink(1, $v->title); + + + // pdrating + $pdRating = PhocaDownloadRate::renderRateFile($v->id, $this->t['display_rating_file']); + + // pdtags + $pdTags = ''; + if ($this->t['display_tags_links'] == 2 || $this->t['display_tags_links'] == 3) { + if ($l->displayTags($v->id) != '') { + $pdTags .= $l->displayTags($v->id); + } + + } + + + // --------------------------------------------------- + //Convert + // --------------------------------------------------- + if ($this->t['display_specific_layout'] == 0) { + echo '
    '; + //echo $pdTitle; + echo $pdImage; + echo $pdFile; + echo $pdFileSize; + echo $pdVersion; + echo $pdLicense; + echo $pdAuthor; + echo $pdAuthorEmail; + echo $pdFileDate; + echo $pdDownloads; + echo $pdDescription; + echo $pdFeatures; + echo $pdChangelog; + echo $pdNotes; + if ($this->t['display_mirror_links'] == 5 || $this->t['display_mirror_links'] == 6) { + echo '
    '.$pdMirrorLink2.'
    '; + echo '
    '.$pdMirrorLink1.'
    '; + } else if ($this->t['display_mirror_links'] == 2 || $this->t['display_mirror_links'] == 3) { + echo '
    '.$pdMirrorLink2.$pdMirrorLink1.'
    '; + } + + echo '
    '.$pdReportLink.'
    '; + echo '
    '.$pdRating.'
    '; + echo '
    '.$pdTags.'
    '; + echo '
    '.$pdVideo.'
    '; + echo '
    '; + echo '
    '; + } else { + + /*$fileLayout = '
    + {pdimage} + {pdfile} + {pdfilesize} + {pdversion} + {pdlicense} + {pdauthor} + {pdauthoremail} + {pdfiledate} + {pddownloads} + {pddescription} + {pdfeatures} + {pdchangelog} + {pdnotes} +
    {pdmirrorlink2} {pdmirrorlink1}
    +
    {pdreportlink}
    +
    {pdrating}
    +
    {pdtags}
    +
    +
    ';*/ + + + $fileLayout = PhocaDownloadSettings::getLayoutText('file'); + $fileLayoutParams = PhocaDownloadSettings::getLayoutParams('file'); + + $replace = array($pdTitle, $pdImage, $pdFile, $pdFileSize, $pdVersion, $pdLicense, $pdAuthor, $pdAuthorEmail, $pdFileDate, $pdDownloads, $pdDescription, $pdFeatures, $pdChangelog, $pdNotes, $pdMirrorLink1, $pdMirrorLink2, $pdReportLink, $pdRating, $pdTags, $pdVideo); + $output = str_replace($fileLayoutParams['search'], $replace, $fileLayout); + + echo $output; + } + + // --------------------------------------------------- + + + $o = '
     
    '; + + if ((int)$v->confirm_license > 0) { + $o .= '

    '.JText::_('COM_PHOCADOWNLOAD_LICENSE_AGREEMENT').'

    '; + $o .= '
    '.$v->licensetext.'
    '; + + // External link + if ($v->link_external != '' && $v->directlink == 1) { + $o .= '
    '; + $o .= ' '.JText::_('COM_PHOCADOWNLOAD_I_AGREE_TO_TERMS_LISTED_ABOVE').' '; + $o .= ''; + } else { + $o .= ''; + $o .= ' '.JText::_('COM_PHOCADOWNLOAD_I_AGREE_TO_TERMS_LISTED_ABOVE').' '; + $o .= ''; + $o .= ''; + $o .= ''; + } + $o .= '
    '; + + // For users who have disabled Javascript + $o .= ''; + } else { + // External link + if ($v->link_external != '') { + $o .= '
    '; + $o .= ''; + } else { + $o .= ''; + $o .= ''; + $o .= ''; + $o .= ''; + $o .= ''; + } + $o .= '
    '; + } + + + if ($this->t['display_file_comments'] == 1) { + if (JComponentHelper::isEnabled('com_jcomments', true)) { + include_once(JPATH_BASE.DS.'components'.DS.'com_jcomments'.DS.'jcomments.php'); + $o .= JComments::showComments($v->id, 'com_phocadownload_files', JText::_('COM_PHOCADOWNLOAD_FILE') .' '. $v->title); + } + } + + if ($this->t['display_file_comments'] == 2) { + $o .= '
    '.$this->loadTemplate('comments-fb').'
    '; + } + + echo $o; + + } else { + echo '

    '.JText::_('COM_PHOCADOWNLOAD_FILE') .'

    '; + echo '
    '.JText::_('COM_PHOCADOWNLOAD_NO_RIGHTS_ACCESS_CATEGORY').'
    '; + } + } + echo '
     
    ';// end of box +} else { + echo '
     
    '; +} +echo '
     
    '. $this->t['pw']; +?> \ No newline at end of file diff --git a/site/views/file/tmpl/default.xml b/site/views/file/tmpl/default.xml new file mode 100644 index 0000000..81c73e5 --- /dev/null +++ b/site/views/file/tmpl/default.xml @@ -0,0 +1,40 @@ + + + + + + + + + COM_PHOCADOWNLOAD_FILE_LAYOUT + COM_PHOCADOWNLOAD_FILE_LAYOUT_DESC + +
    + + +
    +
    + +
    + + + + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/site/views/file/tmpl/default_comments-fb.php b/site/views/file/tmpl/default_comments-fb.php new file mode 100644 index 0000000..970b397 --- /dev/null +++ b/site/views/file/tmpl/default_comments-fb.php @@ -0,0 +1,42 @@ +
    $value) { + $uri->delVar($value); + } + } + + if ($this->t['fb_comment_app_id'] == '') { + echo JText::_('COM_PHOCADOWNLOAD_ERROR_FB_APP_ID_EMPTY'); + } else { + + $cCount = ''; + if ((int)$this->t['fb_comment_count'] > 0) { + $cCount = 'numposts="'.$this->t['fb_comment_count'].'"'; + } + +?> width="t['fb_comment_width'] ?>"> +
    + + +
    diff --git a/site/views/file/tmpl/index.html b/site/views/file/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/file/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/file/view.html.php b/site/views/file/view.html.php new file mode 100644 index 0000000..0255cc1 --- /dev/null +++ b/site/views/file/view.html.php @@ -0,0 +1,231 @@ +t['p'] = $app->getParams(); + $this->t['user'] = JFactory::getUser(); + $uri = JFactory::getURI(); + $model = $this->getModel(); + $document = JFactory::getDocument(); + $fileId = $app->input->get('id', 0, 'int'); + $this->t['limitstart'] = $app->input->get( 'start', 0, 'int');// we need it for category back link + $this->t['tmpl'] = $app->input->get( 'tmpl', '', 'string' ); + $this->t['mediapath'] = PhocaDownloadPath::getPathMedia(); + + $this->t['tmplr'] = 0; + if ($this->t['tmpl'] == 'component') { + $this->t['tmplr'] = 1; + } + + if ($this->t['limitstart'] > 0 ) { + $this->t['limitstarturl'] = '&start='.$this->t['limitstart']; + } else { + $this->t['limitstarturl'] = ''; + } + + $this->category = $model->getCategory($fileId); + $this->file = $model->getFile($fileId, $this->t['limitstarturl']); + + PhocaDownloadRenderFront::renderAllCSS(); + $document->addCustomTag(''); + $js = 'var enableDownloadButtonPD = 0;' + .'function enableDownloadPD() {' + .' if (enableDownloadButtonPD == 0) {' + .' document.forms[\'phocadownloadform\'].elements[\'pdlicensesubmit\'].disabled=false;' + .' enableDownloadButtonPD = 1;' + .' } else {' + .' document.forms[\'phocadownloadform\'].elements[\'pdlicensesubmit\'].disabled=true;' + .' enableDownloadButtonPD = 0;' + .' }' + .'}'; + $document->addScriptDeclaration($js); + + + // Params + $this->t['licenseboxheight'] = $this->t['p']->get( 'license_box_height', 300 ); + $this->t['filename_or_name'] = $this->t['p']->get( 'filename_or_name', 'filename' ); + $this->t['display_up_icon'] = $this->t['p']->get( 'display_up_icon', 1 ); + $this->t['allowed_file_types'] = $this->t['p']->get( 'allowed_file_types', '' ); + $this->t['disallowed_file_types'] = $this->t['p']->get( 'disallowed_file_types', '' ); + $this->t['enable_user_statistics'] = $this->t['p']->get( 'enable_user_statistics', 1 ); + $this->t['display_file_comments'] = $this->t['p']->get( 'display_file_comments', 0 ); + $this->t['file_icon_size'] = $this->t['p']->get( 'file_icon_size', 16 ); + $this->t['display_file_view'] = $this->t['p']->get('display_file_view', 0); + $this->t['download_metakey'] = $this->t['p']->get( 'download_metakey', '' ); + $this->t['download_metadesc'] = $this->t['p']->get( 'download_metadesc', '' ); + $this->t['display_downloads'] = $this->t['p']->get( 'display_downloads', 0 ); + $this->t['display_date_type'] = $this->t['p']->get( 'display_date_type', 0 ); + $this->t['displaynew'] = $this->t['p']->get( 'display_new', 0 ); + $this->t['displayhot'] = $this->t['p']->get( 'display_hot', 0 ); + $this->t['pw'] = PhocaDownloadRenderFront::renderPhocaDownload(); + $this->t['download_external_link'] = $this->t['p']->get( 'download_external_link', '_self' ); + $this->t['display_report_link'] = $this->t['p']->get( 'display_report_link', 0 ); + $this->t['send_mail_download'] = $this->t['p']->get( 'send_mail_download', 0 );// not boolean but id of user + //$this->t['send_mail_upload'] = $this->t['p']->get( 'send_mail_upload', 0 ); + $this->t['display_rating_file'] = $this->t['p']->get( 'display_rating_file', 0 ); + $this->t['display_tags_links'] = $this->t['p']->get( 'display_tags_links', 0 ); + $this->t['display_mirror_links'] = $this->t['p']->get( 'display_mirror_links', 0 ); + $this->t['display_specific_layout'] = $this->t['p']->get( 'display_specific_layout', 0 ); + $this->t['display_detail'] = $this->t['p']->get( 'display_detail', 1); + $this->t['fb_comment_app_id'] = $this->t['p']->get( 'fb_comment_app_id', '' ); + $this->t['fb_comment_width'] = $this->t['p']->get( 'fb_comment_width', '550' ); + $this->t['fb_comment_lang'] = $this->t['p']->get( 'fb_comment_lang', 'en_US' ); + $this->t['fb_comment_count'] = $this->t['p']->get( 'fb_comment_count', '' ); + + // Rating + if ($this->t['display_rating_file'] == 2 || $this->t['display_rating_file'] == 3 ) { + JHTML::_('behavior.framework', true); + PhocaDownloadRate::renderRateFileJS(1); + $this->t['display_rating_file'] = 1; + } else { + $this->t['display_rating_file'] = 0; + } + + // DOWNLOAD + // - - - - - - - - - - - - - - - + $download = $app->input->get( 'download', array(0), 'array' ); + $licenseAgree = $app->input->get( 'license_agree', '', 'string' ); + $downloadId = (int) $download[0]; + if ($downloadId > 0) { + if (isset($this->file[0]->id)) { + $currentLink = 'index.php?option=com_phocadownload&view=file&id='.$this->file[0]->id.':'.$this->file[0]->alias. $this->t['limitstarturl'] . '&Itemid='. $app->input->get('Itemid', 0, 'int'); + } else { + $currentLink = 'index.php?option=com_phocadownload&view=categories&Itemid='. $app->input->get('Itemid', 0, 'int'); + } + + // Check Token + $token = JSession::getFormToken(); + if (!JRequest::getInt( $token, 0, 'post' )) { + //JError::raiseError(403, 'Request Forbidden'); + $app->redirect(JRoute::_('index.php', false), JText::_('COM_PHOCADOWNLOAD_INVALID_TOKEN')); + exit; + } + + // Check License Agreement + if (empty($licenseAgree)) { + $app->redirect(JRoute::_($currentLink, false), JText::_('COM_PHOCADOWNLOAD_WARNING_AGREE_LICENSE_TERMS')); + exit; + } + + $fileData = PhocaDownloadDownload::getDownloadData($downloadId, $currentLink); + PhocaDownloadDownload::download($fileData, $downloadId, $currentLink); + } + // - - - - - - - - - - - - - - - + + $imagePath = PhocaDownloadPath::getPathSet('icon'); + $this->t['cssimgpath'] = str_replace ( '../', JURI::base(true).'/', $imagePath['orig_rel_ds']); + $filePath = PhocaDownloadPath::getPathSet('file'); + $this->t['absfilepath'] = $filePath['orig_abs_ds']; + $this->t['action'] = $uri->toString(); + + if (isset($this->category[0]) && is_object($this->category[0]) && isset($this->file[0]) && is_object($this->file[0])){ + $this->_prepareDocument($this->category[0], $this->file[0]); + } + parent::display($tpl); + + } + + protected function _prepareDocument($category, $file) { + + $app = JFactory::getApplication(); + $menus = $app->getMenu(); + $menu = $menus->getActive(); + $pathway = $app->getPathway(); + $title = null; + + $this->t['downloadmetakey'] = $this->t['p']->get( 'download_metakey', '' ); + $this->t['downloadmetadesc'] = $this->t['p']->get( 'download_metadesc', '' ); + + if ($menu) { + $this->t['p']->def('page_heading', $this->t['p']->get('page_title', $menu->title)); + } else { + $this->t['p']->def('page_heading', JText::_('JGLOBAL_ARTICLES')); + } + + /*$title = $this->t['p']->get('page_title', ''); + if (empty($title) || (isset($title) && $title == '')) { + $title = $this->item->title; + } + if (empty($title) || (isset($title) && $title == '')) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0)) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + } + //$this->document->setTitle($title); + + $this->document->setTitle($title);*/ + + $title = $this->t['p']->get('page_title', ''); + $this->tmpl['display_file_name_title'] = 1; + if (empty($title)) { + $title = htmlspecialchars_decode($app->getCfg('sitename')); + } else if ($app->getCfg('sitename_pagetitles', 0) == 1) { + $title = JText::sprintf('JPAGETITLE', htmlspecialchars_decode($app->getCfg('sitename')), $title); + + if ($this->tmpl['display_file_name_title'] == 1 && isset($file->title) && $file->title != '') { + $title = $title .' - ' . $file->title; + } + + } else if ($app->getCfg('sitename_pagetitles', 0) == 2) { + + if ($this->tmpl['display_file_name_title'] == 1 && isset($file->title) && $file->title != '') { + $title = $title .' - ' . $file->title; + } + + $title = JText::sprintf('JPAGETITLE', $title, htmlspecialchars_decode($app->getCfg('sitename'))); + } + $this->document->setTitle($title); + + + if ($file->metadesc != '') { + $this->document->setDescription($file->metadesc); + } else if ($this->t['downloadmetadesc'] != '') { + $this->document->setDescription($this->t['downloadmetadesc']); + } else if ($this->t['p']->get('menu-meta_description', '')) { + $this->document->setDescription($this->t['p']->get('menu-meta_description', '')); + } + + if ($file->metakey != '') { + $this->document->setMetadata('keywords', $file->metakey); + } else if ($this->t['downloadmetakey'] != '') { + $this->document->setMetadata('keywords', $this->t['downloadmetakey']); + } else if ($this->t['p']->get('menu-meta_keywords', '')) { + $this->document->setMetadata('keywords', $this->t['p']->get('menu-meta_keywords', '')); + } + + if ($app->getCfg('MetaTitle') == '1' && $this->t['p']->get('menupage_title', '')) { + $this->document->setMetaData('title', $this->t['p']->get('page_title', '')); + } + + // Breadcrumbs TODO (Add the whole tree) + $pathway = $app->getPathway(); + if (isset($category->id)) { + if ($category->id > 0) { + $pathway->addItem($category->title, JRoute::_(PhocaDownloadRoute::getCategoryRoute($category->id, $category->alias))); + } + } + + if (!empty($file->title)) { + $pathway->addItem($file->title); + } + } +} +?> \ No newline at end of file diff --git a/site/views/index.html b/site/views/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkcat/index.html b/site/views/phocadownloadlinkcat/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkcat/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkcat/tmpl/default.php b/site/views/phocadownloadlinkcat/tmpl/default.php new file mode 100644 index 0000000..207eb45 --- /dev/null +++ b/site/views/phocadownloadlinkcat/tmpl/default.php @@ -0,0 +1,95 @@ + + + + \ No newline at end of file diff --git a/site/views/phocadownloadlinkcat/tmpl/index.html b/site/views/phocadownloadlinkcat/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkcat/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkcat/view.html.php b/site/views/phocadownloadlinkcat/view.html.php new file mode 100644 index 0000000..8bb2b14 --- /dev/null +++ b/site/views/phocadownloadlinkcat/view.html.php @@ -0,0 +1,61 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + $document = JFactory::getDocument(); + $uri = JFactory::getURI(); + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = $app->input->get('e_name'); + $this->t['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $this->t['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$this->t['ename']; + + $model = $this->getModel(); + + // build list of categories + //$javascript = 'class="inputbox" size="1" onchange="submitform( );"'; + $javascript = 'class="inputbox" size="1"'; + $filter_catid = ''; + + $query = 'SELECT a.title AS text, a.id AS value, a.parent_id as parentid' + . ' FROM #__phocadownload_categories AS a' + . ' WHERE a.published = 1' + //. ' AND a.approved = 1' + . ' ORDER BY a.ordering'; + $db->setQuery( $query ); + $phocadownloads = $db->loadObjectList(); + + $tree = array(); + $text = ''; + $tree = PhocaDownloadCategory::CategoryTreeOption($phocadownloads, $tree, 0, $text, -1); + array_unshift($tree, JHTML::_('select.option', '0', '- '.JText::_('COM_PHOCADOWNLOAD_SELECT_CATEGORY').' -', 'value', 'text')); + $lists['catid'] = JHTML::_( 'select.genericlist', $tree, 'catid', $javascript , 'value', 'text', $filter_catid ); + //----------------------------------------------------------------------- + + $this->assignRef('lists', $lists); + $this->assignRef('tmpl', $this->t); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/site/views/phocadownloadlinkcats/index.html b/site/views/phocadownloadlinkcats/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkcats/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkcats/tmpl/default.php b/site/views/phocadownloadlinkcats/tmpl/default.php new file mode 100644 index 0000000..29b2211 --- /dev/null +++ b/site/views/phocadownloadlinkcats/tmpl/default.php @@ -0,0 +1,65 @@ + + + + \ No newline at end of file diff --git a/site/views/phocadownloadlinkcats/tmpl/index.html b/site/views/phocadownloadlinkcats/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkcats/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkcats/view.html.php b/site/views/phocadownloadlinkcats/view.html.php new file mode 100644 index 0000000..2af1558 --- /dev/null +++ b/site/views/phocadownloadlinkcats/view.html.php @@ -0,0 +1,71 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + $document = JFactory::getDocument(); + $uri = JFactory::getURI(); + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = $app->input->get('e_name'); + $this->t['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $this->t['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$this->t['ename']; + + + // Category Tree + $db = JFactory::getDBO(); + $query = 'SELECT a.title AS text, a.id AS value, a.parent_id as parentid' + . ' FROM #__phocadownload_categories AS a' + // . ' WHERE a.published = 1' You can hide not published and not authorized categories too + // . ' AND a.approved = 1' + . ' ORDER BY a.ordering'; + $db->setQuery( $query ); + $categories = $db->loadObjectList(); + + $tree = array(); + $text = ''; + $tree = PhocaDownloadCategory::CategoryTreeOption($categories, $tree, 0, $text, -1); + //----------------------------------------------------------------------- + + // Multiple + $ctrl = 'hidecategories'; + $attribs = ' '; + $attribs .= ' size="5"'; + //$attribs .= 'class="'.$v.'"'; + $attribs .= ' class="inputbox"'; + $attribs .= ' multiple="multiple"'; + $ctrl .= ''; + //$value = implode( '|', ) + + $categoriesOutput = JHTML::_('select.genericlist', $tree, $ctrl, $attribs, 'value', 'text', 0, 'hidecategories' ); + + $this->assignRef('categoriesoutput', $categoriesOutput); + $this->assignRef('tmpl', $this->t); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/site/views/phocadownloadlinkfile/index.html b/site/views/phocadownloadlinkfile/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkfile/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkfile/tmpl/default.php b/site/views/phocadownloadlinkfile/tmpl/default.php new file mode 100644 index 0000000..3f32f24 --- /dev/null +++ b/site/views/phocadownloadlinkfile/tmpl/default.php @@ -0,0 +1,398 @@ +lists['order'] == 'a.ordering'); + +JHTML::_('behavior.tooltip'); + +if ($this->t['type'] == 0) { + $view = 'file'; +} else if ($this->t['type'] == 1) { + $view = 'fileplaylink'; +} else if ($this->t['type'] == 2) { + $view = 'fileplay'; +} else if ($this->t['type'] == 3) { + $view = 'filepreviewlink'; +} else if ($this->t['type'] == 4) { + $view = 'filelist'; +} + + +?> + + \ No newline at end of file diff --git a/site/views/phocadownloadlinkfile/tmpl/index.html b/site/views/phocadownloadlinkfile/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkfile/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkfile/view.html.php b/site/views/phocadownloadlinkfile/view.html.php new file mode 100644 index 0000000..9375a7b --- /dev/null +++ b/site/views/phocadownloadlinkfile/view.html.php @@ -0,0 +1,128 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = $app->input->get('e_name'); + $this->t['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $this->t['type'] = $app->input->get( 'type', 1, '', 'int' ); + $this->t['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$this->t['ename']; + + + $params = JComponentHelper::getParams('com_phocadownload') ; + + //Filter + $context = 'com_phocadownload.phocadownload.list.'; + //$sectionid = $app->input->get( 'sectionid', -1, '', 'int' ); + //$redirect = $sectionid; + $option = JRequest::getCmd( 'option' ); + + $filter_state = $app->getUserStateFromRequest( $this->_context.'.filter_state', 'filter_state', '', 'word' ); + $filter_catid = $app->getUserStateFromRequest( $this->_context.'.filter_catid', 'filter_catid', 0, 'int' ); + $catid = $app->getUserStateFromRequest( $this->_context.'.catid', 'catid', 0, 'int'); + // $filter_sectionid = $app->getUserStateFromRequest( $this->_context.'.filter_sectionid','filter_sectionid', -1, 'int'); + $filter_order = $app->getUserStateFromRequest( $this->_context.'.filter_order', 'filter_order', 'a.ordering', 'cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context.'.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + $search = $app->getUserStateFromRequest( $this->_context.'.search','search', '', 'string' ); + $search = JString::strtolower( $search ); + + // Get data from the model + $items = $this->get( 'Data'); + $total = $this->get( 'Total'); + $pagination = $this->get( 'Pagination' ); + + // build list of categories + + if ($this->t['type'] != 4) { + $javascript = 'class="inputbox" size="1" onchange="submitform( );"'; + } else { + $javascript = ''; + } + // get list of categories for dropdown filter + $filter = ''; + + //if ($filter_sectionid > 0) { + // $filter = ' WHERE cc.section = '.$db->Quote($filter_sectionid); + //} + + // get list of categories for dropdown filter + $query = 'SELECT cc.id AS value, cc.title AS text' . + ' FROM #__phocadownload_categories AS cc' . + $filter . + ' ORDER BY cc.ordering'; + + if ($this->t['type'] != 4) { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, true, true); + } else { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, false, true); + } +/* + if ($this->t['type'] != 4) { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, true); + } else { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, false); + }*/ + + // sectionid + /*$query = 'SELECT s.title AS text, s.id AS value' + . ' FROM #__phocadownload_sections AS s' + . ' WHERE s.published = 1' + . ' ORDER BY s.ordering'; + + $lists['sectionid'] = PhocaDownloadCategory::filterSection($query, $filter_sectionid);*/ + + // state filter + $lists['state'] = JHTML::_('grid.state', $filter_state ); + + // table ordering + $lists['order_Dir'] = $filter_order_Dir; + $lists['order'] = $filter_order; + + // search filter + $lists['search']= $search; + + + $user = JFactory::getUser(); + $uriS = $uri->toString(); + $this->assignRef('user', $user); + $this->assignRef('lists', $lists); + $this->assignRef('tmpl', $this->t); + $this->assignRef('items', $items); + $this->assignRef('pagination', $pagination); + $this->assignRef('request_url', $uriS); + + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/site/views/phocadownloadlinks/index.html b/site/views/phocadownloadlinks/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinks/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinks/tmpl/default.php b/site/views/phocadownloadlinks/tmpl/default.php new file mode 100644 index 0000000..41c0cf0 --- /dev/null +++ b/site/views/phocadownloadlinks/tmpl/default.php @@ -0,0 +1,20 @@ +' +.'
    ' +.''.JText::_( 'COM_PHOCADOWNLOAD_SELECT_TYPE' ).'' +.'' +.'' +.'
    ' +.''; +?> \ No newline at end of file diff --git a/site/views/phocadownloadlinks/tmpl/index.html b/site/views/phocadownloadlinks/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinks/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinks/view.html.php b/site/views/phocadownloadlinks/view.html.php new file mode 100644 index 0000000..7b56f5e --- /dev/null +++ b/site/views/phocadownloadlinks/view.html.php @@ -0,0 +1,49 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + $document = JFactory::getDocument(); + $uri = JFactory::getURI(); + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = $app->input->get('e_name'); + $eName = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + + + $this->t['linkcategories'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkcats&tmpl=component&e_name='.$eName; + $this->t['linkcategory'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkcat&tmpl=component&e_name='.$eName; + $this->t['linkfile'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkfile&tmpl=component&e_name='.$eName; + $this->t['linkytb'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkytb&tmpl=component&e_name='.$eName; + + $this->assignRef('tmpl', $this->t); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/site/views/phocadownloadlinkytb/index.html b/site/views/phocadownloadlinkytb/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkytb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkytb/tmpl/default.php b/site/views/phocadownloadlinkytb/tmpl/default.php new file mode 100644 index 0000000..f53e7cb --- /dev/null +++ b/site/views/phocadownloadlinkytb/tmpl/default.php @@ -0,0 +1,56 @@ + + + \ No newline at end of file diff --git a/site/views/phocadownloadlinkytb/tmpl/index.html b/site/views/phocadownloadlinkytb/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/phocadownloadlinkytb/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/phocadownloadlinkytb/view.html.php b/site/views/phocadownloadlinkytb/view.html.php new file mode 100644 index 0000000..5d9e4d0 --- /dev/null +++ b/site/views/phocadownloadlinkytb/view.html.php @@ -0,0 +1,40 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = $app->input->get('e_name'); + $this->t['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $this->t['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$this->t['ename']; + + $this->assignRef('tmpl', $this->t); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/site/views/play/index.html b/site/views/play/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/play/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/play/metadata.xml b/site/views/play/metadata.xml new file mode 100644 index 0000000..2378613 --- /dev/null +++ b/site/views/play/metadata.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/site/views/play/tmpl/default.php b/site/views/play/tmpl/default.php new file mode 100644 index 0000000..ed12790 --- /dev/null +++ b/site/views/play/tmpl/default.php @@ -0,0 +1,73 @@ +file[0])) { + $rightDisplay = PhocaDownloadAccess::getUserRight('accessuserid', $this->file[0]->cataccessuserid, $this->file[0]->cataccess, $this->t['user']->getAuthorisedViewLevels(), $this->t['user']->get('id', 0), 0); +} +// - - - - - - - - - - - - - - - - - - - - - - + +if ($rightDisplay == 1) { + + if ($this->t['html5_play'] == 1 && $this->t['filetype'] != 'flv') { + if ($this->t['filetype'] == 'mp3') { + echo ''. "\n"; + } else if ($this->t['filetype'] == 'mp4') { + echo ''. "\n"; + } else if ($this->t['filetype'] == 'ogg') { + echo ''. "\n"; + } else if ($this->t['filetype'] == 'ogv') { + echo ''. "\n"; + } + + } else { + + //Flow Player + $versionFLP = '3.2.2'; + $versionFLPJS = '3.2.2'; + $document = JFactory::getDocument(); + $document->addScript($this->t['playerpath'].'flowplayer-'.$versionFLPJS.'.min.js'); + + ?> +
    +
    t['filetype'] == 'mp3') { + ?>
    + + \ No newline at end of file diff --git a/site/views/play/tmpl/index.html b/site/views/play/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/play/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/play/view.html.php b/site/views/play/view.html.php new file mode 100644 index 0000000..edcad6b --- /dev/null +++ b/site/views/play/view.html.php @@ -0,0 +1,70 @@ +getParams(); + $this->t = array(); + $this->t['user'] = JFactory::getUser(); + $uri = JFactory::getURI(); + $model = $this->getModel(); + $document = JFactory::getDocument(); + $fileId = $app->input->get('id', 0, 'int'); + $file = $model->getFile($fileId); + + $fileExt = ''; + + $filePath = PhocaDownloadPath::getPathSet('fileplay'); + $filePath = str_replace ( '../', JURI::base(false).'', $filePath['orig_rel_ds']); + if (isset($file[0]->filename_play) && $file[0]->filename_play != '') { + + $fileExt = PhocaDownloadFile::getExtension($file[0]->filename_play); + $canPlay = PhocaDownloadFile::canPlay($file[0]->filename_play); + if ($canPlay) { + $this->t['playfilewithpath'] = $filePath . $file[0]->filename_play; + //$this->t['playerpath'] = JURI::base().'components/com_phocadownload/assets/jwplayer/'; + $this->t['playerpath'] = JURI::base().'components/com_phocadownload/assets/flowplayer/'; + $this->t['playerwidth'] = $params->get( 'player_width', 328 ); + $this->t['playerheight'] = $params->get( 'player_height', 200 ); + $this->t['html5_play'] = $params->get( 'html5_play', 0 ); + } else { + echo JText::_('COM_PHOCADOWNLOAD_ERROR_NO_CORRECT_FILE_TO_PLAY_FOUND');exit; + } + } else { + echo JText::_('COM_PHOCADOWNLOAD_ERROR_NO_FILE_TO_PLAY_FOUND');exit; + } + + $this->t['filetype'] = $fileExt; + if ($fileExt == 'mp3') { + $this->t['filetype'] = 'mp3'; + $this->t['playerheight'] = $params->get( 'player_mp3_height', 30 ); + } else if ($fileExt == 'ogg') { + $this->t['filetype'] = 'ogg'; + $this->t['playerheight'] = $params->get( 'player_mp3_height', 30 ); + } + + + $this->assignRef('file', $file); + $this->assignRef('tmpl', $this->t); + $this->assignRef('params', $params); + $uriT = $uri->toString(); + $this->assignRef('request_url', $uriT); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/site/views/ratingfilea/index.html b/site/views/ratingfilea/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/ratingfilea/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/ratingfilea/metadata.xml b/site/views/ratingfilea/metadata.xml new file mode 100644 index 0000000..2378613 --- /dev/null +++ b/site/views/ratingfilea/metadata.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/site/views/ratingfilea/tmpl/default.php b/site/views/ratingfilea/tmpl/default.php new file mode 100644 index 0000000..6cbee28 --- /dev/null +++ b/site/views/ratingfilea/tmpl/default.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/ratingfilea/tmpl/default.xml b/site/views/ratingfilea/tmpl/default.xml new file mode 100644 index 0000000..9205b30 --- /dev/null +++ b/site/views/ratingfilea/tmpl/default.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/site/views/ratingfilea/tmpl/index.html b/site/views/ratingfilea/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/ratingfilea/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/ratingfilea/view.json.php b/site/views/ratingfilea/view.json.php new file mode 100644 index 0000000..83ee2cf --- /dev/null +++ b/site/views/ratingfilea/view.json.php @@ -0,0 +1,148 @@ + '0', + 'error' => JText::_('JINVALID_TOKEN') + ); + echo json_encode($response); + return; + } + + $app = JFactory::getApplication(); + $params = $app->getParams(); + + + $ratingVote = $app->input->get( 'ratingVote', 0, 'post', 'int' ); + $ratingId = $app->input->get( 'ratingId', 0, 'post', 'int' );// ID of File + $format = $app->input->get( 'format', '', 'post', 'string' ); + $task = $app->input->get( 'task', '', 'get', 'string' ); + $view = $app->input->get( 'view', '', 'get', 'string' ); + $small = $app->input->get( 'small', 1, 'get', 'string' );//small or large rating icons + + $paramsC = JComponentHelper::getParams('com_phocadownload'); + $param['displayratingfile'] = $paramsC->get( 'display_rating_file', 0 ); + + // Check if rating is enabled - if not then user should not be able to rate or to see updated reating + + + + if ($task == 'refreshrate' && (int)$param['displayratingfile'] > 0) { + $ratingOutput = PhocaDownloadRate::renderRateFile((int)$ratingId, 1, $small, true);// ID of File + $response = array( + 'status' => '0', + 'message' => $ratingOutput); + echo json_encode($response); + return; + //return $ratingOutput; + + } else if ($task == 'rate') { + + $user = JFactory::getUser(); + //$view = $app->input->get( 'view', '', 'get', '', JREQUEST_NOTRIM ); + //$Itemid = $app->input->get( 'Itemid', 0, 'int'); + + $neededAccessLevels = PhocaDownloadAccess::getNeededAccessLevels(); + $access = PhocaDownloadAccess::isAccess($user->getAuthorisedViewLevels(), $neededAccessLevels); + + + $post['fileid'] = (int)$ratingId; + $post['userid'] = $user->id; + $post['rating'] = (int)$ratingVote; + + + if ($format != 'json') { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_WRONG_RATING') ; + $response = array( + 'status' => '0', + 'error' => $msg); + echo json_encode($response); + return; + } + + if ((int)$post['fileid'] < 1) { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_FILE_NOT_EXISTS'); + $response = array( + 'status' => '0', + 'error' => $msg); + echo json_encode($response); + return; + } + + $model = $this->getModel(); + + $checkUserVote = PhocaDownloadRate::checkUserVoteFile( $post['fileid'], $post['userid'] ); + + // User has already rated this category + if ($checkUserVote) { + $msg = JText::_('COM_PHOCADOWNLOAD_RATING_ALREADY_RATED_FILE'); + $response = array( + 'status' => '0', + 'error' => '', + 'message' => $msg); + echo json_encode($response); + return; + } else { + if ((int)$post['rating'] < 1 || (int)$post['rating'] > 5) { + + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_WRONG_RATING'); + $response = array( + 'status' => '0', + 'error' => $msg); + echo json_encode($response); + return; + } + + if ($access > 0 && $user->id > 0) { + if(!$model->rate($post)) { + $msg = JText::_('COM_PHOCADOWNLOAD_ERROR_RATING_FILE'); + $response = array( + 'status' => '0', + 'error' => $msg); + echo json_encode($response); + return; + } else { + $msg = JText::_('COM_PHOCADOWNLOAD_SUCCESS_RATING_FILE'); + $response = array( + 'status' => '1', + 'error' => '', + 'message' => $msg); + echo json_encode($response); + return; + } + } else { + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_AUTHORISED_ACTION'); + $response = array( + 'status' => '0', + 'error' => $msg); + echo json_encode($response); + return; + } + } + } else { + $msg = JText::_('COM_PHOCADOWNLOAD_NOT_AUTHORISED_ACTION'); + $response = array( + 'status' => '0', + 'error' => $msg); + echo json_encode($response); + return; + } + } +} +?> \ No newline at end of file diff --git a/site/views/user/index.html b/site/views/user/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/user/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/user/metadata.xml b/site/views/user/metadata.xml new file mode 100644 index 0000000..8895f92 --- /dev/null +++ b/site/views/user/metadata.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/site/views/user/tmpl/default.php b/site/views/user/tmpl/default.php new file mode 100644 index 0000000..757fe85 --- /dev/null +++ b/site/views/user/tmpl/default.php @@ -0,0 +1,43 @@ +t['p']->get( 'page_heading' ) != '') { + $heading .= $this->t['p']->get( 'page_heading' ); +} + +if ($this->t['showpageheading'] != 0) { + if ( $heading != '') { + echo '

    '. $this->escape($heading) . '

    '; + } +} +$tab = 0; +switch ($this->t['tab']) { + case 'up': + $tab = 1; + break; + + case 'cc': + default: + $tab = 0; + break; +} + +echo '
     
    '; + +if ($this->t['displaytabs'] > 0) { + echo '
    '; + //$pane =& J Pane::getInstance('Tabs', array('startOffset'=> $this->t['tab'])); + //echo $pane->startPane( 'pane' ); + echo JHtml::_('tabs.start', 'config-tabs-com_phocadownload-user', array('useCookie'=>1, 'startOffset'=> $this->t['tab'])); + + //echo $pane->startPanel( JHTML::_( 'image .site', $this->t['pi'].'icon-document-16.png','', '', '', '', '') . ' '.JText::_('COM_PHOCADOWNLOAD_UPLOAD'), 'files' ); + echo JHtml::_('tabs.panel', JHtml::_( 'image', $this->t['pi'].'icon-document-16.png', '') . ' '.JText::_('COM_PHOCADOWNLOAD_UPLOAD'), 'files' ); + echo $this->loadTemplate('files'); + //echo $pane->endPanel(); + + //echo $pane->endPane(); + echo JHtml::_('tabs.end'); + echo '
    '; +} +echo $this->t['pw']; +?> diff --git a/site/views/user/tmpl/default.xml b/site/views/user/tmpl/default.xml new file mode 100644 index 0000000..da13f00 --- /dev/null +++ b/site/views/user/tmpl/default.xml @@ -0,0 +1,22 @@ + + + + + + + + + COM_PHOCADOWNLOAD_USER_UPLOAD_LAYOUT + COM_PHOCADOWNLOAD_USER_UPLOAD_LAYOUT_DESC + +
    + + + + + + +
    +
    + +
    \ No newline at end of file diff --git a/site/views/user/tmpl/default_files.php b/site/views/user/tmpl/default_files.php new file mode 100644 index 0000000..3f2a8c1 --- /dev/null +++ b/site/views/user/tmpl/default_files.php @@ -0,0 +1,332 @@ +getNullDate(); +$now = JFactory::getDate(); + +echo '
     
    '; + +if ($this->t['displayupload'] == 1) { + + +?> + + + + +

    +
    + + + +
    + + +
    + +
    +listsfiles['catid'] ?> +
    +
    + + + + + + + + + + + + + + + + + +t['filesitems'] ); +$rows = &$this->t['filesitems']; + +if (is_array($rows)) { + foreach ($rows as $row) { + + // USER RIGHT - Delete (Publish/Unpublish) - - - - - - - - - - - + // 2, 2 means that user access will be ignored in function getUserRight for display Delete button + // because we cannot check the access and delete in one time + $user = JFactory::getUser(); + $rightDisplayDelete = 0; + $catAccess = PhocaDownloadAccess::getCategoryAccessByFileId((int)$row->id); + + if (!empty($catAccess)) { + $rightDisplayDelete = PhocaDownloadAccess::getUserRight('deleteuserid', $catAccess->deleteuserid, 2, $user->getAuthorisedViewLevels(), $user->get('id', 0), 0); + } + // - - - - - - - - - - - - - - - - - - - - - - + + ?>"> + + + + '; + if ($row->published == 1) { + if ($rightDisplayDelete) { + echo ''; + echo JHTML::_('image', $this->t['pi'].'icon-publish.png', JText::_('COM_PHOCADOWNLOAD_PUBLISHED')); + echo ''; + } else { + echo JHTML::_('image', $this->t['pi'].'icon-publish-g.png', JText::_('COM_PHOCADOWNLOAD_PUBLISHED')); + } + } + if ($row->published == 0) { + if ($rightDisplayDelete) { + echo ''; + echo JHTML::_('image', $this->t['pi'].'icon-unpublish.png', JText::_('COM_PHOCADOWNLOAD_UNPUBLISHED')); + echo ''; + } else { + echo JHTML::_('image', $this->t['pi'].'icon-unpublish-g.png', JText::_('COM_PHOCADOWNLOAD_UNPUBLISHED')); + } + } + echo ''; + + echo ''; + + echo ''; + + // Approved + echo ''; + + echo ''; + + + echo '' + //echo '' + .''; + + $k = 1 - $k; + $i++; + } +} +?> + + + + + +
    listsfiles['order_Dir'], $this->listsfiles['order'], 'image'); ?>listsfiles['order_Dir'], $this->listsfiles['order'], 'image' ); ?>listsfiles['order_Dir'], $this->listsfiles['order'], 'image' ); ?>listsfiles['order_Dir'], $this->listsfiles['order'], 'image' ); ?>listsfiles['order_Dir'], $this->listsfiles['order'], 'image' ); ?>
    title; ?>'; + if ($rightDisplayDelete) { + echo ''; + echo JHTML::_('image', $this->t['pi'].'icon-trash.png', JText::_('COM_PHOCADOWNLOAD_DELETE')); + echo ''; + } else { + echo JHTML::_('image', $this->t['pi'].'icon-trash-g.png', JText::_('COM_PHOCADOWNLOAD_DELETE')); + } + echo ''; + // User should get info about active/not active file (if e.g. admin change the active status) + $publish_up = JFactory::getDate($row->publish_up); + $publish_down = JFactory::getDate($row->publish_down); + $tz = new DateTimeZone($config->get('offset')); + $publish_up->setTimezone($tz); + $publish_down->setTimezone($tz); + + + if ( $now->toUnix() <= $publish_up->toUnix() ) { + $text = JText::_( 'COM_PHOCADOWNLOAD_PENDING' ); + } else if ( ( $now->toUnix() <= $publish_down->toUnix() || $row->publish_down == $nullDate ) ) { + $text = JText::_( 'COM_PHOCADOWNLOAD_ACTIVE' ); + } else if ( $now->toUnix() > $publish_down->toUnix() ) { + $text = JText::_( 'COM_PHOCADOWNLOAD_EXPIRED' ); + } + + $times = ''; + if (isset($row->publish_up)) { + if ($row->publish_up == $nullDate) { + $times .= JText::_( 'COM_PHOCADOWNLOAD_START') . ': '.JText::_( 'COM_PHOCADOWNLOAD_ALWAYS' ); + } else { + $times .= JText::_( 'COM_PHOCADOWNLOAD_START') .": ". $publish_up->format("D, d M Y H:i:s"); + } + } + if (isset($row->publish_down)) { + if ($row->publish_down == $nullDate) { + $times .= "
    ". JText::_( 'COM_PHOCADOWNLOAD_FINISH'). ': '. JText::_('COM_PHOCADOWNLOAD_NO_EXPIRY' ); + } else { + $times .= "
    ". JText::_( 'COM_PHOCADOWNLOAD_FINISH') .": ". $publish_up->format("D, d M Y H:i:s"); + } + } + + if ( $times ) { + echo '' + .''. $text.''; + } + + + echo '
    '; + if ($row->approved == 1) { + echo JHTML::_('image', $this->t['pi'].'icon-publish.png', JText::_('COM_PHOCADOWNLOAD_APPROVED')); + } else { + echo JHTML::_('image', $this->t['pi'].'icon-unpublish.png', JText::_('COM_PHOCADOWNLOAD_NOT_APPROVED')); + } + echo ''. $row->date .''. $row->categorytitle .''. $row->id .'
    + + + + + + + + + + + + + + +
    + +state->folder) && $this->state->folder != '') { + $currentFolder = $this->state->folder; +} +?> +

    t['uploadmaxsizeread'].']'; +?>

    + +t['errorcatid'] != '') { + echo '
    ' + .'' . $this->t['errorcatid'] . '
    '; +} ?> + +
    + + + + + + t['errorfile'] != '') { + echo ''; + } ?> + + + + + + + + + + + + + + + + + + + + + + + + t['erroremail'] != '') { + echo ''; + } ?> + + + + + + + t['errorwebsite'] != '') { + echo ''; + } ?> + + + + + + + + + + + +
    : + + +
    ' + .'' . $this->t['errorfile'] . '
    :
    :
      +
    :
    :
    ' + .'' . $this->t['erroremail'] . '
    :
    ' + .'' . $this->t['errorwebsite'] . '
    :
    :
    + +
    + + */ ?> + + + + + + + + +
    +
    t['pi'].'icon-loading.gif', '') . JText::_('COM_PHOCADOWNLOAD_LOADING'); ?>
    + + '; + +?> diff --git a/site/views/user/tmpl/index.html b/site/views/user/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/site/views/user/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/views/user/view.html.php b/site/views/user/view.html.php new file mode 100644 index 0000000..d22dce9 --- /dev/null +++ b/site/views/user/view.html.php @@ -0,0 +1,312 @@ +getMenu(); + $menu = $menus->getActive(); + $this->t['p'] = $app->getParams(); + $user = JFactory::getUser(); + $db = JFactory::getDBO(); + $user = JFactory::getUser(); + $userLevels = implode (',', $user->getAuthorisedViewLevels()); + + $this->t['pi'] = 'media/com_phocadownload/images/'; + $this->t['pp'] = 'index.php?option=com_phocadownload&view=user&controller=user'; + $this->t['pl'] = 'index.php?option=com_users&view=login&return='.base64_encode($this->t['pp'].'&Itemid='. $app->input->get('Itemid', 0, 'int')); + + $neededAccessLevels = PhocaDownloadAccess::getNeededAccessLevels(); + $access = PhocaDownloadAccess::isAccess($user->getAuthorisedViewLevels(), $neededAccessLevels); + + if (!$access) { + $app->redirect(JRoute::_($this->t['pl'], false), JText::_("COM_PHOCADOWNLOAD_NOT_AUTHORISED_ACTION")); + return; + } + + PhocaDownloadRenderFront::renderAllCSS(); + + + // = = = = = = = = = = = + // PANE + // = = = = = = = = = = = + // - - - - - - - - - - + // ALL TABS + // - - - - - - - - - - + // UCP is disabled (security reasons) + if ((int)$this->t['p']->get( 'enable_user_cp', 0 ) == 0) { + $app->redirect(JURI::base(false), JText::_("COM_PHOCADOWNLOAD_USER_UPLOAD_DISABLED")); + exit; + } + + $this->t['tab'] = $app->input->get('tab', 0, 'string'); + $this->t['maxuploadchar'] = $this->t['p']->get( 'max_upload_char', 1000 ); + $this->t['enableuseruploadapprove'] = $this->t['p']->get( 'enable_user_upload_approve', 0 ); + $this->t['showpageheading'] = $this->t['p']->get( 'show_page_heading', 1 ); + $this->t['uploadmaxsize'] = $this->t['p']->get( 'user_file_upload_size', 3145728 ); + $this->t['uploadmaxsizeread'] = PhocaDownloadFile::getFileSizeReadable($this->t['uploadmaxsize']); + $this->t['userfilesmaxcount'] = $this->t['p']->get( 'user_files_max_count', 5 ); + $this->t['userfilesmaxsize'] = $this->t['p']->get( 'user_files_max_size', 20971520 ); + $this->t['send_mail_upload'] = $this->t['p']->get( 'send_mail_upload', 0 ); + $this->t['pw'] = PhocaDownloadRenderFront::renderPhocaDownload(); + //Subcateogry + //$this->t['parentid'] = $app->input->get('parentcategoryid', 0, 'int'); + + //$document->addScript(JURI::base(true).'/components/com_phocadownload/assets/js/comments.js'); + $document->addCustomTag(PhocaDownloadRenderFront::renderOnUploadJS()); + $document->addCustomTag(PhocaDownloadRenderFront::renderDescriptionUploadJS((int)$this->t['maxuploadchar'])); + $document->addCustomTag(PhocaDownloadRenderFront::userTabOrdering()); + $model = $this->getModel('user'); + + // Upload Form - - - - - - - - - - - - - - - + $ftp = !JClientHelper::hasCredentials('ftp');// Set FTP form + $session = JFactory::getSession(); + $this->assignRef('session', $session); + // END Upload Form - - - - - - - - - - - - - + + $this->t['displayupload'] = 1; + + + + // - - - - - - - - - - + // FORM + // - - - - - - - - - - + // No Controller because of returning back the values in case some form field is not OK + + // Set default for returning back + $formData = new JObject(); + $formData->set('title', ''); + $formData->set('description',''); + $formData->set('author',''); + $formData->set('email',''); + $formData->set('license',''); + $formData->set('website',''); + $formData->set('version',''); + + $this->t['errorcatid'] = ''; + $this->t['erroremail'] = ''; + $this->t['errorwebsite'] = ''; + $this->t['errorfile'] = ''; + + $task = $app->input->get( 'task', '', 'string' ); + if($task == 'upload') { + $post['title'] = $app->input->get( 'phocadownloaduploadtitle', '', 'string' ); + $post['description'] = $app->input->get( 'phocadownloaduploaddescription', '', 'string' ); + $post['catidfiles'] = $app->input->get( 'catidfiles', 0, 'int' ); + $post['description'] = substr($post['description'], 0, (int)$this->t['maxuploadchar']); + + $post['approved'] = 0; + $post['published'] = 1; + $post['owner_id'] = $user->id; + if ($this->t['enableuseruploadapprove'] == 0) { + $post['approved'] = 1; + } + $post['author'] = $app->input->get( 'phocadownloaduploadauthor', '', 'string' ); + $post['email'] = $app->input->get( 'phocadownloaduploademail', '', 'string' ); + $post['website'] = $app->input->get( 'phocadownloaduploadwebsite', '', 'string' ); + $post['license'] = $app->input->get( 'phocadownloaduploadlicense', '', 'string' ); + $post['version'] = $app->input->get( 'phocadownloaduploadversion', '', 'string' ); + + if ($post['title'] != '') {$formData->set('title', $post['title']);} + if ($post['description'] != '') {$formData->set('description', $post['description']);} + if ($post['author'] != '') {$formData->set('author', $post['author']);} + if ($post['email'] != '') {$formData->set('email', $post['email']);} + if ($post['website'] != '') {$formData->set('website', $post['website']);} + if ($post['license'] != '') {$formData->set('license', $post['license']);} + if ($post['version'] != '') {$formData->set('version', $post['version']);} + + //catid + $returnForm = 0; + if ($post['catidfiles'] < 1) { + $this->t['errorcatid'] = JText::_('COM_PHOCADOWNLOAD_PLEASE_SELECT_CATEGORY'); + $returnForm = 1; + } + jimport('joomla.mail.helper'); + if ($post['email'] != '' && !JMailHelper::isEmailAddress($post['email']) ) { + $this->t['erroremail'] = JText::_('COM_PHOCADOWNLOAD_PLEASE_ENTER_VALID_EMAIL_ADDRESS'); + $returnForm = 1; + } + if ($post['website'] != '' && !PhocaDownloadUtils::isURLAddress($post['website']) ) { + $this->t['errorwebsite'] = JText::_('COM_PHOCADOWNLOAD_PLEASE_ENTER_VALID_WEBSITE'); + $returnForm = 1; + } + + // Upload + $errUploadMsg = ''; + $redirectUrl = ''; + $fileArray = JRequest::getVar('Filedata', '', 'files', 'array'); + + if(empty($fileArray) || (isset($fileArray['name']) && $fileArray['name'] == '')) { + $this->t['errorfile'] = JText::_('COM_PHOCADOWNLOAD_PLEASE_ADD_FILE'); + $returnForm = 1; + } + + if ($post['title'] == '') { + $post['title'] = PhocaDownloadFile::removeExtension($fileArray['name']); + } + $post['alias'] = PhocaDownloadUtils::getAliasName($post['title']); + + + if ($returnForm == 0) { + $errorUploadMsg = ''; + if($model->singleFileUpload($errorUploadMsg, $fileArray, $post)) { + + if ($this->t['send_mail_upload'] > 0) { + PhocaDownloadMail::sendMail((int)$this->t['send_mail_upload'], $post['title'], 2); + } + + $Itemid = $app->input->get( 'Itemid', 0, 'int'); + $limitStart = $app->input->get( 'limitstart', 0, 'int'); + if ($limitStart > 0) { + $limitStartUrl = '&limitstart='.$limitStart; + } else { + $limitStartUrl = ''; + } + $link = 'index.php?option=com_phocadownload&view=user&Itemid='. $Itemid . $limitStartUrl; + $app->redirect(JRoute::_($link, false), JText::_("COM_PHOCADOWNLOAD_SUCCESS_FILE_UPLOADED")); + exit; + } else { + $this->t['errorfile'] = JText::_('COM_PHOCADOWNLOAD_ERROR_FILE_UPLOADED'); + if ($errorUploadMsg != '') { + $this->t['errorfile'] .= '
    ' . $errorUploadMsg; + } + } + + } + } + + + // - - - - - - - - - - - + // FILES + // - - - - - - - - - - - + $this->t['filesitems'] = $model->getDataFiles($user->id); + $this->t['filestotal'] = $model->getTotalFiles($user->id); + $this->t['filespagination'] = $model->getPaginationFiles($user->id); + + $filter_state_files = $app->getUserStateFromRequest( $this->_context_files.'.filter_state','filter_state', '','word'); + $filter_catid_files = $app->getUserStateFromRequest( $this->_context_files.'.filter_catid','filter_catid',0, 'int' ); + $catid_files = $app->getUserStateFromRequest( $this->_context_files. '.catid', 'catid', 0, 'int'); + //$filter_sectionid_files = $app->getUserStateFromRequest( $this->_context_files.'.filter_sectionid', 'filter_sectionid', 0, 'int' ); + $filter_order_files = $app->getUserStateFromRequest( $this->_context_files.'.filter_order','filter_order','a.ordering', 'cmd' ); + $filter_order_Dir_files = $app->getUserStateFromRequest( $this->_context_files.'.filter_order_Dir','filter_order_Dir', '', 'word' ); + $search_files = $app->getUserStateFromRequest( $this->_context_files.'.search', 'search', '', 'string' ); + $search_files = JString::strtolower( $search_files ); + + // build list of categories + $javascript = 'class="inputbox" size="1" onchange="document.phocadownloadfilesform.submit();"'; + + // get list of categories for dropdown filter + $whereC = array(); + //if ($filter_sectionid_files > 0) { + // $whereC[] = ' cc.section = '.$db->Quote($filter_sectionid_files); + //} + //$whereC[] = "(cc.uploaduserid LIKE '%-1%' OR cc.uploaduserid LIKE '%".(int)$user->id."%')"; + //$whereC[] = "(cc.uploaduserid LIKE '%-1%' OR cc.uploaduserid LIKE '%,{".(int)$user->id."}' OR cc.uploaduserid LIKE '{".(int)$user->id."},%' OR cc.uploaduserid LIKE '%,{".(int)$user->id."},%' OR cc.uploaduserid ={".(int)$user->id."} )"; + $whereC[] = "(cc.uploaduserid LIKE '%-1%' OR cc.uploaduserid LIKE '%,".(int)$user->id."' OR cc.uploaduserid LIKE '".(int)$user->id.",%' OR cc.uploaduserid LIKE '%,".(int)$user->id.",%' OR cc.uploaduserid =".(int)$user->id." )"; + $whereC = ( count( $whereC ) ? ' WHERE '. implode( ' AND ', $whereC ) : '' ); + + // get list of categories for dropdown filter + $query = 'SELECT cc.id AS value, cc.title AS text, cc.parent_id as parentid' . + ' FROM #__phocadownload_categories AS cc' . + $whereC. + ' ORDER BY cc.ordering'; + + $lists_files['catid'] = PhocaDownloadCategory::filterCategory($query, $catid_files, TRUE, TRUE, TRUE); + + /*$whereS = array(); + //$whereS[] = "(cc.uploaduserid LIKE '%-1%' OR cc.uploaduserid LIKE '%".(int)$user->id."%')"; + $whereS[] = "(cc.uploaduserid LIKE '%-1%' OR cc.uploaduserid LIKE '%,".(int)$user->id."' OR cc.uploaduserid LIKE '".(int)$user->id.",%' OR cc.uploaduserid LIKE '%,".(int)$user->id.",%' OR cc.uploaduserid =".(int)$user->id." )"; + $whereS[] = 's.published = 1'; + $whereS = ( count( $whereS ) ? ' WHERE '. implode( ' AND ', $whereS ) : '' ); + // sectionid + $query = 'SELECT s.title AS text, s.id AS value' + . ' FROM #__phocadownload_sections AS s' + . ' LEFT JOIN #__phocadownload_categories AS cc ON cc.section = s.id' + . $whereS + . ' GROUP BY s.id' + . ' ORDER BY s.ordering'; + + + + // state filter + /* $state_files[] = JHTML::_('select.option', '', '- '. JText::_( 'Select State' ) .' -' ); + $state_files[] = JHTML::_('select.option', 'P', JText::_( 'Published' ) ); + $state_files[] = JHTML::_('select.option', 'U', JText::_( 'Unpublished') ); + $lists_image['state'] = JHTML::_('select.genericlist', $state_files, 'filter_state', 'class="inputbox" size="1" onchange="document.phocadownloadfilesform.submit();"', 'value', 'text', $filter_state );*/ + + //$lists_files['sectionid'] = PhocaDownloadCategory::filterSection($query, $filter_sectionid_files, TRUE); + + // state filter + $lists_files['state'] = JHTML::_('grid.state', $filter_state_files ); + + // table ordering + $lists_files['order_Dir'] = $filter_order_Dir_files; + $lists_files['order'] = $filter_order_files; + + // search filter + $lists_files['search']= $search_files; + + $this->t['catidfiles'] = $catid_files; + + $this->t['filestab'] = 1; + + // Tabs + $displayTabs = 0; + if ((int)$this->t['filestab'] == 0) { + $currentTab['files'] = -1; + } else { + $currentTab['files'] = $displayTabs; + $displayTabs++; + } + + $this->t['displaytabs'] = $displayTabs; + $this->t['currenttab'] = $currentTab; + + + // ACTION + $this->t['action'] = $uri->toString(); + // SEF problem + $isThereQM = false; + $isThereQM = preg_match("/\?/i", $this->t['action']); + if ($isThereQM) { + $amp = '&'; + } else { + $amp = '?'; + } + $this->t['actionamp'] = htmlspecialchars($this->t['action']) . $amp; + $this->t['istheretab'] = false; + $this->t['istheretab'] = preg_match("/tab=/i", $this->t['action']); + + + $this->t['ps'] = '&tab='. $this->t['currenttab']['files'] + . '&limitstart='.$this->t['filespagination']->limitstart; + + + // ASIGN + $this->assignRef( 'listsfiles', $lists_files); + $this->assignRef( 'formdata', $formData); + $this->assignRef( 'tmpl', $this->t); + $this->assignRef( 'params', $this->t['p']); + $session = JFactory::getSession(); + $this->assignRef('session', $session); + parent::display($tpl); + } +} +?> diff --git a/tables/index.html b/tables/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/tables/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tables/phocadownload.php b/tables/phocadownload.php new file mode 100644 index 0000000..b70a2fa --- /dev/null +++ b/tables/phocadownload.php @@ -0,0 +1,113 @@ +textonly == 1) { + } else { + if (trim( $this->filename ) == '') { + $this->setError( JText::_( 'FILE MUST HAVE A FILENAME') ); + return false; + } + } + + if(empty($this->title)) { + $this->title = PhocaDownloadFile::getTitleFromFilenameWithoutExt($this->filename); + } + + if(empty($this->alias)) { + $this->alias = $this->title; + } + $this->alias = PhocaDownloadUtils::getAliasName($this->alias); + + return true; + } + + public function approve($pks = null, $state = 1, $userId = 0) + { + // Initialise variables. + $k = $this->_tbl_key; + + // Sanitize input. + JArrayHelper::toInteger($pks); + $userId = (int) $userId; + $state = (int) $state; + + // If there are no primary keys set check to see if the instance key is set. + if (empty($pks)) + { + if ($this->$k) { + $pks = array($this->$k); + } + // Nothing to set publishing state on, return false. + else { + $this->setError(JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED')); + return false; + } + } + + // Build the WHERE clause for the primary keys. + $where = $k.'='.implode(' OR '.$k.'=', $pks); + + // Determine if there is checkin support for the table. + if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time')) { + $checkin = ''; + } + else { + $checkin = ' AND (checked_out = 0 OR checked_out = '.(int) $userId.')'; + } + + // Update the publishing state for rows with the given primary keys. + $this->_db->setQuery( + 'UPDATE `'.$this->_tbl.'`' . + ' SET `approved` = '.(int) $state . + ' WHERE ('.$where.')' . + $checkin + ); + $this->_db->query(); + + // Check for a database error. + if ($this->_db->getErrorNum()) { + $this->setError($this->_db->getErrorMsg()); + return false; + } + + // If checkin is supported and all rows were adjusted, check them in. + if ($checkin && (count($pks) == $this->_db->getAffectedRows())) + { + // Checkin the rows. + foreach($pks as $pk) + { + $this->checkin($pk); + } + } + + // If the JTable instance value is in the list of primary keys that were set, set the instance. + if (in_array($this->$k, $pks)) { + $this->state = $state; + } + + $this->setError(''); + return true; + } +} +?> \ No newline at end of file diff --git a/tables/phocadownloadcat.php b/tables/phocadownloadcat.php new file mode 100644 index 0000000..8603804 --- /dev/null +++ b/tables/phocadownloadcat.php @@ -0,0 +1,37 @@ +title ) == '') { + $this->setError( JText::_( 'CATEGORY MUST HAVE A TITLE') ); + return false; + } + + if(empty($this->alias)) { + $this->alias = $this->title; + } + $this->alias = PhocaDownloadUtils::getAliasName($this->alias); + + return true; + } +} +?> \ No newline at end of file diff --git a/tables/phocadownloadfilevotes.php b/tables/phocadownloadfilevotes.php new file mode 100644 index 0000000..d86c999 --- /dev/null +++ b/tables/phocadownloadfilevotes.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/tables/phocadownloadfilevotesstatistics.php b/tables/phocadownloadfilevotesstatistics.php new file mode 100644 index 0000000..2bd0091 --- /dev/null +++ b/tables/phocadownloadfilevotesstatistics.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/tables/phocadownloadlayout.php b/tables/phocadownloadlayout.php new file mode 100644 index 0000000..da4237d --- /dev/null +++ b/tables/phocadownloadlayout.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/tables/phocadownloadlic.php b/tables/phocadownloadlic.php new file mode 100644 index 0000000..90c0239 --- /dev/null +++ b/tables/phocadownloadlic.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/tables/phocadownloadlogging.php b/tables/phocadownloadlogging.php new file mode 100644 index 0000000..6cf2644 --- /dev/null +++ b/tables/phocadownloadlogging.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/tables/phocadownloadstyle.php b/tables/phocadownloadstyle.php new file mode 100644 index 0000000..a1a0204 --- /dev/null +++ b/tables/phocadownloadstyle.php @@ -0,0 +1,29 @@ +alias)) { + $this->alias = $this->title; + } + $this->alias = PhocaDownloadUtils::getAliasName($this->alias); + + return true; + } +} +?> \ No newline at end of file diff --git a/tables/phocadownloadtag.php b/tables/phocadownloadtag.php new file mode 100644 index 0000000..95a567c --- /dev/null +++ b/tables/phocadownloadtag.php @@ -0,0 +1,31 @@ +alias)) { + $this->alias = $this->title; + } + $this->alias = PhocaDownloadUtils::getAliasName($this->alias); + + return true; + } +} +?> \ No newline at end of file diff --git a/tables/phocadownloaduserstats.php b/tables/phocadownloaduserstats.php new file mode 100644 index 0000000..30ab9f0 --- /dev/null +++ b/tables/phocadownloaduserstats.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/update/index.html b/update/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/update/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/update/sql/index.html b/update/sql/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/update/sql/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/update/sql/mysql/3.0.2.sql b/update/sql/mysql/3.0.2.sql new file mode 100644 index 0000000..7f5fe74 --- /dev/null +++ b/update/sql/mysql/3.0.2.sql @@ -0,0 +1,23 @@ +ALTER TABLE `#__phocadownload` ADD COLUMN `token` char(64) default NULL; +ALTER TABLE `#__phocadownload` ADD COLUMN `tokenhits` int(11) NOT NULL default 0; + +-- BEGIN PROCEDURE +-- DELIMITER $$ +-- CREATE PROCEDURE AlterTable() +-- BEGIN +-- DECLARE _count INT; +-- DECLARE _count2 INT; +-- +-- SET _count = ( SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '#__phocadownload' AND COLUMN_NAME = 'token' ); +-- IF _count = 0 THEN ALTER TABLE `#__phocadownload` ADD COLUMN `token` char(64) default NULL; +-- END IF; +-- +-- SET _count2 = ( SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '#__phocadownload' AND COLUMN_NAME = 'tokenhits' ); +-- IF _count2 = 0 THEN ALTER TABLE `#__phocadownload` ADD COLUMN `tokenhits` int(11) NOT NULL default 0; +-- END IF; +-- END $$ +-- DELIMITER ; +-- CALL AlterTable(); +-- DROP PROCEDURE IF EXISTS AlterTable; +-- END PROCEDURE + diff --git a/update/sql/mysql/index.html b/update/sql/mysql/index.html new file mode 100644 index 0000000..ea9e94c --- /dev/null +++ b/update/sql/mysql/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/index.html b/views/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadcat/index.html b/views/phocadownloadcat/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadcat/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadcat/tmpl/edit.php b/views/phocadownloadcat/tmpl/edit.php new file mode 100644 index 0000000..1af9d19 --- /dev/null +++ b/views/phocadownloadcat/tmpl/edit.php @@ -0,0 +1,61 @@ +t['n'] . 'RenderAdminView'; +$r = new $class(); +?> +startForm($this->t['o'], $this->t['task'], $this->item->id, 'adminForm', 'adminForm'); +// First Column +echo '
    '; +$tabs = array ( +'general' => JText::_($this->t['l'].'_GENERAL_OPTIONS'), +'publishing' => JText::_($this->t['l'].'_PUBLISHING_OPTIONS'), +'metadata' => JText::_($this->t['l'].'_METADATA_OPTIONS')); +echo $r->navigation($tabs); + +echo '
    '. "\n"; + +echo '
    '."\n"; +$formArray = array ('title', 'alias', 'parent_id', 'ordering', 'access', 'accessuserid', 'uploaduserid', 'deleteuserid'); +echo $r->group($this->form, $formArray); +$formArray = array('description'); +echo $r->group($this->form, $formArray, 1); +echo '
    '. "\n"; + +echo '
    '."\n"; +foreach($this->form->getFieldset('publish') as $field) { + echo '
    '; + if (!$field->hidden) { + echo '
    '.$field->label.'
    '; + } + echo '
    '; + echo $field->input; + echo '
    '; +} +echo '
    '; + +echo '
    '. "\n"; +echo $this->loadTemplate('metadata'); +echo '
    '. "\n"; + + +echo '
    ';//end tab content +echo '
    ';//end span10 +// Second Column +echo '
    ';//end span2 +echo $r->formInputs(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadcat/tmpl/edit_metadata.php b/views/phocadownloadcat/tmpl/edit_metadata.php new file mode 100644 index 0000000..6f9391f --- /dev/null +++ b/views/phocadownloadcat/tmpl/edit_metadata.php @@ -0,0 +1,31 @@ +form->getFieldsets('metadata'); +foreach ($fieldSets as $name => $fieldSet) : + ?> +
    +
    + +
    +
    form->getLabel('metadesc'); ?>
    +
    form->getInput('metadesc'); ?>
    +
    +
    form->getLabel('metakey'); ?>
    +
    form->getInput('metakey'); ?>
    + + form->getFieldset($name) as $field) : ?> +
    +
    label; ?> +
    input; ?>
    + +
    +
    + \ No newline at end of file diff --git a/views/phocadownloadcat/tmpl/index.html b/views/phocadownloadcat/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadcat/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadcat/view.html.php b/views/phocadownloadcat/view.html.php new file mode 100644 index 0000000..17e309d --- /dev/null +++ b/views/phocadownloadcat/view.html.php @@ -0,0 +1,89 @@ +t = PhocaDownloadUtils::setVars('cat'); + + $this->state = $this->get('State'); + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + $user = JFactory::getUser(); + $model = $this->getModel(); + + JHTML::_('behavior.calendar'); + JHTML::stylesheet( $this->t['s'] ); + + //Data from model + //$this->item =& $this->get('Data'); + + $lists = array(); + $isNew = ((int)$this->item->id == 0); + + // Edit or Create? + if (!$isNew) { + $model->checkout( $user->get('id') ); + } else { + // Initialise new record + $this->item->approved = 1; + $this->item->published = 1; + $this->item->order = 0; + $this->item->access = 0; + } + + $this->addToolbar(); + parent::display($tpl); + } + + + protected function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + JRequest::setVar('hidemainmenu', true); + $bar = JToolBar::getInstance('toolbar'); + $user = JFactory::getUser(); + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $this->state->get('filter.category_id')); + + $text = $isNew ? JText::_( $this->t['l'].'_NEW' ) : JText::_($this->t['l'].'_EDIT'); + JToolBarHelper::title( JText::_( $this->t['l'].'_CATEGORY' ).': [ ' . $text.' ]' , 'folder'); + + // If not checked out, can save the item. + if (!$checkedOut && $canDo->get('core.edit')){ + JToolBarHelper::apply($this->t['task'].'.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save($this->t['task'].'.save', 'JTOOLBAR_SAVE'); + JToolBarHelper::addNew($this->t['task'].'.save2new', 'JTOOLBAR_SAVE_AND_NEW'); + + } + // If an existing item, can save to a copy. + if (!$isNew && $canDo->get('core.create')) { + //JToolBarHelper::custom($this->t['c'].'cat.save2copy', 'copy.png', 'copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); + } + if (empty($this->item->id)) { + JToolBarHelper::cancel($this->t['task'].'.cancel', 'JTOOLBAR_CANCEL'); + } + else { + JToolBarHelper::cancel($this->t['task'].'.cancel', 'JTOOLBAR_CLOSE'); + } + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> diff --git a/views/phocadownloadcats/index.html b/views/phocadownloadcats/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadcats/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadcats/tmpl/default.php b/views/phocadownloadcats/tmpl/default.php new file mode 100644 index 0000000..d7b3a6c --- /dev/null +++ b/views/phocadownloadcats/tmpl/default.php @@ -0,0 +1,134 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +echo '
    '; + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo $r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TITLE', 'a.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_PUBLISHED', 'a.published', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_PARENT_CATEGORY', 'parentcat_title', $listDirn, $listOrder ).''."\n"; +echo ''.JTEXT::_($this->t['l'].'_ACCESS').''."\n"; +echo ''.JHTML::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; + +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$orderkey = array_search($item->id, $this->ordering[$item->parent_id]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit.(int) $item->id ); +$linkParent = JRoute::_( $urlEdit.(int) $item->parent_id ); +$canEditParent = $user->authorise('core.edit', $this->t['o']); + +$parentsStr = ' '.$item->parentstree; + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder($canChange, $saveOrder, $orderkey); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); +$checkO = ''; +if ($item->checked_out) { + $checkO .= JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, $this->t['tasks'].'.', $canCheckin); +} +if ($canCreate || $canEdit) { + $checkO .= ''. $this->escape($item->title).''; +} else { + $checkO .= $this->escape($item->title); +} +$checkO .= ' ('.JText::_($this->t['l'].'_FIELD_ALIAS_LABEL').':'. $this->escape($item->alias).')'; +echo $r->td($checkO, "small hidden-phone"); +echo $r->td(JHtml::_('jgrid.published', $item->published, $i, $this->t['tasks'].'.', $canChange), "small hidden-phone"); + +if ($canEditParent) { + $parentO = ''. $this->escape($item->parentcat_title).''; +} else { + $parentO = $this->escape($item->parentcat_title); +} +echo $r->td($parentO, "small hidden-phone"); +echo $r->td($this->escape($item->access_level), "small hidden-phone"); + + + +echo $r->tdLanguage($item->language, $item->language_title, $this->escape($item->language_title)); +echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + } + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 8); +echo $r->endTable(); + +echo $this->loadTemplate('batch'); + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadcats/tmpl/default_batch.php b/views/phocadownloadcats/tmpl/default_batch.php new file mode 100644 index 0000000..b195b37 --- /dev/null +++ b/views/phocadownloadcats/tmpl/default_batch.php @@ -0,0 +1,48 @@ +state->get('filter.state'); +?> + \ No newline at end of file diff --git a/views/phocadownloadcats/tmpl/index.html b/views/phocadownloadcats/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadcats/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadcats/view.html.php b/views/phocadownloadcats/view.html.php new file mode 100644 index 0000000..41462bf --- /dev/null +++ b/views/phocadownloadcats/view.html.php @@ -0,0 +1,183 @@ +t = PhocaDownloadUtils::setVars('cat'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + // Preprocess the list of items to find ordering divisions. + foreach ($this->items as &$item) { + $this->ordering[$item->parent_id][] = $item->id; + } + + // We need to load all items because of creating tree + // After creating tree we get info from pagination + // and will set displaying of categories for current pagination + //E.g. pagination is limitstart 5, limit 5 - so only categories from 5 to 10 will be displayed + + if (!empty($this->items)) { + $text = ''; // text is tree name e.g. Category >> Subcategory + $tree = array(); + $this->items = $this->processTree($this->items, $tree, 0, $text, -1, 0); + } + + //$this->tmpl['notapproved'] = $this->get( 'NotApprovedCategory' ); + JHTML::stylesheet( $this->t['s'] ); + + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + $state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $state->get('filter.category_id')); + JToolBarHelper::title( JText::_( $this->t['l'].'_CATEGORIES' ),'folder' ); + $user = JFactory::getUser(); + $bar = JToolBar::getInstance('toolbar'); + + if ($canDo->get('core.create')) { + JToolBarHelper::addNew($this->t['task'].'.add','JTOOLBAR_NEW'); + } + if ($canDo->get('core.edit')) { + JToolBarHelper::editList($this->t['task'].'.edit','JTOOLBAR_EDIT'); + } + if ($canDo->get('core.edit.state')) { + + JToolBarHelper::divider(); + JToolBarHelper::custom($this->t['tasks'].'.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true); + JToolBarHelper::custom($this->t['tasks'].'.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true); + } + + if ($canDo->get('core.delete')) { + JToolBarHelper::deleteList( JText::_( $this->t['l'].'_WARNING_DELETE_ITEMS' ), $this->t['tasks'].'.delete', $this->t['l'].'_DELETE'); + } + + // Add a batch button + if ($user->authorise('core.edit')) + { + JHtml::_('bootstrap.modal', 'collapseModal'); + $title = JText::_('JTOOLBAR_BATCH'); + $dhtml = ""; + $bar->appendButton('Custom', $dhtml, 'batch'); + } + + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + + } + + /*TODO - change it to php 5 rules */ + protected function processTree( $data, $tree, $id = 0, $text='', $currentId, $level, $parentsTreeString = '') { + + + $countItemsInCat = 0;// Ordering + $level = $level + 1; + $parentsTreeString = $id . ' '. $parentsTreeString; + foreach ($data as $key) { + $show_text = $text . $key->title; + + static $iCT = 0;// All displayed items + + if ($key->parent_id == $id && $currentId != $id && $currentId != $key->id ) { + $tree[$iCT] = new JObject(); + + // Ordering MUST be solved here + if ($countItemsInCat > 0) { + $tree[$iCT]->orderup = 1; + } else { + $tree[$iCT]->orderup = 0; + } + + if ($countItemsInCat < ($key->countid - 1)) { + $tree[$iCT]->orderdown = 1; + } else { + $tree[$iCT]->orderdown = 0; + } + + $tree[$iCT] = new JObject(); + + $tree[$iCT]->level = $level; + $tree[$iCT]->parentstree = $parentsTreeString; + + $tree[$iCT]->id = $key->id; + $tree[$iCT]->title = $show_text; + $tree[$iCT]->title_self = $key->title; + $tree[$iCT]->parent_id = $key->parent_id; + // $tree[$iCT]->owner_id = $key->owner_id; + $tree[$iCT]->name = $key->name; + $tree[$iCT]->alias = $key->alias; + $tree[$iCT]->image = $key->image; + $tree[$iCT]->section = $key->section; + $tree[$iCT]->image_position = $key->image_position; + $tree[$iCT]->description = $key->description; + $tree[$iCT]->published = $key->published; + $tree[$iCT]->editor = $key->editor; + $tree[$iCT]->ordering = $key->ordering; + $tree[$iCT]->access = $key->access; + $tree[$iCT]->access_level = $key->access_level; + $tree[$iCT]->count = $key->count; + $tree[$iCT]->params = $key->params; + $tree[$iCT]->checked_out = $key->checked_out; + $tree[$iCT]->checked_out_time = $key->checked_out_time; + $tree[$iCT]->groupname = 0; + // $tree[$iCT]->username = $key->username; + // $tree[$iCT]->usernameno = $key->usernameno; + $tree[$iCT]->parentcat_title = $key->parentcat_title; + $tree[$iCT]->parentcat_id = $key->parentcat_id; + $tree[$iCT]->hits = $key->hits; + // $tree[$iCT]->ratingavg = $key->ratingavg; + $tree[$iCT]->accessuserid = $key->accessuserid; + $tree[$iCT]->uploaduserid = $key->uploaduserid; + $tree[$iCT]->language = $key->language; + $tree[$iCT]->language_title = $key->language_title; + // $tree[$iCT]->deleteuserid = $key->deleteuserid; + // $tree[$iCT]->userfolder = $key->userfolder; + // $tree[$iCT]->approved = $key->approved; + // $tree[$iCT]->link = ''; + // $tree[$iCT]->filename = '';// Will be added in View (after items will be reduced) + // $tree[$iCT]->linkthumbnailpath = ''; + + $iCT++; + + $tree = $this->processTree($data, $tree, $key->id, $show_text . " - ", $currentId, $level, $parentsTreeString); + + $countItemsInCat++; + } + } + return($tree); + } + + protected function getSortFields() { + return array( + 'a.ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'a.title' => JText::_($this->t['l'] . '_TITLE'), + 'a.published' => JText::_($this->t['l'] . '_PUBLISHED'), + 'parent_title' => JText::_($this->t['l'] . '_PARENT_CATEGORY'), + 'language' => JText::_('JGRID_HEADING_LANGUAGE'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadcp/index.html b/views/phocadownloadcp/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadcp/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadcp/tmpl/default.php b/views/phocadownloadcp/tmpl/default.php new file mode 100644 index 0000000..88e118d --- /dev/null +++ b/views/phocadownloadcp/tmpl/default.php @@ -0,0 +1,49 @@ + +
    + +
    + +
    +
    +
    +
    t['n'] . 'RenderAdmin'; +$link = 'index.php?option='.$this->t['o'].'&view='; +foreach ($this->views as $k => $v) { + $linkV = $link . $this->t['c'] . $k; + echo $class::quickIconButton( $linkV, 'icon-48-'.$k.'.png', JText::_($v), $this->t['i']); +} + ?>
     
    +

     

    +
    + + +
    +
    +
    + +
    +
    +
    t['i'] . 'logo-phoca.png', 'Phoca.cz' );?>
    '. JText::_($this->t['l'] . '_VERSION').'' +.'

    '. $this->t['version'] .'

    '; +echo '

    '. JText::_($this->t['l'] . '_COPYRIGHT').'

    ' +.'

    © 2007 - '. date("Y"). ' Jan Pavelka

    ' +.'

    www.phoca.cz

    '; +echo '

    '. JText::_($this->t['l'] . '_LICENCE').'

    ' +.'

    GPLv2

    '; +echo '

    '. JText::_($this->t['l'] . '_TRANSLATION').': '. JText::_($this->t['l'] . '_TRANSLATION_LANGUAGE_TAG').'

    ' +.'

    © 2007 - '. date("Y"). ' '. JText::_($this->t['l'] . '_TRANSLATER'). '

    ' +.'

    '.JText::_($this->t['l'] . '_TRANSLATION_SUPPORT_URL').'

    '; + echo '

     

    ' +.''; + + ?>
    +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/views/phocadownloadcp/tmpl/index.html b/views/phocadownloadcp/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadcp/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadcp/view.html.php b/views/phocadownloadcp/view.html.php new file mode 100644 index 0000000..8ae0d99 --- /dev/null +++ b/views/phocadownloadcp/view.html.php @@ -0,0 +1,62 @@ +t = PhocaDownloadUtils::setVars(); + $this->views= array( + 'files' => $this->t['l'] . '_FILES', + 'cats' => $this->t['l'] . '_CATEGORIES', + 'lics' => $this->t['l'] . '_LICENSES', + 'stat' => $this->t['l'] . '_STATISTICS', + 'downloads' => $this->t['l'] . '_DOWNLOADS', + 'uploads' => $this->t['l'] . '_UPLOADS', + 'rafile' => $this->t['l'] . '_FILE_RATING', + 'tags' => $this->t['l'] . '_TAGS', + 'layouts' => $this->t['l'] . '_LAYOUT', + 'styles' => $this->t['l'] . '_STYLES', + 'logs' => $this->t['l'] . '_LOGGING', + 'info' => $this->t['l'] . '_INFO' + ); + + JHTML::stylesheet( $this->t['s'] ); + JHTML::_('behavior.tooltip'); + $class = $this->t['n'] . 'Utils'; + $this->t['version'] = $class::getExtensionVersion(); + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + require_once JPATH_COMPONENT.'/helpers/'.$this->t['c'].'cp.php'; + $class = $this->t['n'] . 'CpHelper'; + $canDo = $class::getActions($this->t['c']); + JToolBarHelper::title( JText::_( $this->t['l'].'_PD_CONTROL_PANEL' ), 'home-2 cpanel' ); + + // This button is unnecessary but it is displayed because Joomla! design bug + $bar = JToolBar::getInstance( 'toolbar' ); + $dhtml = ' '.JText::_($this->t['l'].'_CONTROL_PANEL').''; + $bar->appendButton('Custom', $dhtml); + + if ($canDo->get('core.admin')) { + JToolBarHelper::preferences($this->t['o']); + JToolBarHelper::divider(); + } + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloaddownloads/index.html b/views/phocadownloaddownloads/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloaddownloads/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloaddownloads/tmpl/default.php b/views/phocadownloaddownloads/tmpl/default.php new file mode 100644 index 0000000..f4b9cab --- /dev/null +++ b/views/phocadownloaddownloads/tmpl/default.php @@ -0,0 +1,133 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +if (isset($this->tmpl['notapproved']->count) && (int)$this->tmpl['notapproved']->count > 0 ) { + echo '
    ×'.JText::_($this->t['l'].'_NOT_APPROVED_FILES_COUNT').': ' + .(int)$this->tmpl['notapproved']->count.'
    '; +} + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +//echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +//echo $r->selectFilterCategory(PhocaDownloadCategory::options($this->t['o']), 'JOPTION_SELECT_CATEGORY', $this->state->get('filter.category_id')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo '';//$r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_USER', 'usernameno', $listDirn, $listOrder ).''."\n"; +//echo ''.JHTML::_('grid.sort', $this->t['l'].'_TITLE', 'd.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_FILE', 'filename', $listDirn, $listOrder ).''."\n"; + +//echo ''.JHTML::_('grid.sort', $this->t['l'].'_USERNAME', 'username', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_COUNT', 'a.count', $listDirn, $listOrder ).''."\n"; +//echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + //if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; +/* +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[$item->catid]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + +$linkCat = JRoute::_( 'index.php?option='.$this->t['o'].'&task='.$this->t['c'].'cat.edit&id='.(int) $item->category_id ); +$canEditCat = $user->authorise('core.edit', $this->t['o']);*/ + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder(0,0,0); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + +$usrO = $item->usernameno; +if ($item->username) {$usrO = $usrO . ' ('.$item->username.')';} +if (!$usrO) { + $usrO = JText::_('COM_PHOCADOWNLOAD_GUEST'); +} +echo $r->td($usrO, "small hidden-phone"); + + + + +//echo $r->td($this->escape($item->filetitle)); +echo $r->td($this->escape($item->filetitle) . ' ('.$this->escape($item->filename) . ')'); + +echo $r->td($this->escape($item->count), 'ph-right'); + +//echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + //} + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 15); +echo $r->endTable(); + + + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> diff --git a/views/phocadownloaddownloads/tmpl/index.html b/views/phocadownloaddownloads/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloaddownloads/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloaddownloads/view.html.php b/views/phocadownloaddownloads/view.html.php new file mode 100644 index 0000000..6428f7b --- /dev/null +++ b/views/phocadownloaddownloads/view.html.php @@ -0,0 +1,78 @@ +t = PhocaDownloadUtils::setVars('download'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->maxandsum = $this->get('MaxAndSum'); + + JHTML::stylesheet( $this->t['s'] ); + + // Check for errors. + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + + } + + function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + //$state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t); + + JToolBarHelper::title( JText::_( $this->t['l'].'_DOWNLOADS' ), 'download' ); + + if ($canDo->get('core.edit')){ + + $bar = JToolBar::getInstance('toolbar'); + + $dhtml = ''; + $bar->appendButton('Custom', $dhtml); + JToolBarHelper::divider(); + //JToolBarHelper::custom('phocadownloaduserstat.reset', 'reset.png', '', 'COM_PHOCADOWNLOAD_RESET' , false); + } + + //JToolBarHelper::cancel($this->t['tasks'].'.cancel', 'JTOOLBAR_CLOSE'); + + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + + + 'usernameno' => JText::_($this->t['l'] . '_USER'), + 'username' => JText::_($this->t['l'] . '_USERNAME'), + 'a.count' => JText::_($this->t['l'] . '_COUNT'), + 'filename' => JText::_($this->t['l'] . '_FILENAME') + + ); + } + +} +?> \ No newline at end of file diff --git a/views/phocadownloadfile/index.html b/views/phocadownloadfile/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadfile/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadfile/tmpl/edit.php b/views/phocadownloadfile/tmpl/edit.php new file mode 100644 index 0000000..bed8d93 --- /dev/null +++ b/views/phocadownloadfile/tmpl/edit.php @@ -0,0 +1,188 @@ +item->extid) && $this->item->extid != '') { + $extlink = 1; +} +$class = $this->t['n'] . 'RenderAdminView'; +$r = new $class(); + +?> +startForm($this->t['o'], $this->t['task'], $this->item->id, 'adminForm', 'adminForm'); +// First Column +echo '
    '; +$tabs = array ( +'general' => JText::_($this->t['l'].'_GENERAL_OPTIONS'), +'publishing' => JText::_($this->t['l'].'_PUBLISHING_OPTIONS'), +'metadata' => JText::_($this->t['l'].'_METADATA_OPTIONS'), +'mirror' => JText::_($this->t['l'].'_MIRROR_DETAILS'), +'video' => JText::_($this->t['l'].'_YOUTUBE_OPTIONS') +); +echo $r->navigation($tabs); + +echo '
    '. "\n"; + +echo '
    '."\n"; +$formArray = array ('title', 'alias', 'catid', 'ordering', + 'filename', 'filename_play', 'filename_preview', 'image_filename', 'image_filename_spec1', 'image_filename_spec2', 'image_download', 'version', 'author', 'author_url', 'author_email', 'license', 'license_url', 'confirm_license', 'directlink', 'link_external', 'access', 'unaccessible_file', 'userid', 'owner_id'); +echo $r->group($this->form, $formArray); +$formArray = array('description', 'features', 'changelog', 'notes' ); +echo $r->group($this->form, $formArray, 1); +echo '
    '. "\n"; + +echo '
    '."\n"; +foreach($this->form->getFieldset('publish') as $field) { + echo '
    '; + if (!$field->hidden) { + echo '
    '.$field->label.'
    '; + } + echo '
    '; + echo $field->input; + echo '
    '; +} +echo '
    '; + +echo '
    '. "\n"; +echo $this->loadTemplate('metadata'); +echo '
    '. "\n"; + +echo '
    '. "\n"; +$formArray = array ('mirror1link', 'mirror1title', 'mirror1target', 'mirror2link', 'mirror2title', 'mirror2target'); +echo $r->group($this->form, $formArray); +echo '
    '. "\n"; + +echo '
    '. "\n"; +$formArray = array ('video_filename'); +echo $r->group($this->form, $formArray); +echo '
    '. "\n"; + + +echo '
    ';//end tab content +echo '
    ';//end span10 +// Second Column +echo '
    '; + +if (isset($this->item->id) && isset($this->item->catid) && isset($this->item->token) + && (int)$this->item->id > 0 && (int)$this->item->catid > 0 && $this->item->token != '') { + phocadownloadimport('phocadownload.path.route'); + $downloadLink = PhocaDownloadRoute::getDownloadRoute((int)$this->item->id, (int)$this->item->catid, $this->item->token, 0); + $app = JApplication::getInstance('site'); + $router = $app->getRouter(); + $uri = $router->build($downloadLink); + $frontendUrl = JURI::root(false). str_replace(JURI::root(true).'/administrator/', '',$uri->toString()); + echo '
    '.JText::_('COM_PHOCADOWNLOAD_UNIQUE_DOWNLOAD_URL').'
    '; + echo ''; + echo '
    ('.JText::_('COM_PHOCADOWNLOAD_URL_FORMAT_DEPENDS_ON_SEF').')
    '; +} + + +echo '
    ';//end span2 +echo $r->formInputs(); +echo $r->endForm(); + +/* +?> + + +?>
    +
    + +
    + item->id) ? JText::_('COM_PHOCADOWNLOAD_NEW_FILE') : JText::sprintf('COM_PHOCADOWNLOAD_EDIT_FILE', $this->item->id); ?> + + +
      + '.$this->form->getLabel($value) . $this->form->getInput($value).'' . "\n"; + } ?> +
    + + form->getLabel($value); + echo '
    '; + echo $this->form->getInput($value); + } + ?> + +
    +
    +
    + +
    +
    tmpl['enablethumbcreationstatus']; ?>
    + item->id, array('useCookie'=>1)); ?> + + +
    +
      + form->getFieldset('publish') as $field) { + echo '
    • '; + if (!$field->hidden) { + echo $field->label; + } + echo $field->input; + echo '
    • '; + } ?> +
    +
    + + loadTemplate('metadata'); ?> + + +
    +
      + '.$this->form->getLabel($value) . $this->form->getInput($value).'' . "\n"; + } ?> +
    + + + + +
    +
      + '.$this->form->getLabel($value) . $this->form->getInput($value).'' . "\n"; + } ?> +
    + + +
    + + + +
    + + + +
    +*/ ?> + diff --git a/views/phocadownloadfile/tmpl/edit_metadata.php b/views/phocadownloadfile/tmpl/edit_metadata.php new file mode 100644 index 0000000..6f9391f --- /dev/null +++ b/views/phocadownloadfile/tmpl/edit_metadata.php @@ -0,0 +1,31 @@ +form->getFieldsets('metadata'); +foreach ($fieldSets as $name => $fieldSet) : + ?> +
    +
    + +
    +
    form->getLabel('metadesc'); ?>
    +
    form->getInput('metadesc'); ?>
    +
    +
    form->getLabel('metakey'); ?>
    +
    form->getInput('metakey'); ?>
    + + form->getFieldset($name) as $field) : ?> +
    +
    label; ?> +
    input; ?>
    + +
    +
    + \ No newline at end of file diff --git a/views/phocadownloadfile/tmpl/edit_text.php b/views/phocadownloadfile/tmpl/edit_text.php new file mode 100644 index 0000000..3ab4976 --- /dev/null +++ b/views/phocadownloadfile/tmpl/edit_text.php @@ -0,0 +1,66 @@ +item->extid) && $this->item->extid != '') { + $extlink = 1; +} +$class = $this->t['n'] . 'RenderAdminView'; +$r = new $class(); + +?> +startForm($this->t['o'], $this->t['task'], $this->item->id, 'adminForm', 'adminForm'); +// First Column +echo '
    '; +$tabs = array ( +'general' => JText::_($this->t['l'].'_GENERAL_OPTIONS'), +'publishing' => JText::_($this->t['l'].'_PUBLISHING_OPTIONS') +); +echo $r->navigation($tabs); + +echo '
    '. "\n"; + +echo '
    '."\n"; +$formArray = array ('title', 'alias', 'catid', 'ordering','access'); +echo $r->group($this->form, $formArray); +$formArray = array('description'); +echo $r->group($this->form, $formArray, 1); +echo '
    '. "\n"; + +echo '
    '."\n"; +foreach($this->form->getFieldset('publish') as $field) { + echo '
    '; + if (!$field->hidden) { + echo '
    '.$field->label.'
    '; + } + echo '
    '; + echo $field->input; + echo '
    '; +} +echo '
    '; + +echo '
    ';//end tab content +echo '
    ';//end span10 +// Second Column +echo '
    ';//end span2 + +echo '' + .''; +echo $r->formInputs(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadfile/tmpl/index.html b/views/phocadownloadfile/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadfile/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadfile/view.html.php b/views/phocadownloadfile/view.html.php new file mode 100644 index 0000000..3045df3 --- /dev/null +++ b/views/phocadownloadfile/view.html.php @@ -0,0 +1,71 @@ +t = PhocaDownloadUtils::setVars('file'); + $this->state = $this->get('State'); + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + + JHTML::stylesheet( $this->t['s'] ); + + if (isset($this->item->textonly) && (int)$this->item->textonly == 1 && JRequest::getVar('layout') != 'edit_text') { + $tpl = 'text'; + } + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + JRequest::setVar('hidemainmenu', true); + $bar = JToolBar::getInstance('toolbar'); + $user = JFactory::getUser(); + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $this->state->get('filter.category_id')); + + $text = $isNew ? JText::_( $this->t['l'] . '_NEW' ) : JText::_($this->t['l'] . '_EDIT'); + JToolBarHelper::title( JText::_( $this->t['l'] . '_FILE' ).': [ ' . $text.' ]' , 'file'); + + // If not checked out, can save the item. + if (!$checkedOut && $canDo->get('core.edit')){ + JToolBarHelper::apply($this->t['task'] . '.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save($this->t['task'] . '.save', 'JTOOLBAR_SAVE'); + JToolBarHelper::addNew($this->t['task'] . '.save2new', 'JTOOLBAR_SAVE_AND_NEW'); + + } + // If an existing item, can save to a copy. + if (!$isNew && $canDo->get('core.create')) { + //JToolBarHelper::custom($this->t.'.save2copy', 'copy.png', 'copy_f2.png', 'JTOOLBAR_SAVE_AS_COPY', false); + } + if (empty($this->item->id)) { + JToolBarHelper::cancel($this->t['task'] . '.cancel', 'JTOOLBAR_CANCEL'); + } + else { + JToolBarHelper::cancel($this->t['task'] . '.cancel', 'JTOOLBAR_CLOSE'); + } + + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> diff --git a/views/phocadownloadfiles/index.html b/views/phocadownloadfiles/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadfiles/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadfiles/tmpl/default.php b/views/phocadownloadfiles/tmpl/default.php new file mode 100644 index 0000000..d2bde29 --- /dev/null +++ b/views/phocadownloadfiles/tmpl/default.php @@ -0,0 +1,395 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +if (isset($this->tmpl['notapproved']->count) && (int)$this->tmpl['notapproved']->count > 0 ) { + echo '
    ×'.JText::_($this->t['l'].'_NOT_APPROVED_FILES_COUNT').': ' + .(int)$this->tmpl['notapproved']->count.'
    '; +} + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +echo $r->selectFilterCategory(PhocaDownloadCategory::options($this->t['o']), 'JOPTION_SELECT_CATEGORY', $this->state->get('filter.category_id')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo $r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TITLE', 'a.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_FILENAME', 'a.filename', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_PUBLISHED', 'a.published', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_APPROVED', 'a.approved', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_CATEGORY', 'category_id', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_OWNER', 'category_owner_id', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_UPLOADED_BY', 'uploadusername', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_DOWNLOADS', 'a.hits', $listDirn, $listOrder ).''."\n"; +echo ''.JTEXT::_($this->t['l'].'_ACTIVE').''."\n"; +echo ''.JTEXT::_($this->t['l'].'_ACCESS').''."\n"; +echo ''.JHTML::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + //if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; + +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[$item->catid]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + +$linkCat = JRoute::_( 'index.php?option='.$this->t['o'].'&task='.$this->t['c'].'cat.edit&id='.(int) $item->category_id ); +$canEditCat = $user->authorise('core.edit', $this->t['o']); + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder($canChange, $saveOrder, $orderkey); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + +$checkO = ''; +if ($item->checked_out) { + $checkO .= JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, $this->t['tasks'].'.', $canCheckin); +} +if ($canCreate || $canEdit) { + $checkO .= ''. $this->escape($item->title).''; +} else { + $checkO .= $this->escape($item->title); +} +$checkO .= '
    ('.JText::_($this->t['l'].'_FIELD_ALIAS_LABEL').':'. $this->escape($item->alias).')'; +echo $r->td($checkO, "small hidden-phone"); + +echo $r->td($item->filename); + +echo $r->td(JHtml::_('jgrid.published', $item->published, $i, $this->t['tasks'].'.', $canChange), "small hidden-phone"); +echo $r->td(PhocaDownloadJGrid::approved( $item->approved, $i, $this->t['tasks'].'.', $canChange), "small hidden-phone"); + +if ($canEditCat) { + $catO = ''. $this->escape($item->category_title).''; +} else { + $catO = $this->escape($item->category_title); +} +echo $r->td($catO, "small hidden-phone"); +//echo $r->td($this->escape($item->access_level), "small hidden-phone"); + +$usrO = $item->usernameno; +if ($item->username) {$usrO = $usrO . ' ('.$item->username.')';} +echo $r->td($usrO, "small hidden-phone"); + +$usrU = $item->uploadname; +if ($item->uploadusername) {$usrU = $usrU . ' ('.$item->uploadusername.')';} +echo $r->td($usrU, "small hidden-phone"); + +echo $r->td($item->hits, "small hidden-phone"); + +echo $r->tdPublishDownUp ($item->publish_up, $item->publish_down, $this->t['l']); + +echo $r->td($this->escape($item->access_level)); + +echo $r->tdLanguage($item->language, $item->language_title, $this->escape($item->language_title)); +echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + //} + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 15); +echo $r->endTable(); + +echo $this->loadTemplate('batch'); + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> + + +" method="post" name="adminForm" id="adminForm"> +
    + +
    + + + + + + + +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + items)) { + foreach ($this->items as $i => $item) { + +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', 'com_phocadownload'); +$canEdit = $user->authorise('core.edit', 'com_phocadownload'); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', 'com_phocadownload') && $canCheckin; +$linkEdit = JRoute::_( 'index.php?option=com_phocadownload&task=phocadownloadfile.edit&id='.(int) $item->id ); +$linkCat = JRoute::_( 'index.php?option=com_phocadownload&task=phocadownloadcat.edit&id='.(int) $item->category_id ); +$canEditCat = $user->authorise('core.edit', 'com_phocadownload'); +$linkUserStatistics = JRoute::_( 'index.php?option=com_phocadownload&view=phocadownloaduserstats&id='.(int)$item->id ); + +echo ''; + +echo ''; + + +echo ''; + +echo ''; +echo ''; + +echo ''; + + + + +echo ''; + +echo ''; + +echo ''; +echo ''; + + + + + +?> + +'; +if ($canChange) { + if ($saveOrder) { + if ($listDirn == 'asc') { + echo ''. $this->pagination->orderUpIcon($i, ($item->category_id == @$this->items[$i-1]->category_id), $cntx.'.orderup', 'JLIB_HTML_MOVE_UP', $ordering).''; + echo ''.$this->pagination->orderDownIcon($i, $this->pagination->total, ($item->category_id == @$this->items[$i+1]->category_id), $cntx.'.orderdown', 'JLIB_HTML_MOVE_DOWN', $ordering).''; + } else if ($listDirn == 'desc') { + echo ''. $this->pagination->orderUpIcon($i, ($item->category_id == @$this->items[$i-1]->category_id), $cntx.'.orderdown', 'JLIB_HTML_MOVE_UP', $ordering).''; + echo ''.$this->pagination->orderDownIcon($i, $this->pagination->total, ($item->category_id == @$this->items[$i+1]->category_id), $cntx.'.orderup', 'JLIB_HTML_MOVE_DOWN', $ordering).''; + } + } + $disabled = $saveOrder ? '' : 'disabled="disabled"'; + echo ''; +} else { + echo $item->ordering; +} +echo ''; + + +echo ''; + + +?> + +'. $item->id .''; + +echo ''; + + } + } +echo ''; +?> + + + + + + + +
    + + + + + + + + + + items, 'filesave.png', 'phocadownloadfiles.saveorder'); + } ?> + + + + + +
    '. JHtml::_('grid.id', $i, $item->id) . ''; +if ($item->checked_out) { + echo JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, 'phocadownloadfiles.', $canCheckin); +} + +if ($canCreate || $canEdit) { + echo ''. $this->escape($item->title).''; +} else { + echo $this->escape($item->title); +} +echo '

    ('.JText::_('COM_PHOCADOWNLOAD_FIELD_ALIAS_LABEL').':'. $this->escape($item->alias).')

    '; +echo '
    '. $item->filename.''. $item->hits.''; + + if ($item->textonly != 1) { + echo '' + . JHTML::_('image', 'administrator/components/com_phocadownload/assets/images/icon-16-user-stat.png', JText::_('COM_PHOCADOWNLOAD_USER_STATISTICS')) + .''; + } +echo ''; +echo $item->usernameno; +echo $item->username ? ' ('.$item->username.')' : ''; +echo ''; +echo $item->uploadname; +echo $item->uploadusername ? ' ('.$item->uploadusername.')' : ''; +echo ''. JHtml::_('jgrid.published', $item->published, $i, 'phocadownloadfiles.', $canChange) . ''. PhocaDownloadGrid::approved( $item->approved, $i, 'phocadownloadfiles.', $canChange) . ' + '. $this->escape($item->category_title).''; + } else { + echo $this->escape($item->category_title); + } ?> +' . $this->escape($item->access_level) .' + language=='*') { + echo JText::_('JALL'); + } else { + echo $item->language_title ? $this->escape($item->language_title) : JText::_('JUNDEFINED'); + } + ?> +
    pagination->getListFooter(); ?>
    + + loadTemplate('batch'); ?> + +
    + + + + + + + + + */ ?> \ No newline at end of file diff --git a/views/phocadownloadfiles/tmpl/default_batch.php b/views/phocadownloadfiles/tmpl/default_batch.php new file mode 100644 index 0000000..b195b37 --- /dev/null +++ b/views/phocadownloadfiles/tmpl/default_batch.php @@ -0,0 +1,48 @@ +state->get('filter.state'); +?> + \ No newline at end of file diff --git a/views/phocadownloadfiles/tmpl/index.html b/views/phocadownloadfiles/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadfiles/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadfiles/view.html.php b/views/phocadownloadfiles/view.html.php new file mode 100644 index 0000000..6a607a9 --- /dev/null +++ b/views/phocadownloadfiles/view.html.php @@ -0,0 +1,108 @@ +t = PhocaDownloadUtils::setVars('file'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + // Preprocess the list of items to find ordering divisions. + foreach ($this->items as &$item) { + $this->ordering[$item->catid][] = $item->id; + } + + JHTML::stylesheet( $this->t['s'] ); + $this->tmpl['notapproved'] = $this->get( 'NotApprovedFile' ); + + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + $state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $state->get('filter.file_id')); + $user = JFactory::getUser(); + $bar = JToolBar::getInstance('toolbar'); + + JToolBarHelper::title( JText::_($this->t['l'].'_FILES'), 'file.png' ); + if ($canDo->get('core.create')) { + JToolBarHelper::addNew( $this->t['task'].'.add','JTOOLBAR_NEW'); + JToolBarHelper::addNew( $this->t['task'].'.addtext', $this->t['l'].'_ADD_TEXT'); + JToolBarHelper::custom( $this->t['c'].'m.edit', 'multiple.png', '', $this->t['l'].'_MULTIPLE_ADD' , false); + } + if ($canDo->get('core.edit')) { + JToolBarHelper::editList($this->t['task'].'.edit','JTOOLBAR_EDIT'); + } + + if ($canDo->get('core.create')) { + //JToolBarHelper::divider(); + //JToolBarHelper::custom( $this->t['task'].'.copyquick','copy.png', '', $this->t['l'].'_QUICK_COPY', true); + //JToolBarHelper::custom( $this->t['task'].'.copy','copy.png', '', $this->t['l'].'_COPY', true); + } + + if ($canDo->get('core.edit.state')) { + + JToolBarHelper::divider(); + JToolBarHelper::custom($this->t['tasks'].'.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true); + JToolBarHelper::custom($this->t['tasks'].'.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true); + JToolBarHelper::custom( $this->t['tasks'].'.approve', 'approve.png', '', $this->t['l'].'_APPROVE' , true); + JToolBarHelper::custom( $this->t['tasks'].'.disapprove', 'disapprove.png', '', $this->t['l'].'_NOT_APPROVE' , true); + } + + if ($canDo->get('core.delete')) { + JToolBarHelper::deleteList( JText::_( $this->t['l'].'_WARNING_DELETE_ITEMS' ), $this->t['tasks'].'.delete', $this->t['l'].'_DELETE'); + } + + // Add a batch button + if ($user->authorise('core.edit')) + { + JHtml::_('bootstrap.modal', 'collapseModal'); + $title = JText::_('JTOOLBAR_BATCH'); + $dhtml = ""; + $bar->appendButton('Custom', $dhtml, 'batch'); + } + + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + 'a.ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'a.title' => JText::_($this->t['l'] . '_TITLE'), + 'a.filename' => JText::_($this->t['l'] . '_FILENAME'), + 'a.hits' => JText::_($this->t['l'] . '_DOWNLOADS'), + 'a.owner_id' => JText::_($this->t['l'] . '_OWNER'), + 'uploadusername'=> JText::_($this->t['l'] . '_UPLOADED_BY'), + 'a.published' => JText::_($this->t['l'] . '_PUBLISHED'), + 'a.approved' => JText::_($this->t['l'] . '_APPROVED'), + 'category_id' => JText::_($this->t['l'] . '_CATEGORY'), + 'language' => JText::_('JGRID_HEADING_LANGUAGE'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadinfo/index.html b/views/phocadownloadinfo/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadinfo/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadinfo/tmpl/default.php b/views/phocadownloadinfo/tmpl/default.php new file mode 100644 index 0000000..a56c639 --- /dev/null +++ b/views/phocadownloadinfo/tmpl/default.php @@ -0,0 +1,53 @@ +'; +echo '
    '.JHtmlSidebar::render().'
    '; +echo '
    '; +echo '
    ' + . JHTML::_('image', $this->t['i'] . 'logo-phoca.png', 'Phoca.cz' ) + .'
    ' + . JHTML::_('image', $this->t['i'] . 'logo.png', 'Phoca.cz') + .'

    '.JText::_($this->t['l'].'_PHOCA_DOWNLOAD').' - '. JText::_($this->t['l'].'_INFORMATION').'

    ' + .'
    '; + +echo '

    '. JText::_($this->t['l'].'_HELP').'

    '; + +echo '

    ' +.'Phoca Download Main Site
    ' +.'Phoca Download User Manual
    ' +.'Phoca Download Forum
    ' +.'

    '; + +echo '

    '. JText::_($this->t['l'] . '_VERSION').'

    ' +.'

    '. $this->t['version'] .'

    '; + +echo '

    '. JText::_($this->t['l'] . '_COPYRIGHT').'

    ' +.'

    © 2007 - '. date("Y"). ' Jan Pavelka

    ' +.'

    www.phoca.cz

    '; + +echo '

    '. JText::_($this->t['l'] . '_LICENCE').'

    ' +.'

    GPLv2

    '; + +echo '

    '. JText::_($this->t['l'] . '_TRANSLATION').': '. JText::_($this->t['l'] . '_TRANSLATION_LANGUAGE_TAG').'

    ' + .'

    © 2007 - '. date("Y"). ' '. JText::_($this->t['l'] . '_TRANSLATER'). '

    ' + .'

    '.JText::_($this->t['l'] . '_TRANSLATION_SUPPORT_URL').'

    '; + +echo '' +.'' +.''; + +echo '

     

    '; + +echo '

     

    ' +.''; + +echo '
     
    '; + + +echo '
    '; +echo '
    '; + +echo '
    '; +echo ''; + diff --git a/views/phocadownloadinfo/tmpl/index.html b/views/phocadownloadinfo/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadinfo/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadinfo/view.html.php b/views/phocadownloadinfo/view.html.php new file mode 100644 index 0000000..c2bb17d --- /dev/null +++ b/views/phocadownloadinfo/view.html.php @@ -0,0 +1,46 @@ +t = PhocaDownloadUtils::setVars(); + JHTML::stylesheet( $this->t['s'] ); + JHTML::_('behavior.tooltip'); + $class = $this->t['n'] . 'Utils'; + $this->t['version'] = $class::getExtensionVersion(); + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + require_once JPATH_COMPONENT.'/helpers/'.$this->t['c'].'cp.php'; + $class = $this->t['n'] . 'CpHelper'; + $canDo = $class::getActions($this->t['c']); + + JToolBarHelper::title( JText::_($this->t['l'].'_PD_INFO' ), 'info.png' ); + + // This button is unnecessary but it is displayed because Joomla! design bug + $bar = JToolBar::getInstance( 'toolbar' ); + $dhtml = ' '.JText::_($this->t['l'].'_CONTROL_PANEL').''; + $bar->appendButton('Custom', $dhtml); + + if ($canDo->get('core.admin')) { + JToolbarHelper::preferences('com_'.$this->t['c']); + } + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> diff --git a/views/phocadownloadlayout/index.html b/views/phocadownloadlayout/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlayout/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlayout/tmpl/edit.php b/views/phocadownloadlayout/tmpl/edit.php new file mode 100644 index 0000000..2b5e629 --- /dev/null +++ b/views/phocadownloadlayout/tmpl/edit.php @@ -0,0 +1,99 @@ +item->extid) && $this->item->extid != '') { + $extlink = 1; +} +$class = $this->t['n'] . 'RenderAdminView'; +$r = new $class(); + +?> +startForm($this->t['o'], $this->t['task'], $this->item->id, 'adminForm', 'adminForm'); +// First Column +echo '
    '; +$tabs = array ( +'general' => JText::_($this->t['l'].'_GENERAL_OPTIONS') +); +echo $r->navigation($tabs); + +echo '
    '. "\n"; + +echo '
    '."\n"; + +$formArray = array('categories', 'category', 'file' ); +echo $r->group($this->form, $formArray, 1); +echo '
    '. "\n"; + + +echo '
    ';//end tab content +echo '
    ';//end span10 +// Second Column +echo '
    '; + +echo '
    ' . JText::_('COM_PHOCADOWNLOAD_LAYOUT_WARNING').'
    '; + +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_CATEGORIES_VIEW').'

    '; +$lP = PhocaDownloadSettings::getLayoutParams('categories'); +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_PARAMETERS').'

    '; +if (isset($lP['search'])) { + foreach ($lP['search'] as $k => $v) { + echo $v . ' '; + } +} +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_STYLES').'

    '; +if (isset($lP['style'])) { + foreach ($lP['style'] as $k => $v) { + echo $v . ' '; + } +} +echo '
    '; + +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_CATEGORY_VIEW').'

    '; +$lP = PhocaDownloadSettings::getLayoutParams('category'); +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_PARAMETERS').'

    '; +if (isset($lP['search'])) { + foreach ($lP['search'] as $k => $v) { + echo $v . ' '; + } +} +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_STYLES').'

    '; +if (isset($lP['style'])) { + foreach ($lP['style'] as $k => $v) { + echo $v . ' '; + } +} +echo '
    '; + +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_FILE_VIEW').'

    '; +$lP = PhocaDownloadSettings::getLayoutParams('file'); +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_PARAMETERS').'

    '; +if (isset($lP['search'])) { + foreach ($lP['search'] as $k => $v) { + echo $v . ' '; + } +} +echo '

    ' . JText::_('COM_PHOCADOWNLOAD_STYLES').'

    '; +if (isset($lP['style'])) { + foreach ($lP['style'] as $k => $v) { + echo $v . ' '; + } +} + +echo '
    ';//end span2 +echo $r->formInputs(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadlayout/tmpl/index.html b/views/phocadownloadlayout/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlayout/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlayout/view.html.php b/views/phocadownloadlayout/view.html.php new file mode 100644 index 0000000..aaee5d1 --- /dev/null +++ b/views/phocadownloadlayout/view.html.php @@ -0,0 +1,55 @@ +t = PhocaDownloadUtils::setVars('layout'); + $this->state = $this->get('State'); + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + + JHTML::stylesheet( $this->t['s'] ); + + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + JRequest::setVar('hidemainmenu', true); + $bar = JToolBar::getInstance('toolbar'); + $user = JFactory::getUser(); + //$isNew = ($this->item->id == 0); + //$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t); + + JToolBarHelper::title( JText::_( $this->t['l'].'_LAYOUT' ), 'file-2' ); + JToolBarHelper::custom($this->t['task'].'.back', 'home-2', '', $this->t['l'].'_CONTROL_PANEL', false); + //JToolBarHelper::cancel('phocadownloadlayout.cancel', 'JTOOLBAR_CANCEL'); + + if ($canDo->get('core.edit')) { + JToolBarHelper::apply($this->t['task'].'.apply', 'JTOOLBAR_APPLY'); + //JToolBarHelper::save('phocapdfplugin.save', 'JTOOLBAR_SAVE'); + } + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlayouts/index.html b/views/phocadownloadlayouts/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlayouts/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlayouts/tmpl/default.php b/views/phocadownloadlayouts/tmpl/default.php new file mode 100644 index 0000000..6cbee28 --- /dev/null +++ b/views/phocadownloadlayouts/tmpl/default.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlayouts/tmpl/index.html b/views/phocadownloadlayouts/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlayouts/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlayouts/view.html.php b/views/phocadownloadlayouts/view.html.php new file mode 100644 index 0000000..298c89e --- /dev/null +++ b/views/phocadownloadlayouts/view.html.php @@ -0,0 +1,26 @@ +redirect(JRoute::_('index.php?option=com_phocadownload&view=phocadownloadlayout&task=phocadownloadlayout.edit'.$idString, false)); + return; + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlic/index.html b/views/phocadownloadlic/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlic/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlic/tmpl/edit.php b/views/phocadownloadlic/tmpl/edit.php new file mode 100644 index 0000000..5a9fd70 --- /dev/null +++ b/views/phocadownloadlic/tmpl/edit.php @@ -0,0 +1,55 @@ +t['n'] . 'RenderAdminView'; +$r = new $class(); +?> +startForm($this->t['o'], $this->t['task'], $this->item->id, 'adminForm', 'adminForm'); +// First Column +echo '
    '; +$tabs = array ( +'general' => JText::_($this->t['l'].'_GENERAL_OPTIONS'), +'publishing' => JText::_($this->t['l'].'_PUBLISHING_OPTIONS')); +echo $r->navigation($tabs); + +echo '
    '. "\n"; + +echo '
    '."\n"; +$formArray = array ('title', 'alias', 'ordering'); +echo $r->group($this->form, $formArray); +$formArray = array('description'); +echo $r->group($this->form, $formArray, 1); +echo '
    '. "\n"; + +echo '
    '."\n"; +foreach($this->form->getFieldset('publish') as $field) { + echo '
    '; + if (!$field->hidden) { + echo '
    '.$field->label.'
    '; + } + echo '
    '; + echo $field->input; + echo '
    '; +} +echo '
    '; + +echo '
    ';//end tab content +echo '
    ';//end span10 +// Second Column +echo '
    ';//end span2 +echo $r->formInputs(); +echo $r->endForm(); +?> diff --git a/views/phocadownloadlic/tmpl/index.html b/views/phocadownloadlic/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlic/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlic/view.html.php b/views/phocadownloadlic/view.html.php new file mode 100644 index 0000000..5fed288 --- /dev/null +++ b/views/phocadownloadlic/view.html.php @@ -0,0 +1,62 @@ +t = PhocaDownloadUtils::setVars('lic'); + $this->state = $this->get('State'); + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + + JHTML::stylesheet( $this->t['s'] ); + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + JRequest::setVar('hidemainmenu', true); + $user = JFactory::getUser(); + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $this->state->get('filter.lic_id')); + + $text = $isNew ? JText::_( $this->t['l'] . '_NEW' ) : JText::_($this->t['l'] . '_EDIT'); + JToolBarHelper::title( JText::_( $this->t['l'] . '_LICENSE' ).': [ ' . $text.' ]' , 'bookmark'); + + // If not checked out, can save the item. + if (!$checkedOut && $canDo->get('core.edit')){ + JToolBarHelper::apply($this->t['task'] . '.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save($this->t['task'] . '.save', 'JTOOLBAR_SAVE'); + JToolBarHelper::addNew($this->t['task'] . '.save2new', 'JTOOLBAR_SAVE_AND_NEW'); + } + + if (empty($this->item->id)) { + JToolBarHelper::cancel($this->t['task'] . '.cancel', 'JTOOLBAR_CANCEL'); + } + else { + JToolBarHelper::cancel($this->t['task'] . '.cancel', 'JTOOLBAR_CLOSE'); + } + + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> diff --git a/views/phocadownloadlics/index.html b/views/phocadownloadlics/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlics/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlics/tmpl/default.php b/views/phocadownloadlics/tmpl/default.php new file mode 100644 index 0000000..35545f9 --- /dev/null +++ b/views/phocadownloadlics/tmpl/default.php @@ -0,0 +1,119 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo $r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TITLE', 'a.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_PUBLISHED', 'a.published', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + //if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; + +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[0]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder($canChange, $saveOrder, $orderkey); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + +$checkO = ''; +if ($item->checked_out) { + $checkO .= JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, $this->t['tasks'].'.', $canCheckin); +} +if ($canCreate || $canEdit) { + $checkO .= ''. $this->escape($item->title).''; +} else { + $checkO .= $this->escape($item->title); +} +$checkO .= ' ('.JText::_($this->t['l'].'_FIELD_ALIAS_LABEL').':'. $this->escape($item->alias).')'; +echo $r->td($checkO, "small hidden-phone"); + +echo $r->td(JHtml::_('jgrid.published', $item->published, $i, $this->t['tasks'].'.', $canChange), "small hidden-phone"); + +echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + //} + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 5); +echo $r->endTable(); + + + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadlics/tmpl/index.html b/views/phocadownloadlics/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlics/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlics/view.html.php b/views/phocadownloadlics/view.html.php new file mode 100644 index 0000000..d3c805a --- /dev/null +++ b/views/phocadownloadlics/view.html.php @@ -0,0 +1,81 @@ +t = PhocaDownloadUtils::setVars('lic'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + // Preprocess the list of items to find ordering divisions. + foreach ($this->items as &$item) { + $this->ordering[0][] = $item->id; + } + + JHTML::stylesheet( $this->t['s'] ); + + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + } + + function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + $state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $state->get('filter.lic_id')); + + JToolBarHelper::title( JText::_( $this->t['l'].'_LICENSES' ), 'bookmark' ); + + if ($canDo->get('core.create')) { + JToolBarHelper::addNew($this->t['task'].'.add','JTOOLBAR_NEW'); + } + + if ($canDo->get('core.edit')) { + JToolBarHelper::editList($this->t['task'].'.edit','JTOOLBAR_EDIT'); + } + if ($canDo->get('core.edit.state')) { + + JToolBarHelper::divider(); + JToolBarHelper::custom($this->t['tasks'].'.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true); + JToolBarHelper::custom($this->t['tasks'].'.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true); + } + + if ($canDo->get('core.delete')) { + JToolBarHelper::deleteList( $this->t['l'].'_WARNING_DELETE_ITEMS', $this->t['tasks'].'.delete', $this->t['l'].'_DELETE'); + } + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + 'a.ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'a.title' => JText::_($this->t['l'] . '_TITLE'), + 'a.published' => JText::_($this->t['l'] . '_PUBLISHED'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlinkcat/index.html b/views/phocadownloadlinkcat/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkcat/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkcat/tmpl/default.php b/views/phocadownloadlinkcat/tmpl/default.php new file mode 100644 index 0000000..fce9eee --- /dev/null +++ b/views/phocadownloadlinkcat/tmpl/default.php @@ -0,0 +1,94 @@ + + + + \ No newline at end of file diff --git a/views/phocadownloadlinkcat/tmpl/index.html b/views/phocadownloadlinkcat/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkcat/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkcat/view.html.php b/views/phocadownloadlinkcat/view.html.php new file mode 100644 index 0000000..582a64a --- /dev/null +++ b/views/phocadownloadlinkcat/view.html.php @@ -0,0 +1,63 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + $document = JFactory::getDocument(); + $uri = JFactory::getURI(); + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = JRequest::getVar('e_name'); + $tmpl['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $tmpl['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$tmpl['ename']; + + $model = $this->getModel(); + + // build list of categories + //$javascript = 'class="inputbox" size="1" onchange="submitform( );"'; + $javascript = 'class="inputbox" size="1"'; + $filter_catid = ''; + + $query = 'SELECT a.title AS text, a.id AS value, a.parent_id as parentid' + . ' FROM #__phocadownload_categories AS a' + . ' WHERE a.published = 1' + //. ' AND a.approved = 1' + . ' ORDER BY a.ordering'; + $db->setQuery( $query ); + $phocadownloads = $db->loadObjectList(); + + $tree = array(); + $text = ''; + $tree = PhocaDownloadCategory::CategoryTreeOption($phocadownloads, $tree, 0, $text, -1); + array_unshift($tree, JHTML::_('select.option', '0', '- '.JText::_('COM_PHOCADOWNLOAD_SELECT_CATEGORY').' -', 'value', 'text')); + $lists['catid'] = JHTML::_( 'select.genericlist', $tree, 'catid', $javascript , 'value', 'text', $filter_catid ); + //----------------------------------------------------------------------- + + $this->assignRef('lists', $lists); + $this->assignRef('tmpl', $tmpl); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlinkcats/index.html b/views/phocadownloadlinkcats/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkcats/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkcats/tmpl/default.php b/views/phocadownloadlinkcats/tmpl/default.php new file mode 100644 index 0000000..9b05a40 --- /dev/null +++ b/views/phocadownloadlinkcats/tmpl/default.php @@ -0,0 +1,65 @@ + + + + \ No newline at end of file diff --git a/views/phocadownloadlinkcats/tmpl/index.html b/views/phocadownloadlinkcats/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkcats/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkcats/view.html.php b/views/phocadownloadlinkcats/view.html.php new file mode 100644 index 0000000..760ddeb --- /dev/null +++ b/views/phocadownloadlinkcats/view.html.php @@ -0,0 +1,71 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + $document = JFactory::getDocument(); + $uri = JFactory::getURI(); + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = JRequest::getVar('e_name'); + $tmpl['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $tmpl['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$tmpl['ename']; + + + // Category Tree + $db = JFactory::getDBO(); + $query = 'SELECT a.title AS text, a.id AS value, a.parent_id as parentid' + . ' FROM #__phocadownload_categories AS a' + // . ' WHERE a.published = 1' You can hide not published and not authorized categories too + // . ' AND a.approved = 1' + . ' ORDER BY a.ordering'; + $db->setQuery( $query ); + $categories = $db->loadObjectList(); + + $tree = array(); + $text = ''; + $tree = PhocaDownloadCategory::CategoryTreeOption($categories, $tree, 0, $text, -1); + //----------------------------------------------------------------------- + + // Multiple + $ctrl = 'hidecategories'; + $attribs = ' '; + $attribs .= ' size="5"'; + //$attribs .= 'class="'.$v.'"'; + $attribs .= ' class="inputbox"'; + $attribs .= ' multiple="multiple"'; + $ctrl .= ''; + //$value = implode( '|', ) + + $categoriesOutput = JHTML::_('select.genericlist', $tree, $ctrl, $attribs, 'value', 'text', 0, 'hidecategories' ); + + $this->assignRef('categoriesoutput', $categoriesOutput); + $this->assignRef('tmpl', $tmpl); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlinkfile/index.html b/views/phocadownloadlinkfile/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkfile/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkfile/tmpl/default.php b/views/phocadownloadlinkfile/tmpl/default.php new file mode 100644 index 0000000..7131073 --- /dev/null +++ b/views/phocadownloadlinkfile/tmpl/default.php @@ -0,0 +1,398 @@ +lists['order'] == 'a.ordering'); + +JHTML::_('behavior.tooltip'); + +if ($this->tmpl['type'] == 0) { + $view = 'file'; +} else if ($this->tmpl['type'] == 1) { + $view = 'fileplaylink'; +} else if ($this->tmpl['type'] == 2) { + $view = 'fileplay'; +} else if ($this->tmpl['type'] == 3) { + $view = 'filepreviewlink'; +} else if ($this->tmpl['type'] == 4) { + $view = 'filelist'; +} + + +?> + + \ No newline at end of file diff --git a/views/phocadownloadlinkfile/tmpl/index.html b/views/phocadownloadlinkfile/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkfile/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkfile/view.html.php b/views/phocadownloadlinkfile/view.html.php new file mode 100644 index 0000000..f28a0e4 --- /dev/null +++ b/views/phocadownloadlinkfile/view.html.php @@ -0,0 +1,129 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = JRequest::getVar('e_name'); + $tmpl['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $tmpl['type'] = JRequest::getVar( 'type', 1, '', 'int' ); + $tmpl['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$tmpl['ename']; + + + $params = JComponentHelper::getParams('com_phocadownload') ; + + //Filter + $context = 'com_phocadownload.phocadownload.list.'; + //$sectionid = JRequest::getVar( 'sectionid', -1, '', 'int' ); + //$redirect = $sectionid; + $option = JRequest::getCmd( 'option' ); + + $filter_state = $app->getUserStateFromRequest( $this->_context.'.filter_state', 'filter_state', '', 'word' ); + $filter_catid = $app->getUserStateFromRequest( $this->_context.'.filter_catid', 'filter_catid', 0, 'int' ); + $catid = $app->getUserStateFromRequest( $this->_context.'.catid', 'catid', 0, 'int'); + // $filter_sectionid = $app->getUserStateFromRequest( $this->_context.'.filter_sectionid','filter_sectionid', -1, 'int'); + $filter_order = $app->getUserStateFromRequest( $this->_context.'.filter_order', 'filter_order', 'a.ordering', 'cmd' ); + $filter_order_Dir = $app->getUserStateFromRequest( $this->_context.'.filter_order_Dir', 'filter_order_Dir', '', 'word' ); + $search = $app->getUserStateFromRequest( $this->_context.'.search','search', '', 'string' ); + $search = JString::strtolower( $search ); + + // Get data from the model + $items = $this->get( 'Data'); + $total = $this->get( 'Total'); + $pagination = $this->get( 'Pagination' ); + + // build list of categories + + if ($tmpl['type'] != 4) { + $javascript = 'class="inputbox" size="1" onchange="submitform( );"'; + } else { + $javascript = ''; + } + // get list of categories for dropdown filter + $filter = ''; + + //if ($filter_sectionid > 0) { + // $filter = ' WHERE cc.section = '.$db->Quote($filter_sectionid); + //} + + // get list of categories for dropdown filter + $query = 'SELECT cc.id AS value, cc.title AS text' . + ' FROM #__phocadownload_categories AS cc' . + $filter . + ' ORDER BY cc.ordering'; + + if ($tmpl['type'] != 4) { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, true, true); + } else { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, false, true); + } + /* + if ($tmpl['type'] != 4) { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, true); + } else { + $lists['catid'] = PhocaDownloadCategory::filterCategory($query, $catid, null, false); + }*/ + + // sectionid + /*$query = 'SELECT s.title AS text, s.id AS value' + . ' FROM #__phocadownload_sections AS s' + . ' WHERE s.published = 1' + . ' ORDER BY s.ordering'; + + $lists['sectionid'] = PhocaDownloadCategory::filterSection($query, $filter_sectionid);*/ + + // state filter + $lists['state'] = JHTML::_('grid.state', $filter_state ); + + // table ordering + $lists['order_Dir'] = $filter_order_Dir; + $lists['order'] = $filter_order; + + // search filter + $lists['search']= $search; + + + $user = JFactory::getUser(); + $uriS = $uri->toString(); + $this->assignRef('user', $user); + $this->assignRef('lists', $lists); + $this->assignRef('tmpl', $this->t); + $this->assignRef('items', $items); + $this->assignRef('pagination', $pagination); + $this->assignRef('request_url', $uriS); + + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlinks/index.html b/views/phocadownloadlinks/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinks/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinks/tmpl/default.php b/views/phocadownloadlinks/tmpl/default.php new file mode 100644 index 0000000..c8c93f2 --- /dev/null +++ b/views/phocadownloadlinks/tmpl/default.php @@ -0,0 +1,20 @@ +' +.'
    ' +.''.JText::_( 'COM_PHOCADOWNLOAD_SELECT_TYPE' ).'' +.'' +.'
    ' +.'' +.''; +?> \ No newline at end of file diff --git a/views/phocadownloadlinks/tmpl/index.html b/views/phocadownloadlinks/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinks/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinks/view.html.php b/views/phocadownloadlinks/view.html.php new file mode 100644 index 0000000..7c406a9 --- /dev/null +++ b/views/phocadownloadlinks/view.html.php @@ -0,0 +1,45 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + + $document = JFactory::getDocument(); + $uri = JFactory::getURI(); + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = JRequest::getVar('e_name'); + $eName = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + + + $tmpl['linkcategories'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkcats&tmpl=component&e_name='.$eName; + $tmpl['linkcategory'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkcat&tmpl=component&e_name='.$eName; + $tmpl['linkfile'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkfile&tmpl=component&e_name='.$eName; + $tmpl['linkytb'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinkytb&tmpl=component&e_name='.$eName; + + $this->assignRef('tmpl', $tmpl); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlinkytb/index.html b/views/phocadownloadlinkytb/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkytb/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkytb/tmpl/default.php b/views/phocadownloadlinkytb/tmpl/default.php new file mode 100644 index 0000000..6028bdb --- /dev/null +++ b/views/phocadownloadlinkytb/tmpl/default.php @@ -0,0 +1,54 @@ + + + \ No newline at end of file diff --git a/views/phocadownloadlinkytb/tmpl/index.html b/views/phocadownloadlinkytb/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlinkytb/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlinkytb/view.html.php b/views/phocadownloadlinkytb/view.html.php new file mode 100644 index 0000000..7732d53 --- /dev/null +++ b/views/phocadownloadlinkytb/view.html.php @@ -0,0 +1,40 @@ +isAdmin()) { + $tUri = JURI::base(); + + } + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/phocadownload.css' ); + + $eName = JRequest::getVar('e_name'); + $tmpl['ename'] = preg_replace( '#[^A-Z0-9\-\_\[\]]#i', '', $eName ); + $tmpl['backlink'] = $tUri.'index.php?option=com_phocadownload&view=phocadownloadlinks&tmpl=component&e_name='.$tmpl['ename']; + + $this->assignRef('tmpl', $tmpl); + parent::display($tpl); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadlogs/index.html b/views/phocadownloadlogs/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlogs/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlogs/tmpl/default.php b/views/phocadownloadlogs/tmpl/default.php new file mode 100644 index 0000000..7477ba4 --- /dev/null +++ b/views/phocadownloadlogs/tmpl/default.php @@ -0,0 +1,143 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +if ($this->t['p']->get('enable_logging', 0) == 0) { + echo '
    ×'. JText::_('COM_PHOCADOWNLOAD_LOGGING_NOT_ENABLED').'
    '; +} + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterType($this->t['l'].'_SELECT_TYPE', $this->state->get('filter.type'), array(1 => JText::_($this->t['l'].'_DOWNLOADS'), 2 =>JText::_($this->t['l'].'_UPLOADS'))); +//echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +//echo $r->selectFilterCategory(PhocaDownloadCategory::options($this->t['o']), 'JOPTION_SELECT_CATEGORY', $this->state->get('filter.category_id')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo '';//$r->thOrdering('JGRID_HEADING_ORDERING', 0,0); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_DATE', 'a.date', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_USER', 'username', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_IP', 'a.ip', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_FILE', 'filename', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_CATEGORY', 'category_id', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_PAGE', 'a.page', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TYPE', 'a.type', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; +/* +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[$item->catid]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + +$linkCat = JRoute::_( 'index.php?option='.$this->t['o'].'&task='.$this->t['c'].'cat.edit&id='.(int) $item->category_id ); +$canEditCat = $user->authorise('core.edit', $this->t['o']);*/ + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder(0,0,0); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + + +echo $r->td($this->escape($item->date)); + +$usrO = $item->usernameno; +if ($item->username) {$usrO = $usrO . ' ('.$item->username.')';} +if (!$usrO) { + $usrO = JText::_('COM_PHOCADOWNLOAD_GUEST'); +} +echo $r->td($usrO, "small hidden-phone"); + +echo $r->td($this->escape($item->ip)); + +//echo $r->td($this->escape($item->filetitle)); +echo $r->td($this->escape($item->file_title) . ' ('.$this->escape($item->filename) . ')'); + +echo $r->td($this->escape($item->category_id)); +echo $r->td('' + .''. JText::_( $this->t['l'].'_PAGE' ).''); + +if ($item->type == 2) { + echo $r->td(''.JText::_($this->t['l'].'_UPLOAD').'', "small hidden-phone"); +} else { + echo $r->td(''.JText::_($this->t['l'].'_DOWNLOAD').'', "small hidden-phone"); +} + +echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + } + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 15); +echo $r->endTable(); + + + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> diff --git a/views/phocadownloadlogs/tmpl/index.html b/views/phocadownloadlogs/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadlogs/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadlogs/view.html.php b/views/phocadownloadlogs/view.html.php new file mode 100644 index 0000000..185bdb9 --- /dev/null +++ b/views/phocadownloadlogs/view.html.php @@ -0,0 +1,82 @@ +t = PhocaDownloadUtils::setVars('log'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->t['p'] = JComponentHelper::getParams('com_phocadownload'); + + JHTML::stylesheet( $this->t['s'] ); + + // Check for errors. + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + + } + + function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + //$state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t); + + JToolBarHelper::title( JText::_( $this->t['l'].'_LOGGING' ), 'file-2' ); + + if ($canDo->get('core.edit')){ + + $bar = JToolBar::getInstance('toolbar'); + + $dhtml = ''; + $bar->appendButton('Custom', $dhtml); + JToolBarHelper::divider(); + //JToolBarHelper::custom('phocadownloaduserstat.reset', 'reset.png', '', 'COM_PHOCADOWNLOAD_RESET' , false); + } + + //JToolBarHelper::cancel($this->t['tasks'].'.cancel', 'JTOOLBAR_CLOSE'); + + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + 'a.date' => JText::_($this->t['l'] . '_DATE'), + 'usernameno' => JText::_($this->t['l'] . '_USER'), + 'username' => JText::_($this->t['l'] . '_USERNAME'), + 'd.title' => JText::_($this->t['l'] . '_TITLE'), + 'filename' => JText::_($this->t['l'] . '_FILENAME'), + 'category_id' => JText::_($this->t['l'] . '_CATEGORY'), + 'a.ip' => JText::_($this->t['l'] . '_IP'), + 'a.page' => JText::_($this->t['l'] . '_PAGE'), + 'a.type' => JText::_($this->t['l'] . '_TYPE'), + 'a.id' => JText::_($this->t['l'] . '_ID') + + ); + } + +} +?> \ No newline at end of file diff --git a/views/phocadownloadmanager/index.html b/views/phocadownloadmanager/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadmanager/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadmanager/tmpl/default.php b/views/phocadownloadmanager/tmpl/default.php new file mode 100644 index 0000000..46bcc30 --- /dev/null +++ b/views/phocadownloadmanager/tmpl/default.php @@ -0,0 +1,192 @@ +manager == 'filemultiple') { + + ?>'; + +if ($this->manager == 'filemultiple') { + echo $r->startForm($this->t['o'], $this->t['task'], 'adminForm', 'adminForm'); + echo '
    '; + echo '

    '. JText::_('COM_PHOCADOWNLOAD_MULTIPLE_ADD').'

    '; + + echo '
    '."\n"; + $formArray = array ('title', 'alias','published', 'approved', 'ordering', 'catid', 'language', 'pap_copy_m'); + echo $r->group($this->form, $formArray); + echo '
    '. "\n"; + + echo '
    '. "\n"; +} + +if ($this->manager == 'filemultiple') { + echo '
    '; +} else { + echo '
    '; +} + +echo '
    ' . JText::_('COM_PHOCADOWNLOAD_PATH'). ': '.JPath::clean($this->t['path']['orig_abs_ds']. $this->folderstate->folder) .'
    '; + +//$countFaF = count($this->images) + count($this->folders); +echo '' +.'' +.''; +echo ''. "\n"; + +echo '' +.'' +.'' +.''; + + + + +/* +echo '
    '; + +if ($this->manager == 'filemultiple' && (count($this->files) > 0 || count($this->folders) > 0)) { + echo '
    '; + $fileFolders = count($this->files) + count($this->folders); + echo ''; + echo '  '. JText::_('COM_PHOCADOWNLOAD_CHECK_ALL'); + echo '
    '; +}*/ +echo '
    '; +echo $this->loadTemplate('up'); +if (count($this->files) > 0 || count($this->folders) > 0) { ?> +
    + + folders); $i<$n; $i++) : + $this->setFolder($i); + $this->folderi = $i; + echo $this->loadTemplate('folder'); + endfor; ?> + + files); $i<$n; $i++) : + $this->setFile($i); + $this->filei = $i; + echo $this->loadTemplate('file'); + endfor; ?> + +
    +' + .'' + .'' + .'' + .''; +} +echo '' +.'
    '. "\n"; +if ($this->manager == 'filemultiple') { + echo ''. "\n"; +} else { + echo ''; +} +echo ' '.JText::_( $this->t['l'].'_FILENAME' ).'
      '.JText::_( $this->t['l'].'_THERE_IS_NO_FILE' ).'
    '; + +if ($this->manager == 'filemultiple') { + + echo ''. "\n"; + echo ''. "\n"; + echo ''. "\n"; + echo JHtml::_('form.token'); + echo $r->endForm(); + + echo '
    '; + echo '
    '; + +} ?> + +
     
    + +t['displaytabs'] > 0) { + + echo ''; + + + echo '
    '. "\n"; + + echo '
    '. "\n"; + echo $this->loadTemplate('upload'); + echo '
    '. "\n"; + echo '
    '. "\n"; + echo $this->loadTemplate('multipleupload'); + echo '
    '. "\n"; + + echo '
    '. "\n"; + //echo PhocaDownloadFileUpload::renderCreateFolder($this->session->getName(), $this->session->getId(), $this->currentFolder, 'phocadownloadmanager', 'manager='.$this->manager.'&tab='.$this->t['currenttab']['upload'].'&field='. $this->field ); + echo PhocaDownloadFileUpload::renderCreateFolder($this->session->getName(), $this->session->getId(), $this->currentFolder, 'phocadownloadmanager', 'manager='.$this->manager.'&tab=createfolder&field='. $this->field ); + echo '
    '. "\n"; + + echo '
    '. "\n"; +} +echo '
    '; + +if ($this->t['tab'] != '') {$jsCt = 'a[href=#'.$this->t['tab'] .']';} else {$jsCt = 'a:first';} +echo ''; +?> diff --git a/views/phocadownloadmanager/tmpl/default_file.php b/views/phocadownloadmanager/tmpl/default_file.php new file mode 100644 index 0000000..3f3e52f --- /dev/null +++ b/views/phocadownloadmanager/tmpl/default_file.php @@ -0,0 +1,53 @@ +_tmp_file->path_without_name_relative ); +$group = PhocaDownloadSettings::getManagerGroup($this->manager); + + +if ($this->manager == 'filemultiple') { + $checked = JHTML::_('grid.id', $this->filei + count($this->folders), $this->files[$this->filei]->path_with_name_relative_no ); + + $icon = PhocaDownloadFile::getMimeTypeIcon($this->_tmp_file->name); + echo '' + .' '. $checked .'' + .' ' + . $icon .'' + .' ' . $this->_tmp_file->name . '' + .''; + + +} else { + if (($group['i'] == 1) && ($ext == 'png' || $ext == 'jpg' || $ext == 'gif' || $ext == 'jpeg') ) { + + echo '' + .'' + .'' + .'' + . JHTML::_( 'image', str_replace( '../', '', $this->_tmp_file->path_without_name_relative), JText::_('COM_PHOCADOWNLOAD_INSERT'), array('title' => JText::_('COM_PHOCADOWNLOAD_INSERT_ICON'))) + .'' + .' ' + .'' + . $this->_tmp_file->name + .'' + .'' + .''; + + } else { + + echo '' + .'' + .'' + .'' + . JHTML::_( 'image', $this->t['i'].'icon-file.png', '', JText::_('COM_PHOCADOWNLOAD_INSERT_FILENAME')) + .'' + .' ' + .'' + . $this->_tmp_file->name + .'' + .'' + .''; + } +} +?> diff --git a/views/phocadownloadmanager/tmpl/default_folder.php b/views/phocadownloadmanager/tmpl/default_folder.php new file mode 100644 index 0000000..75990ab --- /dev/null +++ b/views/phocadownloadmanager/tmpl/default_folder.php @@ -0,0 +1,36 @@ + +manager); + +if ($this->manager == 'filemultiple') { + + $checked = JHTML::_('grid.id', $this->folderi, $this->folders[$this->folderi]->path_with_name_relative_no, 0, 'foldercid' ); + $link = 'index.php?option=com_phocadownload&view=phocadownloadmanager' + .'&manager='.$this->manager + .$group['c'] + .'&folder='.$this->_tmp_folder->path_with_name_relative_no + .'&field='. $this->field; + + echo '' + .' '. $checked .'' + .' ' + . JHTML::_( 'image', $this->t['i'].'icon-16-folder-small.png', '').'' + .' '. $this->_tmp_folder->name.'' + .''; + +} else { + + $link = 'index.php?option=com_phocadownload&view=phocadownloadmanager' + .'&manager='. $this->manager + . $group['c'] + .'&folder='.$this->_tmp_folder->path_with_name_relative_no + .'&field='. $this->field; + + echo '' + .' ' + .' ' + . JHTML::_( 'image', $this->t['i'].'icon-16-folder-small.png', JText::_('COM_PHOCADOWNLOAD_OPEN')).'' + .' '. $this->_tmp_folder->name.'' + .''; +} +?> \ No newline at end of file diff --git a/views/phocadownloadmanager/tmpl/default_multipleupload.php b/views/phocadownloadmanager/tmpl/default_multipleupload.php new file mode 100644 index 0000000..e65b3f4 --- /dev/null +++ b/views/phocadownloadmanager/tmpl/default_multipleupload.php @@ -0,0 +1,13 @@ +t['c'].'-multipleupload" class="ph-in">'; +echo $this->t['mu_response_msg'] ; +echo '
    '; +if ($this->t['ftp']) {echo PhocaDownloadFileUpload::renderFTPaccess();} +echo '
    ' . JText::_( $this->t['l'].'_UPLOAD_FILE' ).' [ '. JText::_( $this->t['l'].'_MAX_SIZE' ).': '.$this->t['uploadmaxsizeread'].',' + .']
    '; +echo ''.JText::_($this->t['l'].'_SELECT_FILES').'. '.JText::_($this->t['l'].'_ADD_FILES_TO_UPLOAD_QUEUE_AND_CLICK_START_BUTTON').''; +echo $this->t['mu_output']; +echo '
    '; +echo ''; +?> \ No newline at end of file diff --git a/views/phocadownloadmanager/tmpl/default_up.php b/views/phocadownloadmanager/tmpl/default_up.php new file mode 100644 index 0000000..5b2c8aa --- /dev/null +++ b/views/phocadownloadmanager/tmpl/default_up.php @@ -0,0 +1,11 @@ +manager); +$link = 'index.php?option='.$this->t['o'].'&view='.$this->t['task'].'&manager='.$this->manager . $group['c'] .'&folder='.$this->folderstate->parent .'&field='. $this->field; +echo ' ' +.'' +.'' +. JHTML::_( 'image', $this->t['i'].'icon-16-up.png', '').'' +.'' +.'..' +.''; \ No newline at end of file diff --git a/views/phocadownloadmanager/tmpl/default_upload.php b/views/phocadownloadmanager/tmpl/default_upload.php new file mode 100644 index 0000000..98b6ffb --- /dev/null +++ b/views/phocadownloadmanager/tmpl/default_upload.php @@ -0,0 +1,12 @@ +t['c'].'-upload" class="ph-in">'; +echo '
    '; +echo '
    '; +if ($this->t['ftp']) { echo PhocaDownloadFileUpload::renderFTPaccess();} +echo '
    '. JText::_( $this->t['l'].'_UPLOAD_FILE' ).' [ '. JText::_( $this->t['l'].'_MAX_SIZE' ).': '.$this->t['uploadmaxsizeread'].']
    '; +echo $this->t['su_output']; +echo '
    '; +echo '
    '; +echo ''; +?> \ No newline at end of file diff --git a/views/phocadownloadmanager/tmpl/index.html b/views/phocadownloadmanager/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadmanager/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadmanager/view.html.php b/views/phocadownloadmanager/view.html.php new file mode 100644 index 0000000..32862f4 --- /dev/null +++ b/views/phocadownloadmanager/view.html.php @@ -0,0 +1,185 @@ +t = PhocaDownloadUtils::setVars('manager'); + $this->field = JRequest::getVar('field'); + $this->fce = 'phocaSelectFileName_'.$this->field; + + JHTML::stylesheet( $this->t['s'] ); + + + $this->folderstate = $this->get('FolderState'); + $this->files = $this->get('Files'); + $this->folders = $this->get('Folders'); + $this->session = JFactory::getSession(); + $this->manager = JRequest::getVar( 'manager', '', '', 'file' ); + + if ($this->manager == 'filemultiple') { + $this->form = $this->get('Form'); + } + + $params = JComponentHelper::getParams($this->t['o']); + + $this->t['multipleuploadchunk'] = $params->get( 'multiple_upload_chunk', 0 ); + $this->t['uploadmaxsize'] = $params->get( 'upload_maxsize', 3145728 ); + $this->t['uploadmaxsizeread'] = PhocaDownloadFile::getFileSizeReadable($this->t['uploadmaxsize']); + $this->t['enablemultiple'] = $params->get( 'enable_multiple_upload_admin', 0 ); + $this->t['multipleuploadmethod'] = $params->get( 'multiple_upload_method', 1 ); + + $this->currentFolder = ''; + if (isset($this->folderstate->folder) && $this->folderstate->folder != '') { + $this->currentFolder = $this->folderstate->folder; + } + + // - - - - - - - - - - + //TABS + // - - - - - - - - - - + $this->t['tab'] = JRequest::getVar('tab', '', '', 'string'); + $this->t['displaytabs'] = 0; + + // UPLOAD + $this->t['currenttab']['upload'] = $this->t['displaytabs']; + $this->t['displaytabs']++; + + // MULTIPLE UPLOAD + if((int)$this->t['enablemultiple'] >= 0) { + $this->t['currenttab']['multipleupload'] = $this->t['displaytabs']; + $this->t['displaytabs']++; + } + + $group = PhocaDownloadSettings::getManagerGroup($this->manager); + + // - - - - - - - - - - - + // Upload + // - - - - - - - - - - - + $sU = new PhocaDownloadFileUploadSingle(); + $sU->returnUrl = 'index.php?option=com_phocadownload&view=phocadownloadmanager&tab=upload'.str_replace('&', '&', $group['c']).'&manager='.$this->manager.'&field='.$this->field.'&folder='. $this->currentFolder; + $sU->tab = 'upload'; + $this->t['su_output'] = $sU->getSingleUploadHTML(); + $this->t['su_url'] = JURI::base().'index.php?option=com_phocadownload&task=phocadownloadupload.upload&' + .$this->session->getName().'='.$this->session->getId().'&' + . JSession::getFormToken().'=1&viewback=phocadownloadmanager&manager='.$this->manager.'&field='.$this->field.'&' + .'folder='. $this->currentFolder.'&tab=upload'; + + + // - - - - - - - - - - - + // Multiple Upload + // - - - - - - - - - - - + // Get infos from multiple upload + $muFailed = JRequest::getVar( 'mufailed', '0', '', 'int' ); + $muUploaded = JRequest::getVar( 'muuploaded', '0', '', 'int' ); + $this->t['mu_response_msg'] = $muUploadedMsg = ''; + + if ($muUploaded > 0) { + $muUploadedMsg = JText::_('COM_PHOCADOWNLOAD_COUNT_UPLOADED_FILE'). ': ' . $muUploaded; + } + if ($muFailed > 0) { + $muFailedMsg = JText::_('COM_PHOCADOWNLOAD_COUNT_NOT_UPLOADED_FILE'). ': ' . $muFailed; + } + if ($muFailed > 0 && $muUploaded > 0) { + $this->t['mu_response_msg'] = '
    ' + .'' + .JText::_('COM_PHOCADOWNLOAD_COUNT_UPLOADED_FILE'). ': ' . $muUploaded .'
    ' + .JText::_('COM_PHOCADOWNLOAD_COUNT_NOT_UPLOADED_FILE'). ': ' . $muFailed.'
    '; + } else if ($muFailed > 0 && $muUploaded == 0) { + $this->t['mu_response_msg'] = '
    ' + .'' + .JText::_('COM_PHOCADOWNLOAD_COUNT_NOT_UPLOADED_FILE'). ': ' . $muFailed.'
    '; + } else if ($muFailed == 0 && $muUploaded > 0){ + $this->t['mu_response_msg'] = '
    ' + .'' + .JText::_('COM_PHOCADOWNLOAD_COUNT_UPLOADED_FILE'). ': ' . $muUploaded.'
    '; + } else { + $this->t['mu_response_msg'] = ''; + } + + if((int)$this->t['enablemultiple'] >= 0) { + + PhocadownloadFileUploadMultiple::renderMultipleUploadLibraries(); + $mU = new PhocaDownloadFileUploadMultiple(); + $mU->frontEnd = 0; + $mU->method = $this->t['multipleuploadmethod']; + $mU->url = JURI::base().'index.php?option=com_phocadownload&task=phocadownloadupload.multipleupload&' + .$this->session->getName().'='.$this->session->getId().'&' + . JSession::getFormToken().'=1&tab=multipleupload&manager='.$this->manager.'&field='.$this->field.'&folder='. $this->currentFolder; + $mU->reload = JURI::base().'index.php?option=com_phocadownload&view=phocadownloadmanager' + .str_replace('&', '&', $group['c']).'&' + .$this->session->getName().'='.$this->session->getId().'&' + . JSession::getFormToken().'=1&tab=multipleupload&' + .'manager='.$this->manager.'&field='.$this->field.'&folder='. $this->currentFolder; + $mU->maxFileSize = PhocadownloadFileUploadMultiple::getMultipleUploadSizeFormat($this->t['uploadmaxsize']); + $mU->chunkSize = '1mb'; + + $mU->renderMultipleUploadJS(0, $this->t['multipleuploadchunk']); + $this->t['mu_output']= $mU->getMultipleUploadHTML(); + } + + + $this->t['ftp'] = !JClientHelper::hasCredentials('ftp'); + $this->t['path'] = PhocaDownloadPath::getPathSet($this->manager); + + $this->addToolbar(); + parent::display($tpl); + echo JHTML::_('behavior.keepalive'); + } + + function setFolder($index = 0) { + if (isset($this->folders[$index])) { + $this->_tmp_folder = &$this->folders[$index]; + } else { + $this->_tmp_folder = new JObject; + } + } + + function setFile($index = 0) { + if (isset($this->files[$index])) { + $this->_tmp_file = &$this->files[$index]; + } else { + $this->_tmp_file = new JObject; + } + } + + protected function addToolbar() { + + JRequest::setVar('hidemainmenu', true); + require_once JPATH_COMPONENT.'/helpers/'.$this->t['task'].'.php'; + $state = $this->get('State'); + $class = ucfirst($this->t['task']).'Helper'; + $canDo = $class::getActions($this->t, $state->get('filter.multiple')); + + JToolBarHelper::title( JText::_( $this->t['l'].'_MULTIPLE_ADD' ), 'plus' ); + + if ($canDo->get('core.create')){ + JToolBarHelper::save($this->t['c'].'m.save', 'JTOOLBAR_SAVE'); + } + + JToolBarHelper::cancel($this->t['c'].'m.cancel', 'JTOOLBAR_CLOSE'); + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadrafile/index.html b/views/phocadownloadrafile/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadrafile/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadrafile/tmpl/default.php b/views/phocadownloadrafile/tmpl/default.php new file mode 100644 index 0000000..dd69137 --- /dev/null +++ b/views/phocadownloadrafile/tmpl/default.php @@ -0,0 +1,141 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +if (isset($this->tmpl['notapproved']->count) && (int)$this->tmpl['notapproved']->count > 0 ) { + echo '
    ×'.JText::_($this->t['l'].'_NOT_APPROVED_FILES_COUNT').': ' + .(int)$this->tmpl['notapproved']->count.'
    '; +} + +echo $r->startForm($this->t['o'], $this->t['task'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +echo $r->selectFilterCategory(PhocaDownloadCategory::options($this->t['o']), 'JOPTION_SELECT_CATEGORY', $this->state->get('filter.category_id')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo $r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_USER', 'ua.username', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_FILENAME', 'file_title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_CATEGORY', 'category_title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_RATING', 'a.rating', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; + +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = 0;//array_search($item->id, $this->ordering[0]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + +$linkCat = JRoute::_( 'index.php?option='.$this->t['o'].'&task='.$this->t['c'].'cat.edit&id='.(int) $item->category_id ); +$canEditCat = $user->authorise('core.edit', $this->t['o']); + +$linkImg = JRoute::_( 'index.php?option='.$this->t['o'].'&task='.$this->t['c'].'file.edit&id='.(int) $item->file_id ); +$canEditImg = $user->authorise('core.edit', $this->t['o']); + + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder($canChange, $saveOrder, $orderkey); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + +$usrU = $item->ratingname; +if ($item->ratingusername) {$usrU = $usrU . ' ('.$item->ratingusername.')';} +echo $r->td($usrU, "small hidden-phone"); + + + +if ($canEditImg) { + $imgO = ''. $this->escape($item->file_title).''; +} else { + $imgO = $this->escape($item->file_title); +} +echo $r->td($imgO, "small hidden-phone"); + +if ($canEditCat) { + $catO = ''. $this->escape($item->category_title).''; +} else { + $catO = $this->escape($item->category_title); +} +echo $r->td($catO, "small hidden-phone"); + +//echo $r->td($item->rating, "small hidden-phone"); +echo $r->tdRating($item->rating); + +echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + } + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 15); +echo $r->endTable(); + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadrafile/tmpl/index.html b/views/phocadownloadrafile/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadrafile/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadrafile/view.html.php b/views/phocadownloadrafile/view.html.php new file mode 100644 index 0000000..b798005 --- /dev/null +++ b/views/phocadownloadrafile/view.html.php @@ -0,0 +1,70 @@ +t = PhocaDownloadUtils::setVars('rafile'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + JHTML::stylesheet( $this->t['s'] ); + JHTML::stylesheet( 'media/com_phocadownload/css/administrator/rating.css' ); + + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + } + + function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['task'].'.php'; + + $bar = JToolBar::getInstance('toolbar'); + $user = JFactory::getUser(); + //$isNew = ($this->item->id == 0); + //$checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); + $class = ucfirst($this->t['task']).'Helper'; + $canDo = $class::getActions($this->t, $this->state->get('filter.category_id')); + + + JToolBarHelper::title( JText::_( $this->t['l'].'_FILE_RATING' ), 'star' ); + + if ($canDo->get('core.delete')) { + JToolBarHelper::deleteList( JText::_( $this->t['l'].'_WARNING_DELETE_ITEMS' ), $this->t['task'].'.delete', $this->t['l'].'_DELETE'); + } + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + //'a.ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'ua.username' => JText::_($this->t['l'] . '_USER'), + 'file_title' => JText::_($this->t['l'] . '_FILENAME'), + 'category_id' => JText::_($this->t['l'] . '_CATEGORY'), + 'a.rating' => JText::_($this->t['l'] . '_RATING'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadset/index.html b/views/phocadownloadset/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadset/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadset/tmpl/default.php b/views/phocadownloadset/tmpl/default.php new file mode 100644 index 0000000..51bab2c --- /dev/null +++ b/views/phocadownloadset/tmpl/default.php @@ -0,0 +1,66 @@ + + + + + +
    + +
    +
    + + + + items as $value) { + + echo ''; + echo ''; + + echo ''; + echo ''; + + } + ?> + +
    '; + echo ''; + echo ''; + + switch ($value->type) { + case 'textarea': + echo PhocaDownloadHelper::getTextareaSettings($value->id, $value->title, $value->value); + break; + + case 'textareaeditor': + echo PhocaDownloadHelper::getTextareaEditorSettings($value->id, $value->title, $value->value); + break; + + case 'select': + echo PhocaDownloadHelper::getSelectSettings($value->id, $value->title, $value->value, $value->values); + break; + + + case 'text': + default: + if ($value->title == 'absolute_path') { + echo '
    ' . JText::_('Experts only!'). '
    '; + echo '
    ' . JText::_('Root Path') . ': ' . JPATH_ROOT . '
    '; + } + echo PhocaDownloadHelper::getTextSettings($value->id, $value->title, $value->value); + break; + + } + echo '
    +
    +
    +
    + + + + + +
    + + diff --git a/views/phocadownloadset/tmpl/index.html b/views/phocadownloadset/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadset/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadset/view.html.php b/views/phocadownloadset/view.html.php new file mode 100644 index 0000000..37eb1df --- /dev/null +++ b/views/phocadownloadset/view.html.php @@ -0,0 +1,42 @@ +get( 'Data'); + + $this->assignRef('items', $items); + $this->assignRef('request_url', $uri->toString()); + + parent::display($tpl); + $this->_setToolbar(); + } + + function _setToolbar() { + JToolBarHelper::title( JText::_( 'Phoca Download Settings' ), 'settings.png' ); + JToolBarHelper::save(); + JToolBarHelper::apply(); + JToolBarHelper::cancel( 'cancel', 'Close' ); + JToolBarHelper::help( 'screen.phocadownload', true ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadstat/index.html b/views/phocadownloadstat/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadstat/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadstat/tmpl/default.php b/views/phocadownloadstat/tmpl/default.php new file mode 100644 index 0000000..d51fbfa --- /dev/null +++ b/views/phocadownloadstat/tmpl/default.php @@ -0,0 +1,148 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +echo '
    '; + +echo $r->startForm($this->t['o'], $this->t['task'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +//echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo $r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TITLE', 'a.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_FILENAME', 'a.filename', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_DOWNLOADS', 'a.hits', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + + +echo ''. "\n"; + +$color = 0; +$colors = array ( +'#FF8080','#FF9980','#FFB380','#FFC080','#FFCC80','#FFD980','#FFE680','#FFF280','#FFFF80','#E6FF80', +'#CCFF80','#99FF80','#80FF80','#80FFC9','#80FFFF','#80C9FF','#809FFF','#9191FF','#AA80FF','#B580FF', +'#D580FF','#FF80FF','#FF80DF','#FF80B8'); + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + //if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + if ($item->textonly == 0) { + $j++; + + +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[0]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder($canChange, $saveOrder, $orderkey); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + +$checkO = ''; +if ($item->checked_out) { + $checkO .= JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, $this->t['tasks'].'.', $canCheckin); +} +if ($canCreate || $canEdit) { + $checkO .= ''. $this->escape($item->title).''; +} else { + $checkO .= $this->escape($item->title); +} +$checkO .= '
    ('.JText::_($this->t['l'].'_FIELD_ALIAS_LABEL').':'. $this->escape($item->alias).')'; +echo $r->td($checkO, "small hidden-phone"); + +echo $r->td($item->filename); + + +if ((int)$this->maxandsum->maxhit == 0) { + $per = 0; + $perOutput = 0; +} else { + $per = round((int)$item->hits / (int)$this->maxandsum->maxhit * 500); + $perOutput = round((int)$item->hits / (int)$this->maxandsum->sumhit * 100); +} + +echo ''; +echo '
    '; +// echo '['. $row->id .']'; +echo '
     '.$item->hits.' ('.$perOutput .' %)  
    '; +echo '
    '; +echo ''; + +$color++; +if ($color > 23) { + $color = 0; +} + + + +echo ''. "\n"; + } + //} + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 5); +echo $r->endTable(); + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadstat/tmpl/index.html b/views/phocadownloadstat/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadstat/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadstat/view.html.php b/views/phocadownloadstat/view.html.php new file mode 100644 index 0000000..c40c591 --- /dev/null +++ b/views/phocadownloadstat/view.html.php @@ -0,0 +1,66 @@ +t = PhocaDownloadUtils::setVars('stat'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + $this->maxandsum = $this->get('MaxAndSum'); + + foreach ($this->items as &$item) { + if ($item->textonly == 0) { + $this->ordering[0][] = $item->id; + } + } + + JHTML::stylesheet( $this->t['s'] ); + + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + } + + function addToolbar() { + require_once JPATH_COMPONENT.'/helpers/'.$this->t['task'].'.php'; + $class = ucfirst($this->t['task']).'Helper'; + $canDo = $class::getActions($this->t); + JToolBarHelper::title( JText::_( $this->t['l'].'_STATISTICS' ), 'chart' ); + JToolBarHelper::custom($this->t['task'].'.back', 'home-2', '', $this->t['l'].'_CONTROL_PANEL', false); + // JToolBarHelper::cancel($this->t['task'].'.cancel', 'JTOOLBAR_CLOSE'); + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + 'a.ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'a.title' => JText::_($this->t['l'] . '_TITLE'), + 'a.filename' => JText::_($this->t['l'] . '_FILENAME'), + 'a.hits' => JText::_($this->t['l'] . '_DOWNLOADS'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadstyle/index.html b/views/phocadownloadstyle/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadstyle/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadstyle/tmpl/edit.php b/views/phocadownloadstyle/tmpl/edit.php new file mode 100644 index 0000000..4918640 --- /dev/null +++ b/views/phocadownloadstyle/tmpl/edit.php @@ -0,0 +1,81 @@ +t['n'] . 'RenderAdminView'; +$r = new $class(); + +?> +startForm($this->t['o'], $this->t['task'], $this->item->id, 'adminForm', 'adminForm'); +// First Column +echo '
    '; +$tabs = array ( +'general' => JText::_($this->t['l'].'_GENERAL_OPTIONS'), +'publishing' => JText::_($this->t['l'].'_PUBLISHING_OPTIONS')); +echo $r->navigation($tabs); + +echo '
    '. "\n"; + +echo '
    '."\n"; + +if ($this->ftp) { echo $this->loadTemplate('ftp');} + +//$formArray = array ('title', 'type', 'filename', 'ordering'); +//echo $r->group($this->form, $formArray); + +echo '
    '; +echo $r->item($this->form, 'title'); +echo $this->form->getInput('type'); +echo $r->item($this->form, 'typeoutput'); +echo $r->item($this->form, 'filename', $this->t['ssuffixtype']); +echo $r->item($this->form, 'ordering'); + +echo '
    '; + +echo '
    '; +echo $this->form->getLabel('source'); +echo '
    '; +echo '
    '; +echo $this->form->getInput('source'); +echo '
    '; + +echo '
    '. "\n"; + +echo '
    '."\n"; +foreach($this->form->getFieldset('publish') as $field) { + echo '
    '; + if (!$field->hidden) { + echo '
    '.$field->label.'
    '; + } + echo '
    '; + echo $field->input; + echo '
    '; +} +echo '
    '; + +// Second Column +echo '
    ';//end span2 +echo $r->formInputs(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadstyle/tmpl/edit_ftp.php b/views/phocadownloadstyle/tmpl/edit_ftp.php new file mode 100644 index 0000000..3b1114a --- /dev/null +++ b/views/phocadownloadstyle/tmpl/edit_ftp.php @@ -0,0 +1,41 @@ + +
    + + + + + ftp instanceof Exception): ?> +

    ftp->message); ?>

    + + + + + + + + + + + + + +
    + + + +
    + + + +
    +
    diff --git a/views/phocadownloadstyle/tmpl/index.html b/views/phocadownloadstyle/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadstyle/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadstyle/view.html.php b/views/phocadownloadstyle/view.html.php new file mode 100644 index 0000000..6a0cfae --- /dev/null +++ b/views/phocadownloadstyle/view.html.php @@ -0,0 +1,89 @@ +t = PhocaDownloadUtils::setVars('style'); + JHTML::stylesheet( $this->t['s'] ); + + $this->state = $this->get('State'); + $this->item = $this->get('Item'); + $this->form = $this->get('Form'); + $this->ftp = JClientHelper::setCredentialsFromRequest('ftp'); + $model = $this->getModel(); + + // Set CSS for codemirror + JFactory::getApplication()->setUserState('editor.source.syntax', 'css'); + + + // New or edit + if (!$this->form->getValue('id') || $this->form->getValue('id') == 0) { + $this->form->setValue('source', null, ''); + $this->form->setValue('type', null, 2); + $this->t['ssuffixtype'] = JText::_($this->t['l'].'_WILL_BE_CREATED_FROM_TITLE'); + + } else { + $this->source = $model->getSource($this->form->getValue('id'), $this->form->getValue('filename'), $this->form->getValue('type')); + $this->form->setValue('source', null, $this->source->source); + $this->t['ssuffixtype'] = ''; + } + + // Only help input form field - to display Main instead of 1 and Custom instead of 2 + if ($this->form->getValue('type') == 1) { + $this->form->setValue('typeoutput', null, JText::_($this->t['l'].'_MAIN_CSS')); + } else { + $this->form->setValue('typeoutput', null, JText::_($this->t['l'].'_CUSTOM_CSS')); + } + + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + JRequest::setVar('hidemainmenu', true); + $bar = JToolBar::getInstance('toolbar'); + $user = JFactory::getUser(); + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $this->state->get('filter.category_id')); + + $text = $isNew ? JText::_( $this->t['l'] . '_NEW' ) : JText::_($this->t['l'] . '_EDIT'); + JToolBarHelper::title( JText::_( $this->t['l'] . '_STYLE' ).': [ ' . $text.' ]' , 'eye'); + + // If not checked out, can save the item. + if (!$checkedOut && $canDo->get('core.edit')){ + JToolBarHelper::apply($this->t['task'].'.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save($this->t['task'].'.save', 'JTOOLBAR_SAVE'); + } + + JToolBarHelper::cancel($this->t['task'].'.cancel', 'JTOOLBAR_CLOSE'); + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + +} +?> diff --git a/views/phocadownloadstyles/index.html b/views/phocadownloadstyles/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadstyles/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadstyles/tmpl/default.php b/views/phocadownloadstyles/tmpl/default.php new file mode 100644 index 0000000..285ef2c --- /dev/null +++ b/views/phocadownloadstyles/tmpl/default.php @@ -0,0 +1,144 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); + +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + + +echo $r->jsJorderTable($listOrder); + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +echo $r->selectFilterCategory(PhocaDownloadCategory::options(1), $this->t['l'].'_FILTER_SELECT_TYPE', $this->state->get('filter.category_id')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo $r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TITLE', 'a.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_FILENAME', 'a.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_PUBLISHED', 'a.published', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TYPE', 'a.type', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', 'JGRID_HEADING_LANGUAGE', 'a.language', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + //if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; + +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[$item->type]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder($canChange, $saveOrder, $orderkey); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + + +$checkO = ''; +if ($item->checked_out) { + $checkO .= JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, $this->t['tasks'].'.', $canCheckin); +} +if ($canCreate || $canEdit) { + $checkO .= ''. $this->escape($item->title).''; +} else { + $checkO .= $this->escape($item->title); +} + +echo $r->td($checkO, "small hidden-phone"); + +$filename = PhocaDownloadFile::existsCss($item->filename, $item->type); +$main = ''; +if ((int)$item->type == 1) { + $main = ' '.JText::_($this->t['l'].'_MAIN').''; +} +if ($filename) { + echo $r->td($item->filename . $main .' '.JText::_($this->t['l'].'_FILE_EXISTS').'', "small hidden-phone"); +} else { + echo $r->td($item->filename . $main .' '.JText::_($this->t['l'].'_FILE_DOES_NOT_EXIST').'', "small hidden-phone"); +} + +echo $r->td(JHtml::_('jgrid.published', $item->published, $i, $this->t['tasks'].'.', $canChange), "small hidden-phone"); + +switch($item->type) { + case 2: + echo $r->td(JText::_($this->t['l'].'_CUSTOM_CSS'), "small hidden-phone"); + break; + case 1: + default: + echo $r->td(JText::_($this->t['l'].'_MAIN_CSS'), "small hidden-phone"); + break; +} +echo $r->tdLanguage($item->language, $item->language_title, $this->escape($item->language_title)); +echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + //} + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 15); +echo $r->endTable(); + + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadstyles/tmpl/index.html b/views/phocadownloadstyles/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadstyles/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadstyles/view.html.php b/views/phocadownloadstyles/view.html.php new file mode 100644 index 0000000..94e55bd --- /dev/null +++ b/views/phocadownloadstyles/view.html.php @@ -0,0 +1,88 @@ +t = PhocaDownloadUtils::setVars('style'); + $model = $this->getModel(); + $model->checkItems(); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + JHTML::stylesheet( $this->t['s'] ); + + foreach ($this->items as &$item) { + $this->ordering[$item->type][] = $item->id; + } + + // Check for errors. + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + + } + + function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + $state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $state->get('filter.category_id')); + + JToolBarHelper::title( JText::_( $this->t['l'].'_STYLES' ), 'eye' ); + + if ($canDo->get('core.create')) { + JToolBarHelper::addNew( $this->t['task'].'.add','JTOOLBAR_NEW'); + } + + if ($canDo->get('core.edit')) { + JToolBarHelper::editList($this->t['task'].'.edit','JTOOLBAR_EDIT'); + } + if ($canDo->get('core.edit.state')) { + + JToolBarHelper::divider(); + JToolBarHelper::custom($this->t['tasks'].'.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true); + JToolBarHelper::custom($this->t['tasks'].'.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true); + } + + if ($canDo->get('core.delete')) { + JToolBarHelper::deleteList( JText::_( $this->t['l'].'_WARNING_DELETE_ITEMS' ), $this->t['tasks'].'.delete', $this->t['l'].'_DELETE'); + } + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + 'a.ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'a.title' => JText::_($this->t['l'] . '_TITLE'), + 'a.filename' => JText::_($this->t['l'] . '_FILENAME'), + 'a.published' => JText::_($this->t['l'] . '_PUBLISHED'), + 'a.type' => JText::_($this->t['l'] . '_TYPE'), + 'language' => JText::_('JGRID_HEADING_LANGUAGE'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloadtag/index.html b/views/phocadownloadtag/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadtag/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadtag/tmpl/edit.php b/views/phocadownloadtag/tmpl/edit.php new file mode 100644 index 0000000..2237035 --- /dev/null +++ b/views/phocadownloadtag/tmpl/edit.php @@ -0,0 +1,56 @@ +t['n'] . 'RenderAdminView'; +$r = new $class(); +?> +startForm($this->t['o'], $this->t['task'], $this->item->id, 'adminForm', 'adminForm'); +// First Column +echo '
    '; +$tabs = array ( +'general' => JText::_($this->t['l'].'_GENERAL_OPTIONS'), +'publishing' => JText::_($this->t['l'].'_PUBLISHING_OPTIONS')); +echo $r->navigation($tabs); + +echo '
    '. "\n"; + +echo '
    '."\n"; +$formArray = array ('title', 'alias', 'link_ext', 'link_cat', 'ordering'); +echo $r->group($this->form, $formArray); +$formArray = array('description'); +echo $r->group($this->form, $formArray, 1); +echo '
    '. "\n"; + +echo '
    '."\n"; +foreach($this->form->getFieldset('publish') as $field) { + echo '
    '; + if (!$field->hidden) { + echo '
    '.$field->label.'
    '; + } + echo '
    '; + echo $field->input; + echo '
    '; +} +echo '
    '; + +echo '
    ';//end tab content +echo '
    ';//end span10 +// Second Column +echo '
    ';//end span2 +echo $r->formInputs(); +echo $r->endForm(); +?> + diff --git a/views/phocadownloadtag/tmpl/index.html b/views/phocadownloadtag/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadtag/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadtag/view.html.php b/views/phocadownloadtag/view.html.php new file mode 100644 index 0000000..acb1b6e --- /dev/null +++ b/views/phocadownloadtag/view.html.php @@ -0,0 +1,64 @@ +t = PhocaDownloadUtils::setVars('tag'); + $this->state = $this->get('State'); + $this->form = $this->get('Form'); + $this->item = $this->get('Item'); + + JHTML::stylesheet( $this->t['s'] ); + + $this->addToolbar(); + parent::display($tpl); + } + + protected function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + JRequest::setVar('hidemainmenu', true); + $bar = JToolBar::getInstance('toolbar'); + $user = JFactory::getUser(); + $isNew = ($this->item->id == 0); + $checkedOut = !($this->item->checked_out == 0 || $this->item->checked_out == $user->get('id')); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $this->state->get('filter.tag_id')); + + $text = $isNew ? JText::_( $this->t['l'] . '_NEW' ) : JText::_($this->t['l'] . '_EDIT'); + JToolBarHelper::title( JText::_( $this->t['l'] . '_TAG' ).': [ ' . $text.' ]' , 'tags'); + + // If not checked out, can save the item. + if (!$checkedOut && $canDo->get('core.edit')){ + JToolBarHelper::apply($this->t['task'].'.apply', 'JTOOLBAR_APPLY'); + JToolBarHelper::save($this->t['task'].'.save', 'JTOOLBAR_SAVE'); + JToolBarHelper::addNew($this->t['task'].'.save2new', 'JTOOLBAR_SAVE_AND_NEW'); + } + + if (empty($this->item->id)) { + JToolBarHelper::cancel($this->t['task'].'.cancel', 'JTOOLBAR_CANCEL'); + } + else { + JToolBarHelper::cancel($this->t['task'].'.cancel', 'JTOOLBAR_CLOSE'); + } + + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } +} +?> diff --git a/views/phocadownloadtags/index.html b/views/phocadownloadtags/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadtags/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadtags/tmpl/default.php b/views/phocadownloadtags/tmpl/default.php new file mode 100644 index 0000000..d1b0f63 --- /dev/null +++ b/views/phocadownloadtags/tmpl/default.php @@ -0,0 +1,124 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +if (isset($this->tmpl['notapproved']->count) && (int)$this->tmpl['notapproved']->count > 0 ) { + echo '
    ×'.JText::_($this->t['l'].'_NOT_APPROVED_FILES_COUNT').': ' + .(int)$this->tmpl['notapproved']->count.'
    '; +} + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +//echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +//echo $r->selectFilterCategory(PhocaDownloadCategory::options($this->t['o']), 'JOPTION_SELECT_CATEGORY', $this->state->get('filter.category_id')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo $r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_TITLE', 'a.title', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_PUBLISHED', 'a.published', $listDirn, $listOrder ).''."\n"; +echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + //if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; + +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[0]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder($canChange, $saveOrder, $orderkey); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + +$checkO = ''; +if ($item->checked_out) { + $checkO .= JHtml::_('jgrid.checkedout', $i, $item->editor, $item->checked_out_time, $this->t['tasks'].'.', $canCheckin); +} +if ($canCreate || $canEdit) { + $checkO .= ''. $this->escape($item->title).''; +} else { + $checkO .= $this->escape($item->title); +} +$checkO .= ' ('.JText::_($this->t['l'].'_FIELD_ALIAS_LABEL').':'. $this->escape($item->alias).')'; +echo $r->td($checkO, "small hidden-phone"); + +echo $r->td(JHtml::_('jgrid.published', $item->published, $i, $this->t['tasks'].'.', $canChange), "small hidden-phone"); + +echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + //} + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 5); +echo $r->endTable(); + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> \ No newline at end of file diff --git a/views/phocadownloadtags/tmpl/index.html b/views/phocadownloadtags/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloadtags/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloadtags/view.html.php b/views/phocadownloadtags/view.html.php new file mode 100644 index 0000000..21d0bbb --- /dev/null +++ b/views/phocadownloadtags/view.html.php @@ -0,0 +1,83 @@ +t = PhocaDownloadUtils::setVars('tag'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + // Check for errors. + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + // Preprocess the list of items to find ordering divisions. + foreach ($this->items as &$item) { + $this->ordering[0][] = $item->id; + } + + JHTML::stylesheet( $this->t['s'] ); + + $this->addToolbar(); + parent::display($tpl); + + } + + function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + $state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t, $state->get('filter.tag_id')); + + JToolBarHelper::title( JText::_( $this->t['l'].'_TAGS' ), 'tags' ); + + if ($canDo->get('core.create')) { + JToolBarHelper::addNew($this->t['task'].'.add','JTOOLBAR_NEW'); + } + + if ($canDo->get('core.edit')) { + JToolBarHelper::editList($this->t['task'].'.edit','JTOOLBAR_EDIT'); + } + if ($canDo->get('core.edit.state')) { + + JToolBarHelper::divider(); + JToolBarHelper::custom($this->t['tasks'].'.publish', 'publish.png', 'publish_f2.png','JTOOLBAR_PUBLISH', true); + JToolBarHelper::custom($this->t['tasks'].'.unpublish', 'unpublish.png', 'unpublish_f2.png', 'JTOOLBAR_UNPUBLISH', true); + } + + if ($canDo->get('core.delete')) { + JToolBarHelper::deleteList( $this->t['l'].'_WARNING_DELETE_ITEMS', 'phocadownloadtags.delete', $this->t['l'].'_DELETE'); + } + JToolBarHelper::divider(); + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + 'a.ordering' => JText::_('JGRID_HEADING_ORDERING'), + 'a.title' => JText::_($this->t['l'] . '_TITLE'), + 'a.published' => JText::_($this->t['l'] . '_PUBLISHED'), + 'a.id' => JText::_('JGRID_HEADING_ID') + ); + } +} +?> \ No newline at end of file diff --git a/views/phocadownloaduploads/index.html b/views/phocadownloaduploads/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloaduploads/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloaduploads/tmpl/default.php b/views/phocadownloaduploads/tmpl/default.php new file mode 100644 index 0000000..9369d30 --- /dev/null +++ b/views/phocadownloaduploads/tmpl/default.php @@ -0,0 +1,135 @@ +t['n'] . 'RenderAdminViews'; +$r = new $class(); +$user = JFactory::getUser(); +$userId = $user->get('id'); +$listOrder = $this->escape($this->state->get('list.ordering')); +$listDirn = $this->escape($this->state->get('list.direction')); +$canOrder = $user->authorise('core.edit.state', $this->t['o']); +$saveOrder = $listOrder == 'a.ordering'; +if ($saveOrder) { + $saveOrderingUrl = 'index.php?option='.$this->t['o'].'&task='.$this->t['tasks'].'.saveOrderAjax&tmpl=component'; + JHtml::_('sortablelist.sortable', 'categoryList', 'adminForm', strtolower($listDirn), $saveOrderingUrl, false, true); +} +$sortFields = $this->getSortFields(); + +echo $r->jsJorderTable($listOrder); + +if (isset($this->tmpl['notapproved']->count) && (int)$this->tmpl['notapproved']->count > 0 ) { + echo '
    ×'.JText::_($this->t['l'].'_NOT_APPROVED_FILES_COUNT').': ' + .(int)$this->tmpl['notapproved']->count.'
    '; +} + +echo $r->startForm($this->t['o'], $this->t['tasks'], 'adminForm'); +echo $r->startFilter($this->t['l'].'_FILTER'); +echo $r->selectFilterPublished('JOPTION_SELECT_PUBLISHED', $this->state->get('filter.state')); +//echo $r->selectFilterLanguage('JOPTION_SELECT_LANGUAGE', $this->state->get('filter.language')); +//echo $r->selectFilterCategory(PhocaDownloadCategory::options($this->t['o']), 'JOPTION_SELECT_CATEGORY', $this->state->get('filter.category_id')); +echo $r->endFilter(); + +echo $r->startMainContainer(); +echo $r->startFilterBar(); +echo $r->inputFilterSearch($this->t['l'].'_FILTER_SEARCH_LABEL', $this->t['l'].'_FILTER_SEARCH_DESC', + $this->escape($this->state->get('filter.search'))); +echo $r->inputFilterSearchClear('JSEARCH_FILTER_SUBMIT', 'JSEARCH_FILTER_CLEAR'); +echo $r->inputFilterSearchLimit('JFIELD_PLG_SEARCH_SEARCHLIMIT_DESC', $this->pagination->getLimitBox()); +echo $r->selectFilterDirection('JFIELD_ORDERING_DESC', 'JGLOBAL_ORDER_ASCENDING', 'JGLOBAL_ORDER_DESCENDING', $listDirn); +echo $r->selectFilterSortBy('JGLOBAL_SORT_BY', $sortFields, $listOrder); +echo $r->endFilterBar(); + +echo $r->startTable('categoryList'); + +echo $r->startTblHeader(); + +echo '';//$r->thOrdering('JGRID_HEADING_ORDERING', $listDirn, $listOrder); +echo $r->thCheck('JGLOBAL_CHECK_ALL'); +echo ''.JHTML::_('grid.sort', $this->t['l'].'_USER', 'username', $listDirn, $listOrder ).''."\n"; +echo ''.JText::_('COM_PHOCADOWNLOAD_COUNT_USER_FILES_APPROVED').''."\n"; +echo ''.JText::_('COM_PHOCADOWNLOAD_COUNT_USER_FILES_NOT_APPROVED').''."\n"; + +//echo ''.JHTML::_('grid.sort', $this->t['l'].'_ID', 'a.id', $listDirn, $listOrder ).''."\n"; + +echo $r->endTblHeader(); + +echo ''. "\n"; + +$originalOrders = array(); +$parentsStr = ""; +$j = 0; + +if (is_array($this->items)) { + foreach ($this->items as $i => $item) { + //if ($i >= (int)$this->pagination->limitstart && $j < (int)$this->pagination->limit) { + $j++; +/* +$urlEdit = 'index.php?option='.$this->t['o'].'&task='.$this->t['task'].'.edit&id='; +$urlTask = 'index.php?option='.$this->t['o'].'&task='.$this->t['task']; +$orderkey = array_search($item->id, $this->ordering[$item->catid]); +$ordering = ($listOrder == 'a.ordering'); +$canCreate = $user->authorise('core.create', $this->t['o']); +$canEdit = $user->authorise('core.edit', $this->t['o']); +$canCheckin = $user->authorise('core.manage', 'com_checkin') || $item->checked_out==$user->get('id') || $item->checked_out==0; +$canChange = $user->authorise('core.edit.state', $this->t['o']) && $canCheckin; +$linkEdit = JRoute::_( $urlEdit. $item->id ); + +$linkCat = JRoute::_( 'index.php?option='.$this->t['o'].'&task='.$this->t['c'].'cat.edit&id='.(int) $item->category_id ); +$canEditCat = $user->authorise('core.edit', $this->t['o']);*/ + + +$iD = $i % 2; +echo "\n\n"; +echo ''. "\n"; + +echo $r->tdOrder(0,0,0); +echo $r->td(JHtml::_('grid.id', $i, $item->id), "small hidden-phone"); + +$usrO = $item->usernameno; +if ($item->username) {$usrO = $usrO . ' ('.$item->username.')';} +if (!$usrO) { + $usrO = JText::_('COM_PHOCADOWNLOAD_GUEST'); +} +echo $r->td($usrO, "small hidden-phone"); + +$cntfaid = 0; +if ($item->countfaid) { + $cntfaid = $item->countfaid; +} +echo $r->td($this->escape($cntfaid), 'ph-center'); +$cntfnid = 0; +if ($item->countfnid) { + $cntfnid = $item->countfaid; +} +echo $r->td($this->escape($cntfnid), 'ph-center'); + + +//echo $r->td($item->id, "small hidden-phone"); + +echo ''. "\n"; + + //} + } +} +echo ''. "\n"; + +echo $r->tblFoot($this->pagination->getListFooter(), 15); +echo $r->endTable(); + + + +echo $r->formInputs($listOrder, $originalOrders); +echo $r->endMainContainer(); +echo $r->endForm(); +?> diff --git a/views/phocadownloaduploads/tmpl/index.html b/views/phocadownloaduploads/tmpl/index.html new file mode 100644 index 0000000..fa6d84e --- /dev/null +++ b/views/phocadownloaduploads/tmpl/index.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/views/phocadownloaduploads/view.html.php b/views/phocadownloaduploads/view.html.php new file mode 100644 index 0000000..633a847 --- /dev/null +++ b/views/phocadownloaduploads/view.html.php @@ -0,0 +1,78 @@ +t = PhocaDownloadUtils::setVars('upload'); + $this->items = $this->get('Items'); + $this->pagination = $this->get('Pagination'); + $this->state = $this->get('State'); + + JHTML::stylesheet( $this->t['s'] ); + + // Check for errors. + if (count($errors = $this->get('Errors'))) { + JError::raiseError(500, implode("\n", $errors)); + return false; + } + + $this->addToolbar(); + parent::display($tpl); + + } + + function addToolbar() { + + require_once JPATH_COMPONENT.'/helpers/'.$this->t['tasks'].'.php'; + //$state = $this->get('State'); + $class = ucfirst($this->t['tasks']).'Helper'; + $canDo = $class::getActions($this->t); + + JToolBarHelper::title( JText::_( $this->t['l'].'_UPLOADS' ), 'upload' ); + + if ($canDo->get('core.admin')) { + + $bar = JToolBar::getInstance('toolbar'); + + $dhtml = ''; + $bar->appendButton('Custom', $dhtml); + + + JToolBarHelper::divider(); + } + + + JToolBarHelper::help( 'screen.'.$this->t['c'], true ); + } + + protected function getSortFields() { + return array( + + 'd.title' => JText::_($this->t['l'] . '_TITLE'), + 'd.filename' => JText::_($this->t['l'] . '_FILENAME'), + 'usernameno' => JText::_($this->t['l'] . '_USER'), + 'username' => JText::_($this->t['l'] . '_USERNAME'), + 'a.count' => JText::_($this->t['l'] . '_COUNT') + + ); + } +} +?> \ No newline at end of file