From 315d1fded7c5540a472065de50f4f2a1920bd12b Mon Sep 17 00:00:00 2001 From: "M@dD3n" Date: Sat, 24 Jun 2017 00:58:56 +0300 Subject: [PATCH] Ver. 3.2 --- .gitignore | 1 + .htaccess | 328 + README.md | 78 + admin/.htaccess | 1 + admin/admin.favicon.ico | Bin 0 -> 1150 bytes admin/admin.php | 97 + admin/blocks.php | 133 + admin/browser.php | 192 + admin/dbsettings.php | 70 + admin/docs.php | 298 + admin/fields.php | 84 + admin/finder.php | 24 + admin/functions/func.admin.common.php | 585 + admin/groups.php | 67 + admin/index.php | 135 + admin/init.php | 43 + admin/lang/bg/.gitkeep | 0 admin/lang/bg/blocks.txt | 69 + admin/lang/bg/dbactions.txt | 49 + admin/lang/bg/docs.txt | 286 + admin/lang/bg/groups.txt | 121 + admin/lang/bg/logs.txt | 55 + admin/lang/bg/main.txt | 305 + admin/lang/bg/modules.txt | 38 + admin/lang/bg/navigation.txt | 130 + admin/lang/bg/request.txt | 191 + admin/lang/bg/rubs.txt | 282 + admin/lang/bg/scripts.js | 62 + admin/lang/bg/settings.txt | 116 + admin/lang/bg/sysblocks.txt | 76 + admin/lang/bg/templates.txt | 122 + admin/lang/bg/user.txt | 92 + admin/lang/cz/dbactions.txt | 49 + admin/lang/cz/docs.txt | 260 + admin/lang/cz/groups.txt | 121 + admin/lang/cz/logs.txt | 55 + admin/lang/cz/main.txt | 302 + admin/lang/cz/modules.txt | 38 + admin/lang/cz/navigation.txt | 96 + admin/lang/cz/request.txt | 177 + admin/lang/cz/rubs.txt | 260 + admin/lang/cz/scripts.js | 65 + admin/lang/cz/settings.txt | 111 + admin/lang/cz/sysblocks.txt | 69 + admin/lang/cz/templates.txt | 119 + admin/lang/cz/user.txt | 92 + admin/lang/pl/blocks.txt | 68 + admin/lang/pl/dbactions.txt | 49 + admin/lang/pl/docs.txt | 279 + admin/lang/pl/groups.txt | 103 + admin/lang/pl/logs.txt | 53 + admin/lang/pl/main.txt | 271 + admin/lang/pl/modules.txt | 38 + admin/lang/pl/navigation.txt | 128 + admin/lang/pl/request.txt | 188 + admin/lang/pl/rubs.txt | 267 + admin/lang/pl/scripts.js | 64 + admin/lang/pl/settings.txt | 132 + admin/lang/pl/sysblocks.txt | 71 + admin/lang/pl/templates.txt | 108 + admin/lang/pl/user.txt | 92 + admin/lang/ru/blocks.txt | 69 + admin/lang/ru/dbactions.txt | 47 + admin/lang/ru/docs.txt | 300 + admin/lang/ru/groups.txt | 123 + admin/lang/ru/logs.txt | 53 + admin/lang/ru/main.txt | 303 + admin/lang/ru/modules.txt | 36 + admin/lang/ru/navigation.txt | 128 + admin/lang/ru/request.txt | 196 + admin/lang/ru/rubs.txt | 280 + admin/lang/ru/scripts.js | 62 + admin/lang/ru/settings.txt | 140 + admin/lang/ru/sysblocks.txt | 76 + admin/lang/ru/templates.txt | 120 + admin/lang/ru/user.txt | 90 + admin/lang/ua/blocks.txt | 68 + admin/lang/ua/dbactions.txt | 49 + admin/lang/ua/docs.txt | 298 + admin/lang/ua/groups.txt | 125 + admin/lang/ua/logs.txt | 55 + admin/lang/ua/main.txt | 305 + admin/lang/ua/modules.txt | 38 + admin/lang/ua/navigation.txt | 131 + admin/lang/ua/request.txt | 197 + admin/lang/ua/rubs.txt | 280 + admin/lang/ua/scripts.js | 64 + admin/lang/ua/settings.txt | 139 + admin/lang/ua/sysblocks.txt | 80 + admin/lang/ua/templates.txt | 119 + admin/lang/ua/user.txt | 92 + admin/logs.php | 92 + admin/modules.php | 99 + admin/navigation.php | 136 + admin/request.php | 105 + admin/rubs.php | 561 + admin/settings.php | 177 + admin/start.php | 35 + admin/sysblocks.php | 130 + admin/templates.php | 91 + admin/templates/blocks/form.tpl | 229 + admin/templates/blocks/list.tpl | 231 + admin/templates/blocks/multi.tpl | 37 + admin/templates/blocks/nav.tpl | 1 + admin/templates/browser/browser.tpl | 184 + admin/templates/browser/browser_2frames.tpl | 325 + admin/templates/browser/browser_upload.tpl | 69 + admin/templates/browser/onlycontent.tpl | 1 + admin/templates/css/browser.css | 99 + admin/templates/css/color_default.css | 1158 + admin/templates/css/data_table.css | 155 + admin/templates/css/jquery-ui.css | 566 + admin/templates/css/jquery-ui_custom.css | 531 + admin/templates/css/jquery.fancybox.css | 359 + admin/templates/css/login.css | 203 + admin/templates/css/main.css | 1304 + admin/templates/css/nestable.css | 228 + admin/templates/css/reset.css | 133 + .../alert-opacity-overlay.png | Bin 0 -> 999 bytes .../css/theme_color_default/checkbox.png | Bin 0 -> 279 bytes .../css/theme_color_default/checkbox2.png | Bin 0 -> 254 bytes .../css/theme_color_default/fancy.png | Bin 0 -> 210 bytes .../css/theme_color_default/field.png | Bin 0 -> 210 bytes .../theme_color_default/left-menu-show.png | Bin 0 -> 556 bytes .../message-arrow-left.png | Bin 0 -> 319 bytes .../css/theme_color_default/radio.png | Bin 0 -> 917 bytes .../css/theme_color_default/ui-to-top.png | Bin 0 -> 248 bytes admin/templates/dbactions/actions.tpl | 217 + admin/templates/dbactions/nav.tpl | 1 + admin/templates/documents/alias_doc.tpl | 398 + admin/templates/documents/alias_doc_list.tpl | 75 + admin/templates/documents/alias_list.tpl | 92 + admin/templates/documents/change.tpl | 76 + admin/templates/documents/doc_search.tpl | 214 + admin/templates/documents/docs.tpl | 546 + admin/templates/documents/docs_add_new.tpl | 59 + admin/templates/documents/docs_simple.tpl | 123 + admin/templates/documents/form.tpl | 829 + admin/templates/documents/form_after.tpl | 93 + admin/templates/documents/nav.tpl | 15 + admin/templates/documents/nav_top.tpl | 1 + admin/templates/documents/newremark.tpl | 80 + admin/templates/documents/replyform.tpl | 31 + admin/templates/documents/user.tpl | 107 + admin/templates/error.tpl | 5 + admin/templates/finder/finder.tpl | 22 + admin/templates/finder/nav.tpl | 1 + admin/templates/fonts/cuprum.eot | Bin 0 -> 54687 bytes admin/templates/fonts/cuprum.ttf | Bin 0 -> 195052 bytes admin/templates/fonts/cuprum.woff | Bin 0 -> 60788 bytes admin/templates/groups/groups.tpl | 139 + admin/templates/groups/nav.tpl | 1 + admin/templates/groups/perms.tpl | 168 + admin/templates/images/IconHome.gif | Bin 0 -> 549 bytes admin/templates/images/NavBg.png | Bin 0 -> 183 bytes admin/templates/images/accordion_off.png | Bin 0 -> 1020 bytes admin/templates/images/accordion_on.png | Bin 0 -> 1031 bytes admin/templates/images/add.png | Bin 0 -> 944 bytes .../templates/images/alertOpacityOverlay.png | Bin 0 -> 999 bytes admin/templates/images/arrow.gif | Bin 0 -> 1094 bytes .../images/backgrounds/blueprint.png | Bin 0 -> 272 bytes .../templates/images/backgrounds/darkwood.jpg | Bin 0 -> 14979 bytes admin/templates/images/backgrounds/grey.png | Bin 0 -> 191 bytes admin/templates/images/backgrounds/wood.jpg | Bin 0 -> 42497 bytes admin/templates/images/blanc.gif | Bin 0 -> 43 bytes admin/templates/images/chevron.gif | Bin 0 -> 121 bytes admin/templates/images/chosen-sprite.png | Bin 0 -> 646 bytes admin/templates/images/chosen-sprite@2x.png | Bin 0 -> 872 bytes admin/templates/images/clippy.svg | 3 + admin/templates/images/darkBg.jpg | Bin 0 -> 1193 bytes admin/templates/images/darkBg.png | Bin 0 -> 3789 bytes admin/templates/images/fancybox/blank.gif | Bin 0 -> 43 bytes .../templates/images/fancybox/fancy_close.png | Bin 0 -> 1517 bytes .../images/fancybox/fancy_loading.png | Bin 0 -> 10195 bytes .../images/fancybox/fancy_nav_left.png | Bin 0 -> 1446 bytes .../images/fancybox/fancy_nav_right.png | Bin 0 -> 1454 bytes .../images/fancybox/fancy_shadow_e.png | Bin 0 -> 107 bytes .../images/fancybox/fancy_shadow_n.png | Bin 0 -> 106 bytes .../images/fancybox/fancy_shadow_ne.png | Bin 0 -> 347 bytes .../images/fancybox/fancy_shadow_nw.png | Bin 0 -> 324 bytes .../images/fancybox/fancy_shadow_s.png | Bin 0 -> 111 bytes .../images/fancybox/fancy_shadow_se.png | Bin 0 -> 352 bytes .../images/fancybox/fancy_shadow_sw.png | Bin 0 -> 340 bytes .../images/fancybox/fancy_shadow_w.png | Bin 0 -> 103 bytes .../images/fancybox/fancy_title_left.png | Bin 0 -> 503 bytes .../images/fancybox/fancy_title_main.png | Bin 0 -> 96 bytes .../images/fancybox/fancy_title_over.png | Bin 0 -> 70 bytes .../images/fancybox/fancy_title_right.png | Bin 0 -> 506 bytes .../templates/images/fancybox/fancybox-x.png | Bin 0 -> 203 bytes .../templates/images/fancybox/fancybox-y.png | Bin 0 -> 176 bytes admin/templates/images/fancybox/fancybox.png | Bin 0 -> 24303 bytes admin/templates/images/file.gif | Bin 0 -> 1807 bytes admin/templates/images/folder.gif | Bin 0 -> 2901 bytes admin/templates/images/folder_up.gif | Bin 0 -> 4017 bytes admin/templates/images/forms/addFiles.png | Bin 0 -> 834 bytes admin/templates/images/forms/checkbox.png | Bin 0 -> 556 bytes admin/templates/images/forms/checkbox2.png | Bin 0 -> 632 bytes admin/templates/images/forms/radio.png | Bin 0 -> 1588 bytes admin/templates/images/forms/searchBtn.png | Bin 0 -> 1498 bytes admin/templates/images/forms/select_left.png | Bin 0 -> 306 bytes admin/templates/images/forms/select_right.png | Bin 0 -> 396 bytes admin/templates/images/forms/spinnerBg.png | Bin 0 -> 2805 bytes .../templates/images/forms/spinnerBottom.png | Bin 0 -> 1026 bytes admin/templates/images/forms/spinnerTop.png | Bin 0 -> 1019 bytes .../templates/images/forms/spinnerUpDown.png | Bin 0 -> 1116 bytes admin/templates/images/icons/add.png | Bin 0 -> 228 bytes admin/templates/images/icons/add2.png | Bin 0 -> 220 bytes admin/templates/images/icons/cog.png | Bin 0 -> 1554 bytes admin/templates/images/icons/cog2.png | Bin 0 -> 1526 bytes admin/templates/images/icons/cog3.png | Bin 0 -> 1587 bytes admin/templates/images/icons/contact.png | Bin 0 -> 1247 bytes admin/templates/images/icons/help.png | Bin 0 -> 1280 bytes admin/templates/images/icons/loginEmail.png | Bin 0 -> 1576 bytes admin/templates/images/icons/loginLock.png | Bin 0 -> 1270 bytes admin/templates/images/icons/logout.png | Bin 0 -> 1258 bytes admin/templates/images/icons/mainWebsite.png | Bin 0 -> 1236 bytes admin/templates/images/icons/messages.png | Bin 0 -> 1250 bytes admin/templates/images/icons/preview.png | Bin 0 -> 589 bytes admin/templates/images/icons/profile.png | Bin 0 -> 1233 bytes admin/templates/images/icons/register.png | Bin 0 -> 1185 bytes admin/templates/images/icons/settings.png | Bin 0 -> 1352 bytes admin/templates/images/icons/subAdd.png | Bin 0 -> 972 bytes admin/templates/images/icons/subInbox.png | Bin 0 -> 1087 bytes admin/templates/images/icons/subOutbox.png | Bin 0 -> 1101 bytes admin/templates/images/icons/subTrash.png | Bin 0 -> 1181 bytes admin/templates/images/icons/tasks.png | Bin 0 -> 1058 bytes admin/templates/images/icons/upload.png | Bin 0 -> 956 bytes admin/templates/images/icons/user.png | Bin 0 -> 1281 bytes .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin 0 -> 260 bytes .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin 0 -> 251 bytes .../jquery_ui/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../jquery_ui/ui-bg_flat_10_000000_40x100.png | Bin 0 -> 178 bytes .../ui-bg_glass_100_f6f6f6_1x400.png | Bin 0 -> 104 bytes .../ui-bg_glass_100_fdf5ce_1x400.png | Bin 0 -> 125 bytes .../jquery_ui/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../jquery_ui/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../jquery_ui/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_gloss-wave_35_f6a828_500x100.png | Bin 0 -> 3762 bytes .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin 0 -> 90 bytes .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin 0 -> 129 bytes .../jquery_ui/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_228ef1_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_ef8c08_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_ffd27a_256x240.png | Bin 0 -> 4369 bytes .../jquery_ui/ui-icons_ffffff_256x240.png | Bin 0 -> 4369 bytes admin/templates/images/leftNavBg.png | Bin 0 -> 187 bytes admin/templates/images/leftNavSub.png | Bin 0 -> 174 bytes admin/templates/images/left_menu_show.png | Bin 0 -> 1523 bytes admin/templates/images/level.png | Bin 0 -> 255 bytes admin/templates/images/loader2.gif | Bin 0 -> 673 bytes admin/templates/images/loader3.gif | Bin 0 -> 1849 bytes admin/templates/images/loading.gif | Bin 0 -> 4888 bytes admin/templates/images/loginLogo.png | Bin 0 -> 4706 bytes admin/templates/images/logosmall.png | Bin 0 -> 1151 bytes admin/templates/images/mediapool/attach.gif | Bin 0 -> 195 bytes admin/templates/images/mediapool/avi.gif | Bin 0 -> 601 bytes admin/templates/images/mediapool/blank.gif | Bin 0 -> 250 bytes admin/templates/images/mediapool/bmp.gif | Bin 0 -> 244 bytes admin/templates/images/mediapool/doc.gif | Bin 0 -> 591 bytes admin/templates/images/mediapool/exe.gif | Bin 0 -> 613 bytes admin/templates/images/mediapool/gif.gif | Bin 0 -> 244 bytes admin/templates/images/mediapool/jpe.gif | Bin 0 -> 244 bytes admin/templates/images/mediapool/jpeg.gif | Bin 0 -> 244 bytes admin/templates/images/mediapool/jpg.gif | Bin 0 -> 244 bytes admin/templates/images/mediapool/mp3.gif | Bin 0 -> 385 bytes admin/templates/images/mediapool/pdf.gif | Bin 0 -> 375 bytes admin/templates/images/mediapool/php.gif | Bin 0 -> 368 bytes admin/templates/images/mediapool/png.gif | Bin 0 -> 244 bytes admin/templates/images/mediapool/psd.gif | Bin 0 -> 243 bytes admin/templates/images/mediapool/rar.gif | Bin 0 -> 622 bytes admin/templates/images/mediapool/rtf.gif | Bin 0 -> 375 bytes admin/templates/images/mediapool/swf.gif | Bin 0 -> 375 bytes admin/templates/images/mediapool/tif.gif | Bin 0 -> 243 bytes admin/templates/images/mediapool/txt.gif | Bin 0 -> 369 bytes admin/templates/images/mediapool/wmv.gif | Bin 0 -> 601 bytes admin/templates/images/mediapool/xls.gif | Bin 0 -> 385 bytes admin/templates/images/mediapool/zip.gif | Bin 0 -> 622 bytes admin/templates/images/middlebg.png | Bin 0 -> 943 bytes admin/templates/images/nav_level_2.gif | Bin 0 -> 85 bytes admin/templates/images/nav_level_3.gif | Bin 0 -> 105 bytes admin/templates/images/numberTop.png | Bin 0 -> 192 bytes admin/templates/images/ref.png | Bin 0 -> 5090 bytes admin/templates/images/searchSmall.png | Bin 0 -> 1195 bytes admin/templates/images/sprites.gif | Bin 0 -> 6579 bytes admin/templates/images/sprites_doc.png | Bin 0 -> 1093 bytes admin/templates/images/table_level.png | Bin 0 -> 2948 bytes admin/templates/images/tabsSep.png | Bin 0 -> 927 bytes admin/templates/images/tipsy.gif | Bin 0 -> 58 bytes admin/templates/images/titleBg.png | Bin 0 -> 296 bytes admin/templates/images/topNav.jpg | Bin 0 -> 2052 bytes admin/templates/images/ui.totop.png | Bin 0 -> 1111 bytes admin/templates/images/ui/arrow2Grey.png | Bin 0 -> 950 bytes admin/templates/images/ui/basicBtn.png | Bin 0 -> 2896 bytes admin/templates/images/ui/blackBtn.png | Bin 0 -> 1026 bytes admin/templates/images/ui/blueBtn.png | Bin 0 -> 1047 bytes admin/templates/images/ui/greenBtn.png | Bin 0 -> 262 bytes admin/templates/images/ui/greyishBtn.png | Bin 0 -> 1046 bytes admin/templates/images/ui/handle.png | Bin 0 -> 3425 bytes admin/templates/images/ui/handle_hover.png | Bin 0 -> 1496 bytes admin/templates/images/ui/leftNavSub.png | Bin 0 -> 941 bytes .../templates/images/ui/messageArrow_left.png | Bin 0 -> 1084 bytes .../images/ui/messageArrow_right.png | Bin 0 -> 1074 bytes admin/templates/images/ui/numDataBg.png | Bin 0 -> 384 bytes admin/templates/images/ui/orangeBtn.png | Bin 0 -> 295 bytes admin/templates/images/ui/pagination.png | Bin 0 -> 982 bytes admin/templates/images/ui/progress.png | Bin 0 -> 945 bytes admin/templates/images/ui/progressOverlay.png | Bin 0 -> 1070 bytes admin/templates/images/ui/purpleBtn.png | Bin 0 -> 290 bytes admin/templates/images/ui/redBtn.png | Bin 0 -> 1026 bytes admin/templates/images/ui/seaBtn.png | Bin 0 -> 1018 bytes admin/templates/images/ui/sliderBg.png | Bin 0 -> 2811 bytes admin/templates/images/ui/sliderOverlay.png | Bin 0 -> 938 bytes admin/templates/images/ui/uploadDisabled.png | Bin 0 -> 936 bytes admin/templates/images/ui/whiteBtn.png | Bin 0 -> 332 bytes admin/templates/images/upload.png | Bin 0 -> 956 bytes .../templates/images/uploader/deleteFile.png | Bin 0 -> 347 bytes admin/templates/images/uploader/error.png | Bin 0 -> 369 bytes admin/templates/images/uploader/uploaded.png | Bin 0 -> 307 bytes admin/templates/images/user.png | Bin 0 -> 1004 bytes admin/templates/images/userPic.png | Bin 0 -> 814 bytes admin/templates/images/widgetBg.png | Bin 0 -> 2422 bytes admin/templates/js/filemanager.js | 51 + admin/templates/js/filemanager_template.js | 22 + admin/templates/js/login.js | 4 + admin/templates/js/main.js | 960 + admin/templates/js/rle.js | 127 + admin/templates/login.tpl | 131 + admin/templates/login_scripts.tpl | 3 + admin/templates/logs/404.tpl | 92 + admin/templates/logs/logs.tpl | 85 + admin/templates/logs/nav.tpl | 1 + admin/templates/logs/sql.tpl | 111 + admin/templates/main.tpl | 300 + admin/templates/modules/modules.tpl | 234 + admin/templates/modules/nav.tpl | 1 + admin/templates/navi/navi.tpl | 55 + admin/templates/navi/navi_top.tpl | 55 + admin/templates/navigation/item.tpl | 48 + admin/templates/navigation/item_edit.tpl | 191 + admin/templates/navigation/item_new.tpl | 206 + admin/templates/navigation/items.tpl | 264 + admin/templates/navigation/list.tpl | 214 + admin/templates/navigation/nav.tpl | 1 + admin/templates/navigation/nestable.tpl | 52 + admin/templates/navigation/select.tpl | 12 + admin/templates/navigation/template.tpl | 748 + admin/templates/navigation/tree.tpl | 12 + admin/templates/navigation/tree_docform.tpl | 8 + admin/templates/noperm.tpl | 19 + admin/templates/onlycontent.tpl | 1 + admin/templates/pop.tpl | 67 + admin/templates/request/change.tpl | 39 + admin/templates/request/cond_list.tpl | 127 + admin/templates/request/conditions.tpl | 423 + admin/templates/request/form.tpl | 746 + admin/templates/request/list.tpl | 270 + admin/templates/request/nav.tpl | 1 + admin/templates/rubs/alias.tpl | 92 + admin/templates/rubs/change.tpl | 23 + admin/templates/rubs/code.tpl | 135 + admin/templates/rubs/field_template.tpl | 263 + admin/templates/rubs/fields.tpl | 186 + admin/templates/rubs/fields_groups.tpl | 182 + admin/templates/rubs/fields_list.tpl | 779 + admin/templates/rubs/form.tpl | 837 + admin/templates/rubs/groups.tpl | 26 + admin/templates/rubs/list.tpl | 332 + admin/templates/rubs/multi.tpl | 52 + admin/templates/rubs/nav.tpl | 1 + admin/templates/rubs/rubnew.tpl | 55 + admin/templates/rubs/tmpls.tpl | 178 + admin/templates/rubs/tmpls_form.tpl | 373 + admin/templates/scripts.tpl | 23 + admin/templates/settings/nav.tpl | 1 + admin/templates/settings/pagination_edit.tpl | 249 + admin/templates/settings/settings_case.tpl | 148 + .../templates/settings/settings_countries.tpl | 139 + admin/templates/settings/settings_lang.tpl | 104 + .../templates/settings/settings_lang_edit.tpl | 52 + admin/templates/settings/settings_main.tpl | 588 + .../settings/settings_pagination.tpl | 87 + admin/templates/start.tpl | 258 + admin/templates/sysblocks/form.tpl | 296 + admin/templates/sysblocks/form_visual.tpl | 248 + admin/templates/sysblocks/list.tpl | 244 + admin/templates/sysblocks/multi.tpl | 37 + admin/templates/sysblocks/nav.tpl | 1 + admin/templates/templates/edit_css.tpl | 89 + admin/templates/templates/edit_js.tpl | 88 + admin/templates/templates/form.tpl | 352 + admin/templates/templates/nav.tpl | 1 + admin/templates/templates/templates.tpl | 261 + admin/templates/user/form.tpl | 336 + admin/templates/user/nav.tpl | 1 + admin/templates/user/users.tpl | 423 + admin/user.php | 67 + backup/.htaccess | 1 + cache/.htaccess | 1 + cache/attachments/.htaccess | 1 + cache/combine/.htaccess | 1 + cache/module/.htaccess | 1 + cache/redactor/.htaccess | 1 + cache/redactor/log.txt | 0 cache/smarty/.htaccess | 1 + cache/sql/.htaccess | 1 + cache/tpl/.htaccess | 1 + class/.htaccess | 1 + class/class.blocks.php | 270 + class/class.core.php | 1669 ++ class/class.database.php | 1151 + class/class.dbdump.php | 641 + class/class.debug.php | 478 + class/class.docs.php | 3929 +++ class/class.hooks.php | 174 + class/class.logs.php | 350 + class/class.meta.php | 72 + class/class.modules.php | 406 + class/class.navigation.php | 1279 + class/class.paginations.php | 233 + class/class.request.php | 863 + class/class.rubs.php | 2026 ++ class/class.session.files.php | 140 + class/class.session.php | 161 + class/class.settings.php | 561 + class/class.sysblocks.php | 295 + class/class.template.php | 400 + class/class.templates.php | 615 + class/class.thumbnail.php | 1425 + class/class.user.php | 878 + class/class.yml.php | 436 + fields/.htaccess | 4 + fields/checkbox/field.php | 87 + fields/checkbox/lang/bg.txt | 2 + fields/checkbox/lang/cz.txt | 2 + fields/checkbox/lang/en.txt | 2 + fields/checkbox/lang/pl.txt | 2 + fields/checkbox/lang/ru.txt | 2 + fields/checkbox/lang/ua.txt | 2 + fields/checkbox/tpl/field-doc.tpl | 1 + fields/checkbox/tpl/field-req.tpl | 1 + fields/checkbox/tpl/field.tpl | 2 + fields/code/field.php | 54 + fields/code/lang/bg.txt | 2 + fields/code/lang/cz.txt | 2 + fields/code/lang/pl.txt | 2 + fields/code/lang/ru.txt | 2 + fields/code/lang/ua.txt | 2 + fields/code/tpl/field.tpl | 8 + fields/date/field.php | 117 + fields/date/lang/bg.txt | 2 + fields/date/lang/cz.txt | 2 + fields/date/lang/pl.txt | 2 + fields/date/lang/ru.txt | 2 + fields/date/lang/ua.txt | 2 + fields/date/tpl/field-doc.tpl | 7 + fields/date/tpl/field-req.tpl | 7 + fields/date/tpl/field.tpl | 14 + fields/doc_from_rub/field.php | 170 + fields/doc_from_rub/lang/bg.txt | 5 + fields/doc_from_rub/lang/cz.txt | 3 + fields/doc_from_rub/lang/en.txt | 3 + fields/doc_from_rub/lang/pl.txt | 3 + fields/doc_from_rub/lang/ru.txt | 3 + fields/doc_from_rub/lang/ua.txt | 3 + fields/doc_from_rub/tpl/field-doc.tpl | 31 + fields/doc_from_rub/tpl/field-req.tpl | 31 + fields/doc_from_rub/tpl/field.tpl | 17 + fields/doc_from_rub/tpl/list.tpl | 12 + fields/doc_from_rub_check/field.php | 201 + fields/doc_from_rub_check/lang/bg.txt | 4 + fields/doc_from_rub_check/lang/cz.txt | 3 + fields/doc_from_rub_check/lang/en.txt | 3 + fields/doc_from_rub_check/lang/pl.txt | 3 + fields/doc_from_rub_check/lang/ru.txt | 3 + fields/doc_from_rub_check/lang/ua.txt | 3 + fields/doc_from_rub_check/tpl/field-doc.tpl | 23 + fields/doc_from_rub_check/tpl/field-req.tpl | 23 + fields/doc_from_rub_check/tpl/field.tpl | 38 + fields/doc_from_rub_check/tpl/list.tpl | 20 + fields/doc_from_rub_search/css/field.css | 18 + fields/doc_from_rub_search/field.php | 224 + fields/doc_from_rub_search/js/field.js | 127 + fields/doc_from_rub_search/js/outside.js | 127 + fields/doc_from_rub_search/lang/bg.txt | 8 + fields/doc_from_rub_search/lang/cz.txt | 8 + fields/doc_from_rub_search/lang/pl.txt | 8 + fields/doc_from_rub_search/lang/ru.txt | 8 + fields/doc_from_rub_search/lang/ua.txt | 8 + fields/doc_from_rub_search/tpl/field-doc.tpl | 23 + fields/doc_from_rub_search/tpl/field-req.tpl | 23 + fields/doc_from_rub_search/tpl/field.tpl | 29 + fields/download/field.php | 76 + fields/download/lang/bg.txt | 3 + fields/download/lang/cz.txt | 2 + fields/download/lang/en.txt | 2 + fields/download/lang/pl.txt | 2 + fields/download/lang/ru.txt | 2 + fields/download/lang/ua.txt | 2 + fields/download/tpl/field.tpl | 7 + fields/drop_down/field.php | 87 + fields/drop_down/lang/bg.txt | 3 + fields/drop_down/lang/cz.txt | 3 + fields/drop_down/lang/en.txt | 3 + fields/drop_down/lang/pl.txt | 3 + fields/drop_down/lang/ru.txt | 3 + fields/drop_down/lang/ua.txt | 3 + fields/drop_down/tpl/field.tpl | 11 + fields/drop_down_key/field.php | 78 + fields/drop_down_key/lang/bg.txt | 4 + fields/drop_down_key/lang/cz.txt | 3 + fields/drop_down_key/lang/en.txt | 3 + fields/drop_down_key/lang/pl.txt | 3 + fields/drop_down_key/lang/ru.txt | 3 + fields/drop_down_key/lang/ua.txt | 3 + fields/drop_down_key/tpl/field.tpl | 12 + fields/flash/field.php | 79 + fields/flash/lang/bg.txt | 2 + fields/flash/lang/cz.txt | 2 + fields/flash/lang/pl.txt | 2 + fields/flash/lang/ru.txt | 2 + fields/flash/lang/ua.txt | 2 + fields/flash/tpl/field.tpl | 6 + fields/image_mega/css/field.css | 139 + fields/image_mega/field.php | 435 + fields/image_mega/js/field.js | 284 + fields/image_mega/lang/pl.txt | 30 + fields/image_mega/lang/ru.txt | 30 + fields/image_mega/lang/ua.txt | 30 + fields/image_mega/tpl/field-doc.tpl | 46 + fields/image_mega/tpl/field-req.tpl | 46 + fields/image_mega/tpl/field.tpl | 79 + fields/image_multi/css/field.css | 97 + fields/image_multi/field.php | 395 + fields/image_multi/js/field.js | 229 + fields/image_multi/js/outside.js | 231 + fields/image_multi/lang/bg.txt | 27 + fields/image_multi/lang/cz.txt | 27 + fields/image_multi/lang/en.txt | 26 + fields/image_multi/lang/pl.txt | 27 + fields/image_multi/lang/ru.txt | 27 + fields/image_multi/lang/ua.txt | 27 + fields/image_multi/tpl/field-doc.tpl | 16 + fields/image_multi/tpl/field-req.tpl | 15 + fields/image_multi/tpl/field.tpl | 63 + fields/image_multi_new_3inputs/.gitkeep | 0 fields/image_multi_new_3inputs/css/.gitkeep | 0 fields/image_multi_new_3inputs/css/field.css | 96 + fields/image_multi_new_3inputs/field.php | 307 + fields/image_multi_new_3inputs/js/.gitkeep | 0 fields/image_multi_new_3inputs/js/field.js | 235 + fields/image_multi_new_3inputs/js/outside.js | 231 + fields/image_multi_new_3inputs/lang/.gitkeep | 0 fields/image_multi_new_3inputs/lang/bg.txt | 27 + fields/image_multi_new_3inputs/lang/cz.txt | 29 + fields/image_multi_new_3inputs/lang/en.txt | 26 + fields/image_multi_new_3inputs/lang/pl.txt | 27 + fields/image_multi_new_3inputs/lang/ru.txt | 27 + fields/image_multi_new_3inputs/lang/ua.txt | 27 + fields/image_multi_new_3inputs/tpl/.gitkeep | 0 .../image_multi_new_3inputs/tpl/field-doc.tpl | 3 + .../image_multi_new_3inputs/tpl/field-req.tpl | 3 + fields/image_multi_new_3inputs/tpl/field.tpl | 65 + fields/image_single/css/field.css | 133 + fields/image_single/field.php | 161 + fields/image_single/js/field.js | 55 + fields/image_single/lang/bg.txt | 6 + fields/image_single/lang/cz.txt | 6 + fields/image_single/lang/en.txt | 6 + fields/image_single/lang/pl.txt | 6 + fields/image_single/lang/ru.txt | 6 + fields/image_single/lang/ua.txt | 6 + fields/image_single/tpl/field-doc.tpl | 1 + fields/image_single/tpl/field-req.tpl | 1 + fields/image_single/tpl/field.tpl | 32 + fields/link/field.php | 100 + fields/link/lang/bg.txt | 2 + fields/link/lang/cz.txt | 2 + fields/link/lang/pl.txt | 2 + fields/link/lang/ru.txt | 2 + fields/link/lang/ua.txt | 2 + fields/link/tpl/field.tpl | 2 + fields/multi_checkbox/field.php | 163 + fields/multi_checkbox/lang/bg.txt | 4 + fields/multi_checkbox/lang/cz.txt | 3 + fields/multi_checkbox/lang/en.txt | 3 + fields/multi_checkbox/lang/pl.txt | 3 + fields/multi_checkbox/lang/ru.txt | 3 + fields/multi_checkbox/lang/ua.txt | 3 + fields/multi_checkbox/tpl/field-doc.tpl | 5 + fields/multi_checkbox/tpl/field-req.tpl | 5 + fields/multi_checkbox/tpl/field.tpl | 20 + fields/multi_line/field.php | 93 + fields/multi_line/lang/bg.txt | 2 + fields/multi_line/lang/cz.txt | 2 + fields/multi_line/lang/en.txt | 2 + fields/multi_line/lang/pl.txt | 2 + fields/multi_line/lang/ru.txt | 2 + fields/multi_line/lang/ua.txt | 2 + fields/multi_line_simple/field.php | 95 + fields/multi_line_simple/lang/bg.txt | 3 + fields/multi_line_simple/lang/cz.txt | 2 + fields/multi_line_simple/lang/en.txt | 2 + fields/multi_line_simple/lang/pl.txt | 2 + fields/multi_line_simple/lang/ru.txt | 2 + fields/multi_line_simple/lang/ua.txt | 2 + fields/multi_line_slim/field.php | 95 + fields/multi_line_slim/lang/bg.txt | 3 + fields/multi_line_slim/lang/cz.txt | 2 + fields/multi_line_slim/lang/en.txt | 2 + fields/multi_line_slim/lang/pl.txt | 2 + fields/multi_line_slim/lang/ru.txt | 2 + fields/multi_line_slim/lang/ua.txt | 2 + fields/multi_list/css/field.css | 18 + fields/multi_list/field.php | 194 + fields/multi_list/js/field.js | 75 + fields/multi_list/js/outside.js | 75 + fields/multi_list/lang/bg.txt | 8 + fields/multi_list/lang/cz.txt | 8 + fields/multi_list/lang/en.txt | 8 + fields/multi_list/lang/pl.txt | 8 + fields/multi_list/lang/ru.txt | 8 + fields/multi_list/lang/ua.txt | 8 + fields/multi_list/tpl/field-doc.tpl | 5 + fields/multi_list/tpl/field-req.tpl | 5 + fields/multi_list/tpl/field.tpl | 29 + fields/multi_list_single/css/field.css | 18 + fields/multi_list_single/field.php | 177 + fields/multi_list_single/js/field.js | 75 + fields/multi_list_single/js/outside.js | 75 + fields/multi_list_single/lang/bg.txt | 8 + fields/multi_list_single/lang/cz.txt | 8 + fields/multi_list_single/lang/en.txt | 8 + fields/multi_list_single/lang/pl.txt | 8 + fields/multi_list_single/lang/ru.txt | 8 + fields/multi_list_single/lang/ua.txt | 8 + fields/multi_list_single/tpl/field-doc.tpl | 5 + fields/multi_list_single/tpl/field-req.tpl | 5 + fields/multi_list_single/tpl/field.tpl | 28 + fields/multi_list_triple/css/field.css | 18 + fields/multi_list_triple/field.php | 200 + fields/multi_list_triple/js/field.js | 75 + fields/multi_list_triple/js/outside.js | 75 + fields/multi_list_triple/lang/bg.txt | 9 + fields/multi_list_triple/lang/cz.txt | 9 + fields/multi_list_triple/lang/pl.txt | 9 + fields/multi_list_triple/lang/ru.txt | 9 + fields/multi_list_triple/lang/ua.txt | 9 + fields/multi_list_triple/tpl/field-doc.tpl | 5 + fields/multi_list_triple/tpl/field-req.tpl | 5 + fields/multi_list_triple/tpl/field.tpl | 30 + fields/multi_select/field.php | 159 + fields/multi_select/lang/bg.txt | 3 + fields/multi_select/lang/cz.txt | 3 + fields/multi_select/lang/en.txt | 3 + fields/multi_select/lang/pl.txt | 3 + fields/multi_select/lang/ru.txt | 3 + fields/multi_select/lang/ua.txt | 3 + fields/multi_select/tpl/field-doc.tpl | 5 + fields/multi_select/tpl/field-req.tpl | 5 + fields/multi_select/tpl/field.tpl | 11 + fields/single_line/field.php | 115 + fields/single_line/lang/bg.txt | 3 + fields/single_line/lang/cz.txt | 2 + fields/single_line/lang/en.txt | 2 + fields/single_line/lang/pl.txt | 2 + fields/single_line/lang/ru.txt | 2 + fields/single_line/lang/ua.txt | 2 + fields/single_line/tpl/field-doc.tpl | 1 + fields/single_line/tpl/field-req.tpl | 1 + fields/single_line/tpl/field.tpl | 1 + fields/single_line_numeric/field.php | 106 + fields/single_line_numeric/js/field.js | 26 + fields/single_line_numeric/lang/bg.txt | 3 + fields/single_line_numeric/lang/cz.txt | 2 + fields/single_line_numeric/lang/en.txt | 2 + fields/single_line_numeric/lang/pl.txt | 2 + fields/single_line_numeric/lang/ru.txt | 2 + fields/single_line_numeric/lang/ua.txt | 2 + fields/single_line_numeric/tpl/field-doc.tpl | 1 + fields/single_line_numeric/tpl/field-req.tpl | 1 + fields/single_line_numeric/tpl/field.tpl | 6 + fields/teasers/css/field.css | 18 + fields/teasers/field.php | 165 + fields/teasers/js/field.js | 129 + fields/teasers/js/outside.js | 120 + fields/teasers/lang/bg.txt | 8 + fields/teasers/lang/cz.txt | 8 + fields/teasers/lang/pl.txt | 8 + fields/teasers/lang/ru.txt | 8 + fields/teasers/lang/ua.txt | 8 + fields/teasers/tpl/field.tpl | 29 + fields/text_to_image/.htaccess | 4 + fields/text_to_image/class.txtimage.php | 279 + fields/text_to_image/css/field.css | 18 + fields/text_to_image/field.php | 125 + fields/text_to_image/fonts/CoreSansNR27.ttf | Bin 0 -> 75720 bytes fields/text_to_image/fonts/CoreSansNR37.ttf | Bin 0 -> 76172 bytes fields/text_to_image/fonts/CoreSansNR47.ttf | Bin 0 -> 75856 bytes fields/text_to_image/fonts/Cuprum-Bold.ttf | Bin 0 -> 100172 bytes fields/text_to_image/fonts/Cuprum-Italic.ttf | Bin 0 -> 96400 bytes fields/text_to_image/fonts/Cuprum-Regular.ttf | Bin 0 -> 100608 bytes fields/text_to_image/js/jscolor.js | 1844 ++ fields/text_to_image/lang/bg.txt | 8 + fields/text_to_image/lang/cz.txt | 8 + fields/text_to_image/lang/en.txt | 8 + fields/text_to_image/lang/pl.txt | 8 + fields/text_to_image/lang/ru.txt | 8 + fields/text_to_image/lang/ua.txt | 8 + fields/text_to_image/res.php | 42 + fields/text_to_image/tpl/field-doc.tpl | 1 + fields/text_to_image/tpl/field-req.tpl | 1 + fields/text_to_image/tpl/field.tpl | 73 + fields/youtube/field.php | 205 + fields/youtube/lang/bg.txt | 3 + fields/youtube/lang/cz.txt | 2 + fields/youtube/lang/en.txt | 2 + fields/youtube/lang/pl.txt | 2 + fields/youtube/lang/ru.txt | 2 + fields/youtube/lang/ua.txt | 2 + fields/youtube/tpl/field-doc.tpl | 14 + fields/youtube/tpl/field-req.tpl | 14 + fields/youtube/tpl/field.tpl | 24 + functions/.htaccess | 1 + functions/func.block.php | 87 + functions/func.breadcrumbs.php | 214 + functions/func.common.php | 1022 + functions/func.custom.php | 14 + functions/func.documents.php | 108 + functions/func.fields.php | 592 + functions/func.helpers.php | 795 + functions/func.hidden.php | 50 + functions/func.locale.php | 851 + functions/func.login.php | 346 + functions/func.logs.php | 107 + functions/func.mail.php | 250 + functions/func.modulglobals.php | 71 + functions/func.navigation.php | 497 + functions/func.pagination.php | 141 + functions/func.parserequest.php | 1083 + functions/func.sysblock.php | 95 + functions/func.thumbnails.php | 82 + functions/func.users.php | 240 + functions/func.watermarks.php | 213 + inc/antispam.php | 77 + inc/captcha.php | 25 + inc/config.inc.php | 0 inc/config.php | 145 + inc/db.config.php | 0 inc/dump.php | 30 + inc/errors.php | 104 + inc/fonts/ft16.ttf | Bin 0 -> 19156 bytes inc/index.php | 17 + inc/init.php | 408 + inc/rss.php | 141 + inc/sitemap.php | 99 + inc/stdimage/gear.css | 41 + inc/stdimage/gear.png | Bin 0 -> 607 bytes inc/thumb.php | 269 + inc/upload.php | 146 + index.php | 154 + install/.htaccess | 27 + install/data_base.sql | 341 + install/eula/bg.tpl | 100 + install/eula/ru.tpl | 321 + install/exit.html | 67 + install/index.php | 533 + install/lang/bg.js | 2 + install/lang/bg.txt | 128 + install/lang/ru.js | 2 + install/lang/ru.txt | 128 + install/structure_base.sql | 511 + install/tpl/css/fix.css | 4 + install/tpl/error.tpl | 183 + install/tpl/js/main.js | 135 + install/tpl/step1.tpl | 125 + install/tpl/step2.tpl | 139 + install/tpl/step3.tpl | 241 + install/tpl/step4.tpl | 193 + install/tpl/step5.tpl | 166 + install/tpl/step6.tpl | 106 + lib/Smarty/.htaccess | 1 + lib/Smarty/Config_File.class.php | 393 + lib/Smarty/Smarty.class.php | 1968 ++ lib/Smarty/Smarty_Compiler.class.php | 2365 ++ lib/Smarty/debug.tpl | 157 + .../core.assemble_plugin_filepath.php | 65 + .../core.assign_smarty_interface.php | 43 + .../internals/core.create_dir_structure.php | 79 + .../internals/core.display_debug_console.php | 61 + .../internals/core.get_include_path.php | 44 + lib/Smarty/internals/core.get_microtime.php | 23 + .../internals/core.get_php_resource.php | 80 + lib/Smarty/internals/core.is_secure.php | 59 + lib/Smarty/internals/core.is_trusted.php | 47 + lib/Smarty/internals/core.load_plugins.php | 125 + .../internals/core.load_resource_plugin.php | 74 + .../internals/core.process_cached_inserts.php | 71 + .../core.process_compiled_include.php | 37 + lib/Smarty/internals/core.read_cache_file.php | 101 + lib/Smarty/internals/core.rm_auto.php | 71 + lib/Smarty/internals/core.rmdir.php | 54 + .../internals/core.run_insert_handler.php | 71 + .../internals/core.smarty_include_php.php | 50 + .../internals/core.write_cache_file.php | 96 + .../internals/core.write_compiled_include.php | 91 + .../core.write_compiled_resource.php | 35 + lib/Smarty/internals/core.write_file.php | 54 + lib/Smarty/plugins/block.textformat.php | 103 + lib/Smarty/plugins/compiler.assign.php | 40 + .../plugins/function.assign_debug_info.php | 40 + lib/Smarty/plugins/function.config_load.php | 142 + lib/Smarty/plugins/function.counter.php | 80 + lib/Smarty/plugins/function.cycle.php | 106 + lib/Smarty/plugins/function.debug.php | 35 + lib/Smarty/plugins/function.eval.php | 49 + lib/Smarty/plugins/function.fetch.php | 221 + .../plugins/function.html_checkboxes.php | 143 + lib/Smarty/plugins/function.html_image.php | 142 + lib/Smarty/plugins/function.html_options.php | 122 + lib/Smarty/plugins/function.html_radios.php | 156 + .../plugins/function.html_select_date.php | 331 + .../plugins/function.html_select_time.php | 194 + lib/Smarty/plugins/function.html_table.php | 177 + lib/Smarty/plugins/function.mailto.php | 165 + lib/Smarty/plugins/function.math.php | 104 + lib/Smarty/plugins/function.popup.php | 119 + lib/Smarty/plugins/function.popup_init.php | 40 + lib/Smarty/plugins/modifier.capitalize.php | 43 + lib/Smarty/plugins/modifier.cat.php | 33 + .../plugins/modifier.count_characters.php | 32 + .../plugins/modifier.count_paragraphs.php | 29 + .../plugins/modifier.count_sentences.php | 29 + lib/Smarty/plugins/modifier.count_words.php | 33 + lib/Smarty/plugins/modifier.date_format.php | 58 + .../plugins/modifier.debug_print_var.php | 90 + lib/Smarty/plugins/modifier.declension.php | 96 + lib/Smarty/plugins/modifier.default.php | 32 + lib/Smarty/plugins/modifier.escape.php | 93 + lib/Smarty/plugins/modifier.indent.php | 28 + lib/Smarty/plugins/modifier.lower.php | 26 + lib/Smarty/plugins/modifier.nl2br.php | 35 + lib/Smarty/plugins/modifier.number_format.php | 26 + lib/Smarty/plugins/modifier.regex_replace.php | 48 + lib/Smarty/plugins/modifier.replace.php | 30 + lib/Smarty/plugins/modifier.spacify.php | 30 + lib/Smarty/plugins/modifier.string_format.php | 29 + lib/Smarty/plugins/modifier.strip.php | 33 + lib/Smarty/plugins/modifier.strip_tags.php | 32 + lib/Smarty/plugins/modifier.truncate.php | 50 + lib/Smarty/plugins/modifier.upper.php | 26 + lib/Smarty/plugins/modifier.wordwrap.php | 29 + .../plugins/outputfilter.trimwhitespace.php | 75 + .../plugins/shared.escape_special_chars.php | 31 + lib/Smarty/plugins/shared.make_timestamp.php | 46 + lib/StripTagsSmart/strip_tags_smart.php | 208 + lib/SwiftMailer/classes/Swift.php | 80 + lib/SwiftMailer/classes/Swift/Attachment.php | 71 + .../AbstractFilterableInputStream.php | 181 + .../Swift/ByteStream/ArrayByteStream.php | 182 + .../Swift/ByteStream/FileByteStream.php | 231 + .../ByteStream/TemporaryFileByteStream.php | 42 + .../classes/Swift/CharacterReader.php | 67 + .../GenericFixedWidthReader.php | 97 + .../Swift/CharacterReader/UsAsciiReader.php | 84 + .../Swift/CharacterReader/Utf8Reader.php | 176 + .../classes/Swift/CharacterReaderFactory.php | 26 + .../SimpleCharacterReaderFactory.php | 124 + .../classes/Swift/CharacterStream.php | 89 + .../CharacterStream/ArrayCharacterStream.php | 293 + .../CharacterStream/NgCharacterStream.php | 267 + .../classes/Swift/ConfigurableSpool.php | 63 + .../classes/Swift/DependencyContainer.php | 373 + .../classes/Swift/DependencyException.php | 27 + .../classes/Swift/EmbeddedFile.php | 69 + lib/SwiftMailer/classes/Swift/Encoder.php | 28 + .../classes/Swift/Encoder/Base64Encoder.php | 58 + .../classes/Swift/Encoder/QpEncoder.php | 300 + .../classes/Swift/Encoder/Rfc2231Encoder.php | 92 + lib/SwiftMailer/classes/Swift/Encoding.php | 64 + .../classes/Swift/Events/CommandEvent.php | 65 + .../classes/Swift/Events/CommandListener.php | 24 + .../classes/Swift/Events/Event.php | 38 + .../classes/Swift/Events/EventDispatcher.php | 83 + .../classes/Swift/Events/EventListener.php | 18 + .../classes/Swift/Events/EventObject.php | 63 + .../classes/Swift/Events/ResponseEvent.php | 65 + .../classes/Swift/Events/ResponseListener.php | 24 + .../classes/Swift/Events/SendEvent.php | 129 + .../classes/Swift/Events/SendListener.php | 31 + .../Swift/Events/SimpleEventDispatcher.php | 156 + .../Swift/Events/TransportChangeEvent.php | 27 + .../Swift/Events/TransportChangeListener.php | 45 + .../Swift/Events/TransportExceptionEvent.php | 46 + .../Events/TransportExceptionListener.php | 24 + .../classes/Swift/FailoverTransport.php | 45 + lib/SwiftMailer/classes/Swift/FileSpool.php | 208 + lib/SwiftMailer/classes/Swift/FileStream.php | 24 + lib/SwiftMailer/classes/Swift/Filterable.php | 32 + lib/SwiftMailer/classes/Swift/Image.php | 61 + .../classes/Swift/InputByteStream.php | 75 + lib/SwiftMailer/classes/Swift/IoException.php | 29 + lib/SwiftMailer/classes/Swift/KeyCache.php | 105 + .../classes/Swift/KeyCache/ArrayKeyCache.php | 206 + .../classes/Swift/KeyCache/DiskKeyCache.php | 321 + .../Swift/KeyCache/KeyCacheInputStream.php | 51 + .../classes/Swift/KeyCache/NullKeyCache.php | 115 + .../KeyCache/SimpleKeyCacheInputStream.php | 127 + .../classes/Swift/LoadBalancedTransport.php | 45 + .../classes/Swift/MailTransport.php | 45 + lib/SwiftMailer/classes/Swift/Mailer.php | 114 + .../Swift/Mailer/ArrayRecipientIterator.php | 55 + .../Swift/Mailer/RecipientIterator.php | 32 + lib/SwiftMailer/classes/Swift/MemorySpool.php | 110 + lib/SwiftMailer/classes/Swift/Message.php | 291 + .../classes/Swift/Mime/Attachment.php | 149 + .../classes/Swift/Mime/CharsetObserver.php | 24 + .../classes/Swift/Mime/ContentEncoder.php | 34 + .../ContentEncoder/Base64ContentEncoder.php | 104 + .../ContentEncoder/NativeQpContentEncoder.php | 123 + .../ContentEncoder/PlainContentEncoder.php | 162 + .../Mime/ContentEncoder/QpContentEncoder.php | 134 + .../ContentEncoder/QpContentEncoderProxy.php | 98 + .../Mime/ContentEncoder/RawContentEncoder.php | 64 + .../classes/Swift/Mime/EmbeddedFile.php | 45 + .../classes/Swift/Mime/EncodingObserver.php | 24 + .../classes/Swift/Mime/Grammar.php | 176 + lib/SwiftMailer/classes/Swift/Mime/Header.php | 93 + .../classes/Swift/Mime/HeaderEncoder.php | 24 + .../HeaderEncoder/Base64HeaderEncoder.php | 55 + .../Mime/HeaderEncoder/QpHeaderEncoder.php | 65 + .../classes/Swift/Mime/HeaderFactory.php | 78 + .../classes/Swift/Mime/HeaderSet.php | 169 + .../Swift/Mime/Headers/AbstractHeader.php | 503 + .../classes/Swift/Mime/Headers/DateHeader.php | 125 + .../Mime/Headers/IdentificationHeader.php | 180 + .../Swift/Mime/Headers/MailboxHeader.php | 353 + .../Swift/Mime/Headers/OpenDKIMHeader.php | 133 + .../Mime/Headers/ParameterizedHeader.php | 258 + .../classes/Swift/Mime/Headers/PathHeader.php | 143 + .../Swift/Mime/Headers/UnstructuredHeader.php | 112 + .../classes/Swift/Mime/Message.php | 223 + .../classes/Swift/Mime/MimeEntity.php | 117 + .../classes/Swift/Mime/MimePart.php | 212 + .../Swift/Mime/ParameterizedHeader.php | 34 + .../Swift/Mime/SimpleHeaderFactory.php | 193 + .../classes/Swift/Mime/SimpleHeaderSet.php | 414 + .../classes/Swift/Mime/SimpleMessage.php | 649 + .../classes/Swift/Mime/SimpleMimeEntity.php | 843 + lib/SwiftMailer/classes/Swift/MimePart.php | 59 + .../classes/Swift/NullTransport.php | 39 + .../classes/Swift/OutputByteStream.php | 46 + .../classes/Swift/Plugins/AntiFloodPlugin.php | 141 + .../Swift/Plugins/BandwidthMonitorPlugin.php | 164 + .../Swift/Plugins/Decorator/Replacements.php | 31 + .../classes/Swift/Plugins/DecoratorPlugin.php | 204 + .../Swift/Plugins/ImpersonatePlugin.php | 69 + .../classes/Swift/Plugins/Logger.php | 36 + .../classes/Swift/Plugins/LoggerPlugin.php | 142 + .../Swift/Plugins/Loggers/ArrayLogger.php | 72 + .../Swift/Plugins/Loggers/EchoLogger.php | 58 + .../classes/Swift/Plugins/MessageLogger.php | 74 + .../Swift/Plugins/Pop/Pop3Connection.php | 31 + .../Swift/Plugins/Pop/Pop3Exception.php | 27 + .../Swift/Plugins/PopBeforeSmtpPlugin.php | 273 + .../Swift/Plugins/RedirectingPlugin.php | 213 + .../classes/Swift/Plugins/Reporter.php | 32 + .../classes/Swift/Plugins/ReporterPlugin.php | 61 + .../Swift/Plugins/Reporters/HitReporter.php | 59 + .../Swift/Plugins/Reporters/HtmlReporter.php | 39 + .../classes/Swift/Plugins/Sleeper.php | 24 + .../classes/Swift/Plugins/ThrottlerPlugin.php | 200 + .../classes/Swift/Plugins/Timer.php | 24 + lib/SwiftMailer/classes/Swift/Preferences.php | 103 + .../Swift/ReplacementFilterFactory.php | 27 + .../classes/Swift/RfcComplianceException.php | 27 + .../classes/Swift/SendmailTransport.php | 45 + .../classes/Swift/SignedMessage.php | 23 + lib/SwiftMailer/classes/Swift/Signer.php | 20 + .../classes/Swift/Signers/BodySigner.php | 33 + .../classes/Swift/Signers/DKIMSigner.php | 698 + .../classes/Swift/Signers/DomainKeySigner.php | 525 + .../classes/Swift/Signers/HeaderSigner.php | 65 + .../classes/Swift/Signers/OpenDKIMSigner.php | 190 + .../classes/Swift/Signers/SMimeSigner.php | 436 + .../classes/Swift/SmtpTransport.php | 58 + lib/SwiftMailer/classes/Swift/Spool.php | 53 + .../classes/Swift/SpoolTransport.php | 47 + .../classes/Swift/StreamFilter.php | 35 + .../ByteArrayReplacementFilter.php | 170 + .../StreamFilters/StringReplacementFilter.php | 66 + .../StringReplacementFilterFactory.php | 45 + .../classes/Swift/SwiftException.php | 29 + lib/SwiftMailer/classes/Swift/Transport.php | 54 + .../Swift/Transport/AbstractSmtpTransport.php | 496 + .../Esmtp/Auth/CramMd5Authenticator.php | 81 + .../Esmtp/Auth/LoginAuthenticator.php | 51 + .../Esmtp/Auth/NTLMAuthenticator.php | 720 + .../Esmtp/Auth/PlainAuthenticator.php | 50 + .../Esmtp/Auth/XOAuth2Authenticator.php | 70 + .../Swift/Transport/Esmtp/AuthHandler.php | 263 + .../Swift/Transport/Esmtp/Authenticator.php | 35 + .../classes/Swift/Transport/EsmtpHandler.php | 86 + .../Swift/Transport/EsmtpTransport.php | 413 + .../Swift/Transport/FailoverTransport.php | 88 + .../classes/Swift/Transport/IoBuffer.php | 67 + .../Swift/Transport/LoadBalancedTransport.php | 183 + .../classes/Swift/Transport/MailInvoker.php | 32 + .../classes/Swift/Transport/MailTransport.php | 257 + .../classes/Swift/Transport/NullTransport.php | 93 + .../Swift/Transport/SendmailTransport.php | 160 + .../Swift/Transport/SimpleMailInvoker.php | 39 + .../classes/Swift/Transport/SmtpAgent.php | 36 + .../Swift/Transport/SpoolTransport.php | 117 + .../classes/Swift/Transport/StreamBuffer.php | 334 + .../classes/Swift/TransportException.php | 29 + lib/SwiftMailer/classes/Swift/Validate.php | 43 + .../dependency_maps/cache_deps.php | 23 + .../dependency_maps/message_deps.php | 9 + lib/SwiftMailer/dependency_maps/mime_deps.php | 123 + .../dependency_maps/transport_deps.php | 76 + lib/SwiftMailer/mime_types.php | 1007 + lib/SwiftMailer/preferences.php | 25 + lib/SwiftMailer/swift_init.php | 28 + lib/SwiftMailer/swift_required.php | 30 + lib/SwiftMailer/swift_required_pear.php | 30 + .../swiftmailer_generate_mimes_config.php | 193 + lib/SwiftMailer/version.txt | 1 + lib/bootstrap/css/bootstrap-theme.css | 587 + lib/bootstrap/css/bootstrap-theme.css.map | 1 + lib/bootstrap/css/bootstrap-theme.min.css | 6 + lib/bootstrap/css/bootstrap-theme.min.css.map | 1 + lib/bootstrap/css/bootstrap.css | 6757 +++++ lib/bootstrap/css/bootstrap.css.map | 1 + lib/bootstrap/css/bootstrap.min.css | 6 + lib/bootstrap/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes lib/bootstrap/js/bootstrap.js | 2377 ++ lib/bootstrap/js/bootstrap.min.js | 7 + lib/bootstrap/js/npm.js | 13 + lib/combine/combine.php | 201 + lib/flags/ad.png | Bin 0 -> 643 bytes lib/flags/ae.png | Bin 0 -> 408 bytes lib/flags/af.png | Bin 0 -> 604 bytes lib/flags/ag.png | Bin 0 -> 591 bytes lib/flags/ai.png | Bin 0 -> 643 bytes lib/flags/al.png | Bin 0 -> 600 bytes lib/flags/am.png | Bin 0 -> 497 bytes lib/flags/an.png | Bin 0 -> 488 bytes lib/flags/ao.png | Bin 0 -> 428 bytes lib/flags/ar.png | Bin 0 -> 506 bytes lib/flags/as.png | Bin 0 -> 647 bytes lib/flags/at.png | Bin 0 -> 403 bytes lib/flags/au.png | Bin 0 -> 673 bytes lib/flags/aw.png | Bin 0 -> 524 bytes lib/flags/ax.png | Bin 0 -> 663 bytes lib/flags/az.png | Bin 0 -> 589 bytes lib/flags/ba.png | Bin 0 -> 593 bytes lib/flags/bb.png | Bin 0 -> 585 bytes lib/flags/bd.png | Bin 0 -> 504 bytes lib/flags/be.png | Bin 0 -> 449 bytes lib/flags/bf.png | Bin 0 -> 497 bytes lib/flags/bg.png | Bin 0 -> 462 bytes lib/flags/bh.png | Bin 0 -> 457 bytes lib/flags/bi.png | Bin 0 -> 675 bytes lib/flags/bj.png | Bin 0 -> 486 bytes lib/flags/bm.png | Bin 0 -> 611 bytes lib/flags/bn.png | Bin 0 -> 639 bytes lib/flags/bo.png | Bin 0 -> 500 bytes lib/flags/br.png | Bin 0 -> 593 bytes lib/flags/bs.png | Bin 0 -> 526 bytes lib/flags/bt.png | Bin 0 -> 631 bytes lib/flags/bv.png | Bin 0 -> 512 bytes lib/flags/bw.png | Bin 0 -> 443 bytes lib/flags/by.png | Bin 0 -> 514 bytes lib/flags/bz.png | Bin 0 -> 600 bytes lib/flags/ca.png | Bin 0 -> 628 bytes lib/flags/catalonia.png | Bin 0 -> 398 bytes lib/flags/cc.png | Bin 0 -> 625 bytes lib/flags/cd.png | Bin 0 -> 528 bytes lib/flags/cf.png | Bin 0 -> 614 bytes lib/flags/cg.png | Bin 0 -> 521 bytes lib/flags/ch.png | Bin 0 -> 367 bytes lib/flags/ci.png | Bin 0 -> 453 bytes lib/flags/ck.png | Bin 0 -> 586 bytes lib/flags/cl.png | Bin 0 -> 450 bytes lib/flags/cm.png | Bin 0 -> 525 bytes lib/flags/cn.png | Bin 0 -> 472 bytes lib/flags/co.png | Bin 0 -> 483 bytes lib/flags/cr.png | Bin 0 -> 477 bytes lib/flags/cs.png | Bin 0 -> 439 bytes lib/flags/cu.png | Bin 0 -> 563 bytes lib/flags/cv.png | Bin 0 -> 529 bytes lib/flags/cx.png | Bin 0 -> 608 bytes lib/flags/cy.png | Bin 0 -> 428 bytes lib/flags/cz.png | Bin 0 -> 476 bytes lib/flags/de.png | Bin 0 -> 545 bytes lib/flags/dj.png | Bin 0 -> 572 bytes lib/flags/dk.png | Bin 0 -> 495 bytes lib/flags/dm.png | Bin 0 -> 620 bytes lib/flags/do.png | Bin 0 -> 508 bytes lib/flags/dz.png | Bin 0 -> 582 bytes lib/flags/ec.png | Bin 0 -> 500 bytes lib/flags/ee.png | Bin 0 -> 429 bytes lib/flags/eg.png | Bin 0 -> 465 bytes lib/flags/eh.png | Bin 0 -> 508 bytes lib/flags/en.png | Bin 0 -> 609 bytes lib/flags/england.png | Bin 0 -> 496 bytes lib/flags/er.png | Bin 0 -> 653 bytes lib/flags/es.png | Bin 0 -> 469 bytes lib/flags/et.png | Bin 0 -> 592 bytes lib/flags/eu.png | Bin 0 -> 479 bytes lib/flags/fam.png | Bin 0 -> 532 bytes lib/flags/fi.png | Bin 0 -> 489 bytes lib/flags/fj.png | Bin 0 -> 610 bytes lib/flags/fk.png | Bin 0 -> 648 bytes lib/flags/fm.png | Bin 0 -> 552 bytes lib/flags/fo.png | Bin 0 -> 474 bytes lib/flags/fr.png | Bin 0 -> 545 bytes lib/flags/ga.png | Bin 0 -> 489 bytes lib/flags/gb.png | Bin 0 -> 599 bytes lib/flags/gd.png | Bin 0 -> 637 bytes lib/flags/ge.png | Bin 0 -> 594 bytes lib/flags/gf.png | Bin 0 -> 545 bytes lib/flags/gh.png | Bin 0 -> 490 bytes lib/flags/gi.png | Bin 0 -> 463 bytes lib/flags/gl.png | Bin 0 -> 470 bytes lib/flags/gm.png | Bin 0 -> 493 bytes lib/flags/gn.png | Bin 0 -> 480 bytes lib/flags/gp.png | Bin 0 -> 488 bytes lib/flags/gq.png | Bin 0 -> 537 bytes lib/flags/gr.png | Bin 0 -> 487 bytes lib/flags/gs.png | Bin 0 -> 630 bytes lib/flags/gt.png | Bin 0 -> 493 bytes lib/flags/gu.png | Bin 0 -> 509 bytes lib/flags/gw.png | Bin 0 -> 516 bytes lib/flags/gy.png | Bin 0 -> 645 bytes lib/flags/hk.png | Bin 0 -> 527 bytes lib/flags/hm.png | Bin 0 -> 673 bytes lib/flags/hn.png | Bin 0 -> 537 bytes lib/flags/hr.png | Bin 0 -> 524 bytes lib/flags/ht.png | Bin 0 -> 487 bytes lib/flags/hu.png | Bin 0 -> 432 bytes lib/flags/id.png | Bin 0 -> 430 bytes lib/flags/ie.png | Bin 0 -> 481 bytes lib/flags/il.png | Bin 0 -> 431 bytes lib/flags/in.png | Bin 0 -> 503 bytes lib/flags/io.png | Bin 0 -> 658 bytes lib/flags/iq.png | Bin 0 -> 515 bytes lib/flags/ir.png | Bin 0 -> 512 bytes lib/flags/is.png | Bin 0 -> 532 bytes lib/flags/it.png | Bin 0 -> 420 bytes lib/flags/jm.png | Bin 0 -> 637 bytes lib/flags/jo.png | Bin 0 -> 473 bytes lib/flags/jp.png | Bin 0 -> 420 bytes lib/flags/ke.png | Bin 0 -> 569 bytes lib/flags/kg.png | Bin 0 -> 510 bytes lib/flags/kh.png | Bin 0 -> 549 bytes lib/flags/ki.png | Bin 0 -> 656 bytes lib/flags/km.png | Bin 0 -> 577 bytes lib/flags/kn.png | Bin 0 -> 604 bytes lib/flags/kp.png | Bin 0 -> 561 bytes lib/flags/kr.png | Bin 0 -> 592 bytes lib/flags/kw.png | Bin 0 -> 486 bytes lib/flags/ky.png | Bin 0 -> 643 bytes lib/flags/kz.png | Bin 0 -> 616 bytes lib/flags/la.png | Bin 0 -> 563 bytes lib/flags/lb.png | Bin 0 -> 517 bytes lib/flags/lc.png | Bin 0 -> 520 bytes lib/flags/li.png | Bin 0 -> 537 bytes lib/flags/lk.png | Bin 0 -> 627 bytes lib/flags/lr.png | Bin 0 -> 466 bytes lib/flags/ls.png | Bin 0 -> 628 bytes lib/flags/lt.png | Bin 0 -> 508 bytes lib/flags/lu.png | Bin 0 -> 481 bytes lib/flags/lv.png | Bin 0 -> 465 bytes lib/flags/ly.png | Bin 0 -> 419 bytes lib/flags/ma.png | Bin 0 -> 432 bytes lib/flags/mc.png | Bin 0 -> 380 bytes lib/flags/md.png | Bin 0 -> 566 bytes lib/flags/me.png | Bin 0 -> 448 bytes lib/flags/mg.png | Bin 0 -> 453 bytes lib/flags/mh.png | Bin 0 -> 628 bytes lib/flags/mk.png | Bin 0 -> 664 bytes lib/flags/ml.png | Bin 0 -> 474 bytes lib/flags/mm.png | Bin 0 -> 483 bytes lib/flags/mn.png | Bin 0 -> 492 bytes lib/flags/mo.png | Bin 0 -> 588 bytes lib/flags/mp.png | Bin 0 -> 597 bytes lib/flags/mq.png | Bin 0 -> 655 bytes lib/flags/mr.png | Bin 0 -> 569 bytes lib/flags/ms.png | Bin 0 -> 614 bytes lib/flags/mt.png | Bin 0 -> 420 bytes lib/flags/mu.png | Bin 0 -> 496 bytes lib/flags/mv.png | Bin 0 -> 542 bytes lib/flags/mw.png | Bin 0 -> 529 bytes lib/flags/mx.png | Bin 0 -> 574 bytes lib/flags/my.png | Bin 0 -> 571 bytes lib/flags/mz.png | Bin 0 -> 584 bytes lib/flags/na.png | Bin 0 -> 647 bytes lib/flags/nc.png | Bin 0 -> 591 bytes lib/flags/ne.png | Bin 0 -> 537 bytes lib/flags/nf.png | Bin 0 -> 602 bytes lib/flags/ng.png | Bin 0 -> 482 bytes lib/flags/ni.png | Bin 0 -> 508 bytes lib/flags/nl.png | Bin 0 -> 453 bytes lib/flags/no.png | Bin 0 -> 512 bytes lib/flags/np.png | Bin 0 -> 443 bytes lib/flags/nr.png | Bin 0 -> 527 bytes lib/flags/nu.png | Bin 0 -> 572 bytes lib/flags/nz.png | Bin 0 -> 639 bytes lib/flags/om.png | Bin 0 -> 478 bytes lib/flags/pa.png | Bin 0 -> 519 bytes lib/flags/pe.png | Bin 0 -> 397 bytes lib/flags/pf.png | Bin 0 -> 498 bytes lib/flags/pg.png | Bin 0 -> 593 bytes lib/flags/ph.png | Bin 0 -> 538 bytes lib/flags/pk.png | Bin 0 -> 569 bytes lib/flags/pl.png | Bin 0 -> 374 bytes lib/flags/pm.png | Bin 0 -> 689 bytes lib/flags/pn.png | Bin 0 -> 657 bytes lib/flags/pr.png | Bin 0 -> 556 bytes lib/flags/ps.png | Bin 0 -> 472 bytes lib/flags/pt.png | Bin 0 -> 554 bytes lib/flags/pw.png | Bin 0 -> 550 bytes lib/flags/py.png | Bin 0 -> 473 bytes lib/flags/qa.png | Bin 0 -> 450 bytes lib/flags/re.png | Bin 0 -> 545 bytes lib/flags/ro.png | Bin 0 -> 495 bytes lib/flags/rs.png | Bin 0 -> 423 bytes lib/flags/ru.png | Bin 0 -> 420 bytes lib/flags/rw.png | Bin 0 -> 533 bytes lib/flags/sa.png | Bin 0 -> 551 bytes lib/flags/sb.png | Bin 0 -> 624 bytes lib/flags/sc.png | Bin 0 -> 608 bytes lib/flags/scotland.png | Bin 0 -> 649 bytes lib/flags/sd.png | Bin 0 -> 492 bytes lib/flags/se.png | Bin 0 -> 542 bytes lib/flags/sg.png | Bin 0 -> 468 bytes lib/flags/sh.png | Bin 0 -> 645 bytes lib/flags/si.png | Bin 0 -> 510 bytes lib/flags/sj.png | Bin 0 -> 512 bytes lib/flags/sk.png | Bin 0 -> 562 bytes lib/flags/sl.png | Bin 0 -> 436 bytes lib/flags/sm.png | Bin 0 -> 502 bytes lib/flags/sn.png | Bin 0 -> 532 bytes lib/flags/so.png | Bin 0 -> 527 bytes lib/flags/sp.png | Bin 0 -> 469 bytes lib/flags/sr.png | Bin 0 -> 513 bytes lib/flags/st.png | Bin 0 -> 584 bytes lib/flags/sv.png | Bin 0 -> 501 bytes lib/flags/sy.png | Bin 0 -> 422 bytes lib/flags/sz.png | Bin 0 -> 643 bytes lib/flags/tc.png | Bin 0 -> 624 bytes lib/flags/td.png | Bin 0 -> 570 bytes lib/flags/tf.png | Bin 0 -> 527 bytes lib/flags/tg.png | Bin 0 -> 562 bytes lib/flags/th.png | Bin 0 -> 452 bytes lib/flags/tj.png | Bin 0 -> 496 bytes lib/flags/tk.png | Bin 0 -> 638 bytes lib/flags/tl.png | Bin 0 -> 514 bytes lib/flags/tm.png | Bin 0 -> 593 bytes lib/flags/tn.png | Bin 0 -> 495 bytes lib/flags/to.png | Bin 0 -> 426 bytes lib/flags/tr.png | Bin 0 -> 492 bytes lib/flags/tt.png | Bin 0 -> 617 bytes lib/flags/tv.png | Bin 0 -> 536 bytes lib/flags/tw.png | Bin 0 -> 465 bytes lib/flags/tz.png | Bin 0 -> 642 bytes lib/flags/ua.png | Bin 0 -> 446 bytes lib/flags/ug.png | Bin 0 -> 531 bytes lib/flags/um.png | Bin 0 -> 571 bytes lib/flags/uy.png | Bin 0 -> 532 bytes lib/flags/uz.png | Bin 0 -> 515 bytes lib/flags/va.png | Bin 0 -> 553 bytes lib/flags/vc.png | Bin 0 -> 577 bytes lib/flags/ve.png | Bin 0 -> 528 bytes lib/flags/vg.png | Bin 0 -> 630 bytes lib/flags/vi.png | Bin 0 -> 616 bytes lib/flags/vn.png | Bin 0 -> 474 bytes lib/flags/vu.png | Bin 0 -> 604 bytes lib/flags/wales.png | Bin 0 -> 652 bytes lib/flags/wf.png | Bin 0 -> 554 bytes lib/flags/ws.png | Bin 0 -> 476 bytes lib/flags/ye.png | Bin 0 -> 413 bytes lib/flags/yt.png | Bin 0 -> 593 bytes lib/flags/za.png | Bin 0 -> 642 bytes lib/flags/zm.png | Bin 0 -> 500 bytes lib/flags/zw.png | Bin 0 -> 574 bytes lib/kcaptcha/fonts/.htaccess | 4 + lib/kcaptcha/fonts/palatino_linotype_bold.png | Bin 0 -> 15512 bytes lib/kcaptcha/fonts/perpetua_bold.png | Bin 0 -> 12899 bytes lib/kcaptcha/fonts/times_bold.png | Bin 0 -> 13965 bytes lib/kcaptcha/form_example.php | 19 + lib/kcaptcha/index.php | 15 + lib/kcaptcha/kcaptcha.php | 240 + lib/kcaptcha/kcaptcha_config.php | 47 + lib/kcaptcha/util/font_preparer.php | 42 + lib/mobile_detect/Mobile_Detect.php | 1450 + lib/redactor/ckeditor/.htaccess | 24 + lib/redactor/ckeditor/adapters/ckeditor.php | 598 + lib/redactor/ckeditor/adapters/jquery.js | 10 + lib/redactor/ckeditor/block.js | 190 + lib/redactor/ckeditor/ckeditor.js | 1135 + lib/redactor/ckeditor/config.default.js | 10 + lib/redactor/ckeditor/config.js | 215 + lib/redactor/ckeditor/contents.css | 208 + lib/redactor/ckeditor/lang/af.js | 5 + lib/redactor/ckeditor/lang/ar.js | 5 + lib/redactor/ckeditor/lang/az.js | 5 + lib/redactor/ckeditor/lang/bg.js | 5 + lib/redactor/ckeditor/lang/bn.js | 5 + lib/redactor/ckeditor/lang/bs.js | 5 + lib/redactor/ckeditor/lang/ca.js | 5 + lib/redactor/ckeditor/lang/cs.js | 5 + lib/redactor/ckeditor/lang/cy.js | 5 + lib/redactor/ckeditor/lang/da.js | 5 + lib/redactor/ckeditor/lang/de-ch.js | 5 + lib/redactor/ckeditor/lang/de.js | 5 + lib/redactor/ckeditor/lang/el.js | 5 + lib/redactor/ckeditor/lang/en-au.js | 5 + lib/redactor/ckeditor/lang/en-ca.js | 5 + lib/redactor/ckeditor/lang/en-gb.js | 5 + lib/redactor/ckeditor/lang/en.js | 5 + lib/redactor/ckeditor/lang/eo.js | 5 + lib/redactor/ckeditor/lang/es.js | 5 + lib/redactor/ckeditor/lang/et.js | 5 + lib/redactor/ckeditor/lang/eu.js | 5 + lib/redactor/ckeditor/lang/fa.js | 5 + lib/redactor/ckeditor/lang/fi.js | 5 + lib/redactor/ckeditor/lang/fo.js | 5 + lib/redactor/ckeditor/lang/fr-ca.js | 5 + lib/redactor/ckeditor/lang/fr.js | 5 + lib/redactor/ckeditor/lang/gl.js | 5 + lib/redactor/ckeditor/lang/gu.js | 5 + lib/redactor/ckeditor/lang/he.js | 5 + lib/redactor/ckeditor/lang/hi.js | 5 + lib/redactor/ckeditor/lang/hr.js | 5 + lib/redactor/ckeditor/lang/hu.js | 5 + lib/redactor/ckeditor/lang/id.js | 5 + lib/redactor/ckeditor/lang/is.js | 5 + lib/redactor/ckeditor/lang/it.js | 5 + lib/redactor/ckeditor/lang/ja.js | 5 + lib/redactor/ckeditor/lang/ka.js | 5 + lib/redactor/ckeditor/lang/km.js | 5 + lib/redactor/ckeditor/lang/ko.js | 5 + lib/redactor/ckeditor/lang/ku.js | 5 + lib/redactor/ckeditor/lang/lt.js | 5 + lib/redactor/ckeditor/lang/lv.js | 5 + lib/redactor/ckeditor/lang/mk.js | 5 + lib/redactor/ckeditor/lang/mn.js | 5 + lib/redactor/ckeditor/lang/ms.js | 5 + lib/redactor/ckeditor/lang/nb.js | 5 + lib/redactor/ckeditor/lang/nl.js | 5 + lib/redactor/ckeditor/lang/no.js | 5 + lib/redactor/ckeditor/lang/oc.js | 5 + lib/redactor/ckeditor/lang/pl.js | 5 + lib/redactor/ckeditor/lang/pt-br.js | 5 + lib/redactor/ckeditor/lang/pt.js | 5 + lib/redactor/ckeditor/lang/ro.js | 5 + lib/redactor/ckeditor/lang/ru.js | 5 + lib/redactor/ckeditor/lang/si.js | 5 + lib/redactor/ckeditor/lang/sk.js | 5 + lib/redactor/ckeditor/lang/sl.js | 5 + lib/redactor/ckeditor/lang/sq.js | 5 + lib/redactor/ckeditor/lang/sr-latn.js | 5 + lib/redactor/ckeditor/lang/sr.js | 5 + lib/redactor/ckeditor/lang/sv.js | 5 + lib/redactor/ckeditor/lang/th.js | 5 + lib/redactor/ckeditor/lang/tr.js | 5 + lib/redactor/ckeditor/lang/tt.js | 5 + lib/redactor/ckeditor/lang/ug.js | 5 + lib/redactor/ckeditor/lang/uk.js | 5 + lib/redactor/ckeditor/lang/vi.js | 5 + lib/redactor/ckeditor/lang/zh-cn.js | 5 + lib/redactor/ckeditor/lang/zh.js | 5 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 10 + .../dialogs/lang/_translationstatus.txt | 25 + .../plugins/a11yhelp/dialogs/lang/af.js | 11 + .../plugins/a11yhelp/dialogs/lang/ar.js | 10 + .../plugins/a11yhelp/dialogs/lang/az.js | 11 + .../plugins/a11yhelp/dialogs/lang/bg.js | 10 + .../plugins/a11yhelp/dialogs/lang/ca.js | 12 + .../plugins/a11yhelp/dialogs/lang/cs.js | 12 + .../plugins/a11yhelp/dialogs/lang/cy.js | 11 + .../plugins/a11yhelp/dialogs/lang/da.js | 11 + .../plugins/a11yhelp/dialogs/lang/de-ch.js | 11 + .../plugins/a11yhelp/dialogs/lang/de.js | 11 + .../plugins/a11yhelp/dialogs/lang/el.js | 11 + .../plugins/a11yhelp/dialogs/lang/en-gb.js | 10 + .../plugins/a11yhelp/dialogs/lang/en.js | 10 + .../plugins/a11yhelp/dialogs/lang/eo.js | 12 + .../plugins/a11yhelp/dialogs/lang/es.js | 13 + .../plugins/a11yhelp/dialogs/lang/et.js | 10 + .../plugins/a11yhelp/dialogs/lang/eu.js | 12 + .../plugins/a11yhelp/dialogs/lang/fa.js | 11 + .../plugins/a11yhelp/dialogs/lang/fi.js | 11 + .../plugins/a11yhelp/dialogs/lang/fo.js | 10 + .../plugins/a11yhelp/dialogs/lang/fr-ca.js | 11 + .../plugins/a11yhelp/dialogs/lang/fr.js | 13 + .../plugins/a11yhelp/dialogs/lang/gl.js | 11 + .../plugins/a11yhelp/dialogs/lang/gu.js | 10 + .../plugins/a11yhelp/dialogs/lang/he.js | 10 + .../plugins/a11yhelp/dialogs/lang/hi.js | 10 + .../plugins/a11yhelp/dialogs/lang/hr.js | 11 + .../plugins/a11yhelp/dialogs/lang/hu.js | 11 + .../plugins/a11yhelp/dialogs/lang/id.js | 11 + .../plugins/a11yhelp/dialogs/lang/it.js | 13 + .../plugins/a11yhelp/dialogs/lang/ja.js | 9 + .../plugins/a11yhelp/dialogs/lang/km.js | 10 + .../plugins/a11yhelp/dialogs/lang/ko.js | 10 + .../plugins/a11yhelp/dialogs/lang/ku.js | 11 + .../plugins/a11yhelp/dialogs/lang/lt.js | 10 + .../plugins/a11yhelp/dialogs/lang/lv.js | 11 + .../plugins/a11yhelp/dialogs/lang/mk.js | 11 + .../plugins/a11yhelp/dialogs/lang/mn.js | 10 + .../plugins/a11yhelp/dialogs/lang/nb.js | 11 + .../plugins/a11yhelp/dialogs/lang/nl.js | 12 + .../plugins/a11yhelp/dialogs/lang/no.js | 11 + .../plugins/a11yhelp/dialogs/lang/oc.js | 12 + .../plugins/a11yhelp/dialogs/lang/pl.js | 13 + .../plugins/a11yhelp/dialogs/lang/pt-br.js | 12 + .../plugins/a11yhelp/dialogs/lang/pt.js | 12 + .../plugins/a11yhelp/dialogs/lang/ro.js | 11 + .../plugins/a11yhelp/dialogs/lang/ru.js | 11 + .../plugins/a11yhelp/dialogs/lang/si.js | 10 + .../plugins/a11yhelp/dialogs/lang/sk.js | 11 + .../plugins/a11yhelp/dialogs/lang/sl.js | 11 + .../plugins/a11yhelp/dialogs/lang/sq.js | 11 + .../plugins/a11yhelp/dialogs/lang/sr-latn.js | 10 + .../plugins/a11yhelp/dialogs/lang/sr.js | 10 + .../plugins/a11yhelp/dialogs/lang/sv.js | 11 + .../plugins/a11yhelp/dialogs/lang/th.js | 10 + .../plugins/a11yhelp/dialogs/lang/tr.js | 12 + .../plugins/a11yhelp/dialogs/lang/tt.js | 11 + .../plugins/a11yhelp/dialogs/lang/ug.js | 11 + .../plugins/a11yhelp/dialogs/lang/uk.js | 12 + .../plugins/a11yhelp/dialogs/lang/vi.js | 11 + .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 9 + .../plugins/a11yhelp/dialogs/lang/zh.js | 9 + .../ckeditor/plugins/about/dialogs/about.js | 8 + .../about/dialogs/hidpi/logo_ckeditor.png | Bin 0 -> 13339 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 6757 bytes .../plugins/clipboard/dialogs/paste.js | 12 + .../codemirror/css/codemirror.ckeditor.css | 183 + .../plugins/codemirror/css/codemirror.css | 341 + .../plugins/codemirror/css/codemirror.min.css | 1 + .../plugins/codemirror/icons/autocomplete.png | Bin 0 -> 255 bytes .../plugins/codemirror/icons/autoformat.png | Bin 0 -> 210 bytes .../codemirror/icons/commentselectedrange.png | Bin 0 -> 160 bytes .../plugins/codemirror/icons/searchcode.png | Bin 0 -> 408 bytes .../icons/uncommentselectedrange.png | Bin 0 -> 285 bytes .../codemirror/js/addon/comment/comment.js | 206 + .../js/addon/comment/continuecomment.js | 85 + .../codemirror/js/addon/dialog/dialog.css | 32 + .../codemirror/js/addon/dialog/dialog.js | 157 + .../codemirror/js/addon/edit/closebrackets.js | 202 + .../codemirror/js/addon/edit/closetag.js | 169 + .../codemirror/js/addon/edit/continuelist.js | 51 + .../codemirror/js/addon/edit/matchbrackets.js | 122 + .../codemirror/js/addon/edit/matchtags.js | 66 + .../codemirror/js/addon/edit/trailingspace.js | 27 + .../codemirror/js/addon/fold/brace-fold.js | 105 + .../codemirror/js/addon/fold/comment-fold.js | 59 + .../codemirror/js/addon/fold/foldcode.js | 150 + .../codemirror/js/addon/fold/foldgutter.css | 20 + .../codemirror/js/addon/fold/foldgutter.js | 146 + .../codemirror/js/addon/fold/indent-fold.js | 44 + .../codemirror/js/addon/fold/markdown-fold.js | 49 + .../codemirror/js/addon/fold/xml-fold.js | 182 + .../js/addon/format/autoFormatAll.js | 43 + .../codemirror/js/addon/format/formatting.js | 226 + .../codemirror/js/addon/hint/anyword-hint.js | 41 + .../codemirror/js/addon/hint/css-hint.js | 60 + .../codemirror/js/addon/hint/html-hint.js | 348 + .../js/addon/hint/javascript-hint.js | 155 + .../codemirror/js/addon/hint/show-hint.css | 36 + .../codemirror/js/addon/hint/show-hint.js | 438 + .../codemirror/js/addon/hint/sql-hint.js | 271 + .../codemirror/js/addon/hint/xml-hint.js | 110 + .../codemirror/js/addon/mode/loadmode.js | 64 + .../codemirror/js/addon/mode/multiplex.js | 123 + .../js/addon/mode/multiplex_test.js | 33 + .../codemirror/js/addon/mode/overlay.js | 85 + .../codemirror/js/addon/mode/simple.js | 213 + .../js/addon/search/jump-to-line.js | 49 + .../js/addon/search/match-highlighter.js | 165 + .../js/addon/search/matchesonscrollbar.css | 8 + .../js/addon/search/matchesonscrollbar.js | 97 + .../codemirror/js/addon/search/search.js | 252 + .../js/addon/search/searchcursor.js | 189 + .../js/addon/selection/active-line.js | 74 + .../js/addon/selection/mark-selection.js | 118 + .../js/addon/selection/selection-pointer.js | 98 + .../plugins/codemirror/js/beautify-html.js | 952 + .../plugins/codemirror/js/beautify.js | 2087 ++ .../plugins/codemirror/js/beautify.min.js | 1 + .../codemirror/js/codemirror.addons.min.js | 1 + .../js/codemirror.addons.search.min.js | 1 + .../plugins/codemirror/js/codemirror.js | 9109 ++++++ .../plugins/codemirror/js/codemirror.min.js | 1 + .../js/codemirror.mode.bbcode.min.js | 1 + .../js/codemirror.mode.bbcodemixed.min.js | 1 + .../js/codemirror.mode.htmlmixed.min.js | 1 + .../js/codemirror.mode.javascript.min.js | 1 + .../codemirror/js/codemirror.mode.php.min.js | 1 + .../codemirror/js/mode/bbcode/bbcode.js | 137 + .../codemirror/js/mode/bbcode/index.html | 73 + .../js/mode/bbcodemixed/bbcodemixed.js | 161 + .../codemirror/js/mode/bbcodemixed/index.html | 128 + .../plugins/codemirror/js/mode/clike/clike.js | 785 + .../codemirror/js/mode/clike/index.html | 360 + .../codemirror/js/mode/clike/scala.html | 767 + .../plugins/codemirror/js/mode/clike/test.js | 55 + .../plugins/codemirror/js/mode/css/css.js | 825 + .../plugins/codemirror/js/mode/css/gss.html | 103 + .../codemirror/js/mode/css/gss_test.js | 17 + .../plugins/codemirror/js/mode/css/index.html | 75 + .../plugins/codemirror/js/mode/css/less.html | 152 + .../codemirror/js/mode/css/less_test.js | 54 + .../plugins/codemirror/js/mode/css/scss.html | 157 + .../codemirror/js/mode/css/scss_test.js | 110 + .../plugins/codemirror/js/mode/css/test.js | 200 + .../js/mode/htmlembedded/htmlembedded.js | 28 + .../js/mode/htmlembedded/index.html | 60 + .../codemirror/js/mode/htmlmixed/htmlmixed.js | 152 + .../codemirror/js/mode/htmlmixed/index.html | 89 + .../codemirror/js/mode/javascript/index.html | 114 + .../js/mode/javascript/javascript.js | 784 + .../js/mode/javascript/json-ld.html | 72 + .../codemirror/js/mode/javascript/test.js | 247 + .../js/mode/javascript/typescript.html | 61 + .../plugins/codemirror/js/mode/php/index.html | 64 + .../plugins/codemirror/js/mode/php/php.js | 234 + .../plugins/codemirror/js/mode/php/test.js | 154 + .../plugins/codemirror/js/mode/xml/index.html | 61 + .../plugins/codemirror/js/mode/xml/test.js | 51 + .../plugins/codemirror/js/mode/xml/xml.js | 394 + .../ckeditor/plugins/codemirror/lang/af.js | 12 + .../ckeditor/plugins/codemirror/lang/ar.js | 12 + .../ckeditor/plugins/codemirror/lang/bg.js | 12 + .../ckeditor/plugins/codemirror/lang/bn.js | 12 + .../ckeditor/plugins/codemirror/lang/bs.js | 12 + .../ckeditor/plugins/codemirror/lang/ca.js | 12 + .../ckeditor/plugins/codemirror/lang/cs.js | 12 + .../ckeditor/plugins/codemirror/lang/cy.js | 12 + .../ckeditor/plugins/codemirror/lang/da.js | 12 + .../ckeditor/plugins/codemirror/lang/de.js | 12 + .../ckeditor/plugins/codemirror/lang/el.js | 12 + .../ckeditor/plugins/codemirror/lang/en-au.js | 12 + .../ckeditor/plugins/codemirror/lang/en-ca.js | 12 + .../ckeditor/plugins/codemirror/lang/en-gb.js | 12 + .../ckeditor/plugins/codemirror/lang/en.js | 12 + .../ckeditor/plugins/codemirror/lang/eo.js | 12 + .../ckeditor/plugins/codemirror/lang/es.js | 12 + .../ckeditor/plugins/codemirror/lang/et.js | 12 + .../ckeditor/plugins/codemirror/lang/eu.js | 12 + .../ckeditor/plugins/codemirror/lang/fa.js | 12 + .../ckeditor/plugins/codemirror/lang/fi.js | 12 + .../ckeditor/plugins/codemirror/lang/fo.js | 12 + .../ckeditor/plugins/codemirror/lang/fr-ca.js | 12 + .../ckeditor/plugins/codemirror/lang/fr.js | 12 + .../ckeditor/plugins/codemirror/lang/gl.js | 12 + .../ckeditor/plugins/codemirror/lang/gu.js | 12 + .../ckeditor/plugins/codemirror/lang/he.js | 12 + .../ckeditor/plugins/codemirror/lang/hi.js | 12 + .../ckeditor/plugins/codemirror/lang/hr.js | 12 + .../ckeditor/plugins/codemirror/lang/hu.js | 12 + .../ckeditor/plugins/codemirror/lang/is.js | 12 + .../ckeditor/plugins/codemirror/lang/it.js | 12 + .../ckeditor/plugins/codemirror/lang/ja.js | 12 + .../ckeditor/plugins/codemirror/lang/ka.js | 12 + .../ckeditor/plugins/codemirror/lang/km.js | 12 + .../ckeditor/plugins/codemirror/lang/ko.js | 12 + .../ckeditor/plugins/codemirror/lang/ku.js | 12 + .../ckeditor/plugins/codemirror/lang/lt.js | 12 + .../ckeditor/plugins/codemirror/lang/lv.js | 12 + .../ckeditor/plugins/codemirror/lang/mk.js | 12 + .../ckeditor/plugins/codemirror/lang/mn.js | 12 + .../ckeditor/plugins/codemirror/lang/ms.js | 12 + .../ckeditor/plugins/codemirror/lang/nb.js | 12 + .../ckeditor/plugins/codemirror/lang/nl.js | 12 + .../ckeditor/plugins/codemirror/lang/no.js | 12 + .../ckeditor/plugins/codemirror/lang/pl.js | 12 + .../ckeditor/plugins/codemirror/lang/pt-br.js | 12 + .../ckeditor/plugins/codemirror/lang/pt.js | 12 + .../ckeditor/plugins/codemirror/lang/ro.js | 12 + .../ckeditor/plugins/codemirror/lang/ru.js | 12 + .../ckeditor/plugins/codemirror/lang/sk.js | 12 + .../ckeditor/plugins/codemirror/lang/sl.js | 12 + .../plugins/codemirror/lang/sr-latn.js | 12 + .../ckeditor/plugins/codemirror/lang/sr.js | 12 + .../ckeditor/plugins/codemirror/lang/sv.js | 12 + .../ckeditor/plugins/codemirror/lang/th.js | 12 + .../ckeditor/plugins/codemirror/lang/tr.js | 12 + .../ckeditor/plugins/codemirror/lang/ug.js | 12 + .../ckeditor/plugins/codemirror/lang/uk.js | 12 + .../ckeditor/plugins/codemirror/lang/vi.js | 12 + .../ckeditor/plugins/codemirror/lang/zh-cn.js | 12 + .../ckeditor/plugins/codemirror/lang/zh.js | 12 + .../ckeditor/plugins/codemirror/plugin.js | 1155 + .../plugins/codemirror/theme/3024-day.css | 41 + .../plugins/codemirror/theme/3024-night.css | 39 + .../plugins/codemirror/theme/abcdef.css | 32 + .../codemirror/theme/ambiance-mobile.css | 5 + .../plugins/codemirror/theme/ambiance.css | 74 + .../plugins/codemirror/theme/base16-dark.css | 38 + .../plugins/codemirror/theme/base16-light.css | 38 + .../plugins/codemirror/theme/bespin.css | 34 + .../plugins/codemirror/theme/blackboard.css | 32 + .../plugins/codemirror/theme/cobalt.css | 25 + .../plugins/codemirror/theme/colorforth.css | 33 + .../plugins/codemirror/theme/dracula.css | 41 + .../plugins/codemirror/theme/duotone-dark.css | 35 + .../codemirror/theme/duotone-light.css | 36 + .../plugins/codemirror/theme/eclipse.css | 23 + .../plugins/codemirror/theme/elegant.css | 13 + .../plugins/codemirror/theme/erlang-dark.css | 34 + .../plugins/codemirror/theme/hopscotch.css | 34 + .../plugins/codemirror/theme/icecoder.css | 43 + .../plugins/codemirror/theme/isotope.css | 34 + .../plugins/codemirror/theme/lesser-dark.css | 47 + .../plugins/codemirror/theme/liquibyte.css | 95 + .../plugins/codemirror/theme/material.css | 53 + .../ckeditor/plugins/codemirror/theme/mbo.css | 37 + .../plugins/codemirror/theme/mdn-like.css | 46 + .../plugins/codemirror/theme/midnight.css | 45 + .../plugins/codemirror/theme/monokai.css | 36 + .../plugins/codemirror/theme/neat.css | 12 + .../ckeditor/plugins/codemirror/theme/neo.css | 43 + .../plugins/codemirror/theme/night.css | 27 + .../plugins/codemirror/theme/panda-syntax.css | 85 + .../plugins/codemirror/theme/paraiso-dark.css | 38 + .../codemirror/theme/paraiso-light.css | 38 + .../codemirror/theme/pastel-on-dark.css | 52 + .../plugins/codemirror/theme/railscasts.css | 34 + .../plugins/codemirror/theme/rubyblue.css | 25 + .../plugins/codemirror/theme/seti.css | 44 + .../plugins/codemirror/theme/solarized.css | 169 + .../plugins/codemirror/theme/the-matrix.css | 30 + .../theme/tomorrow-night-bright.css | 35 + .../theme/tomorrow-night-eighties.css | 38 + .../plugins/codemirror/theme/ttcn.css | 64 + .../plugins/codemirror/theme/twilight.css | 32 + .../plugins/codemirror/theme/vibrant-ink.css | 34 + .../plugins/codemirror/theme/xq-dark.css | 53 + .../plugins/codemirror/theme/xq-light.css | 43 + .../plugins/codemirror/theme/yeti.css | 44 + .../plugins/codemirror/theme/zenburn.css | 37 + .../colordialog/dialogs/colordialog.css | 20 + .../colordialog/dialogs/colordialog.js | 14 + .../cursors/cursor-disabled.svg | 25 + .../plugins/copyformatting/cursors/cursor.svg | 14 + .../copyformatting/styles/copyformatting.css | 45 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor/plugins/div/dialogs/div.js | 9 + .../ckeditor/plugins/find/dialogs/find.js | 25 + .../ckeditor/plugins/flash/dialogs/flash.js | 24 + .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor/plugins/forms/dialogs/button.js | 8 + .../plugins/forms/dialogs/checkbox.js | 9 + .../ckeditor/plugins/forms/dialogs/form.js | 8 + .../plugins/forms/dialogs/hiddenfield.js | 7 + .../ckeditor/plugins/forms/dialogs/radio.js | 9 + .../ckeditor/plugins/forms/dialogs/select.js | 20 + .../plugins/forms/dialogs/textarea.js | 8 + .../plugins/forms/dialogs/textfield.js | 11 + .../plugins/forms/images/hiddenfield.gif | Bin 0 -> 178 bytes lib/redactor/ckeditor/plugins/icons.png | Bin 0 -> 12421 bytes lib/redactor/ckeditor/plugins/icons_hidpi.png | Bin 0 -> 40265 bytes .../ckeditor/plugins/iframe/dialogs/iframe.js | 10 + .../plugins/iframe/images/placeholder.png | Bin 0 -> 265 bytes .../ckeditor/plugins/image/dialogs/image.js | 44 + .../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 1610 bytes .../ckeditor/plugins/link/dialogs/anchor.js | 7 + .../ckeditor/plugins/link/dialogs/link.js | 1 + .../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 752 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1109 bytes .../plugins/liststyle/dialogs/liststyle.js | 10 + .../magicline/images/hidpi/icon-rtl.png | Bin 0 -> 176 bytes .../plugins/magicline/images/hidpi/icon.png | Bin 0 -> 199 bytes .../plugins/magicline/images/icon-rtl.png | Bin 0 -> 138 bytes .../plugins/magicline/images/icon.png | Bin 0 -> 133 bytes .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 99 bytes .../plugins/pastefromword/filter/default.js | 43 + .../placeholder/dialogs/placeholder.js | 61 + .../placeholder/icons/hidpi/placeholder.png | Bin 0 -> 1775 bytes .../plugins/placeholder/icons/placeholder.png | Bin 0 -> 714 bytes .../placeholder/lang/_translationstatus.txt | 26 + .../ckeditor/plugins/placeholder/lang/bg.js | 12 + .../ckeditor/plugins/placeholder/lang/cs.js | 12 + .../ckeditor/plugins/placeholder/lang/cy.js | 12 + .../ckeditor/plugins/placeholder/lang/da.js | 12 + .../ckeditor/plugins/placeholder/lang/de.js | 12 + .../ckeditor/plugins/placeholder/lang/el.js | 12 + .../ckeditor/plugins/placeholder/lang/en.js | 12 + .../ckeditor/plugins/placeholder/lang/eo.js | 12 + .../ckeditor/plugins/placeholder/lang/et.js | 12 + .../ckeditor/plugins/placeholder/lang/fa.js | 12 + .../ckeditor/plugins/placeholder/lang/fi.js | 12 + .../ckeditor/plugins/placeholder/lang/fr.js | 12 + .../ckeditor/plugins/placeholder/lang/he.js | 12 + .../ckeditor/plugins/placeholder/lang/hr.js | 12 + .../ckeditor/plugins/placeholder/lang/it.js | 12 + .../ckeditor/plugins/placeholder/lang/nb.js | 12 + .../ckeditor/plugins/placeholder/lang/nl.js | 12 + .../ckeditor/plugins/placeholder/lang/no.js | 12 + .../ckeditor/plugins/placeholder/lang/pl.js | 12 + .../ckeditor/plugins/placeholder/lang/tr.js | 12 + .../ckeditor/plugins/placeholder/lang/ug.js | 12 + .../ckeditor/plugins/placeholder/lang/uk.js | 12 + .../ckeditor/plugins/placeholder/lang/vi.js | 12 + .../plugins/placeholder/lang/zh-cn.js | 12 + .../ckeditor/plugins/placeholder/plugin.js | 144 + .../placeholder/samples/placeholder.html | 72 + .../ckeditor/plugins/preview/preview.html | 13 + .../ckeditor/plugins/savedocs/plugin.js | 22 + .../ckeditor/plugins/scayt/CHANGELOG.md | 20 + .../ckeditor/plugins/scayt/LICENSE.md | 28 + lib/redactor/ckeditor/plugins/scayt/README.md | 25 + .../ckeditor/plugins/scayt/dialogs/options.js | 19 + .../plugins/scayt/dialogs/toolbar.css | 71 + .../plugins/scayt/skins/moono-lisa/scayt.css | 20 + .../showblocks/images/block_address.png | Bin 0 -> 152 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 154 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 120 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 126 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 115 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 128 bytes .../ckeditor/plugins/smiley/dialogs/smiley.js | 11 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 1245 bytes .../plugins/smiley/images/angel_smile.png | Bin 0 -> 1172 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 1219 bytes .../plugins/smiley/images/angry_smile.png | Bin 0 -> 1220 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 732 bytes .../plugins/smiley/images/broken_heart.png | Bin 0 -> 1139 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/confused_smile.png | Bin 0 -> 1101 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 795 bytes .../plugins/smiley/images/cry_smile.png | Bin 0 -> 1214 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 1239 bytes .../plugins/smiley/images/devil_smile.png | Bin 0 -> 1220 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.png | Bin 0 -> 1145 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 506 bytes .../plugins/smiley/images/envelope.png | Bin 0 -> 760 bytes .../ckeditor/plugins/smiley/images/heart.gif | Bin 0 -> 692 bytes .../ckeditor/plugins/smiley/images/heart.png | Bin 0 -> 999 bytes .../ckeditor/plugins/smiley/images/kiss.gif | Bin 0 -> 683 bytes .../ckeditor/plugins/smiley/images/kiss.png | Bin 0 -> 1003 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 660 bytes .../plugins/smiley/images/lightbulb.png | Bin 0 -> 919 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 820 bytes .../plugins/smiley/images/omg_smile.png | Bin 0 -> 1122 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 1209 bytes .../plugins/smiley/images/regular_smile.png | Bin 0 -> 1084 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 782 bytes .../plugins/smiley/images/sad_smile.png | Bin 0 -> 1115 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 1231 bytes .../plugins/smiley/images/shades_smile.png | Bin 0 -> 1204 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 1201 bytes .../plugins/smiley/images/teeth_smile.png | Bin 0 -> 1183 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 715 bytes .../plugins/smiley/images/thumbs_down.png | Bin 0 -> 985 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 714 bytes .../plugins/smiley/images/thumbs_up.png | Bin 0 -> 959 bytes .../plugins/smiley/images/tongue_smile.gif | Bin 0 -> 1210 bytes .../plugins/smiley/images/tongue_smile.png | Bin 0 -> 1132 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 1210 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 775 bytes .../images/whatchutalkingabout_smile.png | Bin 0 -> 1039 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/wink_smile.png | Bin 0 -> 1114 bytes .../dialogs/lang/_translationstatus.txt | 20 + .../plugins/specialchar/dialogs/lang/af.js | 13 + .../plugins/specialchar/dialogs/lang/ar.js | 13 + .../plugins/specialchar/dialogs/lang/az.js | 10 + .../plugins/specialchar/dialogs/lang/bg.js | 13 + .../plugins/specialchar/dialogs/lang/ca.js | 14 + .../plugins/specialchar/dialogs/lang/cs.js | 13 + .../plugins/specialchar/dialogs/lang/cy.js | 14 + .../plugins/specialchar/dialogs/lang/da.js | 11 + .../plugins/specialchar/dialogs/lang/de-ch.js | 13 + .../plugins/specialchar/dialogs/lang/de.js | 13 + .../plugins/specialchar/dialogs/lang/el.js | 13 + .../plugins/specialchar/dialogs/lang/en-gb.js | 13 + .../plugins/specialchar/dialogs/lang/en.js | 13 + .../plugins/specialchar/dialogs/lang/eo.js | 12 + .../plugins/specialchar/dialogs/lang/es.js | 13 + .../plugins/specialchar/dialogs/lang/et.js | 13 + .../plugins/specialchar/dialogs/lang/eu.js | 13 + .../plugins/specialchar/dialogs/lang/fa.js | 12 + .../plugins/specialchar/dialogs/lang/fi.js | 13 + .../plugins/specialchar/dialogs/lang/fr-ca.js | 10 + .../plugins/specialchar/dialogs/lang/fr.js | 12 + .../plugins/specialchar/dialogs/lang/gl.js | 13 + .../plugins/specialchar/dialogs/lang/he.js | 12 + .../plugins/specialchar/dialogs/lang/hr.js | 13 + .../plugins/specialchar/dialogs/lang/hu.js | 12 + .../plugins/specialchar/dialogs/lang/id.js | 13 + .../plugins/specialchar/dialogs/lang/it.js | 14 + .../plugins/specialchar/dialogs/lang/ja.js | 9 + .../plugins/specialchar/dialogs/lang/km.js | 13 + .../plugins/specialchar/dialogs/lang/ko.js | 10 + .../plugins/specialchar/dialogs/lang/ku.js | 13 + .../plugins/specialchar/dialogs/lang/lt.js | 13 + .../plugins/specialchar/dialogs/lang/lv.js | 13 + .../plugins/specialchar/dialogs/lang/nb.js | 11 + .../plugins/specialchar/dialogs/lang/nl.js | 13 + .../plugins/specialchar/dialogs/lang/no.js | 11 + .../plugins/specialchar/dialogs/lang/oc.js | 12 + .../plugins/specialchar/dialogs/lang/pl.js | 12 + .../plugins/specialchar/dialogs/lang/pt-br.js | 11 + .../plugins/specialchar/dialogs/lang/pt.js | 13 + .../plugins/specialchar/dialogs/lang/ru.js | 13 + .../plugins/specialchar/dialogs/lang/si.js | 13 + .../plugins/specialchar/dialogs/lang/sk.js | 13 + .../plugins/specialchar/dialogs/lang/sl.js | 12 + .../plugins/specialchar/dialogs/lang/sq.js | 13 + .../plugins/specialchar/dialogs/lang/sv.js | 11 + .../plugins/specialchar/dialogs/lang/th.js | 13 + .../plugins/specialchar/dialogs/lang/tr.js | 12 + .../plugins/specialchar/dialogs/lang/tt.js | 13 + .../plugins/specialchar/dialogs/lang/ug.js | 13 + .../plugins/specialchar/dialogs/lang/uk.js | 12 + .../plugins/specialchar/dialogs/lang/vi.js | 14 + .../plugins/specialchar/dialogs/lang/zh-cn.js | 9 + .../plugins/specialchar/dialogs/lang/zh.js | 9 + .../specialchar/dialogs/specialchar.js | 14 + .../ckeditor/plugins/table/dialogs/table.js | 21 + .../plugins/tabletools/dialogs/tableCell.js | 17 + .../plugins/templates/dialogs/templates.css | 84 + .../plugins/templates/dialogs/templates.js | 10 + .../plugins/templates/templates/default.js | 7 + .../templates/templates/images/template1.gif | Bin 0 -> 539 bytes .../templates/templates/images/template2.gif | Bin 0 -> 497 bytes .../templates/templates/images/template3.gif | Bin 0 -> 557 bytes lib/redactor/ckeditor/plugins/wsc/LICENSE.md | 28 + lib/redactor/ckeditor/plugins/wsc/README.md | 25 + .../ckeditor/plugins/wsc/dialogs/ciframe.html | 66 + .../plugins/wsc/dialogs/tmpFrameset.html | 52 + .../ckeditor/plugins/wsc/dialogs/wsc.css | 82 + .../ckeditor/plugins/wsc/dialogs/wsc.js | 92 + .../ckeditor/plugins/wsc/dialogs/wsc_ie.js | 11 + .../plugins/wsc/skins/moono-lisa/wsc.css | 43 + .../ckeditor/skins/moono-lisa/dialog.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie8.css | 5 + .../skins/moono-lisa/dialog_iequirks.css | 5 + .../ckeditor/skins/moono-lisa/editor.css | 5 + .../skins/moono-lisa/editor_gecko.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie8.css | 5 + .../skins/moono-lisa/editor_iequirks.css | 5 + .../ckeditor/skins/moono-lisa/icons.png | Bin 0 -> 12421 bytes .../ckeditor/skins/moono-lisa/icons_hidpi.png | Bin 0 -> 40265 bytes .../skins/moono-lisa/images/arrow.png | Bin 0 -> 191 bytes .../skins/moono-lisa/images/close.png | Bin 0 -> 615 bytes .../skins/moono-lisa/images/hidpi/close.png | Bin 0 -> 1238 bytes .../moono-lisa/images/hidpi/lock-open.png | Bin 0 -> 1071 bytes .../skins/moono-lisa/images/hidpi/lock.png | Bin 0 -> 1062 bytes .../skins/moono-lisa/images/hidpi/refresh.png | Bin 0 -> 1623 bytes .../skins/moono-lisa/images/lock-open.png | Bin 0 -> 511 bytes .../ckeditor/skins/moono-lisa/images/lock.png | Bin 0 -> 506 bytes .../skins/moono-lisa/images/refresh.png | Bin 0 -> 757 bytes .../skins/moono-lisa/images/spinner.gif | Bin 0 -> 2984 bytes .../ckeditor/skins/moono-lisa/readme.md | 46 + lib/redactor/ckeditor/styles.js | 137 + lib/redactor/ckeditor/sysblock.js | 192 + .../codemirror/addon/comment/comment.js | 213 + .../addon/comment/continuecomment.js | 85 + .../codemirror/addon/dialog/dialog.css | 32 + .../codemirror/addon/dialog/dialog.js | 157 + .../codemirror/addon/display/autorefresh.js | 47 + .../codemirror/addon/display/fullscreen.css | 6 + .../codemirror/addon/display/fullscreen.js | 41 + .../codemirror/addon/display/panel.js | 123 + .../codemirror/addon/display/placeholder.js | 62 + .../codemirror/addon/display/rulers.js | 51 + .../codemirror/addon/edit/closebrackets.js | 202 + .../codemirror/addon/edit/closetag.js | 169 + .../codemirror/addon/edit/continuelist.js | 51 + .../codemirror/addon/edit/matchbrackets.js | 122 + .../codemirror/addon/edit/matchtags.js | 66 + .../codemirror/addon/edit/trailingspace.js | 27 + .../codemirror/addon/fold/brace-fold.js | 105 + .../codemirror/addon/fold/comment-fold.js | 59 + .../codemirror/addon/fold/foldcode.js | 150 + .../codemirror/addon/fold/foldgutter.css | 20 + .../codemirror/addon/fold/foldgutter.js | 146 + .../codemirror/addon/fold/indent-fold.js | 48 + .../codemirror/addon/fold/markdown-fold.js | 49 + .../codemirror/addon/fold/xml-fold.js | 182 + .../codemirror/addon/hint/anyword-hint.js | 41 + .../codemirror/addon/hint/css-hint.js | 60 + .../codemirror/addon/hint/html-hint.js | 348 + .../codemirror/addon/hint/javascript-hint.js | 155 + .../codemirror/addon/hint/show-hint.css | 36 + .../codemirror/addon/hint/show-hint.js | 438 + .../codemirror/addon/hint/sql-hint.js | 284 + .../codemirror/addon/hint/xml-hint.js | 110 + .../addon/lint/coffeescript-lint.js | 41 + .../codemirror/addon/lint/css-lint.js | 35 + .../codemirror/addon/lint/html-lint.js | 46 + .../codemirror/addon/lint/javascript-lint.js | 136 + .../codemirror/addon/lint/json-lint.js | 31 + lib/redactor/codemirror/addon/lint/lint.css | 73 + lib/redactor/codemirror/addon/lint/lint.js | 244 + .../codemirror/addon/lint/yaml-lint.js | 35 + lib/redactor/codemirror/addon/merge/merge.css | 113 + lib/redactor/codemirror/addon/merge/merge.js | 997 + .../codemirror/addon/mode/loadmode.js | 64 + .../codemirror/addon/mode/multiplex.js | 123 + .../codemirror/addon/mode/multiplex_test.js | 33 + lib/redactor/codemirror/addon/mode/overlay.js | 90 + lib/redactor/codemirror/addon/mode/simple.js | 213 + .../codemirror/addon/runmode/colorize.js | 40 + .../addon/runmode/runmode-standalone.js | 157 + .../codemirror/addon/runmode/runmode.js | 72 + .../codemirror/addon/runmode/runmode.node.js | 179 + .../addon/scroll/annotatescrollbar.js | 122 + .../codemirror/addon/scroll/scrollpastend.js | 48 + .../addon/scroll/simplescrollbars.css | 66 + .../addon/scroll/simplescrollbars.js | 152 + .../codemirror/addon/search/jump-to-line.js | 49 + .../addon/search/match-highlighter.js | 165 + .../addon/search/matchesonscrollbar.css | 8 + .../addon/search/matchesonscrollbar.js | 97 + .../codemirror/addon/search/search.js | 252 + .../codemirror/addon/search/searchcursor.js | 189 + .../codemirror/addon/selection/active-line.js | 72 + .../addon/selection/mark-selection.js | 119 + .../addon/selection/selection-pointer.js | 98 + lib/redactor/codemirror/addon/tern/tern.css | 87 + lib/redactor/codemirror/addon/tern/tern.js | 701 + lib/redactor/codemirror/addon/tern/worker.js | 44 + .../codemirror/addon/wrap/hardwrap.js | 144 + .../codemirror/codemirror_connect.tpl | 32 + lib/redactor/codemirror/codemirror_editor.tpl | 74 + lib/redactor/codemirror/config.js | 31 + lib/redactor/codemirror/config_css.js | 28 + lib/redactor/codemirror/functions.js | 5 + lib/redactor/codemirror/index.php | 6 + lib/redactor/codemirror/lib/codemirror.css | 340 + lib/redactor/codemirror/lib/codemirror.js | 9351 ++++++ lib/redactor/codemirror/lib/util/closetag.js | 164 + lib/redactor/codemirror/lib/util/dialog.css | 27 + lib/redactor/codemirror/lib/util/dialog.js | 70 + lib/redactor/codemirror/lib/util/foldcode.js | 196 + .../codemirror/lib/util/formatting.js | 193 + .../codemirror/lib/util/javascript-hint.js | 134 + lib/redactor/codemirror/lib/util/loadmode.js | 51 + .../codemirror/lib/util/match-highlighter.js | 44 + lib/redactor/codemirror/lib/util/multiplex.js | 77 + lib/redactor/codemirror/lib/util/overlay.js | 54 + lib/redactor/codemirror/lib/util/pig-hint.js | 123 + .../codemirror/lib/util/runmode-standalone.js | 90 + lib/redactor/codemirror/lib/util/runmode.js | 53 + lib/redactor/codemirror/lib/util/search.js | 118 + .../codemirror/lib/util/searchcursor.js | 119 + .../codemirror/lib/util/simple-hint.css | 16 + .../codemirror/lib/util/simple-hint.js | 97 + lib/redactor/codemirror/lib/util/xml-hint.js | 137 + lib/redactor/codemirror/mode/clike/clike.js | 789 + lib/redactor/codemirror/mode/clike/index.html | 360 + lib/redactor/codemirror/mode/clike/scala.html | 767 + lib/redactor/codemirror/mode/clike/test.js | 59 + lib/redactor/codemirror/mode/css/css.js | 830 + lib/redactor/codemirror/mode/css/gss.html | 103 + lib/redactor/codemirror/mode/css/gss_test.js | 17 + lib/redactor/codemirror/mode/css/index.html | 75 + lib/redactor/codemirror/mode/css/less.html | 152 + lib/redactor/codemirror/mode/css/less_test.js | 54 + lib/redactor/codemirror/mode/css/scss.html | 157 + lib/redactor/codemirror/mode/css/scss_test.js | 110 + lib/redactor/codemirror/mode/css/test.js | 200 + .../mode/htmlembedded/htmlembedded.js | 28 + .../codemirror/mode/htmlembedded/index.html | 60 + .../codemirror/mode/htmlmixed/htmlmixed.js | 152 + .../codemirror/mode/htmlmixed/index.html | 100 + .../codemirror/mode/javascript/index.html | 114 + .../codemirror/mode/javascript/javascript.js | 813 + .../codemirror/mode/javascript/json-ld.html | 72 + .../codemirror/mode/javascript/test.js | 372 + .../mode/javascript/typescript.html | 61 + .../codemirror/mode/livescript/index.html | 459 + .../codemirror/mode/livescript/livescript.js | 280 + lib/redactor/codemirror/mode/php/index.html | 64 + lib/redactor/codemirror/mode/php/php.js | 234 + lib/redactor/codemirror/mode/php/test.js | 154 + .../codemirror/mode/smarty/index.html | 138 + lib/redactor/codemirror/mode/smarty/smarty.js | 225 + lib/redactor/codemirror/mode/sql/index.html | 86 + lib/redactor/codemirror/mode/sql/sql.js | 456 + lib/redactor/codemirror/mode/xml/index.html | 61 + lib/redactor/codemirror/mode/xml/test.js | 51 + lib/redactor/codemirror/mode/xml/xml.js | 394 + lib/redactor/codemirror/theme/3024-day.css | 41 + lib/redactor/codemirror/theme/3024-night.css | 39 + lib/redactor/codemirror/theme/abcdef.css | 32 + .../codemirror/theme/ambiance-mobile.css | 5 + lib/redactor/codemirror/theme/ambiance.css | 74 + lib/redactor/codemirror/theme/base16-dark.css | 38 + .../codemirror/theme/base16-light.css | 38 + lib/redactor/codemirror/theme/bespin.css | 34 + lib/redactor/codemirror/theme/blackboard.css | 32 + lib/redactor/codemirror/theme/cobalt.css | 25 + lib/redactor/codemirror/theme/colorforth.css | 33 + lib/redactor/codemirror/theme/dracula.css | 40 + .../codemirror/theme/duotone-dark.css | 35 + .../codemirror/theme/duotone-light.css | 36 + lib/redactor/codemirror/theme/eclipse.css | 23 + lib/redactor/codemirror/theme/elegant.css | 13 + lib/redactor/codemirror/theme/erlang-dark.css | 34 + lib/redactor/codemirror/theme/hopscotch.css | 34 + lib/redactor/codemirror/theme/icecoder.css | 43 + lib/redactor/codemirror/theme/isotope.css | 34 + lib/redactor/codemirror/theme/lesser-dark.css | 47 + lib/redactor/codemirror/theme/liquibyte.css | 95 + lib/redactor/codemirror/theme/material.css | 53 + lib/redactor/codemirror/theme/mbo.css | 37 + lib/redactor/codemirror/theme/mdn-like.css | 46 + lib/redactor/codemirror/theme/midnight.css | 45 + lib/redactor/codemirror/theme/monokai.css | 36 + lib/redactor/codemirror/theme/neat.css | 12 + lib/redactor/codemirror/theme/neo.css | 43 + lib/redactor/codemirror/theme/night.css | 27 + .../codemirror/theme/panda-syntax.css | 85 + .../codemirror/theme/paraiso-dark.css | 38 + .../codemirror/theme/paraiso-light.css | 38 + .../codemirror/theme/pastel-on-dark.css | 52 + lib/redactor/codemirror/theme/railscasts.css | 34 + lib/redactor/codemirror/theme/rubyblue.css | 25 + lib/redactor/codemirror/theme/seti.css | 44 + lib/redactor/codemirror/theme/solarized.css | 169 + lib/redactor/codemirror/theme/the-matrix.css | 30 + .../theme/tomorrow-night-bright.css | 35 + .../theme/tomorrow-night-eighties.css | 38 + lib/redactor/codemirror/theme/ttcn.css | 64 + lib/redactor/codemirror/theme/twilight.css | 32 + lib/redactor/codemirror/theme/vibrant-ink.css | 34 + lib/redactor/codemirror/theme/xq-dark.css | 53 + lib/redactor/codemirror/theme/xq-light.css | 43 + lib/redactor/codemirror/theme/yeti.css | 44 + lib/redactor/codemirror/theme/zenburn.css | 37 + lib/redactor/elfinder/css/elfinder.full.css | 3037 ++ lib/redactor/elfinder/css/elfinder.min.css | 9 + lib/redactor/elfinder/css/theme.css | 68 + lib/redactor/elfinder/img/arrows-active.png | Bin 0 -> 173 bytes lib/redactor/elfinder/img/arrows-normal.png | Bin 0 -> 198 bytes lib/redactor/elfinder/img/crop.gif | Bin 0 -> 329 bytes lib/redactor/elfinder/img/dialogs.png | Bin 0 -> 17744 bytes lib/redactor/elfinder/img/icons-big.png | Bin 0 -> 30933 bytes lib/redactor/elfinder/img/icons-small.png | Bin 0 -> 7235 bytes lib/redactor/elfinder/img/logo.png | Bin 0 -> 11400 bytes lib/redactor/elfinder/img/progress.gif | Bin 0 -> 1727 bytes lib/redactor/elfinder/img/quicklook-bg.png | Bin 0 -> 75 bytes lib/redactor/elfinder/img/quicklook-icons.png | Bin 0 -> 1902 bytes lib/redactor/elfinder/img/resize.png | Bin 0 -> 83 bytes lib/redactor/elfinder/img/spinner-mini.gif | Bin 0 -> 1849 bytes lib/redactor/elfinder/img/titleBg.png | Bin 0 -> 296 bytes lib/redactor/elfinder/img/toolbar.png | Bin 0 -> 17802 bytes lib/redactor/elfinder/img/volume_icon_box.png | Bin 0 -> 621 bytes .../elfinder/img/volume_icon_dropbox.png | Bin 0 -> 419 bytes lib/redactor/elfinder/img/volume_icon_ftp.png | Bin 0 -> 403 bytes .../elfinder/img/volume_icon_googledrive.png | Bin 0 -> 680 bytes .../elfinder/img/volume_icon_local.png | Bin 0 -> 381 bytes .../elfinder/img/volume_icon_onedrive.png | Bin 0 -> 206 bytes lib/redactor/elfinder/img/volume_icon_sql.png | Bin 0 -> 589 bytes lib/redactor/elfinder/inc/MySQLStorage.sql | 23 + lib/redactor/elfinder/inc/autoload.php | 49 + .../elfinder/inc/connector.minimal.php-dist | 107 + lib/redactor/elfinder/inc/connector.php | 157 + lib/redactor/elfinder/inc/connector.php-dist | 107 + .../elfinder/inc/connector_template.php | 175 + lib/redactor/elfinder/inc/elFinder.class.php | 3617 +++ .../elfinder/inc/elFinderConnector.class.php | 321 + .../elFinderFlysystemGoogleDriveNetmount.php | 330 + lib/redactor/elfinder/inc/elFinderPlugin.php | 75 + lib/redactor/elfinder/inc/elFinderSession.php | 244 + .../elfinder/inc/elFinderSessionInterface.php | 59 + .../elfinder/inc/elFinderVolumeBox.class.php | 1827 ++ .../inc/elFinderVolumeDriver.class.php | 6416 +++++ .../inc/elFinderVolumeDropbox.class.php | 1464 + .../inc/elFinderVolumeDropbox2.class.php | 1442 + .../elfinder/inc/elFinderVolumeFTP.class.php | 1574 ++ .../inc/elFinderVolumeGoogleDrive.class.php | 2100 ++ .../inc/elFinderVolumeGroup.class.php | 285 + .../elFinderVolumeLocalFileSystem.class.php | 1262 + .../inc/elFinderVolumeMySQL.class.php | 913 + .../inc/elFinderVolumeOneDrive.class.php | 1778 ++ lib/redactor/elfinder/inc/libs/GdBmp.php | 445 + lib/redactor/elfinder/inc/mime.types | 779 + .../inc/plugins/AutoResize/plugin.php | 121 + .../inc/plugins/AutoRotate/plugin.php | 112 + .../inc/plugins/Normalizer/plugin.php | 160 + .../elfinder/inc/plugins/Sanitizer/plugin.php | 121 + .../elfinder/inc/plugins/Watermark/logo.png | Bin 0 -> 9332 bytes .../elfinder/inc/plugins/Watermark/plugin.php | 307 + lib/redactor/elfinder/inc/resources/video.png | Bin 0 -> 5023 bytes lib/redactor/elfinder/js/elFinder.options.js | 343 + lib/redactor/elfinder/js/elfinder.full.js | 23583 ++++++++++++++++ lib/redactor/elfinder/js/elfinder.min.js | 20 + .../js/extras/encoding-japanese.min.js | 35 + .../js/extras/quicklook.googledocs.js | 69 + .../elfinder/js/i18n/elfinder.LANG.js | 482 + lib/redactor/elfinder/js/i18n/elfinder.ar.js | 375 + lib/redactor/elfinder/js/i18n/elfinder.bg.js | 412 + lib/redactor/elfinder/js/i18n/elfinder.ca.js | 375 + lib/redactor/elfinder/js/i18n/elfinder.cs.js | 473 + lib/redactor/elfinder/js/i18n/elfinder.da.js | 374 + lib/redactor/elfinder/js/i18n/elfinder.de.js | 476 + lib/redactor/elfinder/js/i18n/elfinder.el.js | 374 + lib/redactor/elfinder/js/i18n/elfinder.es.js | 433 + lib/redactor/elfinder/js/i18n/elfinder.fa.js | 374 + .../elfinder/js/i18n/elfinder.fallback.js | 11 + lib/redactor/elfinder/js/i18n/elfinder.fo.js | 419 + lib/redactor/elfinder/js/i18n/elfinder.fr.js | 419 + lib/redactor/elfinder/js/i18n/elfinder.he.js | 375 + lib/redactor/elfinder/js/i18n/elfinder.hr.js | 434 + lib/redactor/elfinder/js/i18n/elfinder.hu.js | 447 + lib/redactor/elfinder/js/i18n/elfinder.id.js | 373 + lib/redactor/elfinder/js/i18n/elfinder.it.js | 448 + lib/redactor/elfinder/js/i18n/elfinder.jp.js | 476 + lib/redactor/elfinder/js/i18n/elfinder.ko.js | 374 + lib/redactor/elfinder/js/i18n/elfinder.nl.js | 419 + lib/redactor/elfinder/js/i18n/elfinder.no.js | 374 + lib/redactor/elfinder/js/i18n/elfinder.pl.js | 455 + .../elfinder/js/i18n/elfinder.pt_BR.js | 438 + lib/redactor/elfinder/js/i18n/elfinder.ro.js | 417 + lib/redactor/elfinder/js/i18n/elfinder.ru.js | 440 + lib/redactor/elfinder/js/i18n/elfinder.sk.js | 473 + lib/redactor/elfinder/js/i18n/elfinder.sl.js | 374 + lib/redactor/elfinder/js/i18n/elfinder.sr.js | 374 + lib/redactor/elfinder/js/i18n/elfinder.sv.js | 375 + lib/redactor/elfinder/js/i18n/elfinder.tr.js | 468 + .../elfinder/js/i18n/elfinder.ug_CN.js | 374 + lib/redactor/elfinder/js/i18n/elfinder.uk.js | 391 + lib/redactor/elfinder/js/i18n/elfinder.vi.js | 374 + .../elfinder/js/i18n/elfinder.zh_CN.js | 487 + .../elfinder/js/i18n/elfinder.zh_TW.js | 472 + .../elfinder/js/proxy/elFinderSupportVer1.js | 414 + lib/redactor/elfinder/sounds/rm.wav | Bin 0 -> 92204 bytes lib/redactor/elrte/css/elrte-inner.css | 85 + lib/redactor/elrte/css/elrte.full.css | 754 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 120 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 105 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 159 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 110 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 101 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../smoothness/jquery-ui-1.8.13.custom.css | 578 + lib/redactor/elrte/images/elrte-toolbar.png | Bin 0 -> 28256 bytes lib/redactor/elrte/images/google-maps.png | Bin 0 -> 2007 bytes lib/redactor/elrte/images/iframe.png | Bin 0 -> 2690 bytes lib/redactor/elrte/images/loading.gif | Bin 0 -> 1279 bytes lib/redactor/elrte/images/media-director.png | Bin 0 -> 2011 bytes lib/redactor/elrte/images/media-flash.png | Bin 0 -> 2054 bytes lib/redactor/elrte/images/media-quicktime.png | Bin 0 -> 2639 bytes lib/redactor/elrte/images/media-realaudio.png | Bin 0 -> 1609 bytes lib/redactor/elrte/images/media-rutube.png | Bin 0 -> 2442 bytes lib/redactor/elrte/images/media-vimeo.png | Bin 0 -> 1501 bytes lib/redactor/elrte/images/media-winmedia.png | Bin 0 -> 2449 bytes lib/redactor/elrte/images/media-youtube.png | Bin 0 -> 1700 bytes lib/redactor/elrte/images/outline-div.png | Bin 0 -> 226 bytes lib/redactor/elrte/images/outline-p.png | Bin 0 -> 223 bytes lib/redactor/elrte/images/pagebreak.gif | Bin 0 -> 54 bytes lib/redactor/elrte/images/pixel.gif | Bin 0 -> 43 bytes .../elrte/images/smileys/evilgrin.png | Bin 0 -> 797 bytes lib/redactor/elrte/images/smileys/grin.png | Bin 0 -> 822 bytes lib/redactor/elrte/images/smileys/happy.png | Bin 0 -> 824 bytes lib/redactor/elrte/images/smileys/smile.png | Bin 0 -> 787 bytes .../elrte/images/smileys/surprised.png | Bin 0 -> 780 bytes lib/redactor/elrte/images/smileys/tongue.png | Bin 0 -> 820 bytes lib/redactor/elrte/images/smileys/unhappy.png | Bin 0 -> 778 bytes lib/redactor/elrte/images/smileys/waii.png | Bin 0 -> 785 bytes lib/redactor/elrte/images/smileys/wink.png | Bin 0 -> 802 bytes lib/redactor/elrte/images/yandex-maps.png | Bin 0 -> 1667 bytes lib/redactor/elrte/js/elrte.full.js | 8818 ++++++ lib/redactor/elrte/js/elrte.min.js | 267 + lib/redactor/elrte/js/i18n/elrte.YOUR_LANG.js | 216 + lib/redactor/elrte/js/i18n/elrte.ar.js | 168 + lib/redactor/elrte/js/i18n/elrte.ca.js | 167 + lib/redactor/elrte/js/i18n/elrte.cs.js | 171 + lib/redactor/elrte/js/i18n/elrte.da.js | 210 + lib/redactor/elrte/js/i18n/elrte.de.js | 170 + lib/redactor/elrte/js/i18n/elrte.en.js | 11 + lib/redactor/elrte/js/i18n/elrte.es.js | 169 + lib/redactor/elrte/js/i18n/elrte.fa.js | 170 + lib/redactor/elrte/js/i18n/elrte.fr.js | 169 + lib/redactor/elrte/js/i18n/elrte.hr.js | 210 + lib/redactor/elrte/js/i18n/elrte.hu.js | 203 + lib/redactor/elrte/js/i18n/elrte.it.js | 169 + lib/redactor/elrte/js/i18n/elrte.jp.js | 189 + lib/redactor/elrte/js/i18n/elrte.ko.js | 210 + lib/redactor/elrte/js/i18n/elrte.lv.js | 181 + lib/redactor/elrte/js/i18n/elrte.nl.js | 201 + lib/redactor/elrte/js/i18n/elrte.pl.js | 170 + lib/redactor/elrte/js/i18n/elrte.pt_BR.js | 167 + lib/redactor/elrte/js/i18n/elrte.ru.js | 213 + lib/redactor/elrte/js/i18n/elrte.sk.js | 172 + lib/redactor/elrte/js/i18n/elrte.th.js | 210 + lib/redactor/elrte/js/i18n/elrte.tr.js | 210 + lib/redactor/elrte/js/i18n/elrte.uk.js | 203 + lib/redactor/elrte/js/i18n/elrte.vi.js | 209 + lib/redactor/elrte/js/i18n/elrte.zh_CN.js | 189 + lib/redactor/elrte/js/i18n/elrte.zh_TW.js | 212 + .../elrte/js/jquery-ui-1.8.13.custom.min.js | 784 + lib/scripts/clipboard.min.js | 7 + lib/scripts/jquery-1.11.1.min.js | 4 + lib/scripts/jquery-1.11.1.min.map | 1 + lib/scripts/jquery-migrate-1.2.1.min.js | 2 + lib/scripts/jquery-ui-time.js | 1298 + lib/scripts/jquery-ui.min.js | 5 + lib/scripts/jquery.alerts.js | 219 + lib/scripts/jquery.autocomplete.js | 848 + lib/scripts/jquery.collapsible.min.js | 496 + lib/scripts/jquery.cookie.js | 10 + lib/scripts/jquery.dataTables.js | 7440 +++++ lib/scripts/jquery.easing.js | 139 + lib/scripts/jquery.fancybox.js | 46 + lib/scripts/jquery.form.min.js | 7 + lib/scripts/jquery.formstyler.min.js | 29 + lib/scripts/jquery.jgrowl.js | 1 + lib/scripts/jquery.lazyload.mini.js | 12 + lib/scripts/jquery.mousewheel.js | 12 + lib/scripts/jquery.nestable.js | 484 + lib/scripts/jquery.nicefileinput.min.js | 1 + lib/scripts/jquery.placeholder.min.js | 11 + lib/scripts/jquery.sticky.js | 112 + lib/scripts/jquery.tipsy.js | 198 + lib/scripts/jquery.tmpl.min.js | 10 + lib/scripts/jquery.totop.js | 5 + lib/scripts/jquery.transform.js | 140 + lib/scripts/mousetrap.js | 9 + lib/scripts/nprogress.js | 469 + lib/scripts/uploader/Moxie.swf | Bin 0 -> 28902 bytes lib/scripts/uploader/Moxie.xap | Bin 0 -> 62535 bytes lib/scripts/uploader/i18n/ar.js | 2 + lib/scripts/uploader/i18n/bg.js | 2 + lib/scripts/uploader/i18n/bs.js | 2 + lib/scripts/uploader/i18n/ca.js | 2 + lib/scripts/uploader/i18n/cs.js | 2 + lib/scripts/uploader/i18n/cy.js | 2 + lib/scripts/uploader/i18n/da.js | 2 + lib/scripts/uploader/i18n/de.js | 2 + lib/scripts/uploader/i18n/el.js | 2 + lib/scripts/uploader/i18n/en.js | 2 + lib/scripts/uploader/i18n/es.js | 2 + lib/scripts/uploader/i18n/et.js | 2 + lib/scripts/uploader/i18n/fa.js | 2 + lib/scripts/uploader/i18n/fi.js | 2 + lib/scripts/uploader/i18n/fr.js | 2 + lib/scripts/uploader/i18n/he.js | 2 + lib/scripts/uploader/i18n/hr.js | 2 + lib/scripts/uploader/i18n/hu.js | 2 + lib/scripts/uploader/i18n/hy.js | 2 + lib/scripts/uploader/i18n/id.js | 2 + lib/scripts/uploader/i18n/it.js | 2 + lib/scripts/uploader/i18n/ja.js | 2 + lib/scripts/uploader/i18n/ka.js | 2 + lib/scripts/uploader/i18n/kk.js | 2 + lib/scripts/uploader/i18n/ko.js | 2 + lib/scripts/uploader/i18n/lt.js | 2 + lib/scripts/uploader/i18n/lv.js | 2 + lib/scripts/uploader/i18n/nl.js | 2 + lib/scripts/uploader/i18n/pl.js | 2 + lib/scripts/uploader/i18n/pt_BR.js | 2 + lib/scripts/uploader/i18n/ro.js | 2 + lib/scripts/uploader/i18n/ru.js | 2 + lib/scripts/uploader/i18n/sk.js | 2 + lib/scripts/uploader/i18n/sr.js | 2 + lib/scripts/uploader/i18n/sv.js | 2 + lib/scripts/uploader/i18n/th_TH.js | 2 + lib/scripts/uploader/i18n/tr.js | 2 + lib/scripts/uploader/i18n/uk_UA.js | 2 + lib/scripts/uploader/i18n/zh_CN.js | 2 + lib/scripts/uploader/i18n/zh_TW.js | 2 + lib/scripts/uploader/jquery.plupload.queue.js | 426 + lib/scripts/uploader/moxie.js | 10684 +++++++ lib/scripts/uploader/moxie.min.js | 15 + lib/scripts/uploader/plupload.full.min.js | 28 + lib/scripts/uploader/plupload.min.js | 13 + lib/translate/Big_Text_Translate.php | 58 + lib/translate/Yandex_Translate.php | 119 + license.txt | 344 + modules/index.php | 8 + robots.txt | 16 + session/.htaccess | 1 + templates/default/css/combine.php | 201 + templates/default/css/styles.css | 0 templates/default/images/watermark.gif | Bin 0 -> 323 bytes templates/default/index.php | 8 + templates/default/js/combine.php | 171 + templates/default/js/main.js | 0 templates/default/lang/ru.txt | 1 + templates/index.php | 8 + uploads/.htaccess | 5 + uploads/.quarantine/index.php | 8 + uploads/.tmb/index.php | 8 + uploads/avatars/index.php | 8 + uploads/avatars/new/index.php | 8 + uploads/gallery/.temp/index.php | 8 + uploads/gallery/.uploader/index.php | 8 + uploads/gallery/index.php | 8 + uploads/gallery/watermark.gif | Bin 0 -> 323 bytes uploads/images/index.php | 8 + uploads/images/noimage.gif | Bin 0 -> 770 bytes uploads/index.php | 8 + uploads/recycled/.htaccess | 1 + uploads/recycled/index.php | 8 + 2331 files changed, 296580 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 README.md create mode 100644 admin/.htaccess create mode 100644 admin/admin.favicon.ico create mode 100644 admin/admin.php create mode 100644 admin/blocks.php create mode 100644 admin/browser.php create mode 100644 admin/dbsettings.php create mode 100644 admin/docs.php create mode 100644 admin/fields.php create mode 100644 admin/finder.php create mode 100644 admin/functions/func.admin.common.php create mode 100644 admin/groups.php create mode 100644 admin/index.php create mode 100644 admin/init.php create mode 100644 admin/lang/bg/.gitkeep create mode 100644 admin/lang/bg/blocks.txt create mode 100644 admin/lang/bg/dbactions.txt create mode 100644 admin/lang/bg/docs.txt create mode 100644 admin/lang/bg/groups.txt create mode 100644 admin/lang/bg/logs.txt create mode 100644 admin/lang/bg/main.txt create mode 100644 admin/lang/bg/modules.txt create mode 100644 admin/lang/bg/navigation.txt create mode 100644 admin/lang/bg/request.txt create mode 100644 admin/lang/bg/rubs.txt create mode 100644 admin/lang/bg/scripts.js create mode 100644 admin/lang/bg/settings.txt create mode 100644 admin/lang/bg/sysblocks.txt create mode 100644 admin/lang/bg/templates.txt create mode 100644 admin/lang/bg/user.txt create mode 100644 admin/lang/cz/dbactions.txt create mode 100644 admin/lang/cz/docs.txt create mode 100644 admin/lang/cz/groups.txt create mode 100644 admin/lang/cz/logs.txt create mode 100644 admin/lang/cz/main.txt create mode 100644 admin/lang/cz/modules.txt create mode 100644 admin/lang/cz/navigation.txt create mode 100644 admin/lang/cz/request.txt create mode 100644 admin/lang/cz/rubs.txt create mode 100644 admin/lang/cz/scripts.js create mode 100644 admin/lang/cz/settings.txt create mode 100644 admin/lang/cz/sysblocks.txt create mode 100644 admin/lang/cz/templates.txt create mode 100644 admin/lang/cz/user.txt create mode 100644 admin/lang/pl/blocks.txt create mode 100644 admin/lang/pl/dbactions.txt create mode 100644 admin/lang/pl/docs.txt create mode 100644 admin/lang/pl/groups.txt create mode 100644 admin/lang/pl/logs.txt create mode 100644 admin/lang/pl/main.txt create mode 100644 admin/lang/pl/modules.txt create mode 100644 admin/lang/pl/navigation.txt create mode 100644 admin/lang/pl/request.txt create mode 100644 admin/lang/pl/rubs.txt create mode 100644 admin/lang/pl/scripts.js create mode 100644 admin/lang/pl/settings.txt create mode 100644 admin/lang/pl/sysblocks.txt create mode 100644 admin/lang/pl/templates.txt create mode 100644 admin/lang/pl/user.txt create mode 100644 admin/lang/ru/blocks.txt create mode 100644 admin/lang/ru/dbactions.txt create mode 100755 admin/lang/ru/docs.txt create mode 100644 admin/lang/ru/groups.txt create mode 100644 admin/lang/ru/logs.txt create mode 100644 admin/lang/ru/main.txt create mode 100644 admin/lang/ru/modules.txt create mode 100644 admin/lang/ru/navigation.txt create mode 100644 admin/lang/ru/request.txt create mode 100755 admin/lang/ru/rubs.txt create mode 100644 admin/lang/ru/scripts.js create mode 100644 admin/lang/ru/settings.txt create mode 100644 admin/lang/ru/sysblocks.txt create mode 100644 admin/lang/ru/templates.txt create mode 100644 admin/lang/ru/user.txt create mode 100644 admin/lang/ua/blocks.txt create mode 100644 admin/lang/ua/dbactions.txt create mode 100644 admin/lang/ua/docs.txt create mode 100644 admin/lang/ua/groups.txt create mode 100644 admin/lang/ua/logs.txt create mode 100644 admin/lang/ua/main.txt create mode 100644 admin/lang/ua/modules.txt create mode 100644 admin/lang/ua/navigation.txt create mode 100644 admin/lang/ua/request.txt create mode 100644 admin/lang/ua/rubs.txt create mode 100644 admin/lang/ua/scripts.js create mode 100644 admin/lang/ua/settings.txt create mode 100644 admin/lang/ua/sysblocks.txt create mode 100644 admin/lang/ua/templates.txt create mode 100644 admin/lang/ua/user.txt create mode 100644 admin/logs.php create mode 100644 admin/modules.php create mode 100644 admin/navigation.php create mode 100644 admin/request.php create mode 100755 admin/rubs.php create mode 100644 admin/settings.php create mode 100644 admin/start.php create mode 100644 admin/sysblocks.php create mode 100644 admin/templates.php create mode 100644 admin/templates/blocks/form.tpl create mode 100644 admin/templates/blocks/list.tpl create mode 100644 admin/templates/blocks/multi.tpl create mode 100644 admin/templates/blocks/nav.tpl create mode 100644 admin/templates/browser/browser.tpl create mode 100644 admin/templates/browser/browser_2frames.tpl create mode 100644 admin/templates/browser/browser_upload.tpl create mode 100644 admin/templates/browser/onlycontent.tpl create mode 100644 admin/templates/css/browser.css create mode 100644 admin/templates/css/color_default.css create mode 100644 admin/templates/css/data_table.css create mode 100644 admin/templates/css/jquery-ui.css create mode 100644 admin/templates/css/jquery-ui_custom.css create mode 100644 admin/templates/css/jquery.fancybox.css create mode 100644 admin/templates/css/login.css create mode 100644 admin/templates/css/main.css create mode 100644 admin/templates/css/nestable.css create mode 100644 admin/templates/css/reset.css create mode 100644 admin/templates/css/theme_color_default/alert-opacity-overlay.png create mode 100644 admin/templates/css/theme_color_default/checkbox.png create mode 100644 admin/templates/css/theme_color_default/checkbox2.png create mode 100644 admin/templates/css/theme_color_default/fancy.png create mode 100644 admin/templates/css/theme_color_default/field.png create mode 100644 admin/templates/css/theme_color_default/left-menu-show.png create mode 100644 admin/templates/css/theme_color_default/message-arrow-left.png create mode 100644 admin/templates/css/theme_color_default/radio.png create mode 100644 admin/templates/css/theme_color_default/ui-to-top.png create mode 100644 admin/templates/dbactions/actions.tpl create mode 100644 admin/templates/dbactions/nav.tpl create mode 100644 admin/templates/documents/alias_doc.tpl create mode 100644 admin/templates/documents/alias_doc_list.tpl create mode 100644 admin/templates/documents/alias_list.tpl create mode 100644 admin/templates/documents/change.tpl create mode 100644 admin/templates/documents/doc_search.tpl create mode 100644 admin/templates/documents/docs.tpl create mode 100644 admin/templates/documents/docs_add_new.tpl create mode 100644 admin/templates/documents/docs_simple.tpl create mode 100755 admin/templates/documents/form.tpl create mode 100644 admin/templates/documents/form_after.tpl create mode 100644 admin/templates/documents/nav.tpl create mode 100644 admin/templates/documents/nav_top.tpl create mode 100644 admin/templates/documents/newremark.tpl create mode 100644 admin/templates/documents/replyform.tpl create mode 100644 admin/templates/documents/user.tpl create mode 100644 admin/templates/error.tpl create mode 100644 admin/templates/finder/finder.tpl create mode 100644 admin/templates/finder/nav.tpl create mode 100644 admin/templates/fonts/cuprum.eot create mode 100644 admin/templates/fonts/cuprum.ttf create mode 100644 admin/templates/fonts/cuprum.woff create mode 100644 admin/templates/groups/groups.tpl create mode 100644 admin/templates/groups/nav.tpl create mode 100644 admin/templates/groups/perms.tpl create mode 100644 admin/templates/images/IconHome.gif create mode 100644 admin/templates/images/NavBg.png create mode 100644 admin/templates/images/accordion_off.png create mode 100644 admin/templates/images/accordion_on.png create mode 100644 admin/templates/images/add.png create mode 100644 admin/templates/images/alertOpacityOverlay.png create mode 100644 admin/templates/images/arrow.gif create mode 100644 admin/templates/images/backgrounds/blueprint.png create mode 100644 admin/templates/images/backgrounds/darkwood.jpg create mode 100644 admin/templates/images/backgrounds/grey.png create mode 100644 admin/templates/images/backgrounds/wood.jpg create mode 100644 admin/templates/images/blanc.gif create mode 100644 admin/templates/images/chevron.gif create mode 100644 admin/templates/images/chosen-sprite.png create mode 100644 admin/templates/images/chosen-sprite@2x.png create mode 100644 admin/templates/images/clippy.svg create mode 100644 admin/templates/images/darkBg.jpg create mode 100644 admin/templates/images/darkBg.png create mode 100644 admin/templates/images/fancybox/blank.gif create mode 100644 admin/templates/images/fancybox/fancy_close.png create mode 100644 admin/templates/images/fancybox/fancy_loading.png create mode 100644 admin/templates/images/fancybox/fancy_nav_left.png create mode 100644 admin/templates/images/fancybox/fancy_nav_right.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_e.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_n.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_ne.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_nw.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_s.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_se.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_sw.png create mode 100644 admin/templates/images/fancybox/fancy_shadow_w.png create mode 100644 admin/templates/images/fancybox/fancy_title_left.png create mode 100644 admin/templates/images/fancybox/fancy_title_main.png create mode 100644 admin/templates/images/fancybox/fancy_title_over.png create mode 100644 admin/templates/images/fancybox/fancy_title_right.png create mode 100644 admin/templates/images/fancybox/fancybox-x.png create mode 100644 admin/templates/images/fancybox/fancybox-y.png create mode 100644 admin/templates/images/fancybox/fancybox.png create mode 100644 admin/templates/images/file.gif create mode 100644 admin/templates/images/folder.gif create mode 100644 admin/templates/images/folder_up.gif create mode 100644 admin/templates/images/forms/addFiles.png create mode 100644 admin/templates/images/forms/checkbox.png create mode 100644 admin/templates/images/forms/checkbox2.png create mode 100644 admin/templates/images/forms/radio.png create mode 100644 admin/templates/images/forms/searchBtn.png create mode 100644 admin/templates/images/forms/select_left.png create mode 100644 admin/templates/images/forms/select_right.png create mode 100644 admin/templates/images/forms/spinnerBg.png create mode 100644 admin/templates/images/forms/spinnerBottom.png create mode 100644 admin/templates/images/forms/spinnerTop.png create mode 100644 admin/templates/images/forms/spinnerUpDown.png create mode 100644 admin/templates/images/icons/add.png create mode 100644 admin/templates/images/icons/add2.png create mode 100644 admin/templates/images/icons/cog.png create mode 100644 admin/templates/images/icons/cog2.png create mode 100644 admin/templates/images/icons/cog3.png create mode 100644 admin/templates/images/icons/contact.png create mode 100644 admin/templates/images/icons/help.png create mode 100644 admin/templates/images/icons/loginEmail.png create mode 100644 admin/templates/images/icons/loginLock.png create mode 100644 admin/templates/images/icons/logout.png create mode 100644 admin/templates/images/icons/mainWebsite.png create mode 100644 admin/templates/images/icons/messages.png create mode 100644 admin/templates/images/icons/preview.png create mode 100644 admin/templates/images/icons/profile.png create mode 100644 admin/templates/images/icons/register.png create mode 100644 admin/templates/images/icons/settings.png create mode 100644 admin/templates/images/icons/subAdd.png create mode 100644 admin/templates/images/icons/subInbox.png create mode 100644 admin/templates/images/icons/subOutbox.png create mode 100644 admin/templates/images/icons/subTrash.png create mode 100644 admin/templates/images/icons/tasks.png create mode 100644 admin/templates/images/icons/upload.png create mode 100644 admin/templates/images/icons/user.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_flat_10_000000_40x100.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_glass_100_fdf5ce_1x400.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_glass_65_ffffff_1x400.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png create mode 100644 admin/templates/images/jquery_ui/ui-bg_highlight-soft_75_ffe45c_1x100.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_222222_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_228ef1_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_2e83ff_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_454545_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_888888_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_cd0a0a_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_ef8c08_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_ffd27a_256x240.png create mode 100644 admin/templates/images/jquery_ui/ui-icons_ffffff_256x240.png create mode 100644 admin/templates/images/leftNavBg.png create mode 100644 admin/templates/images/leftNavSub.png create mode 100644 admin/templates/images/left_menu_show.png create mode 100644 admin/templates/images/level.png create mode 100644 admin/templates/images/loader2.gif create mode 100644 admin/templates/images/loader3.gif create mode 100644 admin/templates/images/loading.gif create mode 100644 admin/templates/images/loginLogo.png create mode 100644 admin/templates/images/logosmall.png create mode 100644 admin/templates/images/mediapool/attach.gif create mode 100644 admin/templates/images/mediapool/avi.gif create mode 100644 admin/templates/images/mediapool/blank.gif create mode 100644 admin/templates/images/mediapool/bmp.gif create mode 100644 admin/templates/images/mediapool/doc.gif create mode 100644 admin/templates/images/mediapool/exe.gif create mode 100644 admin/templates/images/mediapool/gif.gif create mode 100644 admin/templates/images/mediapool/jpe.gif create mode 100644 admin/templates/images/mediapool/jpeg.gif create mode 100644 admin/templates/images/mediapool/jpg.gif create mode 100644 admin/templates/images/mediapool/mp3.gif create mode 100644 admin/templates/images/mediapool/pdf.gif create mode 100644 admin/templates/images/mediapool/php.gif create mode 100644 admin/templates/images/mediapool/png.gif create mode 100644 admin/templates/images/mediapool/psd.gif create mode 100644 admin/templates/images/mediapool/rar.gif create mode 100644 admin/templates/images/mediapool/rtf.gif create mode 100644 admin/templates/images/mediapool/swf.gif create mode 100644 admin/templates/images/mediapool/tif.gif create mode 100644 admin/templates/images/mediapool/txt.gif create mode 100644 admin/templates/images/mediapool/wmv.gif create mode 100644 admin/templates/images/mediapool/xls.gif create mode 100644 admin/templates/images/mediapool/zip.gif create mode 100644 admin/templates/images/middlebg.png create mode 100644 admin/templates/images/nav_level_2.gif create mode 100644 admin/templates/images/nav_level_3.gif create mode 100644 admin/templates/images/numberTop.png create mode 100644 admin/templates/images/ref.png create mode 100644 admin/templates/images/searchSmall.png create mode 100644 admin/templates/images/sprites.gif create mode 100644 admin/templates/images/sprites_doc.png create mode 100644 admin/templates/images/table_level.png create mode 100644 admin/templates/images/tabsSep.png create mode 100644 admin/templates/images/tipsy.gif create mode 100644 admin/templates/images/titleBg.png create mode 100644 admin/templates/images/topNav.jpg create mode 100644 admin/templates/images/ui.totop.png create mode 100644 admin/templates/images/ui/arrow2Grey.png create mode 100644 admin/templates/images/ui/basicBtn.png create mode 100644 admin/templates/images/ui/blackBtn.png create mode 100644 admin/templates/images/ui/blueBtn.png create mode 100644 admin/templates/images/ui/greenBtn.png create mode 100644 admin/templates/images/ui/greyishBtn.png create mode 100644 admin/templates/images/ui/handle.png create mode 100644 admin/templates/images/ui/handle_hover.png create mode 100644 admin/templates/images/ui/leftNavSub.png create mode 100644 admin/templates/images/ui/messageArrow_left.png create mode 100644 admin/templates/images/ui/messageArrow_right.png create mode 100644 admin/templates/images/ui/numDataBg.png create mode 100644 admin/templates/images/ui/orangeBtn.png create mode 100644 admin/templates/images/ui/pagination.png create mode 100644 admin/templates/images/ui/progress.png create mode 100644 admin/templates/images/ui/progressOverlay.png create mode 100644 admin/templates/images/ui/purpleBtn.png create mode 100644 admin/templates/images/ui/redBtn.png create mode 100644 admin/templates/images/ui/seaBtn.png create mode 100644 admin/templates/images/ui/sliderBg.png create mode 100644 admin/templates/images/ui/sliderOverlay.png create mode 100644 admin/templates/images/ui/uploadDisabled.png create mode 100644 admin/templates/images/ui/whiteBtn.png create mode 100644 admin/templates/images/upload.png create mode 100644 admin/templates/images/uploader/deleteFile.png create mode 100644 admin/templates/images/uploader/error.png create mode 100644 admin/templates/images/uploader/uploaded.png create mode 100644 admin/templates/images/user.png create mode 100644 admin/templates/images/userPic.png create mode 100644 admin/templates/images/widgetBg.png create mode 100644 admin/templates/js/filemanager.js create mode 100644 admin/templates/js/filemanager_template.js create mode 100644 admin/templates/js/login.js create mode 100644 admin/templates/js/main.js create mode 100644 admin/templates/js/rle.js create mode 100644 admin/templates/login.tpl create mode 100644 admin/templates/login_scripts.tpl create mode 100644 admin/templates/logs/404.tpl create mode 100644 admin/templates/logs/logs.tpl create mode 100644 admin/templates/logs/nav.tpl create mode 100644 admin/templates/logs/sql.tpl create mode 100644 admin/templates/main.tpl create mode 100644 admin/templates/modules/modules.tpl create mode 100644 admin/templates/modules/nav.tpl create mode 100644 admin/templates/navi/navi.tpl create mode 100644 admin/templates/navi/navi_top.tpl create mode 100644 admin/templates/navigation/item.tpl create mode 100644 admin/templates/navigation/item_edit.tpl create mode 100644 admin/templates/navigation/item_new.tpl create mode 100644 admin/templates/navigation/items.tpl create mode 100644 admin/templates/navigation/list.tpl create mode 100644 admin/templates/navigation/nav.tpl create mode 100644 admin/templates/navigation/nestable.tpl create mode 100644 admin/templates/navigation/select.tpl create mode 100644 admin/templates/navigation/template.tpl create mode 100644 admin/templates/navigation/tree.tpl create mode 100644 admin/templates/navigation/tree_docform.tpl create mode 100644 admin/templates/noperm.tpl create mode 100644 admin/templates/onlycontent.tpl create mode 100644 admin/templates/pop.tpl create mode 100644 admin/templates/request/change.tpl create mode 100644 admin/templates/request/cond_list.tpl create mode 100644 admin/templates/request/conditions.tpl create mode 100644 admin/templates/request/form.tpl create mode 100644 admin/templates/request/list.tpl create mode 100644 admin/templates/request/nav.tpl create mode 100644 admin/templates/rubs/alias.tpl create mode 100644 admin/templates/rubs/change.tpl create mode 100644 admin/templates/rubs/code.tpl create mode 100644 admin/templates/rubs/field_template.tpl create mode 100644 admin/templates/rubs/fields.tpl create mode 100644 admin/templates/rubs/fields_groups.tpl create mode 100644 admin/templates/rubs/fields_list.tpl create mode 100644 admin/templates/rubs/form.tpl create mode 100644 admin/templates/rubs/groups.tpl create mode 100755 admin/templates/rubs/list.tpl create mode 100644 admin/templates/rubs/multi.tpl create mode 100644 admin/templates/rubs/nav.tpl create mode 100644 admin/templates/rubs/rubnew.tpl create mode 100644 admin/templates/rubs/tmpls.tpl create mode 100644 admin/templates/rubs/tmpls_form.tpl create mode 100644 admin/templates/scripts.tpl create mode 100644 admin/templates/settings/nav.tpl create mode 100644 admin/templates/settings/pagination_edit.tpl create mode 100644 admin/templates/settings/settings_case.tpl create mode 100644 admin/templates/settings/settings_countries.tpl create mode 100644 admin/templates/settings/settings_lang.tpl create mode 100644 admin/templates/settings/settings_lang_edit.tpl create mode 100644 admin/templates/settings/settings_main.tpl create mode 100644 admin/templates/settings/settings_pagination.tpl create mode 100644 admin/templates/start.tpl create mode 100644 admin/templates/sysblocks/form.tpl create mode 100644 admin/templates/sysblocks/form_visual.tpl create mode 100644 admin/templates/sysblocks/list.tpl create mode 100644 admin/templates/sysblocks/multi.tpl create mode 100644 admin/templates/sysblocks/nav.tpl create mode 100644 admin/templates/templates/edit_css.tpl create mode 100644 admin/templates/templates/edit_js.tpl create mode 100644 admin/templates/templates/form.tpl create mode 100644 admin/templates/templates/nav.tpl create mode 100644 admin/templates/templates/templates.tpl create mode 100644 admin/templates/user/form.tpl create mode 100644 admin/templates/user/nav.tpl create mode 100644 admin/templates/user/users.tpl create mode 100644 admin/user.php create mode 100644 backup/.htaccess create mode 100644 cache/.htaccess create mode 100644 cache/attachments/.htaccess create mode 100644 cache/combine/.htaccess create mode 100644 cache/module/.htaccess create mode 100644 cache/redactor/.htaccess create mode 100644 cache/redactor/log.txt create mode 100644 cache/smarty/.htaccess create mode 100644 cache/sql/.htaccess create mode 100644 cache/tpl/.htaccess create mode 100644 class/.htaccess create mode 100644 class/class.blocks.php create mode 100755 class/class.core.php create mode 100755 class/class.database.php create mode 100644 class/class.dbdump.php create mode 100644 class/class.debug.php create mode 100755 class/class.docs.php create mode 100644 class/class.hooks.php create mode 100644 class/class.logs.php create mode 100644 class/class.meta.php create mode 100644 class/class.modules.php create mode 100644 class/class.navigation.php create mode 100644 class/class.paginations.php create mode 100644 class/class.request.php create mode 100755 class/class.rubs.php create mode 100644 class/class.session.files.php create mode 100644 class/class.session.php create mode 100644 class/class.settings.php create mode 100644 class/class.sysblocks.php create mode 100644 class/class.template.php create mode 100644 class/class.templates.php create mode 100644 class/class.thumbnail.php create mode 100644 class/class.user.php create mode 100644 class/class.yml.php create mode 100644 fields/.htaccess create mode 100644 fields/checkbox/field.php create mode 100644 fields/checkbox/lang/bg.txt create mode 100644 fields/checkbox/lang/cz.txt create mode 100644 fields/checkbox/lang/en.txt create mode 100644 fields/checkbox/lang/pl.txt create mode 100644 fields/checkbox/lang/ru.txt create mode 100644 fields/checkbox/lang/ua.txt create mode 100644 fields/checkbox/tpl/field-doc.tpl create mode 100644 fields/checkbox/tpl/field-req.tpl create mode 100644 fields/checkbox/tpl/field.tpl create mode 100644 fields/code/field.php create mode 100644 fields/code/lang/bg.txt create mode 100644 fields/code/lang/cz.txt create mode 100644 fields/code/lang/pl.txt create mode 100644 fields/code/lang/ru.txt create mode 100644 fields/code/lang/ua.txt create mode 100644 fields/code/tpl/field.tpl create mode 100644 fields/date/field.php create mode 100644 fields/date/lang/bg.txt create mode 100644 fields/date/lang/cz.txt create mode 100644 fields/date/lang/pl.txt create mode 100644 fields/date/lang/ru.txt create mode 100644 fields/date/lang/ua.txt create mode 100644 fields/date/tpl/field-doc.tpl create mode 100644 fields/date/tpl/field-req.tpl create mode 100644 fields/date/tpl/field.tpl create mode 100644 fields/doc_from_rub/field.php create mode 100644 fields/doc_from_rub/lang/bg.txt create mode 100644 fields/doc_from_rub/lang/cz.txt create mode 100644 fields/doc_from_rub/lang/en.txt create mode 100644 fields/doc_from_rub/lang/pl.txt create mode 100644 fields/doc_from_rub/lang/ru.txt create mode 100644 fields/doc_from_rub/lang/ua.txt create mode 100644 fields/doc_from_rub/tpl/field-doc.tpl create mode 100644 fields/doc_from_rub/tpl/field-req.tpl create mode 100644 fields/doc_from_rub/tpl/field.tpl create mode 100644 fields/doc_from_rub/tpl/list.tpl create mode 100644 fields/doc_from_rub_check/field.php create mode 100644 fields/doc_from_rub_check/lang/bg.txt create mode 100644 fields/doc_from_rub_check/lang/cz.txt create mode 100644 fields/doc_from_rub_check/lang/en.txt create mode 100644 fields/doc_from_rub_check/lang/pl.txt create mode 100644 fields/doc_from_rub_check/lang/ru.txt create mode 100644 fields/doc_from_rub_check/lang/ua.txt create mode 100644 fields/doc_from_rub_check/tpl/field-doc.tpl create mode 100644 fields/doc_from_rub_check/tpl/field-req.tpl create mode 100644 fields/doc_from_rub_check/tpl/field.tpl create mode 100644 fields/doc_from_rub_check/tpl/list.tpl create mode 100644 fields/doc_from_rub_search/css/field.css create mode 100644 fields/doc_from_rub_search/field.php create mode 100644 fields/doc_from_rub_search/js/field.js create mode 100644 fields/doc_from_rub_search/js/outside.js create mode 100644 fields/doc_from_rub_search/lang/bg.txt create mode 100644 fields/doc_from_rub_search/lang/cz.txt create mode 100644 fields/doc_from_rub_search/lang/pl.txt create mode 100644 fields/doc_from_rub_search/lang/ru.txt create mode 100644 fields/doc_from_rub_search/lang/ua.txt create mode 100644 fields/doc_from_rub_search/tpl/field-doc.tpl create mode 100644 fields/doc_from_rub_search/tpl/field-req.tpl create mode 100644 fields/doc_from_rub_search/tpl/field.tpl create mode 100644 fields/download/field.php create mode 100644 fields/download/lang/bg.txt create mode 100644 fields/download/lang/cz.txt create mode 100644 fields/download/lang/en.txt create mode 100644 fields/download/lang/pl.txt create mode 100644 fields/download/lang/ru.txt create mode 100644 fields/download/lang/ua.txt create mode 100644 fields/download/tpl/field.tpl create mode 100644 fields/drop_down/field.php create mode 100644 fields/drop_down/lang/bg.txt create mode 100644 fields/drop_down/lang/cz.txt create mode 100644 fields/drop_down/lang/en.txt create mode 100644 fields/drop_down/lang/pl.txt create mode 100644 fields/drop_down/lang/ru.txt create mode 100644 fields/drop_down/lang/ua.txt create mode 100644 fields/drop_down/tpl/field.tpl create mode 100644 fields/drop_down_key/field.php create mode 100644 fields/drop_down_key/lang/bg.txt create mode 100644 fields/drop_down_key/lang/cz.txt create mode 100644 fields/drop_down_key/lang/en.txt create mode 100644 fields/drop_down_key/lang/pl.txt create mode 100644 fields/drop_down_key/lang/ru.txt create mode 100644 fields/drop_down_key/lang/ua.txt create mode 100644 fields/drop_down_key/tpl/field.tpl create mode 100644 fields/flash/field.php create mode 100644 fields/flash/lang/bg.txt create mode 100644 fields/flash/lang/cz.txt create mode 100644 fields/flash/lang/pl.txt create mode 100644 fields/flash/lang/ru.txt create mode 100644 fields/flash/lang/ua.txt create mode 100644 fields/flash/tpl/field.tpl create mode 100755 fields/image_mega/css/field.css create mode 100755 fields/image_mega/field.php create mode 100755 fields/image_mega/js/field.js create mode 100644 fields/image_mega/lang/pl.txt create mode 100755 fields/image_mega/lang/ru.txt create mode 100644 fields/image_mega/lang/ua.txt create mode 100755 fields/image_mega/tpl/field-doc.tpl create mode 100755 fields/image_mega/tpl/field-req.tpl create mode 100755 fields/image_mega/tpl/field.tpl create mode 100755 fields/image_multi/css/field.css create mode 100755 fields/image_multi/field.php create mode 100755 fields/image_multi/js/field.js create mode 100755 fields/image_multi/js/outside.js create mode 100644 fields/image_multi/lang/bg.txt create mode 100644 fields/image_multi/lang/cz.txt create mode 100755 fields/image_multi/lang/en.txt create mode 100644 fields/image_multi/lang/pl.txt create mode 100755 fields/image_multi/lang/ru.txt create mode 100644 fields/image_multi/lang/ua.txt create mode 100755 fields/image_multi/tpl/field-doc.tpl create mode 100755 fields/image_multi/tpl/field-req.tpl create mode 100755 fields/image_multi/tpl/field.tpl create mode 100755 fields/image_multi_new_3inputs/.gitkeep create mode 100755 fields/image_multi_new_3inputs/css/.gitkeep create mode 100755 fields/image_multi_new_3inputs/css/field.css create mode 100755 fields/image_multi_new_3inputs/field.php create mode 100755 fields/image_multi_new_3inputs/js/.gitkeep create mode 100755 fields/image_multi_new_3inputs/js/field.js create mode 100755 fields/image_multi_new_3inputs/js/outside.js create mode 100755 fields/image_multi_new_3inputs/lang/.gitkeep create mode 100644 fields/image_multi_new_3inputs/lang/bg.txt create mode 100644 fields/image_multi_new_3inputs/lang/cz.txt create mode 100755 fields/image_multi_new_3inputs/lang/en.txt create mode 100644 fields/image_multi_new_3inputs/lang/pl.txt create mode 100755 fields/image_multi_new_3inputs/lang/ru.txt create mode 100644 fields/image_multi_new_3inputs/lang/ua.txt create mode 100755 fields/image_multi_new_3inputs/tpl/.gitkeep create mode 100755 fields/image_multi_new_3inputs/tpl/field-doc.tpl create mode 100755 fields/image_multi_new_3inputs/tpl/field-req.tpl create mode 100755 fields/image_multi_new_3inputs/tpl/field.tpl create mode 100644 fields/image_single/css/field.css create mode 100644 fields/image_single/field.php create mode 100644 fields/image_single/js/field.js create mode 100644 fields/image_single/lang/bg.txt create mode 100644 fields/image_single/lang/cz.txt create mode 100644 fields/image_single/lang/en.txt create mode 100644 fields/image_single/lang/pl.txt create mode 100644 fields/image_single/lang/ru.txt create mode 100644 fields/image_single/lang/ua.txt create mode 100644 fields/image_single/tpl/field-doc.tpl create mode 100644 fields/image_single/tpl/field-req.tpl create mode 100644 fields/image_single/tpl/field.tpl create mode 100644 fields/link/field.php create mode 100644 fields/link/lang/bg.txt create mode 100644 fields/link/lang/cz.txt create mode 100644 fields/link/lang/pl.txt create mode 100644 fields/link/lang/ru.txt create mode 100644 fields/link/lang/ua.txt create mode 100644 fields/link/tpl/field.tpl create mode 100644 fields/multi_checkbox/field.php create mode 100644 fields/multi_checkbox/lang/bg.txt create mode 100644 fields/multi_checkbox/lang/cz.txt create mode 100644 fields/multi_checkbox/lang/en.txt create mode 100644 fields/multi_checkbox/lang/pl.txt create mode 100644 fields/multi_checkbox/lang/ru.txt create mode 100644 fields/multi_checkbox/lang/ua.txt create mode 100644 fields/multi_checkbox/tpl/field-doc.tpl create mode 100644 fields/multi_checkbox/tpl/field-req.tpl create mode 100644 fields/multi_checkbox/tpl/field.tpl create mode 100644 fields/multi_line/field.php create mode 100644 fields/multi_line/lang/bg.txt create mode 100644 fields/multi_line/lang/cz.txt create mode 100644 fields/multi_line/lang/en.txt create mode 100644 fields/multi_line/lang/pl.txt create mode 100644 fields/multi_line/lang/ru.txt create mode 100644 fields/multi_line/lang/ua.txt create mode 100644 fields/multi_line_simple/field.php create mode 100644 fields/multi_line_simple/lang/bg.txt create mode 100644 fields/multi_line_simple/lang/cz.txt create mode 100644 fields/multi_line_simple/lang/en.txt create mode 100644 fields/multi_line_simple/lang/pl.txt create mode 100644 fields/multi_line_simple/lang/ru.txt create mode 100644 fields/multi_line_simple/lang/ua.txt create mode 100644 fields/multi_line_slim/field.php create mode 100644 fields/multi_line_slim/lang/bg.txt create mode 100644 fields/multi_line_slim/lang/cz.txt create mode 100644 fields/multi_line_slim/lang/en.txt create mode 100644 fields/multi_line_slim/lang/pl.txt create mode 100644 fields/multi_line_slim/lang/ru.txt create mode 100644 fields/multi_line_slim/lang/ua.txt create mode 100644 fields/multi_list/css/field.css create mode 100644 fields/multi_list/field.php create mode 100644 fields/multi_list/js/field.js create mode 100644 fields/multi_list/js/outside.js create mode 100644 fields/multi_list/lang/bg.txt create mode 100644 fields/multi_list/lang/cz.txt create mode 100644 fields/multi_list/lang/en.txt create mode 100644 fields/multi_list/lang/pl.txt create mode 100644 fields/multi_list/lang/ru.txt create mode 100644 fields/multi_list/lang/ua.txt create mode 100644 fields/multi_list/tpl/field-doc.tpl create mode 100644 fields/multi_list/tpl/field-req.tpl create mode 100644 fields/multi_list/tpl/field.tpl create mode 100644 fields/multi_list_single/css/field.css create mode 100644 fields/multi_list_single/field.php create mode 100644 fields/multi_list_single/js/field.js create mode 100644 fields/multi_list_single/js/outside.js create mode 100644 fields/multi_list_single/lang/bg.txt create mode 100644 fields/multi_list_single/lang/cz.txt create mode 100644 fields/multi_list_single/lang/en.txt create mode 100644 fields/multi_list_single/lang/pl.txt create mode 100644 fields/multi_list_single/lang/ru.txt create mode 100644 fields/multi_list_single/lang/ua.txt create mode 100644 fields/multi_list_single/tpl/field-doc.tpl create mode 100644 fields/multi_list_single/tpl/field-req.tpl create mode 100644 fields/multi_list_single/tpl/field.tpl create mode 100644 fields/multi_list_triple/css/field.css create mode 100644 fields/multi_list_triple/field.php create mode 100644 fields/multi_list_triple/js/field.js create mode 100644 fields/multi_list_triple/js/outside.js create mode 100644 fields/multi_list_triple/lang/bg.txt create mode 100644 fields/multi_list_triple/lang/cz.txt create mode 100644 fields/multi_list_triple/lang/pl.txt create mode 100644 fields/multi_list_triple/lang/ru.txt create mode 100644 fields/multi_list_triple/lang/ua.txt create mode 100644 fields/multi_list_triple/tpl/field-doc.tpl create mode 100644 fields/multi_list_triple/tpl/field-req.tpl create mode 100644 fields/multi_list_triple/tpl/field.tpl create mode 100644 fields/multi_select/field.php create mode 100644 fields/multi_select/lang/bg.txt create mode 100644 fields/multi_select/lang/cz.txt create mode 100644 fields/multi_select/lang/en.txt create mode 100644 fields/multi_select/lang/pl.txt create mode 100644 fields/multi_select/lang/ru.txt create mode 100644 fields/multi_select/lang/ua.txt create mode 100644 fields/multi_select/tpl/field-doc.tpl create mode 100644 fields/multi_select/tpl/field-req.tpl create mode 100644 fields/multi_select/tpl/field.tpl create mode 100644 fields/single_line/field.php create mode 100644 fields/single_line/lang/bg.txt create mode 100644 fields/single_line/lang/cz.txt create mode 100644 fields/single_line/lang/en.txt create mode 100644 fields/single_line/lang/pl.txt create mode 100644 fields/single_line/lang/ru.txt create mode 100644 fields/single_line/lang/ua.txt create mode 100644 fields/single_line/tpl/field-doc.tpl create mode 100644 fields/single_line/tpl/field-req.tpl create mode 100644 fields/single_line/tpl/field.tpl create mode 100644 fields/single_line_numeric/field.php create mode 100644 fields/single_line_numeric/js/field.js create mode 100644 fields/single_line_numeric/lang/bg.txt create mode 100644 fields/single_line_numeric/lang/cz.txt create mode 100644 fields/single_line_numeric/lang/en.txt create mode 100644 fields/single_line_numeric/lang/pl.txt create mode 100644 fields/single_line_numeric/lang/ru.txt create mode 100644 fields/single_line_numeric/lang/ua.txt create mode 100644 fields/single_line_numeric/tpl/field-doc.tpl create mode 100644 fields/single_line_numeric/tpl/field-req.tpl create mode 100644 fields/single_line_numeric/tpl/field.tpl create mode 100644 fields/teasers/css/field.css create mode 100644 fields/teasers/field.php create mode 100644 fields/teasers/js/field.js create mode 100644 fields/teasers/js/outside.js create mode 100644 fields/teasers/lang/bg.txt create mode 100644 fields/teasers/lang/cz.txt create mode 100644 fields/teasers/lang/pl.txt create mode 100644 fields/teasers/lang/ru.txt create mode 100644 fields/teasers/lang/ua.txt create mode 100644 fields/teasers/tpl/field.tpl create mode 100644 fields/text_to_image/.htaccess create mode 100644 fields/text_to_image/class.txtimage.php create mode 100644 fields/text_to_image/css/field.css create mode 100644 fields/text_to_image/field.php create mode 100644 fields/text_to_image/fonts/CoreSansNR27.ttf create mode 100644 fields/text_to_image/fonts/CoreSansNR37.ttf create mode 100644 fields/text_to_image/fonts/CoreSansNR47.ttf create mode 100644 fields/text_to_image/fonts/Cuprum-Bold.ttf create mode 100644 fields/text_to_image/fonts/Cuprum-Italic.ttf create mode 100644 fields/text_to_image/fonts/Cuprum-Regular.ttf create mode 100644 fields/text_to_image/js/jscolor.js create mode 100644 fields/text_to_image/lang/bg.txt create mode 100644 fields/text_to_image/lang/cz.txt create mode 100644 fields/text_to_image/lang/en.txt create mode 100644 fields/text_to_image/lang/pl.txt create mode 100644 fields/text_to_image/lang/ru.txt create mode 100644 fields/text_to_image/lang/ua.txt create mode 100644 fields/text_to_image/res.php create mode 100644 fields/text_to_image/tpl/field-doc.tpl create mode 100644 fields/text_to_image/tpl/field-req.tpl create mode 100644 fields/text_to_image/tpl/field.tpl create mode 100644 fields/youtube/field.php create mode 100644 fields/youtube/lang/bg.txt create mode 100644 fields/youtube/lang/cz.txt create mode 100644 fields/youtube/lang/en.txt create mode 100644 fields/youtube/lang/pl.txt create mode 100644 fields/youtube/lang/ru.txt create mode 100644 fields/youtube/lang/ua.txt create mode 100644 fields/youtube/tpl/field-doc.tpl create mode 100644 fields/youtube/tpl/field-req.tpl create mode 100644 fields/youtube/tpl/field.tpl create mode 100644 functions/.htaccess create mode 100644 functions/func.block.php create mode 100644 functions/func.breadcrumbs.php create mode 100755 functions/func.common.php create mode 100644 functions/func.custom.php create mode 100644 functions/func.documents.php create mode 100644 functions/func.fields.php create mode 100644 functions/func.helpers.php create mode 100644 functions/func.hidden.php create mode 100644 functions/func.locale.php create mode 100644 functions/func.login.php create mode 100755 functions/func.logs.php create mode 100644 functions/func.mail.php create mode 100644 functions/func.modulglobals.php create mode 100644 functions/func.navigation.php create mode 100644 functions/func.pagination.php create mode 100755 functions/func.parserequest.php create mode 100644 functions/func.sysblock.php create mode 100644 functions/func.thumbnails.php create mode 100644 functions/func.users.php create mode 100644 functions/func.watermarks.php create mode 100644 inc/antispam.php create mode 100644 inc/captcha.php create mode 100644 inc/config.inc.php create mode 100755 inc/config.php create mode 100644 inc/db.config.php create mode 100644 inc/dump.php create mode 100644 inc/errors.php create mode 100644 inc/fonts/ft16.ttf create mode 100644 inc/index.php create mode 100644 inc/init.php create mode 100644 inc/rss.php create mode 100644 inc/sitemap.php create mode 100644 inc/stdimage/gear.css create mode 100644 inc/stdimage/gear.png create mode 100644 inc/thumb.php create mode 100644 inc/upload.php create mode 100755 index.php create mode 100644 install/.htaccess create mode 100755 install/data_base.sql create mode 100644 install/eula/bg.tpl create mode 100644 install/eula/ru.tpl create mode 100644 install/exit.html create mode 100644 install/index.php create mode 100644 install/lang/bg.js create mode 100644 install/lang/bg.txt create mode 100644 install/lang/ru.js create mode 100644 install/lang/ru.txt create mode 100755 install/structure_base.sql create mode 100644 install/tpl/css/fix.css create mode 100644 install/tpl/error.tpl create mode 100644 install/tpl/js/main.js create mode 100644 install/tpl/step1.tpl create mode 100644 install/tpl/step2.tpl create mode 100644 install/tpl/step3.tpl create mode 100644 install/tpl/step4.tpl create mode 100644 install/tpl/step5.tpl create mode 100644 install/tpl/step6.tpl create mode 100755 lib/Smarty/.htaccess create mode 100755 lib/Smarty/Config_File.class.php create mode 100755 lib/Smarty/Smarty.class.php create mode 100755 lib/Smarty/Smarty_Compiler.class.php create mode 100755 lib/Smarty/debug.tpl create mode 100755 lib/Smarty/internals/core.assemble_plugin_filepath.php create mode 100755 lib/Smarty/internals/core.assign_smarty_interface.php create mode 100755 lib/Smarty/internals/core.create_dir_structure.php create mode 100755 lib/Smarty/internals/core.display_debug_console.php create mode 100755 lib/Smarty/internals/core.get_include_path.php create mode 100755 lib/Smarty/internals/core.get_microtime.php create mode 100755 lib/Smarty/internals/core.get_php_resource.php create mode 100755 lib/Smarty/internals/core.is_secure.php create mode 100755 lib/Smarty/internals/core.is_trusted.php create mode 100755 lib/Smarty/internals/core.load_plugins.php create mode 100755 lib/Smarty/internals/core.load_resource_plugin.php create mode 100755 lib/Smarty/internals/core.process_cached_inserts.php create mode 100755 lib/Smarty/internals/core.process_compiled_include.php create mode 100755 lib/Smarty/internals/core.read_cache_file.php create mode 100755 lib/Smarty/internals/core.rm_auto.php create mode 100755 lib/Smarty/internals/core.rmdir.php create mode 100755 lib/Smarty/internals/core.run_insert_handler.php create mode 100755 lib/Smarty/internals/core.smarty_include_php.php create mode 100755 lib/Smarty/internals/core.write_cache_file.php create mode 100755 lib/Smarty/internals/core.write_compiled_include.php create mode 100755 lib/Smarty/internals/core.write_compiled_resource.php create mode 100755 lib/Smarty/internals/core.write_file.php create mode 100755 lib/Smarty/plugins/block.textformat.php create mode 100755 lib/Smarty/plugins/compiler.assign.php create mode 100755 lib/Smarty/plugins/function.assign_debug_info.php create mode 100755 lib/Smarty/plugins/function.config_load.php create mode 100755 lib/Smarty/plugins/function.counter.php create mode 100755 lib/Smarty/plugins/function.cycle.php create mode 100755 lib/Smarty/plugins/function.debug.php create mode 100755 lib/Smarty/plugins/function.eval.php create mode 100755 lib/Smarty/plugins/function.fetch.php create mode 100755 lib/Smarty/plugins/function.html_checkboxes.php create mode 100755 lib/Smarty/plugins/function.html_image.php create mode 100755 lib/Smarty/plugins/function.html_options.php create mode 100755 lib/Smarty/plugins/function.html_radios.php create mode 100755 lib/Smarty/plugins/function.html_select_date.php create mode 100755 lib/Smarty/plugins/function.html_select_time.php create mode 100755 lib/Smarty/plugins/function.html_table.php create mode 100755 lib/Smarty/plugins/function.mailto.php create mode 100755 lib/Smarty/plugins/function.math.php create mode 100755 lib/Smarty/plugins/function.popup.php create mode 100755 lib/Smarty/plugins/function.popup_init.php create mode 100755 lib/Smarty/plugins/modifier.capitalize.php create mode 100755 lib/Smarty/plugins/modifier.cat.php create mode 100755 lib/Smarty/plugins/modifier.count_characters.php create mode 100755 lib/Smarty/plugins/modifier.count_paragraphs.php create mode 100755 lib/Smarty/plugins/modifier.count_sentences.php create mode 100755 lib/Smarty/plugins/modifier.count_words.php create mode 100755 lib/Smarty/plugins/modifier.date_format.php create mode 100755 lib/Smarty/plugins/modifier.debug_print_var.php create mode 100644 lib/Smarty/plugins/modifier.declension.php create mode 100755 lib/Smarty/plugins/modifier.default.php create mode 100755 lib/Smarty/plugins/modifier.escape.php create mode 100755 lib/Smarty/plugins/modifier.indent.php create mode 100755 lib/Smarty/plugins/modifier.lower.php create mode 100755 lib/Smarty/plugins/modifier.nl2br.php create mode 100644 lib/Smarty/plugins/modifier.number_format.php create mode 100755 lib/Smarty/plugins/modifier.regex_replace.php create mode 100755 lib/Smarty/plugins/modifier.replace.php create mode 100755 lib/Smarty/plugins/modifier.spacify.php create mode 100755 lib/Smarty/plugins/modifier.string_format.php create mode 100755 lib/Smarty/plugins/modifier.strip.php create mode 100755 lib/Smarty/plugins/modifier.strip_tags.php create mode 100755 lib/Smarty/plugins/modifier.truncate.php create mode 100755 lib/Smarty/plugins/modifier.upper.php create mode 100755 lib/Smarty/plugins/modifier.wordwrap.php create mode 100755 lib/Smarty/plugins/outputfilter.trimwhitespace.php create mode 100755 lib/Smarty/plugins/shared.escape_special_chars.php create mode 100755 lib/Smarty/plugins/shared.make_timestamp.php create mode 100644 lib/StripTagsSmart/strip_tags_smart.php create mode 100644 lib/SwiftMailer/classes/Swift.php create mode 100644 lib/SwiftMailer/classes/Swift/Attachment.php create mode 100644 lib/SwiftMailer/classes/Swift/ByteStream/AbstractFilterableInputStream.php create mode 100644 lib/SwiftMailer/classes/Swift/ByteStream/ArrayByteStream.php create mode 100644 lib/SwiftMailer/classes/Swift/ByteStream/FileByteStream.php create mode 100644 lib/SwiftMailer/classes/Swift/ByteStream/TemporaryFileByteStream.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterReader.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterReader/GenericFixedWidthReader.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterReader/UsAsciiReader.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterReader/Utf8Reader.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterReaderFactory.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterReaderFactory/SimpleCharacterReaderFactory.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterStream.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterStream/ArrayCharacterStream.php create mode 100644 lib/SwiftMailer/classes/Swift/CharacterStream/NgCharacterStream.php create mode 100644 lib/SwiftMailer/classes/Swift/ConfigurableSpool.php create mode 100644 lib/SwiftMailer/classes/Swift/DependencyContainer.php create mode 100644 lib/SwiftMailer/classes/Swift/DependencyException.php create mode 100644 lib/SwiftMailer/classes/Swift/EmbeddedFile.php create mode 100644 lib/SwiftMailer/classes/Swift/Encoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Encoder/Base64Encoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Encoder/QpEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Encoder/Rfc2231Encoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Encoding.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/CommandEvent.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/CommandListener.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/Event.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/EventDispatcher.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/EventListener.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/EventObject.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/ResponseEvent.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/ResponseListener.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/SendEvent.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/SendListener.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/SimpleEventDispatcher.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/TransportChangeEvent.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/TransportChangeListener.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/TransportExceptionEvent.php create mode 100644 lib/SwiftMailer/classes/Swift/Events/TransportExceptionListener.php create mode 100644 lib/SwiftMailer/classes/Swift/FailoverTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/FileSpool.php create mode 100644 lib/SwiftMailer/classes/Swift/FileStream.php create mode 100644 lib/SwiftMailer/classes/Swift/Filterable.php create mode 100644 lib/SwiftMailer/classes/Swift/Image.php create mode 100644 lib/SwiftMailer/classes/Swift/InputByteStream.php create mode 100644 lib/SwiftMailer/classes/Swift/IoException.php create mode 100644 lib/SwiftMailer/classes/Swift/KeyCache.php create mode 100644 lib/SwiftMailer/classes/Swift/KeyCache/ArrayKeyCache.php create mode 100644 lib/SwiftMailer/classes/Swift/KeyCache/DiskKeyCache.php create mode 100644 lib/SwiftMailer/classes/Swift/KeyCache/KeyCacheInputStream.php create mode 100644 lib/SwiftMailer/classes/Swift/KeyCache/NullKeyCache.php create mode 100644 lib/SwiftMailer/classes/Swift/KeyCache/SimpleKeyCacheInputStream.php create mode 100644 lib/SwiftMailer/classes/Swift/LoadBalancedTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/MailTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Mailer.php create mode 100644 lib/SwiftMailer/classes/Swift/Mailer/ArrayRecipientIterator.php create mode 100644 lib/SwiftMailer/classes/Swift/Mailer/RecipientIterator.php create mode 100644 lib/SwiftMailer/classes/Swift/MemorySpool.php create mode 100644 lib/SwiftMailer/classes/Swift/Message.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Attachment.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/CharsetObserver.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ContentEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/Base64ContentEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/PlainContentEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoderProxy.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/RawContentEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/EmbeddedFile.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/EncodingObserver.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Grammar.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Header.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/HeaderEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/HeaderEncoder/Base64HeaderEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/HeaderEncoder/QpHeaderEncoder.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/HeaderFactory.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/HeaderSet.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/AbstractHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/DateHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/IdentificationHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/OpenDKIMHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/ParameterizedHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/PathHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Headers/UnstructuredHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/Message.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/MimeEntity.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/MimePart.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/ParameterizedHeader.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/SimpleHeaderFactory.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/SimpleHeaderSet.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/SimpleMessage.php create mode 100644 lib/SwiftMailer/classes/Swift/Mime/SimpleMimeEntity.php create mode 100644 lib/SwiftMailer/classes/Swift/MimePart.php create mode 100644 lib/SwiftMailer/classes/Swift/NullTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/OutputByteStream.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/AntiFloodPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/BandwidthMonitorPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Decorator/Replacements.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/DecoratorPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/ImpersonatePlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Logger.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/LoggerPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Loggers/ArrayLogger.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Loggers/EchoLogger.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/MessageLogger.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Pop/Pop3Connection.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Pop/Pop3Exception.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/PopBeforeSmtpPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/RedirectingPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Reporter.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/ReporterPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Reporters/HitReporter.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Reporters/HtmlReporter.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Sleeper.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/ThrottlerPlugin.php create mode 100644 lib/SwiftMailer/classes/Swift/Plugins/Timer.php create mode 100644 lib/SwiftMailer/classes/Swift/Preferences.php create mode 100644 lib/SwiftMailer/classes/Swift/ReplacementFilterFactory.php create mode 100644 lib/SwiftMailer/classes/Swift/RfcComplianceException.php create mode 100644 lib/SwiftMailer/classes/Swift/SendmailTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/SignedMessage.php create mode 100644 lib/SwiftMailer/classes/Swift/Signer.php create mode 100644 lib/SwiftMailer/classes/Swift/Signers/BodySigner.php create mode 100644 lib/SwiftMailer/classes/Swift/Signers/DKIMSigner.php create mode 100644 lib/SwiftMailer/classes/Swift/Signers/DomainKeySigner.php create mode 100644 lib/SwiftMailer/classes/Swift/Signers/HeaderSigner.php create mode 100644 lib/SwiftMailer/classes/Swift/Signers/OpenDKIMSigner.php create mode 100644 lib/SwiftMailer/classes/Swift/Signers/SMimeSigner.php create mode 100644 lib/SwiftMailer/classes/Swift/SmtpTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Spool.php create mode 100644 lib/SwiftMailer/classes/Swift/SpoolTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/StreamFilter.php create mode 100644 lib/SwiftMailer/classes/Swift/StreamFilters/ByteArrayReplacementFilter.php create mode 100644 lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilter.php create mode 100644 lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilterFactory.php create mode 100644 lib/SwiftMailer/classes/Swift/SwiftException.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/AbstractSmtpTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/Esmtp/AuthHandler.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/Esmtp/Authenticator.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/EsmtpHandler.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/EsmtpTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/FailoverTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/IoBuffer.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/LoadBalancedTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/MailInvoker.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/MailTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/NullTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/SendmailTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/SimpleMailInvoker.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/SmtpAgent.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/SpoolTransport.php create mode 100644 lib/SwiftMailer/classes/Swift/Transport/StreamBuffer.php create mode 100644 lib/SwiftMailer/classes/Swift/TransportException.php create mode 100644 lib/SwiftMailer/classes/Swift/Validate.php create mode 100644 lib/SwiftMailer/dependency_maps/cache_deps.php create mode 100644 lib/SwiftMailer/dependency_maps/message_deps.php create mode 100644 lib/SwiftMailer/dependency_maps/mime_deps.php create mode 100644 lib/SwiftMailer/dependency_maps/transport_deps.php create mode 100644 lib/SwiftMailer/mime_types.php create mode 100644 lib/SwiftMailer/preferences.php create mode 100644 lib/SwiftMailer/swift_init.php create mode 100644 lib/SwiftMailer/swift_required.php create mode 100644 lib/SwiftMailer/swift_required_pear.php create mode 100644 lib/SwiftMailer/swiftmailer_generate_mimes_config.php create mode 100644 lib/SwiftMailer/version.txt create mode 100644 lib/bootstrap/css/bootstrap-theme.css create mode 100644 lib/bootstrap/css/bootstrap-theme.css.map create mode 100644 lib/bootstrap/css/bootstrap-theme.min.css create mode 100644 lib/bootstrap/css/bootstrap-theme.min.css.map create mode 100644 lib/bootstrap/css/bootstrap.css create mode 100644 lib/bootstrap/css/bootstrap.css.map create mode 100644 lib/bootstrap/css/bootstrap.min.css create mode 100644 lib/bootstrap/css/bootstrap.min.css.map create mode 100644 lib/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 lib/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 lib/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 lib/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 lib/bootstrap/js/bootstrap.js create mode 100644 lib/bootstrap/js/bootstrap.min.js create mode 100644 lib/bootstrap/js/npm.js create mode 100644 lib/combine/combine.php create mode 100644 lib/flags/ad.png create mode 100644 lib/flags/ae.png create mode 100644 lib/flags/af.png create mode 100644 lib/flags/ag.png create mode 100644 lib/flags/ai.png create mode 100644 lib/flags/al.png create mode 100644 lib/flags/am.png create mode 100644 lib/flags/an.png create mode 100644 lib/flags/ao.png create mode 100644 lib/flags/ar.png create mode 100644 lib/flags/as.png create mode 100644 lib/flags/at.png create mode 100644 lib/flags/au.png create mode 100644 lib/flags/aw.png create mode 100644 lib/flags/ax.png create mode 100644 lib/flags/az.png create mode 100644 lib/flags/ba.png create mode 100644 lib/flags/bb.png create mode 100644 lib/flags/bd.png create mode 100644 lib/flags/be.png create mode 100644 lib/flags/bf.png create mode 100644 lib/flags/bg.png create mode 100644 lib/flags/bh.png create mode 100644 lib/flags/bi.png create mode 100644 lib/flags/bj.png create mode 100644 lib/flags/bm.png create mode 100644 lib/flags/bn.png create mode 100644 lib/flags/bo.png create mode 100644 lib/flags/br.png create mode 100644 lib/flags/bs.png create mode 100644 lib/flags/bt.png create mode 100644 lib/flags/bv.png create mode 100644 lib/flags/bw.png create mode 100644 lib/flags/by.png create mode 100644 lib/flags/bz.png create mode 100644 lib/flags/ca.png create mode 100644 lib/flags/catalonia.png create mode 100644 lib/flags/cc.png create mode 100644 lib/flags/cd.png create mode 100644 lib/flags/cf.png create mode 100644 lib/flags/cg.png create mode 100644 lib/flags/ch.png create mode 100644 lib/flags/ci.png create mode 100644 lib/flags/ck.png create mode 100644 lib/flags/cl.png create mode 100644 lib/flags/cm.png create mode 100644 lib/flags/cn.png create mode 100644 lib/flags/co.png create mode 100644 lib/flags/cr.png create mode 100644 lib/flags/cs.png create mode 100644 lib/flags/cu.png create mode 100644 lib/flags/cv.png create mode 100644 lib/flags/cx.png create mode 100644 lib/flags/cy.png create mode 100644 lib/flags/cz.png create mode 100644 lib/flags/de.png create mode 100644 lib/flags/dj.png create mode 100644 lib/flags/dk.png create mode 100644 lib/flags/dm.png create mode 100644 lib/flags/do.png create mode 100644 lib/flags/dz.png create mode 100644 lib/flags/ec.png create mode 100644 lib/flags/ee.png create mode 100644 lib/flags/eg.png create mode 100644 lib/flags/eh.png create mode 100644 lib/flags/en.png create mode 100644 lib/flags/england.png create mode 100644 lib/flags/er.png create mode 100644 lib/flags/es.png create mode 100644 lib/flags/et.png create mode 100644 lib/flags/eu.png create mode 100644 lib/flags/fam.png create mode 100644 lib/flags/fi.png create mode 100644 lib/flags/fj.png create mode 100644 lib/flags/fk.png create mode 100644 lib/flags/fm.png create mode 100644 lib/flags/fo.png create mode 100644 lib/flags/fr.png create mode 100644 lib/flags/ga.png create mode 100644 lib/flags/gb.png create mode 100644 lib/flags/gd.png create mode 100644 lib/flags/ge.png create mode 100644 lib/flags/gf.png create mode 100644 lib/flags/gh.png create mode 100644 lib/flags/gi.png create mode 100644 lib/flags/gl.png create mode 100644 lib/flags/gm.png create mode 100644 lib/flags/gn.png create mode 100644 lib/flags/gp.png create mode 100644 lib/flags/gq.png create mode 100644 lib/flags/gr.png create mode 100644 lib/flags/gs.png create mode 100644 lib/flags/gt.png create mode 100644 lib/flags/gu.png create mode 100644 lib/flags/gw.png create mode 100644 lib/flags/gy.png create mode 100644 lib/flags/hk.png create mode 100644 lib/flags/hm.png create mode 100644 lib/flags/hn.png create mode 100644 lib/flags/hr.png create mode 100644 lib/flags/ht.png create mode 100644 lib/flags/hu.png create mode 100644 lib/flags/id.png create mode 100644 lib/flags/ie.png create mode 100644 lib/flags/il.png create mode 100644 lib/flags/in.png create mode 100644 lib/flags/io.png create mode 100644 lib/flags/iq.png create mode 100644 lib/flags/ir.png create mode 100644 lib/flags/is.png create mode 100644 lib/flags/it.png create mode 100644 lib/flags/jm.png create mode 100644 lib/flags/jo.png create mode 100644 lib/flags/jp.png create mode 100644 lib/flags/ke.png create mode 100644 lib/flags/kg.png create mode 100644 lib/flags/kh.png create mode 100644 lib/flags/ki.png create mode 100644 lib/flags/km.png create mode 100644 lib/flags/kn.png create mode 100644 lib/flags/kp.png create mode 100644 lib/flags/kr.png create mode 100644 lib/flags/kw.png create mode 100644 lib/flags/ky.png create mode 100644 lib/flags/kz.png create mode 100644 lib/flags/la.png create mode 100644 lib/flags/lb.png create mode 100644 lib/flags/lc.png create mode 100644 lib/flags/li.png create mode 100644 lib/flags/lk.png create mode 100644 lib/flags/lr.png create mode 100644 lib/flags/ls.png create mode 100644 lib/flags/lt.png create mode 100644 lib/flags/lu.png create mode 100644 lib/flags/lv.png create mode 100644 lib/flags/ly.png create mode 100644 lib/flags/ma.png create mode 100644 lib/flags/mc.png create mode 100644 lib/flags/md.png create mode 100644 lib/flags/me.png create mode 100644 lib/flags/mg.png create mode 100644 lib/flags/mh.png create mode 100644 lib/flags/mk.png create mode 100644 lib/flags/ml.png create mode 100644 lib/flags/mm.png create mode 100644 lib/flags/mn.png create mode 100644 lib/flags/mo.png create mode 100644 lib/flags/mp.png create mode 100644 lib/flags/mq.png create mode 100644 lib/flags/mr.png create mode 100644 lib/flags/ms.png create mode 100644 lib/flags/mt.png create mode 100644 lib/flags/mu.png create mode 100644 lib/flags/mv.png create mode 100644 lib/flags/mw.png create mode 100644 lib/flags/mx.png create mode 100644 lib/flags/my.png create mode 100644 lib/flags/mz.png create mode 100644 lib/flags/na.png create mode 100644 lib/flags/nc.png create mode 100644 lib/flags/ne.png create mode 100644 lib/flags/nf.png create mode 100644 lib/flags/ng.png create mode 100644 lib/flags/ni.png create mode 100644 lib/flags/nl.png create mode 100644 lib/flags/no.png create mode 100644 lib/flags/np.png create mode 100644 lib/flags/nr.png create mode 100644 lib/flags/nu.png create mode 100644 lib/flags/nz.png create mode 100644 lib/flags/om.png create mode 100644 lib/flags/pa.png create mode 100644 lib/flags/pe.png create mode 100644 lib/flags/pf.png create mode 100644 lib/flags/pg.png create mode 100644 lib/flags/ph.png create mode 100644 lib/flags/pk.png create mode 100644 lib/flags/pl.png create mode 100644 lib/flags/pm.png create mode 100644 lib/flags/pn.png create mode 100644 lib/flags/pr.png create mode 100644 lib/flags/ps.png create mode 100644 lib/flags/pt.png create mode 100644 lib/flags/pw.png create mode 100644 lib/flags/py.png create mode 100644 lib/flags/qa.png create mode 100644 lib/flags/re.png create mode 100644 lib/flags/ro.png create mode 100644 lib/flags/rs.png create mode 100644 lib/flags/ru.png create mode 100644 lib/flags/rw.png create mode 100644 lib/flags/sa.png create mode 100644 lib/flags/sb.png create mode 100644 lib/flags/sc.png create mode 100644 lib/flags/scotland.png create mode 100644 lib/flags/sd.png create mode 100644 lib/flags/se.png create mode 100644 lib/flags/sg.png create mode 100644 lib/flags/sh.png create mode 100644 lib/flags/si.png create mode 100644 lib/flags/sj.png create mode 100644 lib/flags/sk.png create mode 100644 lib/flags/sl.png create mode 100644 lib/flags/sm.png create mode 100644 lib/flags/sn.png create mode 100644 lib/flags/so.png create mode 100644 lib/flags/sp.png create mode 100644 lib/flags/sr.png create mode 100644 lib/flags/st.png create mode 100644 lib/flags/sv.png create mode 100644 lib/flags/sy.png create mode 100644 lib/flags/sz.png create mode 100644 lib/flags/tc.png create mode 100644 lib/flags/td.png create mode 100644 lib/flags/tf.png create mode 100644 lib/flags/tg.png create mode 100644 lib/flags/th.png create mode 100644 lib/flags/tj.png create mode 100644 lib/flags/tk.png create mode 100644 lib/flags/tl.png create mode 100644 lib/flags/tm.png create mode 100644 lib/flags/tn.png create mode 100644 lib/flags/to.png create mode 100644 lib/flags/tr.png create mode 100644 lib/flags/tt.png create mode 100644 lib/flags/tv.png create mode 100644 lib/flags/tw.png create mode 100644 lib/flags/tz.png create mode 100644 lib/flags/ua.png create mode 100644 lib/flags/ug.png create mode 100644 lib/flags/um.png create mode 100644 lib/flags/uy.png create mode 100644 lib/flags/uz.png create mode 100644 lib/flags/va.png create mode 100644 lib/flags/vc.png create mode 100644 lib/flags/ve.png create mode 100644 lib/flags/vg.png create mode 100644 lib/flags/vi.png create mode 100644 lib/flags/vn.png create mode 100644 lib/flags/vu.png create mode 100644 lib/flags/wales.png create mode 100644 lib/flags/wf.png create mode 100644 lib/flags/ws.png create mode 100644 lib/flags/ye.png create mode 100644 lib/flags/yt.png create mode 100644 lib/flags/za.png create mode 100644 lib/flags/zm.png create mode 100644 lib/flags/zw.png create mode 100644 lib/kcaptcha/fonts/.htaccess create mode 100644 lib/kcaptcha/fonts/palatino_linotype_bold.png create mode 100644 lib/kcaptcha/fonts/perpetua_bold.png create mode 100644 lib/kcaptcha/fonts/times_bold.png create mode 100644 lib/kcaptcha/form_example.php create mode 100644 lib/kcaptcha/index.php create mode 100644 lib/kcaptcha/kcaptcha.php create mode 100644 lib/kcaptcha/kcaptcha_config.php create mode 100644 lib/kcaptcha/util/font_preparer.php create mode 100644 lib/mobile_detect/Mobile_Detect.php create mode 100644 lib/redactor/ckeditor/.htaccess create mode 100644 lib/redactor/ckeditor/adapters/ckeditor.php create mode 100644 lib/redactor/ckeditor/adapters/jquery.js create mode 100644 lib/redactor/ckeditor/block.js create mode 100644 lib/redactor/ckeditor/ckeditor.js create mode 100644 lib/redactor/ckeditor/config.default.js create mode 100644 lib/redactor/ckeditor/config.js create mode 100644 lib/redactor/ckeditor/contents.css create mode 100644 lib/redactor/ckeditor/lang/af.js create mode 100644 lib/redactor/ckeditor/lang/ar.js create mode 100644 lib/redactor/ckeditor/lang/az.js create mode 100644 lib/redactor/ckeditor/lang/bg.js create mode 100644 lib/redactor/ckeditor/lang/bn.js create mode 100644 lib/redactor/ckeditor/lang/bs.js create mode 100644 lib/redactor/ckeditor/lang/ca.js create mode 100644 lib/redactor/ckeditor/lang/cs.js create mode 100644 lib/redactor/ckeditor/lang/cy.js create mode 100644 lib/redactor/ckeditor/lang/da.js create mode 100644 lib/redactor/ckeditor/lang/de-ch.js create mode 100644 lib/redactor/ckeditor/lang/de.js create mode 100644 lib/redactor/ckeditor/lang/el.js create mode 100644 lib/redactor/ckeditor/lang/en-au.js create mode 100644 lib/redactor/ckeditor/lang/en-ca.js create mode 100644 lib/redactor/ckeditor/lang/en-gb.js create mode 100644 lib/redactor/ckeditor/lang/en.js create mode 100644 lib/redactor/ckeditor/lang/eo.js create mode 100644 lib/redactor/ckeditor/lang/es.js create mode 100644 lib/redactor/ckeditor/lang/et.js create mode 100644 lib/redactor/ckeditor/lang/eu.js create mode 100644 lib/redactor/ckeditor/lang/fa.js create mode 100644 lib/redactor/ckeditor/lang/fi.js create mode 100644 lib/redactor/ckeditor/lang/fo.js create mode 100644 lib/redactor/ckeditor/lang/fr-ca.js create mode 100644 lib/redactor/ckeditor/lang/fr.js create mode 100644 lib/redactor/ckeditor/lang/gl.js create mode 100644 lib/redactor/ckeditor/lang/gu.js create mode 100644 lib/redactor/ckeditor/lang/he.js create mode 100644 lib/redactor/ckeditor/lang/hi.js create mode 100644 lib/redactor/ckeditor/lang/hr.js create mode 100644 lib/redactor/ckeditor/lang/hu.js create mode 100644 lib/redactor/ckeditor/lang/id.js create mode 100644 lib/redactor/ckeditor/lang/is.js create mode 100644 lib/redactor/ckeditor/lang/it.js create mode 100644 lib/redactor/ckeditor/lang/ja.js create mode 100644 lib/redactor/ckeditor/lang/ka.js create mode 100644 lib/redactor/ckeditor/lang/km.js create mode 100644 lib/redactor/ckeditor/lang/ko.js create mode 100644 lib/redactor/ckeditor/lang/ku.js create mode 100644 lib/redactor/ckeditor/lang/lt.js create mode 100644 lib/redactor/ckeditor/lang/lv.js create mode 100644 lib/redactor/ckeditor/lang/mk.js create mode 100644 lib/redactor/ckeditor/lang/mn.js create mode 100644 lib/redactor/ckeditor/lang/ms.js create mode 100644 lib/redactor/ckeditor/lang/nb.js create mode 100644 lib/redactor/ckeditor/lang/nl.js create mode 100644 lib/redactor/ckeditor/lang/no.js create mode 100644 lib/redactor/ckeditor/lang/oc.js create mode 100644 lib/redactor/ckeditor/lang/pl.js create mode 100644 lib/redactor/ckeditor/lang/pt-br.js create mode 100644 lib/redactor/ckeditor/lang/pt.js create mode 100644 lib/redactor/ckeditor/lang/ro.js create mode 100644 lib/redactor/ckeditor/lang/ru.js create mode 100644 lib/redactor/ckeditor/lang/si.js create mode 100644 lib/redactor/ckeditor/lang/sk.js create mode 100644 lib/redactor/ckeditor/lang/sl.js create mode 100644 lib/redactor/ckeditor/lang/sq.js create mode 100644 lib/redactor/ckeditor/lang/sr-latn.js create mode 100644 lib/redactor/ckeditor/lang/sr.js create mode 100644 lib/redactor/ckeditor/lang/sv.js create mode 100644 lib/redactor/ckeditor/lang/th.js create mode 100644 lib/redactor/ckeditor/lang/tr.js create mode 100644 lib/redactor/ckeditor/lang/tt.js create mode 100644 lib/redactor/ckeditor/lang/ug.js create mode 100644 lib/redactor/ckeditor/lang/uk.js create mode 100644 lib/redactor/ckeditor/lang/vi.js create mode 100644 lib/redactor/ckeditor/lang/zh-cn.js create mode 100644 lib/redactor/ckeditor/lang/zh.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/af.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/az.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/da.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/de-ch.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/de.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/el.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/en.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/es.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/et.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/eu.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/fo.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/he.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/id.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/it.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/km.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/no.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/oc.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/si.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/th.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js create mode 100644 lib/redactor/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js create mode 100644 lib/redactor/ckeditor/plugins/about/dialogs/about.js create mode 100644 lib/redactor/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png create mode 100644 lib/redactor/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100644 lib/redactor/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/css/codemirror.ckeditor.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/css/codemirror.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/css/codemirror.min.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/icons/autocomplete.png create mode 100755 lib/redactor/ckeditor/plugins/codemirror/icons/autoformat.png create mode 100755 lib/redactor/ckeditor/plugins/codemirror/icons/commentselectedrange.png create mode 100755 lib/redactor/ckeditor/plugins/codemirror/icons/searchcode.png create mode 100755 lib/redactor/ckeditor/plugins/codemirror/icons/uncommentselectedrange.png create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/comment/comment.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/comment/continuecomment.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/dialog/dialog.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/dialog/dialog.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/edit/closebrackets.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/edit/closetag.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/edit/continuelist.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/edit/matchbrackets.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/edit/matchtags.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/edit/trailingspace.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/brace-fold.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/comment-fold.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/foldcode.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/foldgutter.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/foldgutter.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/indent-fold.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/markdown-fold.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/fold/xml-fold.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/format/autoFormatAll.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/format/formatting.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/anyword-hint.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/css-hint.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/html-hint.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/javascript-hint.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/show-hint.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/show-hint.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/sql-hint.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/hint/xml-hint.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/mode/loadmode.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/mode/multiplex.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/mode/multiplex_test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/mode/overlay.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/mode/simple.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/search/jump-to-line.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/search/match-highlighter.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/search/matchesonscrollbar.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/search/matchesonscrollbar.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/search/search.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/search/searchcursor.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/selection/active-line.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/selection/mark-selection.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/addon/selection/selection-pointer.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/beautify-html.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/beautify.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/beautify.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.addons.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.addons.search.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.mode.bbcode.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.mode.bbcodemixed.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.mode.htmlmixed.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.mode.javascript.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/codemirror.mode.php.min.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/bbcode/bbcode.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/bbcode/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/bbcodemixed/bbcodemixed.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/bbcodemixed/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/clike/clike.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/clike/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/clike/scala.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/clike/test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/css.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/gss.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/gss_test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/less.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/less_test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/scss.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/scss_test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/css/test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/htmlembedded/htmlembedded.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/htmlembedded/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/htmlmixed/htmlmixed.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/htmlmixed/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/javascript/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/javascript/javascript.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/javascript/json-ld.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/javascript/test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/javascript/typescript.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/php/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/php/php.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/php/test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/xml/index.html create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/xml/test.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/js/mode/xml/xml.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/af.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ar.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/bg.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/bn.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/bs.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ca.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/cs.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/cy.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/da.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/de.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/el.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/en-au.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/en-ca.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/en-gb.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/en.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/eo.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/es.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/et.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/eu.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/fa.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/fi.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/fo.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/fr-ca.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/fr.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/gl.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/gu.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/he.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/hi.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/hr.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/hu.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/is.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/it.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ja.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ka.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/km.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ko.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ku.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/lt.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/lv.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/mk.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/mn.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ms.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/nb.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/nl.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/no.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/pl.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/pt-br.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/pt.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ro.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ru.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/sk.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/sl.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/sr-latn.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/sr.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/sv.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/th.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/tr.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/ug.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/uk.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/vi.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/zh-cn.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/lang/zh.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/plugin.js create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/3024-day.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/3024-night.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/abcdef.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/ambiance-mobile.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/ambiance.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/base16-dark.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/base16-light.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/bespin.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/blackboard.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/cobalt.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/colorforth.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/dracula.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/duotone-dark.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/duotone-light.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/eclipse.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/elegant.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/erlang-dark.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/hopscotch.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/icecoder.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/isotope.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/lesser-dark.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/liquibyte.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/material.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/mbo.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/mdn-like.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/midnight.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/monokai.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/neat.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/neo.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/night.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/panda-syntax.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/paraiso-dark.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/paraiso-light.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/pastel-on-dark.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/railscasts.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/rubyblue.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/seti.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/solarized.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/the-matrix.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/tomorrow-night-bright.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/tomorrow-night-eighties.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/ttcn.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/twilight.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/vibrant-ink.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/xq-dark.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/xq-light.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/yeti.css create mode 100755 lib/redactor/ckeditor/plugins/codemirror/theme/zenburn.css create mode 100644 lib/redactor/ckeditor/plugins/colordialog/dialogs/colordialog.css create mode 100644 lib/redactor/ckeditor/plugins/colordialog/dialogs/colordialog.js create mode 100644 lib/redactor/ckeditor/plugins/copyformatting/cursors/cursor-disabled.svg create mode 100644 lib/redactor/ckeditor/plugins/copyformatting/cursors/cursor.svg create mode 100644 lib/redactor/ckeditor/plugins/copyformatting/styles/copyformatting.css create mode 100644 lib/redactor/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 lib/redactor/ckeditor/plugins/div/dialogs/div.js create mode 100644 lib/redactor/ckeditor/plugins/find/dialogs/find.js create mode 100644 lib/redactor/ckeditor/plugins/flash/dialogs/flash.js create mode 100644 lib/redactor/ckeditor/plugins/flash/images/placeholder.png create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/button.js create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/checkbox.js create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/form.js create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/hiddenfield.js create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/radio.js create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/select.js create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/textarea.js create mode 100644 lib/redactor/ckeditor/plugins/forms/dialogs/textfield.js create mode 100644 lib/redactor/ckeditor/plugins/forms/images/hiddenfield.gif create mode 100644 lib/redactor/ckeditor/plugins/icons.png create mode 100644 lib/redactor/ckeditor/plugins/icons_hidpi.png create mode 100644 lib/redactor/ckeditor/plugins/iframe/dialogs/iframe.js create mode 100644 lib/redactor/ckeditor/plugins/iframe/images/placeholder.png create mode 100644 lib/redactor/ckeditor/plugins/image/dialogs/image.js create mode 100644 lib/redactor/ckeditor/plugins/image/images/noimage.png create mode 100644 lib/redactor/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 lib/redactor/ckeditor/plugins/link/dialogs/link.js create mode 100644 lib/redactor/ckeditor/plugins/link/images/anchor.png create mode 100644 lib/redactor/ckeditor/plugins/link/images/hidpi/anchor.png create mode 100644 lib/redactor/ckeditor/plugins/liststyle/dialogs/liststyle.js create mode 100644 lib/redactor/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png create mode 100644 lib/redactor/ckeditor/plugins/magicline/images/hidpi/icon.png create mode 100644 lib/redactor/ckeditor/plugins/magicline/images/icon-rtl.png create mode 100644 lib/redactor/ckeditor/plugins/magicline/images/icon.png create mode 100644 lib/redactor/ckeditor/plugins/pagebreak/images/pagebreak.gif create mode 100644 lib/redactor/ckeditor/plugins/pastefromword/filter/default.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/dialogs/placeholder.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/icons/hidpi/placeholder.png create mode 100644 lib/redactor/ckeditor/plugins/placeholder/icons/placeholder.png create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/_translationstatus.txt create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/bg.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/cs.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/cy.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/da.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/de.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/el.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/en.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/eo.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/et.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/fa.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/fi.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/fr.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/he.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/hr.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/it.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/nb.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/nl.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/no.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/pl.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/tr.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/ug.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/uk.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/vi.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/lang/zh-cn.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/plugin.js create mode 100644 lib/redactor/ckeditor/plugins/placeholder/samples/placeholder.html create mode 100644 lib/redactor/ckeditor/plugins/preview/preview.html create mode 100644 lib/redactor/ckeditor/plugins/savedocs/plugin.js create mode 100644 lib/redactor/ckeditor/plugins/scayt/CHANGELOG.md create mode 100644 lib/redactor/ckeditor/plugins/scayt/LICENSE.md create mode 100644 lib/redactor/ckeditor/plugins/scayt/README.md create mode 100644 lib/redactor/ckeditor/plugins/scayt/dialogs/options.js create mode 100644 lib/redactor/ckeditor/plugins/scayt/dialogs/toolbar.css create mode 100644 lib/redactor/ckeditor/plugins/scayt/skins/moono-lisa/scayt.css create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_address.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_blockquote.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_div.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_h1.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_h2.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_h3.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_h4.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_h5.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_h6.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_p.png create mode 100644 lib/redactor/ckeditor/plugins/showblocks/images/block_pre.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/dialogs/smiley.js create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/angel_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/angel_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/angry_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/angry_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/broken_heart.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/broken_heart.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/confused_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/confused_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/cry_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/cry_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/devil_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/devil_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/embaressed_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/embarrassed_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/embarrassed_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/envelope.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/envelope.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/heart.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/heart.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/kiss.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/kiss.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/lightbulb.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/lightbulb.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/omg_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/omg_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/regular_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/regular_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/sad_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/sad_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/shades_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/shades_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/teeth_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/teeth_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/thumbs_down.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/thumbs_down.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/thumbs_up.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/thumbs_up.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/tongue_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/tongue_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/tounge_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/wink_smile.gif create mode 100644 lib/redactor/ckeditor/plugins/smiley/images/wink_smile.png create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/af.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/ar.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/az.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/bg.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/ca.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/cs.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/cy.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/da.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/de-ch.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/de.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/el.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/en.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/eo.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/es.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/et.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/eu.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/fa.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/fi.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/fr.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/gl.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/he.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/hr.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/hu.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/id.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/it.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/ja.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/km.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/ko.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/ku.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/lt.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/lv.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/nb.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/nl.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/no.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/oc.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/pl.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/pt.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/ru.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/si.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/sk.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/sl.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/sq.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/sv.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/th.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/tr.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/tt.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/ug.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/uk.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/vi.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/lang/zh.js create mode 100644 lib/redactor/ckeditor/plugins/specialchar/dialogs/specialchar.js create mode 100644 lib/redactor/ckeditor/plugins/table/dialogs/table.js create mode 100644 lib/redactor/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 lib/redactor/ckeditor/plugins/templates/dialogs/templates.css create mode 100644 lib/redactor/ckeditor/plugins/templates/dialogs/templates.js create mode 100644 lib/redactor/ckeditor/plugins/templates/templates/default.js create mode 100644 lib/redactor/ckeditor/plugins/templates/templates/images/template1.gif create mode 100644 lib/redactor/ckeditor/plugins/templates/templates/images/template2.gif create mode 100644 lib/redactor/ckeditor/plugins/templates/templates/images/template3.gif create mode 100644 lib/redactor/ckeditor/plugins/wsc/LICENSE.md create mode 100644 lib/redactor/ckeditor/plugins/wsc/README.md create mode 100644 lib/redactor/ckeditor/plugins/wsc/dialogs/ciframe.html create mode 100644 lib/redactor/ckeditor/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 lib/redactor/ckeditor/plugins/wsc/dialogs/wsc.css create mode 100644 lib/redactor/ckeditor/plugins/wsc/dialogs/wsc.js create mode 100644 lib/redactor/ckeditor/plugins/wsc/dialogs/wsc_ie.js create mode 100644 lib/redactor/ckeditor/plugins/wsc/skins/moono-lisa/wsc.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/dialog.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/dialog_ie.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/dialog_ie8.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/dialog_iequirks.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/editor.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/editor_gecko.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/editor_ie.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/editor_ie8.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/editor_iequirks.css create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/icons.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/icons_hidpi.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/arrow.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/close.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/hidpi/close.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/hidpi/lock.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/hidpi/refresh.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/lock-open.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/lock.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/refresh.png create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/images/spinner.gif create mode 100644 lib/redactor/ckeditor/skins/moono-lisa/readme.md create mode 100644 lib/redactor/ckeditor/styles.js create mode 100644 lib/redactor/ckeditor/sysblock.js create mode 100644 lib/redactor/codemirror/addon/comment/comment.js create mode 100644 lib/redactor/codemirror/addon/comment/continuecomment.js create mode 100644 lib/redactor/codemirror/addon/dialog/dialog.css create mode 100644 lib/redactor/codemirror/addon/dialog/dialog.js create mode 100644 lib/redactor/codemirror/addon/display/autorefresh.js create mode 100644 lib/redactor/codemirror/addon/display/fullscreen.css create mode 100644 lib/redactor/codemirror/addon/display/fullscreen.js create mode 100644 lib/redactor/codemirror/addon/display/panel.js create mode 100644 lib/redactor/codemirror/addon/display/placeholder.js create mode 100644 lib/redactor/codemirror/addon/display/rulers.js create mode 100644 lib/redactor/codemirror/addon/edit/closebrackets.js create mode 100644 lib/redactor/codemirror/addon/edit/closetag.js create mode 100644 lib/redactor/codemirror/addon/edit/continuelist.js create mode 100644 lib/redactor/codemirror/addon/edit/matchbrackets.js create mode 100644 lib/redactor/codemirror/addon/edit/matchtags.js create mode 100644 lib/redactor/codemirror/addon/edit/trailingspace.js create mode 100644 lib/redactor/codemirror/addon/fold/brace-fold.js create mode 100644 lib/redactor/codemirror/addon/fold/comment-fold.js create mode 100644 lib/redactor/codemirror/addon/fold/foldcode.js create mode 100644 lib/redactor/codemirror/addon/fold/foldgutter.css create mode 100644 lib/redactor/codemirror/addon/fold/foldgutter.js create mode 100644 lib/redactor/codemirror/addon/fold/indent-fold.js create mode 100644 lib/redactor/codemirror/addon/fold/markdown-fold.js create mode 100644 lib/redactor/codemirror/addon/fold/xml-fold.js create mode 100644 lib/redactor/codemirror/addon/hint/anyword-hint.js create mode 100644 lib/redactor/codemirror/addon/hint/css-hint.js create mode 100644 lib/redactor/codemirror/addon/hint/html-hint.js create mode 100644 lib/redactor/codemirror/addon/hint/javascript-hint.js create mode 100644 lib/redactor/codemirror/addon/hint/show-hint.css create mode 100644 lib/redactor/codemirror/addon/hint/show-hint.js create mode 100644 lib/redactor/codemirror/addon/hint/sql-hint.js create mode 100644 lib/redactor/codemirror/addon/hint/xml-hint.js create mode 100644 lib/redactor/codemirror/addon/lint/coffeescript-lint.js create mode 100644 lib/redactor/codemirror/addon/lint/css-lint.js create mode 100644 lib/redactor/codemirror/addon/lint/html-lint.js create mode 100644 lib/redactor/codemirror/addon/lint/javascript-lint.js create mode 100644 lib/redactor/codemirror/addon/lint/json-lint.js create mode 100644 lib/redactor/codemirror/addon/lint/lint.css create mode 100644 lib/redactor/codemirror/addon/lint/lint.js create mode 100644 lib/redactor/codemirror/addon/lint/yaml-lint.js create mode 100644 lib/redactor/codemirror/addon/merge/merge.css create mode 100644 lib/redactor/codemirror/addon/merge/merge.js create mode 100644 lib/redactor/codemirror/addon/mode/loadmode.js create mode 100644 lib/redactor/codemirror/addon/mode/multiplex.js create mode 100644 lib/redactor/codemirror/addon/mode/multiplex_test.js create mode 100644 lib/redactor/codemirror/addon/mode/overlay.js create mode 100644 lib/redactor/codemirror/addon/mode/simple.js create mode 100644 lib/redactor/codemirror/addon/runmode/colorize.js create mode 100644 lib/redactor/codemirror/addon/runmode/runmode-standalone.js create mode 100644 lib/redactor/codemirror/addon/runmode/runmode.js create mode 100644 lib/redactor/codemirror/addon/runmode/runmode.node.js create mode 100644 lib/redactor/codemirror/addon/scroll/annotatescrollbar.js create mode 100644 lib/redactor/codemirror/addon/scroll/scrollpastend.js create mode 100644 lib/redactor/codemirror/addon/scroll/simplescrollbars.css create mode 100644 lib/redactor/codemirror/addon/scroll/simplescrollbars.js create mode 100644 lib/redactor/codemirror/addon/search/jump-to-line.js create mode 100644 lib/redactor/codemirror/addon/search/match-highlighter.js create mode 100644 lib/redactor/codemirror/addon/search/matchesonscrollbar.css create mode 100644 lib/redactor/codemirror/addon/search/matchesonscrollbar.js create mode 100644 lib/redactor/codemirror/addon/search/search.js create mode 100644 lib/redactor/codemirror/addon/search/searchcursor.js create mode 100644 lib/redactor/codemirror/addon/selection/active-line.js create mode 100644 lib/redactor/codemirror/addon/selection/mark-selection.js create mode 100644 lib/redactor/codemirror/addon/selection/selection-pointer.js create mode 100644 lib/redactor/codemirror/addon/tern/tern.css create mode 100644 lib/redactor/codemirror/addon/tern/tern.js create mode 100644 lib/redactor/codemirror/addon/tern/worker.js create mode 100644 lib/redactor/codemirror/addon/wrap/hardwrap.js create mode 100644 lib/redactor/codemirror/codemirror_connect.tpl create mode 100644 lib/redactor/codemirror/codemirror_editor.tpl create mode 100644 lib/redactor/codemirror/config.js create mode 100644 lib/redactor/codemirror/config_css.js create mode 100644 lib/redactor/codemirror/functions.js create mode 100644 lib/redactor/codemirror/index.php create mode 100644 lib/redactor/codemirror/lib/codemirror.css create mode 100644 lib/redactor/codemirror/lib/codemirror.js create mode 100644 lib/redactor/codemirror/lib/util/closetag.js create mode 100644 lib/redactor/codemirror/lib/util/dialog.css create mode 100644 lib/redactor/codemirror/lib/util/dialog.js create mode 100644 lib/redactor/codemirror/lib/util/foldcode.js create mode 100644 lib/redactor/codemirror/lib/util/formatting.js create mode 100644 lib/redactor/codemirror/lib/util/javascript-hint.js create mode 100644 lib/redactor/codemirror/lib/util/loadmode.js create mode 100644 lib/redactor/codemirror/lib/util/match-highlighter.js create mode 100644 lib/redactor/codemirror/lib/util/multiplex.js create mode 100644 lib/redactor/codemirror/lib/util/overlay.js create mode 100644 lib/redactor/codemirror/lib/util/pig-hint.js create mode 100644 lib/redactor/codemirror/lib/util/runmode-standalone.js create mode 100644 lib/redactor/codemirror/lib/util/runmode.js create mode 100644 lib/redactor/codemirror/lib/util/search.js create mode 100644 lib/redactor/codemirror/lib/util/searchcursor.js create mode 100644 lib/redactor/codemirror/lib/util/simple-hint.css create mode 100644 lib/redactor/codemirror/lib/util/simple-hint.js create mode 100644 lib/redactor/codemirror/lib/util/xml-hint.js create mode 100644 lib/redactor/codemirror/mode/clike/clike.js create mode 100644 lib/redactor/codemirror/mode/clike/index.html create mode 100644 lib/redactor/codemirror/mode/clike/scala.html create mode 100644 lib/redactor/codemirror/mode/clike/test.js create mode 100644 lib/redactor/codemirror/mode/css/css.js create mode 100644 lib/redactor/codemirror/mode/css/gss.html create mode 100644 lib/redactor/codemirror/mode/css/gss_test.js create mode 100644 lib/redactor/codemirror/mode/css/index.html create mode 100644 lib/redactor/codemirror/mode/css/less.html create mode 100644 lib/redactor/codemirror/mode/css/less_test.js create mode 100644 lib/redactor/codemirror/mode/css/scss.html create mode 100644 lib/redactor/codemirror/mode/css/scss_test.js create mode 100644 lib/redactor/codemirror/mode/css/test.js create mode 100644 lib/redactor/codemirror/mode/htmlembedded/htmlembedded.js create mode 100644 lib/redactor/codemirror/mode/htmlembedded/index.html create mode 100644 lib/redactor/codemirror/mode/htmlmixed/htmlmixed.js create mode 100644 lib/redactor/codemirror/mode/htmlmixed/index.html create mode 100644 lib/redactor/codemirror/mode/javascript/index.html create mode 100644 lib/redactor/codemirror/mode/javascript/javascript.js create mode 100644 lib/redactor/codemirror/mode/javascript/json-ld.html create mode 100644 lib/redactor/codemirror/mode/javascript/test.js create mode 100644 lib/redactor/codemirror/mode/javascript/typescript.html create mode 100644 lib/redactor/codemirror/mode/livescript/index.html create mode 100644 lib/redactor/codemirror/mode/livescript/livescript.js create mode 100644 lib/redactor/codemirror/mode/php/index.html create mode 100644 lib/redactor/codemirror/mode/php/php.js create mode 100644 lib/redactor/codemirror/mode/php/test.js create mode 100644 lib/redactor/codemirror/mode/smarty/index.html create mode 100644 lib/redactor/codemirror/mode/smarty/smarty.js create mode 100644 lib/redactor/codemirror/mode/sql/index.html create mode 100644 lib/redactor/codemirror/mode/sql/sql.js create mode 100644 lib/redactor/codemirror/mode/xml/index.html create mode 100644 lib/redactor/codemirror/mode/xml/test.js create mode 100644 lib/redactor/codemirror/mode/xml/xml.js create mode 100644 lib/redactor/codemirror/theme/3024-day.css create mode 100644 lib/redactor/codemirror/theme/3024-night.css create mode 100644 lib/redactor/codemirror/theme/abcdef.css create mode 100644 lib/redactor/codemirror/theme/ambiance-mobile.css create mode 100644 lib/redactor/codemirror/theme/ambiance.css create mode 100644 lib/redactor/codemirror/theme/base16-dark.css create mode 100644 lib/redactor/codemirror/theme/base16-light.css create mode 100644 lib/redactor/codemirror/theme/bespin.css create mode 100644 lib/redactor/codemirror/theme/blackboard.css create mode 100644 lib/redactor/codemirror/theme/cobalt.css create mode 100644 lib/redactor/codemirror/theme/colorforth.css create mode 100644 lib/redactor/codemirror/theme/dracula.css create mode 100644 lib/redactor/codemirror/theme/duotone-dark.css create mode 100644 lib/redactor/codemirror/theme/duotone-light.css create mode 100644 lib/redactor/codemirror/theme/eclipse.css create mode 100644 lib/redactor/codemirror/theme/elegant.css create mode 100644 lib/redactor/codemirror/theme/erlang-dark.css create mode 100644 lib/redactor/codemirror/theme/hopscotch.css create mode 100644 lib/redactor/codemirror/theme/icecoder.css create mode 100644 lib/redactor/codemirror/theme/isotope.css create mode 100644 lib/redactor/codemirror/theme/lesser-dark.css create mode 100644 lib/redactor/codemirror/theme/liquibyte.css create mode 100644 lib/redactor/codemirror/theme/material.css create mode 100644 lib/redactor/codemirror/theme/mbo.css create mode 100644 lib/redactor/codemirror/theme/mdn-like.css create mode 100644 lib/redactor/codemirror/theme/midnight.css create mode 100644 lib/redactor/codemirror/theme/monokai.css create mode 100644 lib/redactor/codemirror/theme/neat.css create mode 100644 lib/redactor/codemirror/theme/neo.css create mode 100644 lib/redactor/codemirror/theme/night.css create mode 100644 lib/redactor/codemirror/theme/panda-syntax.css create mode 100644 lib/redactor/codemirror/theme/paraiso-dark.css create mode 100644 lib/redactor/codemirror/theme/paraiso-light.css create mode 100644 lib/redactor/codemirror/theme/pastel-on-dark.css create mode 100644 lib/redactor/codemirror/theme/railscasts.css create mode 100644 lib/redactor/codemirror/theme/rubyblue.css create mode 100644 lib/redactor/codemirror/theme/seti.css create mode 100644 lib/redactor/codemirror/theme/solarized.css create mode 100644 lib/redactor/codemirror/theme/the-matrix.css create mode 100644 lib/redactor/codemirror/theme/tomorrow-night-bright.css create mode 100644 lib/redactor/codemirror/theme/tomorrow-night-eighties.css create mode 100644 lib/redactor/codemirror/theme/ttcn.css create mode 100644 lib/redactor/codemirror/theme/twilight.css create mode 100644 lib/redactor/codemirror/theme/vibrant-ink.css create mode 100644 lib/redactor/codemirror/theme/xq-dark.css create mode 100644 lib/redactor/codemirror/theme/xq-light.css create mode 100644 lib/redactor/codemirror/theme/yeti.css create mode 100644 lib/redactor/codemirror/theme/zenburn.css create mode 100755 lib/redactor/elfinder/css/elfinder.full.css create mode 100755 lib/redactor/elfinder/css/elfinder.min.css create mode 100755 lib/redactor/elfinder/css/theme.css create mode 100755 lib/redactor/elfinder/img/arrows-active.png create mode 100755 lib/redactor/elfinder/img/arrows-normal.png create mode 100755 lib/redactor/elfinder/img/crop.gif create mode 100755 lib/redactor/elfinder/img/dialogs.png create mode 100755 lib/redactor/elfinder/img/icons-big.png create mode 100755 lib/redactor/elfinder/img/icons-small.png create mode 100755 lib/redactor/elfinder/img/logo.png create mode 100755 lib/redactor/elfinder/img/progress.gif create mode 100755 lib/redactor/elfinder/img/quicklook-bg.png create mode 100755 lib/redactor/elfinder/img/quicklook-icons.png create mode 100755 lib/redactor/elfinder/img/resize.png create mode 100755 lib/redactor/elfinder/img/spinner-mini.gif create mode 100644 lib/redactor/elfinder/img/titleBg.png create mode 100755 lib/redactor/elfinder/img/toolbar.png create mode 100755 lib/redactor/elfinder/img/volume_icon_box.png create mode 100755 lib/redactor/elfinder/img/volume_icon_dropbox.png create mode 100755 lib/redactor/elfinder/img/volume_icon_ftp.png create mode 100755 lib/redactor/elfinder/img/volume_icon_googledrive.png create mode 100755 lib/redactor/elfinder/img/volume_icon_local.png create mode 100755 lib/redactor/elfinder/img/volume_icon_onedrive.png create mode 100755 lib/redactor/elfinder/img/volume_icon_sql.png create mode 100755 lib/redactor/elfinder/inc/MySQLStorage.sql create mode 100755 lib/redactor/elfinder/inc/autoload.php create mode 100755 lib/redactor/elfinder/inc/connector.minimal.php-dist create mode 100755 lib/redactor/elfinder/inc/connector.php create mode 100755 lib/redactor/elfinder/inc/connector.php-dist create mode 100644 lib/redactor/elfinder/inc/connector_template.php create mode 100755 lib/redactor/elfinder/inc/elFinder.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderConnector.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderFlysystemGoogleDriveNetmount.php create mode 100755 lib/redactor/elfinder/inc/elFinderPlugin.php create mode 100755 lib/redactor/elfinder/inc/elFinderSession.php create mode 100755 lib/redactor/elfinder/inc/elFinderSessionInterface.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeBox.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeDriver.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeDropbox.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeDropbox2.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeFTP.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeGoogleDrive.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeGroup.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeLocalFileSystem.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeMySQL.class.php create mode 100755 lib/redactor/elfinder/inc/elFinderVolumeOneDrive.class.php create mode 100755 lib/redactor/elfinder/inc/libs/GdBmp.php create mode 100755 lib/redactor/elfinder/inc/mime.types create mode 100755 lib/redactor/elfinder/inc/plugins/AutoResize/plugin.php create mode 100755 lib/redactor/elfinder/inc/plugins/AutoRotate/plugin.php create mode 100755 lib/redactor/elfinder/inc/plugins/Normalizer/plugin.php create mode 100755 lib/redactor/elfinder/inc/plugins/Sanitizer/plugin.php create mode 100755 lib/redactor/elfinder/inc/plugins/Watermark/logo.png create mode 100755 lib/redactor/elfinder/inc/plugins/Watermark/plugin.php create mode 100755 lib/redactor/elfinder/inc/resources/video.png create mode 100644 lib/redactor/elfinder/js/elFinder.options.js create mode 100755 lib/redactor/elfinder/js/elfinder.full.js create mode 100755 lib/redactor/elfinder/js/elfinder.min.js create mode 100755 lib/redactor/elfinder/js/extras/encoding-japanese.min.js create mode 100755 lib/redactor/elfinder/js/extras/quicklook.googledocs.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.LANG.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.ar.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.bg.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.ca.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.cs.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.da.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.de.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.el.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.es.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.fa.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.fallback.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.fo.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.fr.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.he.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.hr.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.hu.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.id.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.it.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.jp.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.ko.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.nl.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.no.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.pl.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.pt_BR.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.ro.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.ru.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.sk.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.sl.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.sr.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.sv.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.tr.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.ug_CN.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.uk.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.vi.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.zh_CN.js create mode 100755 lib/redactor/elfinder/js/i18n/elfinder.zh_TW.js create mode 100755 lib/redactor/elfinder/js/proxy/elFinderSupportVer1.js create mode 100755 lib/redactor/elfinder/sounds/rm.wav create mode 100644 lib/redactor/elrte/css/elrte-inner.css create mode 100644 lib/redactor/elrte/css/elrte.full.css create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-icons_222222_256x240.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-icons_2e83ff_256x240.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-icons_454545_256x240.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-icons_888888_256x240.png create mode 100644 lib/redactor/elrte/css/smoothness/images/ui-icons_cd0a0a_256x240.png create mode 100644 lib/redactor/elrte/css/smoothness/jquery-ui-1.8.13.custom.css create mode 100644 lib/redactor/elrte/images/elrte-toolbar.png create mode 100644 lib/redactor/elrte/images/google-maps.png create mode 100644 lib/redactor/elrte/images/iframe.png create mode 100644 lib/redactor/elrte/images/loading.gif create mode 100644 lib/redactor/elrte/images/media-director.png create mode 100644 lib/redactor/elrte/images/media-flash.png create mode 100644 lib/redactor/elrte/images/media-quicktime.png create mode 100644 lib/redactor/elrte/images/media-realaudio.png create mode 100644 lib/redactor/elrte/images/media-rutube.png create mode 100644 lib/redactor/elrte/images/media-vimeo.png create mode 100644 lib/redactor/elrte/images/media-winmedia.png create mode 100644 lib/redactor/elrte/images/media-youtube.png create mode 100644 lib/redactor/elrte/images/outline-div.png create mode 100644 lib/redactor/elrte/images/outline-p.png create mode 100644 lib/redactor/elrte/images/pagebreak.gif create mode 100644 lib/redactor/elrte/images/pixel.gif create mode 100644 lib/redactor/elrte/images/smileys/evilgrin.png create mode 100644 lib/redactor/elrte/images/smileys/grin.png create mode 100644 lib/redactor/elrte/images/smileys/happy.png create mode 100644 lib/redactor/elrte/images/smileys/smile.png create mode 100644 lib/redactor/elrte/images/smileys/surprised.png create mode 100644 lib/redactor/elrte/images/smileys/tongue.png create mode 100644 lib/redactor/elrte/images/smileys/unhappy.png create mode 100644 lib/redactor/elrte/images/smileys/waii.png create mode 100644 lib/redactor/elrte/images/smileys/wink.png create mode 100644 lib/redactor/elrte/images/yandex-maps.png create mode 100644 lib/redactor/elrte/js/elrte.full.js create mode 100644 lib/redactor/elrte/js/elrte.min.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.YOUR_LANG.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.ar.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.ca.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.cs.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.da.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.de.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.en.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.es.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.fa.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.fr.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.hr.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.hu.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.it.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.jp.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.ko.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.lv.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.nl.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.pl.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.pt_BR.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.ru.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.sk.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.th.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.tr.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.uk.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.vi.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.zh_CN.js create mode 100644 lib/redactor/elrte/js/i18n/elrte.zh_TW.js create mode 100644 lib/redactor/elrte/js/jquery-ui-1.8.13.custom.min.js create mode 100644 lib/scripts/clipboard.min.js create mode 100644 lib/scripts/jquery-1.11.1.min.js create mode 100644 lib/scripts/jquery-1.11.1.min.map create mode 100644 lib/scripts/jquery-migrate-1.2.1.min.js create mode 100644 lib/scripts/jquery-ui-time.js create mode 100644 lib/scripts/jquery-ui.min.js create mode 100644 lib/scripts/jquery.alerts.js create mode 100755 lib/scripts/jquery.autocomplete.js create mode 100644 lib/scripts/jquery.collapsible.min.js create mode 100644 lib/scripts/jquery.cookie.js create mode 100644 lib/scripts/jquery.dataTables.js create mode 100644 lib/scripts/jquery.easing.js create mode 100644 lib/scripts/jquery.fancybox.js create mode 100644 lib/scripts/jquery.form.min.js create mode 100644 lib/scripts/jquery.formstyler.min.js create mode 100644 lib/scripts/jquery.jgrowl.js create mode 100644 lib/scripts/jquery.lazyload.mini.js create mode 100644 lib/scripts/jquery.mousewheel.js create mode 100644 lib/scripts/jquery.nestable.js create mode 100644 lib/scripts/jquery.nicefileinput.min.js create mode 100644 lib/scripts/jquery.placeholder.min.js create mode 100644 lib/scripts/jquery.sticky.js create mode 100644 lib/scripts/jquery.tipsy.js create mode 100644 lib/scripts/jquery.tmpl.min.js create mode 100644 lib/scripts/jquery.totop.js create mode 100644 lib/scripts/jquery.transform.js create mode 100644 lib/scripts/mousetrap.js create mode 100644 lib/scripts/nprogress.js create mode 100644 lib/scripts/uploader/Moxie.swf create mode 100644 lib/scripts/uploader/Moxie.xap create mode 100644 lib/scripts/uploader/i18n/ar.js create mode 100644 lib/scripts/uploader/i18n/bg.js create mode 100644 lib/scripts/uploader/i18n/bs.js create mode 100644 lib/scripts/uploader/i18n/ca.js create mode 100644 lib/scripts/uploader/i18n/cs.js create mode 100644 lib/scripts/uploader/i18n/cy.js create mode 100644 lib/scripts/uploader/i18n/da.js create mode 100644 lib/scripts/uploader/i18n/de.js create mode 100644 lib/scripts/uploader/i18n/el.js create mode 100644 lib/scripts/uploader/i18n/en.js create mode 100644 lib/scripts/uploader/i18n/es.js create mode 100644 lib/scripts/uploader/i18n/et.js create mode 100644 lib/scripts/uploader/i18n/fa.js create mode 100644 lib/scripts/uploader/i18n/fi.js create mode 100644 lib/scripts/uploader/i18n/fr.js create mode 100644 lib/scripts/uploader/i18n/he.js create mode 100644 lib/scripts/uploader/i18n/hr.js create mode 100644 lib/scripts/uploader/i18n/hu.js create mode 100644 lib/scripts/uploader/i18n/hy.js create mode 100644 lib/scripts/uploader/i18n/id.js create mode 100644 lib/scripts/uploader/i18n/it.js create mode 100644 lib/scripts/uploader/i18n/ja.js create mode 100644 lib/scripts/uploader/i18n/ka.js create mode 100644 lib/scripts/uploader/i18n/kk.js create mode 100644 lib/scripts/uploader/i18n/ko.js create mode 100644 lib/scripts/uploader/i18n/lt.js create mode 100644 lib/scripts/uploader/i18n/lv.js create mode 100644 lib/scripts/uploader/i18n/nl.js create mode 100644 lib/scripts/uploader/i18n/pl.js create mode 100644 lib/scripts/uploader/i18n/pt_BR.js create mode 100644 lib/scripts/uploader/i18n/ro.js create mode 100644 lib/scripts/uploader/i18n/ru.js create mode 100644 lib/scripts/uploader/i18n/sk.js create mode 100644 lib/scripts/uploader/i18n/sr.js create mode 100644 lib/scripts/uploader/i18n/sv.js create mode 100644 lib/scripts/uploader/i18n/th_TH.js create mode 100644 lib/scripts/uploader/i18n/tr.js create mode 100644 lib/scripts/uploader/i18n/uk_UA.js create mode 100644 lib/scripts/uploader/i18n/zh_CN.js create mode 100644 lib/scripts/uploader/i18n/zh_TW.js create mode 100644 lib/scripts/uploader/jquery.plupload.queue.js create mode 100644 lib/scripts/uploader/moxie.js create mode 100644 lib/scripts/uploader/moxie.min.js create mode 100644 lib/scripts/uploader/plupload.full.min.js create mode 100644 lib/scripts/uploader/plupload.min.js create mode 100644 lib/translate/Big_Text_Translate.php create mode 100644 lib/translate/Yandex_Translate.php create mode 100644 license.txt create mode 100644 modules/index.php create mode 100644 robots.txt create mode 100644 session/.htaccess create mode 100644 templates/default/css/combine.php create mode 100644 templates/default/css/styles.css create mode 100644 templates/default/images/watermark.gif create mode 100644 templates/default/index.php create mode 100644 templates/default/js/combine.php create mode 100644 templates/default/js/main.js create mode 100644 templates/default/lang/ru.txt create mode 100644 templates/index.php create mode 100644 uploads/.htaccess create mode 100644 uploads/.quarantine/index.php create mode 100644 uploads/.tmb/index.php create mode 100644 uploads/avatars/index.php create mode 100644 uploads/avatars/new/index.php create mode 100644 uploads/gallery/.temp/index.php create mode 100644 uploads/gallery/.uploader/index.php create mode 100644 uploads/gallery/index.php create mode 100644 uploads/gallery/watermark.gif create mode 100644 uploads/images/index.php create mode 100644 uploads/images/noimage.gif create mode 100644 uploads/index.php create mode 100644 uploads/recycled/.htaccess create mode 100644 uploads/recycled/index.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ccc9fd9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.DS_Store \ No newline at end of file diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..b88db2b --- /dev/null +++ b/.htaccess @@ -0,0 +1,328 @@ +###################### AVE.CMS_HTACCESS_BEGIN ########################## +# Options: +# -MultiViews: Turns off multiviews so it doesn't interfer with our rewrite rules +# -Indexes: Stop directory listings +# +FollowSymlinks: Let out rewrite rules work + +Options -Indexes +FollowSymLinks + + +# ------------------------------------------------------------------------------ +# | PHP Configuration | +# ------------------------------------------------------------------------------ + + + php_value default_charset utf-8 + + #Отлючаем вывод ошибок + #php_value error_reporting E_NONE + + # Этот параметр устанавливает максимальное время в секундах, позволяющее скрипту запускаться прежде, чем он завершается синтаксическим анализатором. + #php_value max_execution_time 300 + + # Максимальное время загрузки данных для скрипта, в том числе и файлов из формы + #php_value max_input_time 300 + + # Ограничивает максимальный объем данных, получаемых от пользователя методом POST + #php_value post_max_size 512M + + # Устанавливает максимальный размер файла, который может быть получен методом POST (меньше, чем post_max_size) + #php_value upload_max_filesize 128M + + # Максимальное кол-во загружаемых файлов + #php_value max_file_uploads 50 + + # Включаем у PHP короткие + + + php_value default_charset utf-8 + + #Отлючаем вывод ошибок + #php_value error_reporting E_NONE + + # Этот параметр устанавливает максимальное время в секундах, позволяющее скрипту запускаться прежде, чем он завершается синтаксическим анализатором. + #php_value max_execution_time 300 + + # Максимальное время загрузки данных для скрипта, в том числе и файлов из формы + #php_value max_input_time 300 + + # Ограничивает максимальный объем данных, получаемых от пользователя методом POST + #php_value post_max_size 32M + + # Устанавливает максимальный размер файла, который может быть получен методом POST (меньше, чем post_max_size) + #php_value upload_max_filesize 32M + + # Максимальное кол-во загружаемых файлов + #php_value max_file_uploads 50 + + # Включаем у PHP короткие + + +# ------------------------------------------------------------------------------ +# | CORS-enabled images | +# ------------------------------------------------------------------------------ + +# Send the CORS header for images when browsers request it. +# https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image +# http://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html +# http://hacks.mozilla.org/2011/11/using-cors-to-load-webgl-textures-from-cross-domain-images/ + + + + + SetEnvIf Origin ":" IS_CORS + Header set Access-Control-Allow-Origin "*" env=IS_CORS + + + + + +# ------------------------------------------------------------------------------ +# | Web fonts access | +# ------------------------------------------------------------------------------ + +# Allow access to web fonts from all domains. + + + + Header set Access-Control-Allow-Origin "*" + + + + +# ############################################################################## +# # INTERNET EXPLORER # +# ############################################################################## + +# ------------------------------------------------------------------------------ +# | Better website experience | +# ------------------------------------------------------------------------------ + +# Force Internet Explorer to render pages in the highest available mode +# in the various cases when it may not. +# http://hsivonen.iki.fi/doctype/ie-mode.pdf + + + Header set X-UA-Compatible "IE=edge" + # `mod_headers` cannot match based on the content-type, however, this + # header should be send only for HTML pages and not for the other resources + + Header unset X-UA-Compatible + + + + +# ############################################################################## +# # MIME TYPES AND ENCODING # +# ############################################################################## + +# ------------------------------------------------------------------------------ +# | Proper MIME types for all files | +# ------------------------------------------------------------------------------ + + + + # Audio + AddType audio/mp4 m4a f4a f4b + AddType audio/ogg oga ogg opus + + # Data interchange + AddType application/json json map + AddType application/ld+json jsonld + + # JavaScript + # Normalize to standard type. + # http://tools.ietf.org/html/rfc4329#section-7.2 + AddType application/javascript js + + # Video + AddType video/mp4 f4v f4p m4v mp4 + AddType video/ogg ogv + AddType video/webm webm + AddType video/x-flv flv + + # Web fonts + AddType application/font-woff woff + AddType application/vnd.ms-fontobject eot + + # Browsers usually ignore the font MIME types and simply sniff the bytes + # to figure out the font type. + # http://mimesniff.spec.whatwg.org/#matching-a-font-type-pattern + + # Chrome however, shows a warning if any other MIME types are used for + # the following fonts. + + AddType application/x-font-ttf ttc ttf + AddType font/opentype otf + + # Make SVGZ fonts work on the iPad. + # https://twitter.com/FontSquirrel/status/14855840545 + AddType image/svg+xml svgz + AddEncoding gzip svgz + + # Other + AddType application/octet-stream safariextz + AddType application/x-chrome-extension crx + AddType application/x-opera-extension oex + AddType application/x-web-app-manifest+json webapp + AddType application/x-xpinstall xpi + AddType application/xml atom rdf rss xml + AddType image/webp webp + AddType image/x-icon cur + AddType text/cache-manifest appcache manifest + AddType text/vtt vtt + AddType text/x-component htc + AddType text/x-vcard vcf + + + +# ------------------------------------------------------------------------------ +# | UTF-8 encoding | +# ------------------------------------------------------------------------------ + +# Use UTF-8 encoding for anything served as `text/html` or `text/plain`. +AddDefaultCharset utf-8 + +# Force UTF-8 for certain file formats. + + AddCharset utf-8 .atom .css .js .json .jsonld .rss .vtt .webapp .xml + + + +# ------------------------------------------------------------------------------ +# | Expires headers | +# ------------------------------------------------------------------------------ + +# The following expires headers are set pretty far in the future. If you +# don't control versioning with filename-based cache busting, consider +# lowering the cache time for resources such as style sheets and JavaScript +# files to something like one week. + + + + ExpiresActive on + ExpiresDefault "access plus 1 month" + + # CSS + ExpiresByType text/css "access plus 1 year" + + # Data interchange + ExpiresByType application/json "access plus 0 seconds" + ExpiresByType application/ld+json "access plus 0 seconds" + ExpiresByType application/xml "access plus 0 seconds" + ExpiresByType text/xml "access plus 0 seconds" + + # Favicon (cannot be renamed!) and cursor images + ExpiresByType image/x-icon "access plus 1 week" + + # HTML components (HTCs) + ExpiresByType text/x-component "access plus 1 month" + + # HTML + ExpiresByType text/html "access plus 0 seconds" + + # JavaScript + ExpiresByType application/javascript "access plus 1 year" + + # Manifest files + ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" + ExpiresByType text/cache-manifest "access plus 0 seconds" + + # Media + ExpiresByType audio/ogg "access plus 1 month" + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType video/mp4 "access plus 1 month" + ExpiresByType video/ogg "access plus 1 month" + ExpiresByType video/webm "access plus 1 month" + + # Web feeds + ExpiresByType application/atom+xml "access plus 1 hour" + ExpiresByType application/rss+xml "access plus 1 hour" + + # Web fonts + ExpiresByType application/font-woff "access plus 1 month" + ExpiresByType application/vnd.ms-fontobject "access plus 1 month" + ExpiresByType application/x-font-ttf "access plus 1 month" + ExpiresByType font/opentype "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" + + + + + Order allow,deny + + + + SecFilterScanPOST Off + + +# ------------------------------------------------------------------------------ +# | Rewrite engine | +# ------------------------------------------------------------------------------ + + + RewriteEngine on + RewriteBase / + + # Заглушка для index.php + RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/ + RewriteRule ^index\.php$ http://%{HTTP_HOST}/ [R=301,L] + + # Убираем слеш в конце +# RewriteCond %{HTTP_HOST} (.*) +# RewriteCond %{REQUEST_URI} /$ [NC] +# RewriteRule ^(.*)(/)$ $1 [L,R=301] + + # Редирект с www.domain.com на domain.com +# RewriteCond %{HTTP_HOST} ^www\.(.+) [NC] +# RewriteRule (.*) http://%1/$1 [R=permanent,L] + + # Редирект с domain.com на www.domain.com +# RewriteCond %{HTTP_HOST} !^www\. [NC] +# RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [QSA,L] + +# RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] +# RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] +# RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) + + RewriteCond %{REQUEST_URI} !^/(backup|cache|class|fields|functions|inc|modules|lib|session|templates)/ + + # Файл robots.txt + RewriteCond %{REQUEST_URI} !^/robots\.txt$ [NC] + + # Файл sitemap.xml + RewriteRule ^sitemap.xml$ inc/sitemap.php [QSA,L] + +#--start-ave-editor--# + +#--end-ave-editor--# + + # RSS + RewriteRule ^rss/rss-([0-9]+).xml$ inc/rss.php?id=$1 [QSA,L] + + RewriteRule \.(ico)$ - [NC,L] + + RewriteRule ^index.php$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule .* index.php [L] + +####################### AVE.CMS_HTACCESS_END ########################### \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..09ee04a --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# AVE.cms v3.2 +###### Многофункциональная, система управления сайтом. + +## Оглавление + +* [Системные требования](#Системные-требования) + +* [Модули](#Модули) + +* [Установка](#Установка) + +* [Ресурсы](#Ресурсы) + + +## Системные требования + + * Операционная система: + * Unix + * Windows Server + + * ПО WEB сервера: + * Apache >= 1.3 + * Nginx >= 1.6.2 + * IIS >= 5 + * PHP >= 5.5 + * PHP >= 5.5.x ... <= 5.6.x разрешить использовать короткие теги short_open_tag = On (zlib, cURL, mbString, JSON) + * PHP >= 7.x ... <= 7.1.x + + +## Модули +Описание и загрузка модулей + +| Наименование | Описание | +|---------------------------------|-----------------------------| +| [Комментарии] | Система комментирования публикаций. | +| [Контактные формы] | Модуль предназначен для создания различных веб-форм для контактов.Поддержка различных типов полей. | +| [Публикатор документов] | Данный модуль предназначен для создания форм ввода и редактирования документов на сайте. | +| [Вопрос-Ответ (FAQ)] | Модуль создания раширенной справочной системы на основе тегов. | +| [Галерея] | Модуль для создания и управления галереями изображений. | +| [Авторизация] | Модуль поддержки Регистрации/Авторизации пользователей. | +| [Рассылки] | Модуль позволяет осуществлять рассылки новостей и другой информации пользователям. | +| [Похожие документы] | Модуль позволяет выводить список связанных документов *(Связующим элементом документов является первое слово из поля Ключевые слова.)* | +| [Быстрый переход] | Данный модуль является альтернативным способом организации меню навигации на сайте. Он представлен в виде выпадающего списка разделов и подразделов вашего сайта. | +| [RSS] | Данный модуль предзназначен для организации RSS потоков на вашем сайте. | +| [Поиск] | Организация поиска по сайту. | +| [Карта сайта] | Построение карты сайта на базе пунктов меню навигации. | +| [Корзина] | Модуль электронной комерции. | +| [Импорт] | Импорт документов в выбранную рубрику. | +| [Рейтинг документов] | Поддержка оценок для публикаций. | +| [Навигация по документам рубрики] | Данный модуль позволяет организовать навигацию по документам в пределах рубрики. | + +И другие + +## Установка + +1. Распакуйте содержимое архива в новую папку на вашем локальном компьютере. +2. Загрузить эту папку целиком через FTP-клиент на ваш хост. +3. Вам также может потребоваться установить права доступа (CHMOD 777) рекурсивно, на папки /cache/, /session/ и /uploads/, если ваш хостинг не установливает это по умолчанию. +4. Также вам может потребоваться установить права доступа (CHMOD 777) рекурсивно, на файлы inc/db.config.php и inc/config.inc.php, если ваш хостинг не установливает это по умолчанию. +5. Наберите http://адрес вашего сайта/ в браузере. +6. Следуйте инструкциям. +7. После установки системы настоятельно рекомендуем устанавливать права доступа на папку uploads не выше CHMOD 755. + +## Ресурсы + +Сайт: [ave-cms.ru](https://ave-cms.ru/) + +Форум: [forum.ave-cms.ru](https://forum.ave-cms.ru/) + +E-mail: support@ave-cms.ru + +Google+: [Google+](https://plus.google.com/106406255345948508717) + +Вконтакте: [vk.com/ave_cms](http://vk.com/ave_cms) + + +--- +Copyright © 2007-2017 [Ave-Cms.Ru](https://ave-cms.ru) | [AVE.cms 3.2](https://ave-cms.ru) \ No newline at end of file diff --git a/admin/.htaccess b/admin/.htaccess new file mode 100644 index 0000000..4951997 --- /dev/null +++ b/admin/.htaccess @@ -0,0 +1 @@ + RewriteEngine off diff --git a/admin/admin.favicon.ico b/admin/admin.favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a0e897a0a655c59bc26e3343fd512bcd927e91b3 GIT binary patch literal 1150 zcmbu--77<390%}cW!<{pxwX6T-$%TAJXa2v3R-nOr$Y+fvA;e+$vT z-{PNw)m{{YJjf6A8`fE6YkkOH>nj6bvtsu&Bg@x;+@)?fcZR=hd*LL9;nlI_wOjS4 zs!d4kGGvUlp=fgmCHrHEBEAQ!{`A3Cqz|?j23VORjI6N^ z#Q55ImUd)P-bxQDFBc3K^Qio$$}_TOJCR_9dsMtPf|~najQcJKin{LtvHMg4T~LB5 zlz@rv+{^JBTxZj$dtO2P%c?BOcYQ`O`BmTeKjQk$S*mlFnQbvEIXi7_ksoK+sgZKc zJ19LIN9h4Ym|4V!k^_tEv^;;wul#HV+8K4n%;{*t$S%qJs;(E`s;(9xt2m#7CYk)S zbJRXAt2GZxZv>h9)*s7G%h4)7^B%OydugKxy_0#zf95Cm%j>UMVb-VkdD843|3$gq NYR$fc{Dc7h;}gm4g(3g| literal 0 HcmV?d00001 diff --git a/admin/admin.php b/admin/admin.php new file mode 100644 index 0000000..bb000f0 --- /dev/null +++ b/admin/admin.php @@ -0,0 +1,97 @@ +get_config_vars('EXIT_ADMIN')); + user_logout(); + header('Location:admin.php'); +} + +if(auth_cookie()) +{ + header('Location:index.php'); + exit; +} + +if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'login') +{ + // Авторизация + if (!empty($_POST['user_login']) && !empty($_POST['user_pass'])) + { + if (ADMIN_CAPTCHA) + { + if (isset($_SESSION['captcha_keystring']) && isset($_POST['securecode']) && $_SESSION['captcha_keystring'] == $_POST['securecode']) $captcha_ok = 1; + else + { + unset($_SESSION['user_id'], $_SESSION['user_pass']); + unset($_SESSION['captcha_keystring']); + $error = $AVE_Template->get_config_vars('WRONG_CAPTCHA'); + $AVE_Template->assign('error', $error); + } + } + else + $captcha_ok = 1; + + if ($captcha_ok) + { + if (true === user_login($_POST['user_login'], $_POST['user_pass'], 1,(int)(isset($_POST['SaveLogin']) && $_POST['SaveLogin'] == '1'))) + { + //_echo($_SESSION); + if (!empty($_SESSION['redirectlink'])) + { + header('Location:' . $_SESSION['redirectlink']); + unset($_SESSION['redirectlink']); + exit; + } + + reportLog($AVE_Template->get_config_vars('LOGIN_ADMIN')); + //Перенапрявляем пользователя + header('Location:'.get_referer_admin_link().''); + exit; + + } + else + { + reportLog($AVE_Template->get_config_vars('ERROR_ADMIN') . ' - ' + . stripslashes($_POST['user_login']) . ' / ' + . stripslashes($_POST['user_pass'])); + + unset($_SESSION['user_id'], $_SESSION['user_pass']); + unset($_SESSION['captcha_keystring']); + $error = $AVE_Template->get_config_vars('WRONG_PASS'); + $AVE_Template->assign('error', $error); + } + + } + + } +} + +$AVE_Template->assign('captcha', ADMIN_CAPTCHA); +$AVE_Template->display('login.tpl'); +?> \ No newline at end of file diff --git a/admin/blocks.php b/admin/blocks.php new file mode 100644 index 0000000..d219006 --- /dev/null +++ b/admin/blocks.php @@ -0,0 +1,133 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/blocks.txt', 'blocks'); + + switch ($_REQUEST['action']) + { + case '': + if (check_permission_acp('blocks_view')) + { + $AVE_Block->blockList(); + } + break; + + case 'new': + if (check_permission_acp('blocks_edit')) + { + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_Block->blockNew(); + } + break; + + case 'edit': + if (check_permission_acp('blocks_edit')) + { + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_Block->blockEdit(isset($_REQUEST['id']) ? $_REQUEST['id'] : null); + } + break; + + case 'save': + if (check_permission_acp('blocks_edit')) + { + $AVE_Block->blockSave(isset($_REQUEST['id']) ? $_REQUEST['id'] : null); + } + break; + + case 'del': + if (check_permission_acp('blocks_edit')) + { + $AVE_Block->blockDelete($_REQUEST['id']); + } + break; + + case 'alias': + if (check_permission_acp('blocks_edit')) + { + echo $AVE_Block->blockValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + } + exit; + + case 'multi': + if (check_permission_acp('blocks_edit')) + { + $_REQUEST['sub'] = (!isset($_REQUEST['sub'])) ? '' : $_REQUEST['sub']; + $errors = array(); + switch ($_REQUEST['sub']) + { + case 'save': + $ok = true; + $row = $AVE_DB->Query(" + SELECT block_name + FROM " . PREFIX . "_blocks + WHERE block_name = '" . $_REQUEST['block_name'] . "' + ")->FetchRow(); + + if (@$row->block_name != '') + { + array_push($errors, $AVE_Template->get_config_vars('BLOCK_EXIST')); + $AVE_Template->assign('errors', $errors); + $ok = false; + } + + if ($_REQUEST['block_name'] == '') + { + array_push($errors, $AVE_Template->get_config_vars('BLOCK_COPY_TIP')); + $AVE_Template->assign('errors', $errors); + $ok = false; + } + + if ($ok) + { + $row = $AVE_DB->Query(" + SELECT block_text + FROM " . PREFIX . "_blocks + WHERE id = '" . (int)$_REQUEST['id'] . "' + ")->FetchRow(); + + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_blocks + SET + Id = '', + block_name = '" . $_REQUEST['block_name'] . "', + block_text = '" . addslashes($row->block_text) . "', + block_author_id = '" . $_SESSION['user_id'] . "', + block_created = '" . time() . "' + "); + + reportLog($_SESSION['user_name'] . ' - создал копию блока (' . (int)$_REQUEST['id'] . ')', 2, 2); + + header('Location:index.php?do=blocks'.'&cp=' . SESSION); + } + + $AVE_Template->assign('content', $AVE_Template->fetch('blocks/multi.tpl')); + + break; + } + } + } +?> \ No newline at end of file diff --git a/admin/browser.php b/admin/browser.php new file mode 100644 index 0000000..74d5d75 --- /dev/null +++ b/admin/browser.php @@ -0,0 +1,192 @@ +config_load(BASE_DIR . '/admin/lang/' . $lang . '/main.txt'); +$AVE_Template->assign('tpl_dir', 'templates/'); +$AVE_Template->assign('ABS_PATH', '../'); + +if (!isset($_REQUEST['action'])) $_REQUEST['action'] = ''; + +switch ($_REQUEST['action']) +{ + case 'list': + $dir = (empty($_REQUEST['dir']) + || strpos($_REQUEST['dir'], '..') !== false + || strpos($_REQUEST['dir'], '//') !== false) ? '/' : $_REQUEST['dir']; + + $path = $upload_path . (is_dir($upload_path . $dir) ? $dir : '/'); + + $new_dir = $path . (isset($_REQUEST['newdir']) ? $_REQUEST['newdir'] : ''); + $new_dir_rezult = (!is_dir($new_dir) && !mkdir($new_dir, 0777)); + + $skip_entry = array(THUMBNAIL_DIR, 'recycled', 'index.php'); + + $dirs = array(); + $files = array(); + + $d = @dir($path); + while (false !== ($entry = @$d->read())) + { + if (in_array($entry, $skip_entry) || $entry{0} === '.') continue; + + if (is_dir($path . $entry)) + { + $dirs[$entry] = 'index.php?do=browser&type=' . $_REQUEST['type'] + . '&action=list&dir=' . $dir . $entry . '/'; + } + else + { + $nameParts = explode('.', $entry); + $ext = strtolower(end($nameParts)); + + $file['icon'] = file_exists("templates/images/mediapool/{$ext}.gif") ? $ext : 'attach'; + $file['filesize'] = @round(@filesize($path . $entry)/1024, 2); + $file['moddate'] = date("d.m.y, H:i", @filemtime($path . $entry)); + + if (in_array($ext, $images_ext)) + { + $nameParts[count($nameParts)-2] .= $thumb_size; + $file['bild'] = '/' . UPLOAD_DIR . $dir . THUMBNAIL_DIR . '/' . implode('.', $nameParts); + } + else + { + $file['bild'] = 'templates/images/file.gif'; + } + + $files[$entry] = $file; + } + } + $d->close(); + + ksort($dirs); + ksort($files); + + $AVE_Template->assign('new_dir_rezult', $new_dir_rezult); + $AVE_Template->assign('recycled', strpos($dir, '/recycled/') === 0); + $AVE_Template->assign('dirs', $dirs); + $AVE_Template->assign('files', $files); + $AVE_Template->assign('max_size', $max_size); + $AVE_Template->assign('dir', $dir); + $AVE_Template->assign('dirup', rtrim(dirname($dir), '\\/') . '/'); + $AVE_Template->assign('mediapath', UPLOAD_DIR); + + $AVE_Template->display('browser.tpl'); + break; + + case 'upload': + if (check_permission('mediapool_add')) + { + $AVE_Template->display('browser_upload.tpl'); + }else{ + echo ''; + } + break; + + case 'upload2': + header('Location:index.php?do=browser&type=image&target=' . $_REQUEST['target'] . '&tval=/' . UPLOAD_DIR . $_REQUEST['tval']); + break; + + case 'delfile': + if (check_permission('mediapool_del')) + { + if (empty($_REQUEST['file']) || empty($_REQUEST['dir'])) exit(0); + + $file_name = basename($_REQUEST['file']); + + $del_file = $upload_path . $_REQUEST['dir'] . $file_name; + if (strpos($del_file, '..') !== false || !is_file($del_file)) exit(0); + + $recycled_path = $upload_path . '/recycled/'; + if (!is_dir($recycled_path) && !mkdir($recycled_path)) exit(0); + + do {$nameParts = explode('.', $file_name); + $nameParts[count($nameParts)-2] .= '-' . uniqid(rand()); + $recycled_file_name = implode('.', $nameParts); + } while (file_exists($recycled_path . $recycled_file_name)); + + @copy($del_file, $recycled_path . $recycled_file_name); + + if (@unlink($del_file)) + { + $nameParts = explode('.', $file_name); + $ext = strtolower(end($nameParts)); + if (in_array($ext, $images_ext)) + { + $nameParts[count($nameParts)-2] .= $thumb_size; + @unlink($upload_path . $_REQUEST['dir'] . THUMBNAIL_DIR . '/' . implode('.', $nameParts)); + } + + reportLog($_SESSION['user_name'] . ' - удалил файл (' + . UPLOAD_DIR . $_REQUEST['dir'] . $file_name . ')'); + } + } + + echo ''; + break; + + default: + + @list($target, $target_id) = explode('__', $_REQUEST['target']); + + $tval = '/'; + + if (!empty($_REQUEST['tval']) && 0 === strpos($_REQUEST['tval'], '/' . UPLOAD_DIR . '/')) + { + if (is_dir(BASE_DIR . '/' . $_REQUEST['tval'])) { + $tval = rtrim(substr($_REQUEST['tval'], strlen('/' . UPLOAD_DIR)), '\\/') . '/'; + } + + if (is_file(BASE_DIR . '/' . $_REQUEST['tval'])) { + $tval = rtrim(dirname(substr($_REQUEST['tval'], strlen('/' . UPLOAD_DIR))), '\\/') . '/'; + } + } + + $AVE_Template->assign('dir', $tval); + $AVE_Template->assign('target', $target); + $AVE_Template->assign('target_id', $target_id); + $AVE_Template->assign('cppath', substr($_SERVER['PHP_SELF'], 0, -18)); + $AVE_Template->assign('mediapath', UPLOAD_DIR); + + $AVE_Template->display('browser_2frames.tpl'); + break; +} + +$out = ob_get_clean(); + +echo $out; + +?> diff --git a/admin/dbsettings.php b/admin/dbsettings.php new file mode 100644 index 0000000..5b8d382 --- /dev/null +++ b/admin/dbsettings.php @@ -0,0 +1,70 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/dbactions.txt', 'db'); + +require(BASE_DIR . '/class/class.dbdump.php'); +$AVE_DB_Service = new AVE_DB_Service; + +if (!empty($_REQUEST['action'])) +{ + switch ($_REQUEST['action']) + { + case 'optimize': + $AVE_DB_Service->databaseTableOptimize(); + break; + + case 'repair': + $AVE_DB_Service->databaseTableRepair(); + break; + + case 'dump_top': + $AVE_DB_Service->databaseDumpExport(1); + exit; + + case 'dump': + $AVE_DB_Service->databaseDumpExport(); + exit; + + case 'restore': + $AVE_DB_Service->databaseDumpImport(BASE_DIR . "/" . ATTACH_DIR . "/"); + break; + + case 'download': + $AVE_DB_Service->databaseDumpFileSave($_REQUEST['file']); + break; + + case 'restorefile': + $AVE_DB_Service->databaseDumpFileImport($_REQUEST['file']); + break; + + case 'deletefile': + $AVE_DB_Service->databaseDumpFileDelete($_REQUEST['file']); + break; + } +} + +$AVE_Template->assign('db_size', get_mysql_size()); +$AVE_Template->assign('files', $AVE_DB_Service->databaseFilesGet()); +$AVE_Template->assign('tables', $AVE_DB_Service->databaseTableGet()); +$AVE_Template->assign('content', $AVE_Template->fetch('dbactions/actions.tpl')); + +?> \ No newline at end of file diff --git a/admin/docs.php b/admin/docs.php new file mode 100644 index 0000000..7e4c4fa --- /dev/null +++ b/admin/docs.php @@ -0,0 +1,298 @@ +documentTemplateTimeAssign(); + +$AVE_Rubric->rubricPermissionFetch(); + +$AVE_Template->config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/docs.txt', 'docs'); + +$AVE_Template->assign("navi", $AVE_Template->fetch("navi/navi.tpl")); + +switch($_REQUEST['action']) +{ + case '' : + if (check_permission_acp('document_view')) + { + switch($_REQUEST['sub']) + { + case 'quicksave': + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_Document->quickSave(); + break; + } + $AVE_Document->documentListGet(); + } + $AVE_Template->assign('content', $AVE_Template->fetch('documents/docs.tpl')); + break; + + case 'add_new': + if (check_permission_acp('document_view')) + { + $AVE_Request->requestListFetch(); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/docs_add_new.tpl')); + } + break; + + case 'showsimple': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentListGet(); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/docs_simple.tpl')); + } + break; + + case 'edit': + if (check_permission_acp('document_view')) + { + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_Navigation->navigationAllItemList(); + $AVE_Request->requestListFetch(); + $AVE_Document->documentEdit((int)$_REQUEST['Id']); + } + break; + + case 'copy': + if (check_permission_acp('document_view')) + { + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_Navigation->navigationAllItemList(); + $AVE_Request->requestListFetch(); + $AVE_Document->documentCopy((int)$_REQUEST['Id']); + } + break; + + case 'new': + if (check_permission_acp('document_view')) + { + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_Navigation->navigationAllItemList(); + $AVE_Request->requestListFetch(); + $AVE_Document->documentNew((int)$_REQUEST['rubric_id']); + } + break; + + case 'innavi': + if (check_permission_acp('document_view') && check_permission_acp('navigation_new')) + { + $AVE_Document->documentInNavi(); + } + break; + + case 'after': + if (check_permission_acp('document_view')) + { + $AVE_Navigation->navigationAllItemList(); + $AVE_Document->documentFormAfter(); + } + break; + + case 'open': + if (check_permission_acp('document_view')) + { + $AVE_Navigation->navigationItemStatusOn((int)$_REQUEST['Id']); + $AVE_Document->documentStatusSet((int)$_REQUEST['Id'], 1); + } + break; + + case 'close': + if (check_permission_acp('document_view')) + { + $AVE_Navigation->navigationItemStatusOff((int)$_REQUEST['Id']); + $AVE_Document->documentStatusSet((int)$_REQUEST['Id'], 0); + } + break; + + case 'delete': + if (check_permission_acp('document_view')) + { + $AVE_Navigation->navigationItemStatusOff((int)$_REQUEST['Id']); + $AVE_Document->documentMarkDelete((int)$_REQUEST['Id']); + } + break; + + case 'redelete': + if (check_permission_acp('document_view')) + { + $AVE_Navigation->navigationItemStatusOn((int)$_REQUEST['Id']); + $AVE_Document->documentUnmarkDelete((int)$_REQUEST['Id']); + } + break; + + case 'enddelete': + if (check_permission_acp('alles')) + { + $AVE_Navigation->navigationItemDeleteFromDoc((int)$_REQUEST['Id']); + $AVE_Document->documentDelete((int)$_REQUEST['Id']); + // Выполняем обновление страницы + header('Location:index.php?do=docs&cp=' . SESSION); + } + break; + + case 'revision_recover': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentRevissionRestore((int)$_REQUEST['doc_id'], (int)$_REQUEST['revission'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'revision_delete': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentRevissionDelete((int)$_REQUEST['doc_id'], (int)$_REQUEST['revission'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'remark': + if (check_permission_acp('remark_view')) + { + $AVE_Document->documentRemarkNew((int)$_REQUEST['Id'], 0); + } + break; + + case 'remark_reply': + if (check_permission_acp('remark_view')) + { + $AVE_Document->documentRemarkNew((int)$_REQUEST['Id'], 1); + } + break; + + case 'remark_status': + if (check_permission_acp('remark_edit')) + { + $AVE_Document->documentRemarkStatus((int)$_REQUEST['Id'], (int)$_REQUEST['remark_status']); + } + break; + + case 'remark_del': + if (check_permission_acp('remark_edit')) + { + $AVE_Document->documentRemarkDelete((int)$_REQUEST['Id'], (int)$_REQUEST['remark_first']); + } + break; + + case 'change': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentRubricChange(); + } + break; + + case 'change_user': + if (check_permission_acp('document_view')) + { + switch($_REQUEST['sub']) + { + case 'save': + $AVE_Document->changeAutorSave(); + break; + } + $AVE_Template->assign('content', $AVE_Template->fetch('documents/user.tpl')); + } + break; + + case 'find_user': + if (check_permission_acp('document_view')) + { + findautor($_REQUEST['q'], 10); + } + exit; + + case 'keywords': + if (check_permission_acp('document_view')) + { + searchKeywords($_REQUEST['q']); + } + exit; + + case 'editstatus': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentEditStatus(); + } + break; + + case 'image_import': + echo json_encode(array("respons"=>image_multi_import($_REQUEST['path']), "status"=>"error", "action"=>"return")); + exit; + + case 'translit': + echo($AVE_Document->documentAliasCreate()); + exit; + + case 'checkurl': + echo($AVE_Document->documentAliasCheck()); + exit; + + case 'aliases': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentAliasHistoryList(); + } + break; + + case 'aliases_doc': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentAliasListDoc((int)$_REQUEST['doc_id']); + } + break; + + case 'aliases_new': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentAliasNew(); + } + break; + + case 'aliases_edit': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentAliasEdit(); + } + break; + + case 'aliases_save': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentAliasSave(); + } + break; + + case 'aliases_del': + if (check_permission_acp('document_view')) + { + $AVE_Document->documentAliasDel(); + } + break; +} + +?> \ No newline at end of file diff --git a/admin/fields.php b/admin/fields.php new file mode 100644 index 0000000..bb02e4b --- /dev/null +++ b/admin/fields.php @@ -0,0 +1,84 @@ +Query(" + SELECT * + FROM " . PREFIX . "_documents + WHERE Id = '" . (int)$_REQUEST['doc_id'] . "' + ")->FetchRow(); + + // запрещаем доступ, + // если автору документа не разрешено изменять свои документы в рубрике + // или пользователю не разрешено изменять все документы в рубрике + if (is_object($document)) { + $_REQUEST['rubric_id'] = (int)$document->rubric_id; + if (! + ( + ( + isset($_SESSION['user_id']) && $document->document_author_id == $_SESSION['user_id'] + && isset($_SESSION[$_REQUEST['rubric_id'] . '_editown']) && $_SESSION[$_REQUEST['rubric_id'] . '_editown'] == 1 + ) + || (isset($_SESSION[$_REQUEST['rubric_id'] . '_editall']) && $_SESSION[$_REQUEST['rubric_id'] . '_editall'] == 1) + ) + ) + { + $show = false; + } + } else { + $_REQUEST['rubric_id'] = (isset($_REQUEST['rubric_id']) && !empty($_REQUEST['rubric_id'])) ? (int)$_REQUEST['rubric_id'] : 0; + $show = false; + } + + // разрешаем доступ, если пользователь принадлежит группе Администраторов или имеет все права на рубрику + if ( (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$_REQUEST['rubric_id'] . '_alles']) && $_SESSION[$_REQUEST['rubric_id'] . '_alles'] == 1) ) + { + $show = true; + } + + if ($show) + { + // Выполняем запрос к БД и получаем значение по умолчанию + $default = $AVE_DB->Query(" + SELECT + rubric_field_default + FROM " . PREFIX . "_rubric_fields + WHERE Id = '" . (int)$_REQUEST['field_id'] . "' AND rubric_id = '" . (int)$_REQUEST['rubric_id'] . "' + ")->GetCell(); + + $field_value = (isset($_REQUEST['field_value']) ? (string)$_REQUEST['field_value'] : ''); + + $field_function = 'get_field_' . (string)$_REQUEST['field']; + $field_function($field_value, $_REQUEST['type'], (int)$_REQUEST['field_id'], '', 0, $x, 0, 0, $default); + } + else + { + exit; + } + +?> \ No newline at end of file diff --git a/admin/finder.php b/admin/finder.php new file mode 100644 index 0000000..6c08684 --- /dev/null +++ b/admin/finder.php @@ -0,0 +1,24 @@ +assign('content', $AVE_Template->fetch('finder/finder.tpl')); + } +?> \ No newline at end of file diff --git a/admin/functions/func.admin.common.php b/admin/functions/func.admin.common.php new file mode 100644 index 0000000..44e2b2a --- /dev/null +++ b/admin/functions/func.admin.common.php @@ -0,0 +1,585 @@ +' . file_get_contents($_logdir) . '' . file_get_contents($_404dir) . '' . file_get_contents($_sqldir) . 'assign('logs', $logs); +} + +/** + * Список пользователей за последние $onlinetime секунд + * + * @param int $onlinetime количество секунд + * @return Array массив из пользователей отсортированный по последней активности + */ +function get_online_users($onlinetime=USERS_TIME_SHOW){ + global $AVE_DB, $AVE_Template; + $time=(time()-intval($onlinetime)); + $sql=@$AVE_DB->Query("SELECT * FROM ".PREFIX."_users WHERE last_visit>".$time." ORDER BY last_visit DESC"); + $online_users=Array(); + while ($row = $sql->FetchRow()) + { + $row->user_name = get_username_by_id($row->Id); + $row->user_group_name = get_usergroup_by_id($row->user_group); + array_push($online_users,$row); + } + $AVE_Template->assign('online_users', $online_users); +} + +/** + * Форматированный вывод размера + * + * @param int $file_size размер + * @return string нормированный размер с единицой измерения + */ +function format_size($file_size) +{ + if ($file_size >= 1073741824) + { + $file_size = round($file_size / 1073741824 * 100) / 100 . ' Gb'; + } + elseif ($file_size >= 1048576) + { + $file_size = round($file_size / 1048576 * 100) / 100 . ' Mb'; + } + elseif ($file_size >= 1024) + { + $file_size = round($file_size / 1024 * 100) / 100 . ' Kb'; + } + else + { + $file_size = $file_size . ' b'; + } + + return $file_size; +} + +/** + * Извлечение из БД статистики по основным компонентам системы + * + */ +function get_ave_info() +{ + global $AVE_DB, $AVE_Template; + + $cnts = array(); + + $cnts['templates'] = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_templates")->GetCell(); + $cnts['documents'] = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_documents")->GetCell(); + $cnts['request'] = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_request") ->GetCell(); + $cnts['rubrics'] = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_rubrics") ->GetCell(); + + $sql = $AVE_DB->Query(" + SELECT + `ModuleStatus`, + COUNT(`ModuleStatus`) AS cntStatus + FROM " . PREFIX . "_module + GROUP BY `ModuleStatus` + "); + while ($row = $sql->FetchRow()) + { + $cnts['modules_' . $row->ModuleStatus] = $row->cntStatus; + } + + $sql = $AVE_DB->Query(" + SELECT + status, + COUNT(status) AS cntStatus + FROM " . PREFIX . "_users + GROUP BY status + "); + while ($row = $sql->FetchRow()) + { + $cnts['users_' . $row->status] = $row->cntStatus; + } + + $AVE_Template->assign('cnts', $cnts); +} + +/** + * Размер дириктории + * + * @param string $directory наименование директории + * @return int + */ +function get_dir_size($directory) +{ + if (!is_dir($directory)) return -1; + $size = 0; + if ($DIR = opendir($directory)) + { + while (($dirfile = readdir($DIR)) !== false) + { + if (@is_link($directory . '/' . $dirfile) || $dirfile == '.' || $dirfile == '..') continue; + if (@is_file($directory . '/' . $dirfile)) + { + $size += filesize($directory . '/' . $dirfile); + } + elseif (@is_dir($directory . '/' . $dirfile)) + { + $dirSize = get_dir_size($directory . '/' . $dirfile); + if ($dirSize >= 0) + { + $size += $dirSize; + } + else + { + return -1; + } + } + } + closedir($DIR); + } + + return $size; +} + +/** + * Размер базы данных + * + * @return int + */ +function get_mysql_size() +{ + global $AVE_DB; + + $mysql_size = 0; + $sql = $AVE_DB->Query("SHOW TABLE STATUS LIKE '" . PREFIX . "_%'"); + while ($row = $sql->FetchAssocArray()) + { + $mysql_size += $row['Data_length'] + $row['Index_length']; + } + + return format_size($mysql_size); +} + +function get_ave_tags($srcfile) +{ + if (@include_once($srcfile)) + { + reset ($vorlage); + $vl = array(); + + while (list($key, $value) = each($vorlage)) + { + $tag = new stdClass; + $tag->cp_tag = $key; + $tag->cp_desc = $value; + array_push($vl, $tag); + unset($tag); + } + + return $vl; + } + + return null; +} + + +function get_all_templates() +{ + global $AVE_DB; + + static $templates = null; + + if ($templates == null) + { + $templates = array(); + + $sql = $AVE_DB->Query(" + SELECT + Id, + template_title + FROM " . PREFIX . "_templates + "); + + while ($row = $sql->FetchRow()) + { + array_push($templates, $row); + } + } + + return $templates; +} + +function get_editable_module() +{ + global $AVE_DB, $AVE_Template; + + $modules = array(); + $sql = $AVE_DB->Query(" + SELECT + ModuleName, + ModuleSysName + FROM " . PREFIX . "_module + WHERE `ModuleStatus` = '1' + AND `ModuleAdminEdit` = '1' + ORDER BY ModuleName ASC + "); + while ($row = $sql->FetchRow()) + { + if (check_permission('mod_' . $row->ModuleSysName)) + { + array_push($modules, $row); + } + } + + $AVE_Template->assign('modules', $modules); +} + +function get_mime_type($file) +{ + $file_extension = strtolower(mb_substr(strrchr($file, '.'), 1)); + + switch ($file_extension) + { + case 'psd': $ctype = 'image/x-photoshop'; break; + case 'rar': $ctype = 'application/x-rar-compressed'; break; + case 'zip': $ctype = 'application/x-zip-compressed'; break; + case 'pdf': $ctype = 'application/pdf'; break; + case 'bz2': $ctype = 'application/bzip2'; break; + case 'doc': + case 'dot': + case 'wiz': + case 'wzs': $ctype = 'application/msword'; break; + case 'eps': $ctype = 'application/postscript'; break; + case 'pot': + case 'ppa': + case 'pps': + case 'ppt': + case 'pwz': $ctype = 'application/vnd.ms-powerpoint'; break; + case 'rtf': $ctype = 'application/rtf'; break; + case 'rnx': $ctype = 'application/vnd.rn-realmedia'; break; + case 'hlp': $ctype = 'hlp'; break; + case 'gtar': $ctype = 'application/x-gtar'; break; + case 'gzip': + case 'tgz': $ctype = 'application/x-gzip'; break; + case 'lnx': $ctype = 'application/x-latex'; break; + case 'exe': $ctype = 'application/x-msdownload'; break; + case 'swf': $ctype = 'application/x-shockwafe-flash'; break; + case 'xml': $ctype = 'application/xml'; break; + case 'midi': $ctype = 'audio/midi'; break; + case 'mp3': + case 'mp2': + case 'mpga': $ctype = 'audio/mpeg'; break; + case 'wav': $ctype = 'audio/wav'; break; + case 'bmp': $ctype = 'audio/wav'; break; + case 'gif': $ctype = 'image/gif'; break; + case 'jpeg': + case 'jpg': + case 'jpe': $ctype = 'image/jpeg'; break; + case 'png': $ctype = 'image/png'; break; + case 'tif': + case 'tiff': $ctype = 'image/tiff'; break; + case 'ico': $ctype = 'image/x-icon'; break; + case 'csv': $ctype = 'text/comma-separated-values'; break; + case 'css': $ctype = 'text/css'; break; + case 'htm': + case 'html': + case 'shtml': $ctype = 'text/html'; break; + case 'txt': + case 'klp': + case 'tex': + case 'php': + case 'asp': + case 'aspx': + case 'php3': + case 'php4': + case 'php5': + case 'sql': $ctype = 'text/plain'; break; + case 'xml': $ctype = 'text/xml'; break; + case 'xhtm': $ctype = 'text/xhtml'; break; + case 'wml': $ctype = 'text/wml'; break; + case 'mpeg': + case 'mpg': + case 'mpe': + case 'mlv': + case 'mpa': + case 'wma': + case 'wmv': $ctype = 'video/mpeg'; break; + case 'avi': $ctype = 'video/x-msvideo'; break; + case 'mov': $ctype = 'video/quicktime'; break; + case 'xls': $ctype = 'application/vnd.ms-excel'; break; + case 'ai': $ctype = 'application/postscript'; break; + case 'rm': $ctype = 'application/vnd.rn-realmedia'; break; + case 'gz': $ctype = 'application/x-gzip'; break; + case 'js': $ctype = 'application/x-javascript'; break; + case 'pl': + case 'cc': $ctype = 'text/plain'; break; + case 'qt': $ctype = 'video/quicktime'; break; + default : $ctype='application/force-download'; + } + + return $ctype; +} + +function file_download($filename, $retbytes = true) +{ + $chunksize = 1*(1024*1024); + $buffer = ''; + $cnt = 0; + + $handle = fopen($filename, 'rb'); + + if ($handle === false) return false; + + while (!feof($handle)) + { + $buffer = fread($handle, $chunksize); + echo $buffer; + flush(); + if ($retbytes) $cnt += strlen($buffer); + } + + $status = fclose($handle); + + if ($retbytes && $status) return $cnt; + + return $status; +} + +function is_php_code($check_code) +{ + $check_code = stripslashes($check_code); + $check_code = str_replace(' ', '', $check_code); + $check_code = strtolower($check_code); + + if (strpos($check_code, '') !== false || + strpos($check_code, 'language="php"') !== false || + strpos($check_code, "language='php'") !== false || + strpos($check_code, 'language=php') !== false) + { + return true; + } + + return false; +} + +function check_permission_acp($perm) +{ + if (!check_permission($perm)) + { + if (!defined('NOPERM')) define('NOPERM', 1); + return false; + } + + return true; +} + +//Проверка на наличие модуля Контакты и новых писем +function ContactsModuleCheck() { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module WHERE ModuleFunction = 'contact' and ModuleStatus = '1'"); + $enable = $sql->numrows(); + if ($enable != "0" || $enable != ""){ + $contacts = "1"; + $sql_num = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_modul_contact_info WHERE Aw_Zeit = '0'"); + $num_posts = $sql_num->numrows(); + } else { + $contacts = "0"; + } + $AVE_Template->assign('num_posts', $num_posts); + $AVE_Template->assign('contacts', $contacts); +} + +//Проверка на наличие модуля Логин +function LoginModuleCheck() { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_module WHERE ModuleFunction = 'mod_login' and ModuleStatus = '1'"); + $enable = $sql->numrows(); + if ($enable != "0" || $enable != ""){ + $login_menu = "1"; + } else { + $login_menu = "0"; + } + $AVE_Template->assign('login_menu', $login_menu); +} + +//Выводим на главную список последних 15 документов +function DisplayMainDocuments() { + global $AVE_DB, $AVE_Template; + + $doc_start = array(); + $sql = $AVE_DB->Query(" + SELECT + doc.*, + rub.rubric_admin_teaser_template + FROM " . PREFIX . "_documents doc + LEFT JOIN " . PREFIX . "_rubrics AS rub ON rub.Id = doc.rubric_id + WHERE 1 = 1 + AND rub.rubric_docs_active = '1' + ORDER BY doc.document_published DESC LIMIT 0,10"); + while($row = $sql->fetchrow()) { + $row->rubric_title = showrubricName($row->rubric_id); + $row->document_title = stripslashes(htmlspecialchars_decode(pretty_chars($row->document_title))); + $row->document_breadcrum_title = stripslashes(htmlspecialchars_decode(pretty_chars($row->document_breadcrum_title))); + $row->document_author = get_username_by_id($row->document_author_id); // Получаем имя пользователя (Автора) + $row->cantEdit = 0; + $row->canDelete = 0; + $row->canEndDel = 0; + $row->canOpenClose = 0; + $row->rubric_admin_teaser_template=@eval2var('?>'.($row->rubric_admin_teaser_template>'' ? @showrequestelement($row,$row->rubric_admin_teaser_template) : '').'document_author_id == @$_SESSION['user_id'] + && isset($_SESSION[$row->rubric_id . '_editown']) && @$_SESSION[$row->rubric_id . '_editown'] == 1) + || (isset($_SESSION[$row->rubric_id . '_editall']) && $_SESSION[$row->rubric_id . '_editall'] == 1) ) + { + $row->cantEdit = 1; + $row->canDelete = 1; + } + // запрещаем редактирование главной страницы и страницу ошибки 404 если требуется одобрение Администратора + if ( ($row->Id == 1 || $row->Id == PAGE_NOT_FOUND_ID) + && isset($_SESSION[$row->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] != 1) + { + $row->cantEdit = 0; + } + // разрешаем автору блокировать и разблокировать свои документы если не требуется одобрение Администратора + if ($row->document_author_id == @$_SESSION['user_id'] + && isset($_SESSION[$row->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] == 1) + { + $row->canOpenClose = 1; + } + // разрешаем всё, если пользователь принадлежит группе Администраторов или имеет все права на рубрику + if (UGROUP == 1 || @$_SESSION[$row->rubric_id . '_alles'] == 1) + { + $row->cantEdit = 1; + $row->canDelete = 1; + $row->canEndDel = 1; + $row->canOpenClose = 1; + } + // Запрещаем удаление Главной страницы и страницы с 404 ошибкой + if ($row->Id == 1 || $row->Id == PAGE_NOT_FOUND_ID) + { + $row->canDelete = 0; + $row->canEndDel = 0; + } + array_push($doc_start, $row); + } + $AVE_Template->assign('doc_start', $doc_start); +} + +function showrubricName($id) { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query("SELECT rubric_title FROM " . PREFIX . "_rubrics WHERE Id='$id'"); + $row = $sql->fetchrow(); + return $row->rubric_title; +} + +function showuserName($id) { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query("SELECT user_name FROM " . PREFIX . "_users WHERE Id='$id'"); + $row = $sql->fetchrow(); + return $row->user_name; +} + +function cacheShow() { + global $AVE_Template; + + $showCache = format_size(get_dir_size($AVE_Template->compile_dir)+get_dir_size($AVE_Template->cache_dir_root)); + echo json_encode(array($showCache, 'accept')); +} + +function templateName($id) { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT * FROM " . PREFIX . "_templates + WHERE Id = '$id' + "); + $row = $sql->fetchrow(); + + return $row->template_title; +} + +function groupName($id) { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT * FROM " . PREFIX . "_user_groups + WHERE user_group = '$id' + "); + $row = $sql->fetchrow(); + + return $row->user_group_name; +} + +?> \ No newline at end of file diff --git a/admin/groups.php b/admin/groups.php new file mode 100644 index 0000000..a6b28bd --- /dev/null +++ b/admin/groups.php @@ -0,0 +1,67 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/groups.txt', 'groups'); + +switch ($_REQUEST['action']) +{ + case '': + if (check_permission_acp('group_view')) + { + $AVE_User->userGroupListShow(); + } + break; + + case 'grouprights': + if (check_permission_acp('group_edit')) + { + switch ($_REQUEST['sub']) + { + case '': + $AVE_User->userGroupPermissionEdit($_REQUEST['Id']); + break; + + case 'save': + $AVE_User->userGroupPermissionSave($_REQUEST['Id']); + break; + } + } + break; + + case 'new': + if (check_permission_acp('group_edit')) + { + $AVE_User->userGroupNew(); + } + break; + + case 'delete': + if (check_permission_acp('group_edit')) + { + $AVE_User->userGroupDelete($_REQUEST['Id']); + } + break; +} + +?> \ No newline at end of file diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..de36df9 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,135 @@ +assign('captcha', ADMIN_CAPTCHA); + $AVE_Template->display('login.tpl'); + exit; + } + + if (! defined('UID') || ! check_permission('adminpanel')) + { + user_logout(); + header('Location:admin.php'); + exit; + } + + if (empty($_SESSION['admin_language'])) + { + if (! empty($_REQUEST['feld']) && ! empty($_REQUEST['Id']) && ! empty($_REQUEST['rubric_id'])) + { + $_SESSION['redirectlink'] = 'index.php?do=docs&action=edit&pop=1' + . '&rubric_id=' . (int)$_REQUEST['rubric_id'] + . '&Id=' . (int)$_REQUEST['Id'] + . '&feld=' . (int)$_REQUEST['feld'] + . '#' . (int)$_REQUEST['feld']; + } + else + { + unset($_SESSION['redirectlink']); + } + + header('Location:admin.php'); + exit; + } + + /* Вывод модулей на всех страницах */ + get_editable_module(); + LoginModuleCheck(); + + $AVE_Template->assign('use_editor', get_settings('use_editor')); + $AVE_Template->assign('user_avatar', getAvatar($_SESSION['user_id'],25)); + + if (!isset($_REQUEST['do'])) $_REQUEST['do'] = ''; + if (!isset($_REQUEST['action'])) $_REQUEST['action'] = ''; + if (!isset($_REQUEST['sub'])) $_REQUEST['sub'] = ''; + if (!isset($_REQUEST['submit'])) $_REQUEST['submit'] = ''; + + //Шаблоны навигации + $AVE_Template->assign('navi', $AVE_Template->fetch('navi/navi.tpl')); + $AVE_Template->assign('navi_top', $AVE_Template->fetch('navi/navi_top.tpl')); + + //Разрешенные методы + $allowed = array( + 'index', + 'start', + 'templates', + 'rubs', + 'user', + 'finder', + 'groups', + 'docs', + 'navigation', + 'logs', + 'request', + 'modules', + 'settings', + 'blocks', + 'sysblocks', + 'dbsettings', + 'browser', + 'fields' + ); + + $do = (! empty($_REQUEST['do']) && in_array($_REQUEST['do'], $allowed)) + ? $_REQUEST['do'] + : 'start'; + + header("Cache-Control: no-store, no-cache, must-revalidate"); + header("Expires: " . date("r")); + + include(BASE_DIR . '/admin/' . $do . '.php'); + + if (defined('NOPERM')) + $AVE_Template->assign('content', $config_vars['MAIN_NO_PERMISSION']); + + //Шаблоны + $tpl = (isset($_REQUEST['pop']) && $_REQUEST['pop'] == 1) + ? 'pop.tpl' + : 'main.tpl'; + + if (isset($_REQUEST['onlycontent']) && $_REQUEST['onlycontent'] == 1) + $tpl = 'onlycontent.tpl'; + + // Выводим шаблон + $AVE_Template->display($tpl); + + // Статистика + if (defined('PROFILING') && PROFILING) + echo get_statistic(1, 1, 1, 1); +?> \ No newline at end of file diff --git a/admin/init.php b/admin/init.php new file mode 100644 index 0000000..8ee0dd9 --- /dev/null +++ b/admin/init.php @@ -0,0 +1,43 @@ +Query(" + SELECT lang_alias_pref FROM " . PREFIX . "_settings_lang + WHERE lang_default = '1' +")->GetCell(); + +$_SESSION['admin_language'] = $lang_system; + +$AVE_Template = new AVE_Template(BASE_DIR . '/admin/templates'); +$AVE_Template->assign('tpl_dir', ABS_PATH . 'admin/templates'); + +// Файлы шаблонов для CodeMirror +$AVE_Template->assign('codemirror_connect', BASE_DIR . '/lib/redactor/codemirror/codemirror_connect.tpl'); +$AVE_Template->assign('codemirror_editor', BASE_DIR . '/lib/redactor/codemirror/codemirror_editor.tpl'); + +// Подключаем основные ланги +$AVE_Template->config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/main.txt'); + +define('SESSION', session_id()); +$AVE_Template->assign('sess', SESSION); +?> \ No newline at end of file diff --git a/admin/lang/bg/.gitkeep b/admin/lang/bg/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/admin/lang/bg/blocks.txt b/admin/lang/bg/blocks.txt new file mode 100644 index 0000000..56d123e --- /dev/null +++ b/admin/lang/bg/blocks.txt @@ -0,0 +1,69 @@ +BLOCK_HEAD = "Визуални блокове" +BLOCK_EDIT = "Управление на визуални блокове" +BLOCK_EDIT_TIP = "В този раздел се намират всички визуални блокове." +BLOCK_ID = "Id" +BLOCK_NAME = "Наименование на визуален блок" +BLOCK_HTML = "Код на визуалния блок" +BLOCK_TAGS = "Таг" +BLOCK_TAGS_2 = "HTML Tags" + + +BLOCK_VISUAL = "Визуален редактор" +BLOCK_VISUAL_H = "Визуален редакторр" + +BLOCK_MEDIAPATH = "Системен таг, път до папката с дизайна" +BLOCK_BREADCRUMB = "Системен таг, Breadcrumb" +BLOCK_DOCID_INFO = "Системен таг, идентификатор на документа" +BLOCK_PATH = "Път до корена на инсталацията" +BLOCK_HOME = "Линк към главната страница на сайта" + +BLOCK_AUTHOR = "Автор" +BLOCK_DATE = "Дата на създаване" +BLOCK_TAG = "Системен таг" +BLOCK_ACTIONS = "Действия" +BLOCK_NO_ITEMS = "Съобщение:
В този момент създадени визуални блокове." +BLOCK_BUTTON_SAVE = "Запази промените" +BLOCK_BUTTON_ADD = "Добави визуален блок" +BLOCK_BUTTON_COPY = "Копиране" +BLOCK_INSERT_H = "Добавяне на визуален блок" +BLOCK_EDIT_H = "Редактиране на визуален блок" +BLOCK_INNAME = "Въведете наименование на визуалния блок" +BLOCK_ENTER_NAME = "Моля, въведете наименованието на визуалния блок" +BLOCK_INSERT = "Тук може да добавяте и редактирате визуални блокове" + +BLOCK_SAVE = "Добави" +BLOCK_SAVEDIT = "Запази промените" +BLOCK_SAVE_NEXT = "Добави и продължи редактирането" +BLOCK_SAVEDIT_NEXT = "Приложи (CTRL+S)" + +BLOCK_INTEXT = "Визуален блок" +BLOCK_ADD = "Добави нов визуален блок" +BLOCK_ADD_BUTTON = "Добави" +BLOCK_EDIT_HINT = "Редактиране на визуален блок" +BLOCK_DELETE_HINT = "Узтриване на блок" +BLOCK_DEL_HINT = "Сигурни ли сте, че желаете да изтриете визуалния блок?" +BLOCK_LIST_LINK = "Списък с визуални блокове" +BLOCK_FILE = "Файл на шаблона" +BLOCK_SAVED = "Блокът е успешно записан." +BLOCK_COPY_TITLE = "Копиране на визуален блок" +BLOCK_COPY = "Копиране на визуален блок" +BLOCK_COPY_TIP = "Моля, въведете наименованието на визуалния блок" +BLOCK_COPY_TIP2 = "Моля, въведете наименование на копирания визуален блок" +BLOCK_EXIST = "Вече съшествува визуален блок със същото наименование" +BLOCK_SQLUPDATE = "Променил блок" +BLOCK_SQLNEW = "Създал нов визуален блок" +BLOCK_SQLDEL = "Изтрил визуален блок" +BLOCK_OR = " или " + +BLOCK_SAVED = "Визуалния блок е успешно записан" +BLOCK_SAVED_ERR = "Неуспешен запис на визуален блок.
Опитайте отново." +BLOCK_ERROR = "Грешка" +BLOCK_SUCCESS = "Изпълнено" + +// v 3.2 +BLOCK_DESCRIPTION = "Кратко описание" +BLOCK_ALIAS = "Алиас" +BLOCK_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:BLOCK:alias] [tag:BLOCK:id]. Алиасът не може да бъде число, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на блоковете." +BLOCK_ACCEPT = "Этот алиас можно использовать" +BLOCK_ER_SYN = "Грешен алиас!
Алиасът не трябва да е число, да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа" +BLOCK_ER_EXISTS ="Грешен алиас!
Този алиас вече е използван в друга контактна форма" \ No newline at end of file diff --git a/admin/lang/bg/dbactions.txt b/admin/lang/bg/dbactions.txt new file mode 100644 index 0000000..2e4675d --- /dev/null +++ b/admin/lang/bg/dbactions.txt @@ -0,0 +1,49 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +DB_SUB_TITLE = "Управление на базите данни" +DB_ACTION_WARNING = "Внимание!\nВие извършвате всички действия с базите данни на свой риск.\n\nПомнете, че всякакви действия с базите данни, биха могли да повредят съществуващата информация. \n\nСигурни ли сте, че желаете да продължите?\n\n" +DB_ACTION_RESET = "Внимание!\nВие се опитвате да възстановите базата даннни от резервно копие. Цалата текуща информация, ще бъде изтрита и презаписана.\nМоля, вземете под внимание, че след възстановяването на данни, Вие ще трябва да се ауторизирате отново.\n\nСигурни ли сте, че желаете да продължите?\n\n" +DB_OPTION_LIST = "Структура на базата дани" +DB_BUTTON_ACTION = "Изпълни действие" +DB_OPTIMIZE_DATABASE = "Оптимизация на базата данни" +DB_OPTIMIZE_INFO = "Това действие позволява да се увеличи производителността и да се намали обема на Вашите бази данни. Препоръчвания интервал между оптимизацията не трябва да бъде по-малък от 1 път в седмицата." +DB_REPAIR_DATABASE = "Възстановяване на повредени таблици" +DB_REPAIR_INFO = "Това действие позволява да се направи опит да се възстановят повреди в таблиците на базата данни, в случай на некоретно представяне на информацията по страниците." +DB_BACKUP_DATABASE = "Създаване на резервно копие" +DB_BACKUP_INFO = "Това позволява да се направи резервно копие както на цялата база данни, така и наотделни таблици. Моля, изберете в списъка отляво, таблиците за които искате да създадете резервно коппие. За избор на няколко таблици натиснете клавиша CTRL." +DB_RESTORE_TITLE = "Възстановяване на базите данни от резервно копие" +DB_RESTORE_FILE = "Възстановяване на базите данни от от файл" +DB_BUTTON_RESTORE = "Възстанови" +DB_ACTION = "Изберете действие" +DB_TIPS = "Внимание! Вие изпълнявате всички действия с базите данни на свой риск и отговорност. Помнете, че всички действия извършвани с базата данни могат да повредят съществуващата информация." +DB_BACKUP_SERVER = "Запази резервно копие на сървъра" +DB_SC = "Операцията с базите данни е успешно изпълнена" + +DB_OPTIMIZE_DATABASE_SC = "Оптимизацията на базите данни е успешно изпълнена" +DB_REPAIR_DATABASE_SC = "Възстановяването на повредените таблици е успешно изпълнено" + +DB_REPORT_DUMP = "Извършил резервно копиране на базите данни" +DB_REPORT_DUMP_RECOVER = "Изпълнил възстановяване на базите данни от резервно копие" +DB_REPORT_DUMP_OPTIM = "Изпълнил оптимизация на базите данни" +DB_REPORT_DUMP_TABLE = "Изпълнил възстановяване на таблици в базите данни" + +DB_FILE_DATA = "Дата на създаване" +DB_FILE_SIZE = "Размер" +DB_FILE_NAME = "Наименование на файл" +DB_ACTIONS = "Действия" +DB_ACTIONS_EDIT = "Редактиране" +DB_ACTIONS_DEL = "Изтриване" +DB_ACTIONS_RESTORE = "Възстановяване" +DB_ACTIONS_SAVE = "Запази на компютъра" + +DB_REPORT_DUMP_DEL_OK = "Изтрил файл с резервно копие на базите данни" +DB_REPORT_DUMP_DEL_ER = "Неуспешно изтриване на файл с резервно копие на базите данни" +DB_REPORT_DUMP_ER = "Грешка: Импорта на базите данни не е изпълнен, т.к. файлът липсва или е повреден." + +DB_ACTIONS_RESTORE_H = "Възстановаване на резервно копие" +DB_ACTIONS_RESTORE_T = "Сигурни ли сте, че желаете са възстановите резервно копие на базите данни?" + +DB_ACTIONS_DELETE_H = "Изтриване на файл" +DB_ACTIONS_DELETE_T = "Сигурни ли сте, че желаете да изтриете файл с резервно копие на базите данни?" + +DB_NO_FILES_MESS = "В момента липсват файлове с резевно копие на базите данни" diff --git a/admin/lang/bg/docs.txt b/admin/lang/bg/docs.txt new file mode 100644 index 0000000..1db615f --- /dev/null +++ b/admin/lang/bg/docs.txt @@ -0,0 +1,286 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[docs] +DOC_SUB_TITLE = "Управление на документи" +DOC_TIPS = "В този раздел е сипсъка на всички документи в системата. Тук може да изпълните основните операции с документи, като: Преглед, Редактиране, Изтриване на документ, а също и да напишете бележка към даден документ." +DOC_DATE_FORMAT = "%d.%m.%Y %H:%M" +DOC_LEGEND = "Легенда" +DOC_LEGEND_EDIT = "Редактиране на документ" +DOC_LEGEND_SHOW = "Преглед на страницата в нов прозорец" +DOC_LEGEND_ENABLE = "Направи документа активен" +DOC_LEGEND_DISABLE = "Направи документа неактивен" +DOC_LEGEND_TEMP_DELETE = "Временно изтриване на документ (в кошчето)" +DOC_LEGEND_RESTORE = "Възстанови документа (от кошчето)" +DOC_LEGEND_FINAL_DELETE = "Окончателно изтриване на документа" +DOC_CHOSE_RUB = "Изберете рубрика" +DOC_ID = "ID" +DOC_URL_RUB = "URL" +DOC_TITLE = "Наименование документ" +DOC_URL_TITLE = "Линк към документа" +DOC_IN_RUBRIK = "Рубрика" +DOC_IN_NEW = "Нов документ" +DOC_CREATED = "Публикуван" +DOC_EDIT = "Редактиран" +DOC_PRINTED = "Отпечатан" +DOC_CLICKS = "Видян" +DOC_AUTHOR = "Автор" +DOC_ACTIONS = "Действия" +DOC_EDIT_TITLE = "Редактиране на текущия документ" +DOC_CHANGE_RUBRIC = "Преместване на текущия документ в друга рубрика" +DOC_CHANGE_AUTOR = "Промяна на автора на документа" +DOC_SHOW_TITLE = "Преглед на документа(линк без ЧПУ)" +DOC_SHOW2_TITLE = "Преглед на документа(линк c ЧПУ)" +DOC_SHOW3_TITLE = "Документ без наименование" +DOC_CREATE_NOTICE_TITLE = "Създаване на бележка" +DOC_REPLY_NOTICE_TITLE = "Преглед/отговор на бележка" +DOC_ENABLE_TITLE = "Публикуване на документа" +DOC_DISABLE_TITLE = "Сваляне от публикация(деактивиране)" +DOC_TEMPORARY_DELETE = "Поставяне на документа в кошчето" +DOC_RESTORE_DELETE = "Възстанови от кошчето" +DOC_FINAL_DELETE = "Изтриване на документ" +DOC_ICON_COMMENT = "Има въведени бележки" +DOC_ICON_PUBLIC = "Документа е спрян от публикуване(деактивиран)" +DOC_ICON_RECYCLE = "Документа е поставен в кошчето(временно изтрит)" +DOC_SORT_TEXT = "Сортиране на документите по:" +DOC_TEMPORARY_CONFIRM = "Сигурни ли сте, че желаете временно да изтриете този документ?" +DOC_FINAL_CONFIRM = "Сигурни ли сте, че желаете окончателно да изтриете този документ?" +DOC_INSERT_LINK_TIP = "За избор на търсения документ, натиснете бутона "Избор"" +DOC_BUTTON_INSERT_LINK = "Избери" +DOC_BUTTON_LINK_POPUP = "Избери в нов прозорец" +DOC_BUTTON_ADD_DOCUMENT = "Добави документ" +DOC_BUTTON_ADD_DOCUMENT_NEXT = "Добави и продължи редактирането" +DOC_BUTTON_EDIT_DOCUMENT = "Запази промените" +DOC_BUTTON_EDIT_DOCUMENT_NEXT = "Запиши и продължи(Ctrl+S)" +DOC_ADD_DOCUMENT = "Добави нов документ" +DOC_EDIT_DOCUMENT = "Редактиране на документ" +DOC_OPTIONS = "Параметри на документ" +DOC_NAME = "Наименование документ
(HTML <title>)" +DOC_URL = "Псевдоним на документа
(SEO alias)" +DOC_URL_LINK = "Подстановка Алиасов" +DOC_URL_INFO = "За да изглежда линка към документа например така:
http://www.domain.tld/phone/samsung/
напишете в това поле: phone/samsung

Суффикс на линка автоматически се добавя при извеждане
в зависимост с настройките иказани във файла inc/config.php

В наименованието е разрешено да се използват:
a-z — латински символи;
а-я — символи кирилица (ако е разрешено);
/ — слеш;
- — знак тире;
_ — знак за подчертаване.

Наименованието на линка не трябва да съдържа:
print/ или /print/ или /print;
page-XX/ или /page-XX/ или /page-XX;
apage-XX/ или /apage-XX/ или /apage-XX;
artpage-XX/ или /artpage-XX/ или /artpage-XX;
където XX - цифри" +DOC_URL_LOG = "Използване на историята на алиасите за редирект" +DOC_URL_LOG_T = "Да се съхранява или не историята на алиасите на документа за последващ редирект" +DOC_URL_LOG_RUBRIC = "Използвай настройките на рубриката" +DOC_URL_LOG_USE = "Използвай винаги" +DOC_FIELD_G_UNKNOW = "Без група" +DOC_PROPERTY = "Параметри на документа" +DOC_URL_LOG_NOTUSE = "Не използвай" +DOC_QUERIES = "Налични заявки" +DOC_META_TITLE = "TITLE - текст, който се извежда като заглавие на документа в прозореца на браузерра. Този таг е важен за SEO оптимизацията, затова моля избирайте внимателно зазглавието." +DOC_META_KEYWORDS = "Ключови думи:
(meta keywords)" +DOC_META_KEYWORDS_INFO = "Описват съдържанието на страницата, могат да бъдат използвани от търсещите системи.

Необходимо е поне част от изброените думи да присъстват в текста на страницата." +DOC_META_DESCRIPTION = "Описание на страницата
(meta description)" +DOC_META_DESCRIPTION_INFO= "Кратът текстм описващ съдържанието на страницата. Също може да бъде използвано от търсещите машини и да се извежда като пояснение в резултатите от търсенето или в интернет каталози." +DOC_CAN_SEARCH = "Разреши търсенето в документа
(за модула Търсене)" +DOC_INDEX_TYPE = "Тип индексиране на страницата
(meta robots)" +DOC_INDEX_FOLLOW = "Индексиране и преход по линковете" +DOC_INDEX_NOFOLLOW = "Индексиране, но без преход по линковете" +DOC_NOINDEX_NOFOLLOW = "Без индексиране и без преход по линковете" +DOC_SITEMAP_FREQ = "Честота на обновяване
sitemap.xml" +DOC_SITEMAP_FREQ_DOC = "Честота на обновяване на страницата" +DOC_SITEMAP_ALWAYS = "Винаги" +DOC_SITEMAP_HOURLY = "Ежечасно" +DOC_SITEMAP_DAILY = "Ежедневно" +DOC_SITEMAP_WEEKLY = "Ежеседмично" +DOC_SITEMAP_MONTHLY = "Ежемесечно" +DOC_SITEMAP_YEARLY = "Ежегодно" +DOC_SITEMAP_NEVER = "Никога" +DOC_SITEMAP_PRIORITY = "Приоритет
sitemap.xml" +DOC_SITEMAP_PRIORITY_DOC = "Приоритет на тази страница спрямо останалите" +DOC_SITEMAP_PRIORITY_LOW = "Нисък приоритет" +DOC_SITEMAP_PRIORITY_MID = "Среден приоритет" +DOC_SITEMAP_PRIORITY_HIG = "Висш приоритет" +DOC_START_PUBLICATION = "Начало на публикуване" +DOC_END_PUBLICATION = "Край на публикуване" +DOC_STATUS = "Статус на документа" +DOC_STATUS_ACTIVE = "Активен" +DOC_STATUS_INACTIVE = "Неактивен" +DOC_ADD_IN_NAVIGATION = "Добави подпункт в меню" +DOC_USE_NAVIGATION = "Свържи с пункт в меню" +DOC_USE_RUB_ALIAS = "Подстановки алиасов родителски документи, указване родителския документ за breadcrumb." +DOC_USE_BREADCRUMB = "Свържи с документ
(може да се използва за breadcrumb)" +DOC_USE_LANG_PACK = "Свържи с документ от езикова група" +DOC_NAVIGATION_INFO = "За да свържете документът с пункт от менюто, изберете съответния ред от падащия списък. Ако не е необходимо свързване, оставете полето празно." +DOC_MAIN_CONTENT = "Основно съдържание на документа" +DOC_MAIN_NOCONTENT = "Липсват полета за документа" +DOC_AFTER_CREATE_TITLE = "Следващи действия" +DOC_AFTER_CREATE_INFO = "Моля, изберете действие от списъка по долу:" +DOC_EDIT_THIS_DOCUMENT = "Продължаване редактирането на документа" +DOC_INCLUDE_NAVIGATION = "Добавяне на създадения документ в меню за навигация" +DOC_ADD_NEW_DOCUMENT = "Добавяне на нов документ в текущата рубрика" +DOC_ADD_COPY_DOCUMENT = "Добавяне на копие на документа в текущата рубрика" +DOC_DISPLAY_NEW_WINDOW = "Преглед на документа в нов прозорец (Ctrl+O)" +DOC_CLOSE_WINDOW = "Към списъка на всички документи" +DOC_CLOSE_WINDOW_RUBRIC = "Към списъка с документи от текущата рубрика" +DOC_TO_NAVI_TITLE = "Добавление документа в меню навигации" +DOC_NAVIGATION_POSITION = "Позиция в списъка:" +DOC_NAVIGATION_TITLE = "Наименование на реда в менюто:" +DOC_TARGET = "Отваряне:" +DOC_TARGET_SELF = "в текущия прозорец" +DOC_TARGET_BLANK = "в нов прозорец" +DOC_BUTTON_ADD_MENU = "Добави в меню" +DOC_TOP_MENU_ITEM = "Нов ред от 1-во ниво" +DOC_NOTICE = "Бележки към документа" +DOC_NOTICE_NEW_LINK = "Добави нова бележка" +DOC_NOTICE_AUTHOR = "Добавил: " +DOC_NOTICE_DELETE_LINK = "Изтриване на бележка" +DOC_ALLOW_NOTICE = "Разреши коментарите към бележките" +DOC_BUTTON_NOTICE = "Бележки" +DOC_NOTICE_TITLE = "Заглавие:" +DOC_NOTICE_TEXT = "Бележка:" +DOC_BUTTON_ADD_NOTICE = "Добави бележка" +DOC_SEND_NOTICE_INFO = "За да добавите нова бележка към докумнета, моля попълнете полетата във формата по долу." +DOC_NEW_NOTICE_TITLE = "Добави нова бележка" +DOC_MAIL_BODY_CHECK = "Потребителя %USER% е добавил нов документ с наименование '%TITLE%'.%N%Моля, проверете този документ преди публикуване." +DOC_MAIL_SUBJECT_CHECK = "Добавен е нов документ" +DOC_MAIL_BODY_USER = "Здравейте %USER%.%N%Създадения от Вас документ е успешно добавен и е изпратено уведомление на Администратора за проверка. Документа ще бъде публикуван след проверка." +DOC_MAIL_SUBJECT_USER = "Вашият документа е добавен и очаква проверка" +DOC_MAIL_BODY_NOTICE = "Потребителя %USER% е добавил нова бележка към документ.%N%Ауторизирайте се в панела за управление и преминете по линка по-долу, за да прочете бележката.:%N%%LINK%" +DOC_MAIL_SUBJECT_NOTICE = "Добавена е нова бележка към документ" +DOC_NEW_PAGE = "Добави нова страница" +DOC_CLOSE_HELP_WINDOW = "

" +DOC_HELP = "Помощ" +DOC_VIDEO_TYPE_HELP = "Добавяне на видео файл
При добавяне на видео файл, Вие може да зададете ширина и височина на прозореца за показване на видеото. Първото число е за ширината на прозореца, второто за височина.

Например:

video.avi|300|300
или
video.avi|100%|300" +DOC_FLASH_TYPE_HELP = "Добавяне на флаш
При добавяне на флаш, Вие може да укажете ширина и височина на прозореца за преглед. Първото значение определя ширината, второто височината.

Например:

flash.swf|300|300
или
flash.swf|100%|300" +DOC_FILE_TYPE_HELP = "Вмъкване на файл
При добавяне на файл, Вие може да зададете наименование на линка. За това е необходимо след наименованието на файла да въведете разделителен знак | и след него въведете наименованието на линка.

Например:

file.zip|Свали файла" +DOC_NO_PERMISSION = "Извинете, но Вие нямате права за редактиране на този документ." +DOC_NO_PERMISSION_RUB = "Извинете, но Вие нямате права за добавяне на документ в тази рубрика." +DOC_NO_DEL_REVISION = "Извинете, но Вие нямате права за изтриване на ревизия на документ." +DOC_NO_RES_REVISION = "Извинете, но Вие нямате права за възстановяване на ревизия на документ." +DOC_EDIT_RUB = "Прехвърли в друга рубрика" +DOC_RUBRIC = "Рубрика" +DOC_SORT_RUB = "Сортиране по рубрики" +DOC_IMAGE = "Изображението в списъка на новините" +DOC_IMAGE_MAX_W = "Максимална ширина" +DOC_IMAGE_MAX_H = "Максимална височина" +DOC_INTRO = "Тизер
(текста в списъка на новините)" +DOC_ALIAS_CREATE = "Формиране" +DOC_ENTER_NAME = "Моля, изберете рубрика в която желаете да добавите новия документ." +DOC_SORT_NAME = "Моля, изберете рубрика." +DOC_OR = " или " +DOC_NO_DOCS = "Липсват документи, отговарящи на тези условия." + +DOC_COPY = "Копиране на документ" +DOC_COPY_DOCUMENT = "Копиране на документ" +DOC_COPY_TIP = "Моля, въведете наименование на документа" + +DOC_ADD_NEW_LIGHT_TIP = "За да добваите нов документ, моля изберете рубрика." +DOC_ADD_NEW_LIGHT_ADD = "Добавяне на документ" +DOC_ADD_NEW_LIGHT_BTN = "Добави документ" + +DOC_CHANGE_TITLE = "Преместване на документ в друга рубрика" +DOC_CHANGE_INFO = "Внимание! При промяна на рубриката, непрехвърлените полета се губят!" +DOC_CHANGE_OLD_FIELD = "Поле на документ" +DOC_CHANGE_NEW_FIELD = "Преместване в ново" +DOC_CHANGE_DROP_FIELD = "-- не пренасяй --" +DOC_CHANGE_CREATE_FIELD = "-- създай ново --" +DOC_CHANGE_BUTTON = "Промени" + +DOC_CHANGE_AU_TITLE = "Промяна автор на документа" +DOC_CHANGE_AU_INFO = "Внимание! При промяна на автора, предишния автор може да бъде лишен от правата си да редактира документа." +DOC_CHANGE_BUTTON = "Запази" + +DOC_IN_MENU = "в меню" + +DOC_REVISSION = "История на промените" +DOC_REVISSION_DATA = "Дата и време на промяна" +DOC_REVISSION_USER = "Автор" +DOC_REVISSION_VIEW = "Преглед на версията" +DOC_REVISSION_RECOVER = "Възстановяване на версията" +DOC_REVISSION_RECOVER_T = "Сигурни ли сте, че желаете да възстановите версията?" +DOC_REVISSION_DELETE = "Изтриване на версия" +DOC_REVISSION_DELETE_T = "Сигурни ли сте, че желаете да изтриете тази версия?" +DOC_REVISSION_NO_ITEMS = "В момента няма данни" + +DOC_URL_ERROR_SYMBOL = " недопустими символи " +DOC_URL_ERROR_START = " започва с / " +DOC_URL_ERROR_END = " завършва на / (при това суффикс URL започва с /)" +DOC_URL_ERROR_SEGMENT = " недопустими сегменти: " +DOC_URL_ERROR_EMTY = " липсват данни за проверка " +DOC_URL_ERROR_DUPLICATES = " псевдонима вече се използва " +DOC_URL_H_ERROR_DUPLICATES = "псевдонима вече се използва в историята на алиасите" +DOC_URL_CHECK_OK = " този URL може да се използва " +DOC_URL_CHECK_ER = " в URL има грешки:
" + +DOC_REQUEST_NOT_INFO = "Липсва описание за тази заявка." + +DOC_REVISION_DELETE = "Изтрил версия на документа" +DOC_REVISION_RECOVER = "Възстановил версия на документа" + +DOC_BREADCRUMB_BTN = "Избери" +DOC_BREADCRUMB_TITLE = "Наименование на линк за breadcrumb" +DOC_BREADCRUMB_WITH = "Свързан с" + +DOC_DOCUMENT_OPEN = "Документа е активиран" +DOC_DOCUMENT_CLOSE = "Документа е деактивиран" + +DOC_DOCUMENT_DOC = "документ" +DOC_DOCUMENT_ACT = "Активирал" +DOC_DOCUMENT_DISACT = "Деактивирал" + +DOC_DOCUMENT_OPEN_ERR = "Този документ не може да бъде неактивен!" +DOC_DOCUMENT_OPEN_PRIVE = "Нямате достатъчно права за да извършите това действие!" + +DOC_ACTION_SELECT = "Действие с избраните" +DOC_ACTION_SELECT_ACT = "Активен" +DOC_ACTION_SELECT_NACT = "Неактивен" +DOC_ACTION_SELECT_TRASH = "Временно изтриване" +DOC_ACTION_SELECT_OUTTRASH = "Възстановяване" +DOC_ACTION_SELECT_DEL = "Изтриване" +DOC_ACTION_BUTTON = "Запази промените" + +DOC_CHOOSE_LANG = "Избор на език за документа" +DOC_LANG_VERSION = "Версия на документа на други езици" +DOC_LINK_CHOOSE = "Изберете документ" +DOCUMENT_SAVED = "Документът е успешно записан" + +DOC_REV_DELETED = "Ревизиите на документите са успешно изтрити" +DOC_REV_DELETED_ERR = "Неуспешно изтриване на ревизиите.
Пробвайте отново." +DOC_REV_ERROR = "Грешка" +DOC_REV_SUCCESS = "Изпълнено" +DOC_REV_UPDATE = "Изтрил ревизиите на документите" + +DOC_ALIASES = "Управление на редиректите на документите" +DOC_ALIASES_LIST_NM = "Наименование на документ" +DOC_ALIASES_LIST_RB = "Рубрика" +DOC_ALIASES_LIST_CH = "Изменено" +DOC_ALIASES_LIST_CR = "Брой" +DOC_ALIASES_LIST_AT = "Действия" +DOC_ALIASES_TITLE = "Списък на всички документи, които имата вътрешни редиректи.
Тук може да изпзълните основните операции с документите: преглед, редактиране, изтриване." +DOC_ALIASES_BREAD_RUB = "Рубрика:" +DOC_ALIASES_BREAD_DOC = "Документ:" +DOC_ALIASES_BREAD_URL = "Основен URL:" +DOC_ALIASES_DOC_LIST = "Списък документи с редиректи" +DOC_ALIASES_ADD = "Добави нов редирект" +DOC_ALIASES_ADD_VAL = "Значение на редиректа" +DOC_ALIASES_LIST = "Списък с редиректи" +DOC_ALIASES_LIST_EMPT = "Празен списък" +DOC_ALIASES_TABL_H_URL = "Алиас на редиректа" +DOC_ALIASES_TABL_H_ADD = "Добавен" +DOC_ALIASES_TABL_H_AUT = "Автор" +DOC_ALIASES_TABL_CHECK = "Маркирай този пункт за изтриване" +DOC_ALIASES_GO = "Премени по линка" +DOC_ALIASES_DEL_T = "Изтриване на алиас" +DOC_ALIASES_DEL_C = "Сигурни ли сте, че желаете да изтриете алиаса?" +DOC_ALIASES_BUTT_DEL = "изтрий" +DOC_ALIASES_BUTT_CLO = "Затвори прозореца" +DOC_ALIASES_BUTT_APP = "Приложи" +DOC_ALIASES_BUTT_CNL = "Отмени" +DOC_ALIASES_BUTT_SAV = "Запази" +DOC_ALIASES_BUTT_ADD = "Добави" +DOC_ALIASES_REP_OK = "Изпълнено" +DOC_ALIASES_REP_OK_T = "Редиректът е успешно добавен" +DOC_ALIASES_REP_OK_T_E = "Редиректът е успешно обновен" +DOC_ALIASES_REP_ER = "Грешка" +DOC_ALIASES_REP_ER_T = "Редиректът не е добавен. Пробвайте отново." +DOC_ALIASES_REP_ER_T_E = "Редиректът не е обновен. Пробвайте отново." + +DOC_RUBRIC_TMPLS = "Избери шаблон на рубрика" +DOC_RUBRIC_TMPLS_HINT = "Може да зададете на документа, всеки шаблон от рубриката" + +DOC_SEARCH_FIELD = "Изберете поле" +DOC_SEARCH_FIELD_LIKE = "Съдържа" +DOC_SEARCH_FIELD_EQ = "Равно на" +DOC_SEARCH_FIELD_TEXT = "Стойност" +DOC_TEMPLATE_DEFAULT = "Използвай по подразбиране" +DOC_SHOW_LANG = "Покажи" \ No newline at end of file diff --git a/admin/lang/bg/groups.txt b/admin/lang/bg/groups.txt new file mode 100644 index 0000000..bbfe296 --- /dev/null +++ b/admin/lang/bg/groups.txt @@ -0,0 +1,121 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[groups] +UGROUP_TITLE = "Управление на групите потребители" +UGROUP_TITLE2 = "Управление правата за достъп на група" +UGROUP_TITLE_MENU = "Групи потребители" +UGROUP_INFO = "В този раздел са всички потребителе в системата. За всяка група Вие може да определите персонални права, които разрешават или ограничават действията на потребителите както в Панела за управление, така и в Публичната част на сайта." +UGROUP_ID = "ID" +UGROUP_NAME = "Наименование" +UGROUP_COUNT = "В групата" +UGROUP_ACTIONS = "Действия" +UGROUP_IN_GROUP = "Преглед на списъка на потребителите, отнасящи се към дадената група" +UGROUP_EDIT = "Редактиране правата на групата" +UGROUP_NO_PERMISSION = "Извинете, Вие нямате права за редактиране" +UGROUP_DELETE = "Изтриване на текущата група" +UGROUP_USERS_IN_GROUP = "В момента Вие не може да изтриете дадената група. т.к. в нея има въведени потребители." +UGROUP_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете тази група?" +UGROUP_NO_DELETABLE = "Вие не може да изтриете дадената група, т.к. е системна." +UGROUP_NO_PERM_DELETE = "Извинете, но Вие нямате права за изтриване на група." +UGROUP_NEW_GROUP = "Добавяне на нова група" +UGROUP_NEW_NAME = "Наименование на групата:" +UGROUP_BUTTON_ADD = "Добавяне" +UGROUP_LEGEND_LINK = "Легенда" +UGROUP_LEGEND_EDIT = "Редактиране правата на групата" +UGROUP_LEGEND_DELETE = "Изтриване на група" +UGROUP_ENTER_NAME = "Моля, въведете наименованието на групата потребители" +UGROUP_WARNING_TIP = "Внимание! Бъдете крайно внимателни при определянето на правата за групите потребители. Помнете, че като разрешаване достъпа до някои раздели, може да доведе до уязвимост на системата." +UGROUP_YOUR_NOT_CHANGE = "Грешка! Извинете, но Вие нямате права за редактиране на групите потребители." +UGROUP_NOT_EXIST = "Грешка! Извинете, но такава група не съществува." +UGROUP_NO_MODULES = "Липсват инсталирани модули" +UGROUP_MODULES_RIGHT = "Моля, изберете модулите до които ще има достъп тази група потребители." +UGROUP_CONTROL_RIGHT = "Моля, изберете раздели от Административния панел за които ще бъде разрешен или ограничен достъпа за тази група потребители." +UGROUP_BUTTON_SAVE = "Запази промените" +UGROUP_BUTTON_SAVE_AJAX = "Приложи (CTRL+S)" +UGROUP_SAVE_CONFIRM = "Сигурни ли сте, че желаете да запишите правата за тази група потребители?" +UGROUP_NAME_EDIT = "Редактиране наименованието на групата" +UGROUP_OR = "или" +UGROUP_SAVED = "Правата за групата са успешно записани" +UGROUP_SAVED_ERR = "Неуспешно записване на правата за групата.
Пробвайте отново." +UGROUP_ERROR = "Грешка" +UGROUP_SUCCESS = "Изпълнено" +UGROUP_SAVE_MAIN = "Променил правата за достъп за групата" + +UGROUP_REPORT_ADD = "Създал група потребители" +UGROUP_REPORT_DEL = "Изтрил група потребители" + +alles = "Разреши всички права (Бъдете много внимателни!)" +adminpanel = "Достъп в панела за управление" + +gen_settings = "Достъп за управлението на общите настройки на системата" +gen_settings_more = "Достъп за управлението на допълнителните настройки на системата" +gen_settings_countries = "Достъп за управлението на списъка с държави" +gen_settings_languages = "Достъп за управлението на езиците" + +logs_view = "Достъп за преглед на системните съобщения" +logs_clear = "Достъп за изтриване на системните съобщения" + +db_actions = "Достъп за управление на базата данни (Резервно копиране, Възстановяване, Оптимизация)" + +modules_view = "Достъп до списъка с модули" +modules_admin = "Достъп до модули (Настройка, Управление, Използване)" +modules_system = "Достъп за управление на модулите (Изтриване, Инсталиране)" + +navigation_view = "Достъп до списъка с менюта за навигация" +navigation_edit = "Достъп за управление на менюта за навигация (Създаване, Редактиране, Изтриване)" + +remark_view = "Достъп до списъка с бележки" +remark_edit = "Достъп за управление на бележките към документите (Създаване, Редактиране, Изтриване)" + +document_php = "Достъп за използване на PHP код в документите (Бъдете много внимателни!)" +document_view = "Достъп до списъка с документи (правава за Достъп към докуметите зависят и се определят в настройките на Рубриките)" +document_revisions = "Достъп за изтриване на всички ревизии на документите" + +rubric_view = "Достъп за преглед на списъка с рубрики" +rubric_edit = "Достъп за управление на рубриките (Създаване, Редактиране, Изтриване)" +rubric_php = "Достъп за използване на PHP код в шаблоните на рубриките (Бъдете много внимателни!)" +rubric_perms = "Достъп за управление на Правата за достъп на документите на рубриките" +rubric_code = "Достъп до изпълнимия код за рубриките (Бъдете много внимателни!)" + +template_view = "Достъп до списъка със шаблони" +template_edit = "Достъп до упралението на шаблоните (Създаване, Редактиране, Изтриване)" +template_php = "Достъп за използване на PHP код в шаблоните (Бъдете много внимателни!)" + +request_view = "Достъп до списъка със заявките" +request_edit = "Достъп до управлението на заявките (Създаване, Редактиране, Изтриване)" +request_php = "Достъп за използване на PHP код в шаблоните на заявките (Бъдете много внимателни!)" + +sysblocks_view = "Достъп за преглед на списъка със системните блокове" +sysblocks_edit = "Достъп за управление на системните блокове (Създаване, Редактиране, Изтриване)" + +user_view = "Достъп до списъка на потребителите" +user_edit = "Достъп за редактиране на параметрите на потребителите" +user_perms = "Достъп за управление на правата на потребителите" + +group_view = "Достъп за преглед списъка на групите потребители" +group_edit = "Достъп за управление на правата на групите потребители (Създаване, Редактиране, Изтриване)" + +mediapool_int = "Достъп до файловия мениджър" +mediapool_add = "Достъп за добавяне на нови файлове на сървъра (чрез файловия мениджър)" +mediapool_del = "Достъп за изтриване на файлове на съсръра (чрез файловия мениджър)" +mediapool_finder = "Достъп до Файловия мениджър (elFinder)" + +cache_clear = "Достъп за изтриване на кеша" +cache_thumb = "Достъп за изтриване на удалению thumbnail изображенията (thumbnail)" + +logs = "Системни съобщния" +cache = "Управление на кеша" +gen = "Системни настройки" +db = "База данни" +sysblocks = "Системни блокове" +rubric = "Рубрики" +document = "Документи" +modules = "Модули" +mediapool = "Файлови мениджъри" +navigation = "Навигация" +request = "Заявки" +template = "Шаблони" +remark = "Бележки към документите" +document = "Документи" +user = "Потребители" +group = "Групи потребители" \ No newline at end of file diff --git a/admin/lang/bg/logs.txt b/admin/lang/bg/logs.txt new file mode 100644 index 0000000..c9a247d --- /dev/null +++ b/admin/lang/bg/logs.txt @@ -0,0 +1,55 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[logs] +LOGS_SUB_TITLE = "Управление на системните съобщения" +LOGS_TITLE = "Журнал системни събития" +LOGS_TIP = "В този раздел е списъка на всички действия, извършвани в Административния панел." +LOGS_ID = "№" +LOGS_IP = "Ip-адрес" +LOGS_DATE = "Дата" +LOGS_USER = "Потребител" +LOGS_ACTION = "Действие" +LOGS_BUTTON_DELETE = "Изтриване на системните съобщения" +LOGS_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете системните съобщения?" +LOGS_BUTTON_EXPORT = "Експорт на ситемните съобщения" +LOGS_BUTTON_EXPORT_404 = "Експорт на дневника с грешки 404" +LOGS_DATE_FORMAT = "%d.%m.%y г." +LOGS_DATE_FORMAT2 = "%H:%M" +LOGS_IN = "в" +LOGS_CLEAR = "Системните съобщения са успешно изтрити." +LOGS_CLEAN = "Изтрил системните съобщения" +LOGS_EXPORT = "Експортирал системните съобщения" + +LOGS_404_SUB_TITLE = "Дневник грешки 404" +LOGS_404_TITLE = "Дневник грешки 404" +LOGS_404_TIP = "В този раздел е списъка на всички грешки 404." +LOGS_404_ID = "№" +LOGS_404_IP = "Ip-адрес" +LOGS_404_DATE = "Дата" +LOGS_404_ACTION = "Действие" +LOGS_404_BUTTON_DELETE = "Изтриване на дневника" +LOGS_404_DELETE_CONFIRM = "Сисурнили сте, че желаете да изтриете дневника с грешки 404?" +LOGS_404_BUTTON_EXPORT = "Експорт на дневника с грешки" +LOGS_404_DATE_FORMAT = "%d.%m.%y г." +LOGS_404_DATE_FORMAT2 = "%H:%M" +LOGS_404_IN = "в" +LOGS_404_CLEAR = "Системните съобщения са успешно изтрити." +LOGS_404_CLEAN = "изтрил Дневника с грешки 404" +LOGS_404_EXPORT = "експортирал Дневника с грешки 404" + +LOGS_SQL_SUB_TITLE = "Дневник MySQL грешки" +LOGS_SQL_TITLE = "Дневник MySQL грешки" +LOGS_SQL_TIP = "Списък на всички MySQL грешки." +LOGS_SQL_ID = "№" +LOGS_SQL_IP = "Ip-адрес" +LOGS_SQL_DATE = "Дата" +LOGS_SQL_ACTION = "Действие" +LOGS_SQL_BUTTON_DELETE = "Изтриване на дневника с MySQL грешки" +LOGS_SQL_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете дневника с MySQL грешки?" +LOGS_SQL_BUTTON_EXPORT = "Експорт на дневника с MySQL грешки" +LOGS_SQL_DATE_FORMAT = "%d.%m.%y г." +LOGS_SQL_DATE_FORMAT2 = "%H:%M" +LOGS_SQL_IN = "в" +LOGS_SQL_CLEAR = "Дневника с MySQL грешки еуспешно изтрит." +LOGS_SQL_CLEAN = "Изтрил дневника с MySQL грешки" +LOGS_SQL_EXPORT = "Експортирал дневника с MySQL грешки" \ No newline at end of file diff --git a/admin/lang/bg/main.txt b/admin/lang/bg/main.txt new file mode 100644 index 0000000..20032ed --- /dev/null +++ b/admin/lang/bg/main.txt @@ -0,0 +1,305 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +MAIN_WELCOME = "Добре дошли в Панела за управление!" +MAIN_WELCOME_INFO = "На главната страница Вие може да изберете някое от най-често изпълняваните функции." + +MAIN_PAGE = "Начална страница" + +MAIN_LOGIN_INTRO = "Вход в системата" +MAIN_LOGIN_BACK_SITE = "Обратно към сайта" +MAIN_LOGIN_NAME = "Потребител" +MAIN_LOGIN_PASSWORD = "Парола" +MAIN_LOGIN_BUTTON = "Вход" +MAIN_LOGIN_REGISTER = "Регистрация" +MAIN_LOGIN_LOST = "Забравена парола?" +MAIN_LOGIN_HELP = "Помощ" +MAIN_LOGIN_REMEMBER = "Запомни ме" +MAIN_LOGIN_CAP_CODE = "Код:" +MAIN_LOGIN_CAP_CODE_REF = "Обновяване на кода:" +MAIN_LOGIN_CAP_CODE_REFR = "Обновяване на кода" + +MAIN_LINK_HOME = "Начало" +MAIN_LINK_AUTHOR = "Сайт за поддръжка" +MAIN_LINK_DATABASE = "База данни" +MAIN_LINK_NAVIGATION = "Навигация" +MAIN_LINK_MODULES = "Модули" +MAIN_LINK_MODULES_H = "Модули" +MAIN_LINK_SETTINGS = "Настройки" +MAIN_LINK_SETTINGS_H = "Настройки" +MAIN_LINK_USERS = "Потребители" +MAIN_LINK_TEMPLATES = "Шаблони" +MAIN_LINK_RUBRICS = "Рубрики" +MAIN_LINK_DOCUMENT = "Документи" +MAIN_LINK_QUERYES = "Заявки" +MAIN_LINK_GROUPS = "Групи потребители" +MAIN_LINK_LANG = "Езици" + +MAIN_BUTTON_LOGIN = "Вход" +MAIN_BUTTON_ADD = "Добави" +MAIN_BUTTON_LOGOUT = "Изход" + +MAIN_SETTINGS_EDIT_1 = "Общи настройки" +MAIN_SETTINGS_EDIT_2 = "Допълнителни настройки" +MAIN_SETTINGS_EDIT_3 = "Държави" +MAIN_SETTINGS_EDIT_4 = "Създай резервно копие на БД" + +MAIN_LINK_DOC_TIPS = "В този раздел е списъка на всички въведени в системата документи." +MAIN_LINK_RUBRIK_TIP = "В този раздел е списъка на всички съществуващи рубрики в системата." +MAIN_LINK_REQUEST_TIP = "В този раздел е списъка на всички съществуващи заявки в системата." +MAIN_LINK_NAVI_TIP = "В този раздел е списъка на всички менюта за навигация в системата." +MAIN_LINK_TEMPLATES_TIP = "В този раздел е списъка на всички шаблони, използвани в системата." +MAIN_LINK_MODULES_TIP = "В този раздел е списъка на всички достъпни/активни и неактивни/ модули в системата." +MAIN_LINK_SETTINGS_TIP = "В този раздел може да променяте/редактирате глобалните параметри на системата." +MAIN_LINK_DB_TIP = "В този раздел вие може да работите с базите данни на системата." +MAIN_LINK_USER_TIP = "В този раздел е списъка на всички потребители, въведени в системата." +MAIN_LINK_UGROUP_TIP = "В този раздел е списъка на всички групи потребители в системата." + +MAIN_PAGE_TITLE = "Административен панел" +MAIN_LOGIN_TEXT = "Вход в системата" +MAIN_LOGIN_TEXT2 = "Моля, въведете вашите данни:" +MAIN_LOGIN_CAPTCHA = "Въведете кода:" +MAIN_SELECT_LANGUAGE = "Език:" +MAIN_SELECT_THEME = "Шаблон:" +MAIN_YOUR_EMAIL = "Имейл:" +MAIN_YOUR_LOGIN = "Логин или имейл:" +MAIN_YOUR_PASSWORD = "Парола:" + +MAIN_LINK_SITE = "Преглед сайт" +MAIN_LINK_HOME = "Начало" +MAIN_LINK_LOGOUT = "Изход от админ панела" +MAIN_LINK_LOGOUT_QUEST = "Сигурни ли сте, че желаете да излезете?" +MAIN_LINK_CACHE_CLEAR = "Изтриване на кеша" +MAIN_LINK_CACHE_CLEAR_QUEST = "Сигурни ли сте, че желаете да изтриете кеша?" + +MAIN_LINK_SITE_ON = "С включен редактор" +MAIN_LINK_SITE_OFF = "Без редактор" + +MAIN_LINK_EDIT = "Редактиране на сайта" +MAIN_ADD_IN_RUB = "Добавяне на нов документ" +MAIN_DOCUMENTS_ALL = "Списък с документи" +MAIN_SEARCH_DOCUMENTS = "Търсене на документи" +MAIN_SORT_DOCUMENTS = "Филтър по рубрика" +MAIN_TIME_PERIOD = "Период на публикация" +MAIN_TIME_START = "Начало" +MAIN_TIME_END = "Край" +MAIN_BUTTON_SEARCH = "Търсене" +MAIN_TITLE_SEARCH = "Наименование документ" +MAIN_TITLE_DOC_NAME = "Наименование документ" +MAIN_TITLE_DOC_ID = "ID на документ" +MAIN_SEARCH_HELP = "Използване на търсенето

Използвайте знака "+" за задължтелно включване на думата в търсенето.
Използвайте знака "-" за изключване на дума от търсенето.

Задължително използвайте интервал преди знаците "+" и "-". " +MAIN_ID_SEARCH = "ID на документ" +MAIN_SELECT_RUBRIK = "В рубрика" +MAIN_ALL_RUBRUKS = "във всички рубрики" +MAIN_ALL_DOCUMENTS = "всички" +MAIN_DOCUMENT_STATUS = "Статус на документ" +MAIN_DOCUMENT_ACTIVE = "само активните" +MAIN_DOCUMENT_INACTIVE = "само неактивните" +MAIN_TEMP_DELETE_DOCS = "временно изтрити" +MAIN_RESULTS_ON_PAGE = "Резултати на стр." +MAIN_OPEN_MEDIAPATH = "Преглед на сървара" +MAIN_NAVI_UGROUPS = "Групи" +MAIN_UGROUP_EDIT = "Редактиране правата на групите" +MAIN_UGROUP_DELETE = "Изтриване на тази група" +MAIN_LOGS = "Логове" +MAIN_NAVI_MODULES = "Модули" +MAIN_NAVIGATION = "Навигация" +MAIN_NAVIGATION_NEW = "Добавяне на ново меню" +MAIN_QUERIES = "Заявки" +MAIN_REQUEST_NEW = "Добавяне на нова заявка" +MAIN_RUBRIKS = "Рубрики" +MAIN_RUBRIK_NEW = "Добавяне на нова рибрика" +MAIN_RUBRIK_EDIT_FIELDS = "Редактиране полетата на рубриката" +MAIN_RUBRIK_EDIT_TEMPL = "Редактиране шаблона на рубриката" +MAIN_SETTINGS = "Настройки" +MAIN_COUNTRY_EDIT = "Държави" +MAIN_SYSBLOCKS = "Системни блокове" +MAIN_TEMPLATES = "Шаблони" +MAIN_TEMPLATES_NEW = "Добавяне на нов шаблон" +MAIN_USERS = "Потребители" +MAIN_DATABASE_INFO = "База данни" +MAIN_NAVI_DOCUMENTS = "Документи" +MAIN_BROWSE_DOCUMENTS = "Преглед на документите" +MAIN_USERS_LIST = "Списък потребители" +MAIN_USER_ADD = "Добавяне на нов потребител" +MAIN_SEARCH_USERS = "Търсене на потребители по:" +MAIN_USER_PARAMS = "Име, Id, E-mail, E-mail домейн" +MAIN_USER_STATUS = "Със статус:" +MAIN_USER_STATUS_ALL = "Всички" +MAIN_USER_STATUS_ACTIVE = "Активен" +MAIN_USER_STATUS_INACTIVE = "Очакващ активация" +MAIN_USER_GROUP = "Принадлежи към група" +MAIN_USER_ONLINE = "Здравейте, " +MAIN_USER_PERM = "Статус:" +MAIN_ALL_USER_GROUP = "Във всяка" +MAIN_BUTTON_SEARCH_USER = "Намери потребител по параметри" +MAIN_NO_PERMISSION = "Извинете, но вие нямате права за достъп до дадения раздел" +MAIN_LOGOUT_CONFIRM = "Сигурни ли сте, че желаете да излезете?" + +MAIN_START_DOC_TITLE = "Последни документи" +MAIN_START_DOC_ID = "id" +MAIN_START_DOC_NAME = "Наименование" +MAIN_START_DOC_RUBRIC = "Рубрика" +MAIN_START_DOC_DATE = "Публикуван" +MAIN_START_DOC_AUTOR = "Автор" + +MAIN_START_SEARCH = "Търсене:" +MAIN_START_SEARCH_T = "Търсене на документ" + +MAIN_START_LOGS_LOG = "Дневник операции" +MAIN_START_LOGS_404 = "Грешки 404" +MAIN_START_LOGS_SQL = "Грешки MySQL" + +MAIN_TABLE_SUCC = "Брой успешно заредени таблици: " +MAIN_TABLE_ERROR = "Брой таблици с грешки: " +MAIN_SQL_FILE_ERROR = "SQL-файла има грешен формат или има грешки в структурата на заявката." +MAIN_RESTORE_OK = "Базата данни е успешно възстановена" + +MAIN_NO_PERM_MODULES = "Извинете, но вие нямате достатъчно права за да управлявате дадения модул" +MAIN_MP_FILE_DELETE = "Изтриване на файл" +MAIN_MP_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете файла: " +MAIN_MP_DOC_FOLDER = "Списък на папки/ файлове" +MAIN_MP_FILE_SIZE = "Размер на файла" +MAIN_MP_FILE_DATE = "Дата на създаване" +MAIN_MP_ACTIONS = "Действия" +MAIN_MP_FILE_INFO = "За да добавите файл, кликнете върху заглавието му, а след това на бутон Закачи файл" +MAIN_MP_UP_LEVEL = "Връщане на едно ниво нагоре" +MAIN_MP_CREATE_FOLDER = "Създаване на папка" +MAIN_MP_UPLOAD_FILE = "Зареждане на файл" +MAIN_MP_FILE_INSERT = "Закачи файл" +MAIN_MP_DIR_INSERT = "Избери папка" +MAIN_MP_SELECT_FILES = "Изберете файлове за зареждане" +MAIN_MP_IMAGE_RESIZE = "Промяна на размера на зарежданите изображения" +MAIN_MP_IMAGE_WIDTH = "Ширина" +MAIN_MP_IMAGE_HEIGHT = "Височина" +MAIN_BUTTON_UPLOAD = "Зареди" +MAIN_BUTTON_WAIT = "Моля, почакайте..." +MAIN_MP_PLEASE_SELECT = "Моля, изберете файл" +MAIN_ADD_IN = "Изберете рубрика:" +MAIN_GROUP_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете тази група?" +MAIN_RUBRIKS_LIST = "Списък на рубриките" +MAIN_USER = "Потребител" +ButtonSave = "Запиши" +MAIN_NEW_PAGE = "Добави нова страница" +MAIN_BUTTON_SORT = "Филтър" +MAIN_QUICK_MODULE = "Управление на модули" +MAIN_STAT = "Статистика" +MAIN_STAT_SYSTEM_INFO = "Системна информация" +MAIN_STAT_DOCUMENTS = "Общо документи" +MAIN_STAT_RUBRICS = "Общо рубрики" +MAIN_STAT_QUERIES = "Общо заявки" +MAIN_STAT_TEMPLATES = "Общо шаблони" +MAIN_STAT_MYSQL = "Размер на БД" +MAIN_STAT_CACHE = "Общ размер на кеша" +MAIN_STAT_CACHE_SHOW = "Покажи" +MAIN_STAT_MODULES = "Инсталирани модули:" +MAIN_STAT_MODULES_OFF = "Деинсталирани модули:" +MAIN_STAT_USERS = "Всичко потребители:" +MAIN_STAT_USERS_WAIT = "Очакващи активация:" +MAIN_STAT_AVE = "ILEN.cms" +MAIN_STAT_DOMEN = "Домейн" +MAIN_STAT_PHP = "PHP версия:" +MAIN_STAT_MYSQL_VERSION = "MySQL версия:" +MAIN_STAT_CLEAR_CACHE = "Изтриване на кеша" +MAIN_STAT_CLEAR_CACHE_FULL= "Изтриване на кеша и сесиите" +MAIN_STAT_CLEAR_THUMB = "Изтриване на миниатюрите" +MAIN_STAT_CLEAR_REV = "Изтриване на ревизиите" +MAIN_STAT_CLEAR_COUNT = "Зануляване на дневния брояч" +MAIN_ADD_FOLDER = "Моля, въведете наименование на новата папка:" +MAIN_NO_ADD_FOLDER = "Не е въведено наименование на папка или действието е отменено!" +MAIN_NO_ADD_TEMPL = "Не е въведено наименование на шаблон или действието е отменено!" +MAIN_NO_ADD_GROUP = "Не е въведено наименование на група или действието е отменено!" +MAIN_NO_ADD_RUB = "Не е въведено наименование на рубрика или действието е отменено!" +MAIN_NO_ADD_QUERY = "Не е въведено наименование на заявка или действието е отменено!" +MAIN_NO_ADD_NAV = "Не е въведено наименование на меню или действието е отменено!" +MAIN_NO_ADD_BLOCK = "Не е въведено наименование на системния блок или действието е отменено!" +MAIN_NO_ADD_USER = "Не е въведено име на потребител или действието е отменено!" +MAIN_NO_ADD_DOCS = "Не е въведено наименование на документа или действието е отменено!" +MAIN_CLEAR_CACHE_OK = "Кешът е изтрит" +MAIN_FILE_MANAGER_TITLE = "Файлов мениджър" +MAIN_FILE_MANAGER_TIP = "Изберете необходимия файл и натиснете бутона "Вмъкни файл"" + +MAIN_SVN_NEW = "Излезе нова версия" +MAIN_SVN_SAIT = "Премини към сайта" +MAIN_SVN_REPOS = "Премини към сайт репозиторий" +MAIN_SVN_MAILTO = "Напиши писмо" +MAIN_SVN_LOOK = "Преглед на ревизията на сайт репозиторий" +MAIN_SVN_RECOM = "Препоръчва се обновяване!" + +MAIN_FINDER = "Файлов мениджър" + +MAIN_ADD_NEW_GROUP = "Добави нова група" +MAIN_ADD_NEW_GROUP_NAME = "Наименование на група" + +MAIN_ADD_NEW_USER = "Добави нов потребител" +MAIN_ADD_NEW_USER_NAME = "Име на потребител:" + +MAIN_ADD_NEW_NAV = "Добави ново меню за навигация" +MAIN_ADD_NEW_NAV_NAME = "Наименование меню за навигация:" + +MAIN_ADD_NEW_TEMPL = "Добави нов шаблон" +MAIN_ADD_NEW_TEMPL_NAME = "Наименование на шаблона:" + +MAIN_ADD_NEW_REQUEST = "Добави нова заявка" +MAIN_ADD_NEW_REQUEST_NAME = "Наименование на заявката:" + +MAIN_ADD_NEW_RUB = "Добави нова рубрика" +MAIN_ADD_NEW_RUB_NAME = "Наименование на рубриката:" + +MAIN_ADD_NEW_BLOCK = "Добави нов системен блок" +MAIN_ADD_NEW_BLOCK_NAME = "Наименование на системния блок:" + +MAIN_USERS_LAST_TIME = "За последен път:" + +MAIN_LOGS_ID = "№" +MAIN_LOGS_IP = "Ip-адрес" +MAIN_LOGS_DATE = "Дата" +MAIN_LOGS_USER = "Потребител" +MAIN_LOGS_ACTION = "Действие" + +MAIN_DOC_SHOW3_TITLE = "Документ без наименование" +MAIN_DOC_EDIT_TITLE = "Редактиране на този документ" +MAIN_DOC_SHOW_TITLE = "Преглед на документа (линк без ЧПУ)" +MAIN_DOC_SHOW2_TITLE = "Преглед на документа (линк c ЧПУ)" + +MAIN_ADD_DOC = "Документ" +MAIN_ADD_RUB = "Рубрика" +MAIN_ADD_REQ = "Заявка" +MAIN_ADD_SYS = "Системен блок" +MAIN_ADD_TEM = "Шаблон" +MAIN_ADD_NAV = "Навигация" +MAIN_ADD_USR = "Потребител" +MAIN_ADD_GRP = "Група" + +MAIN_BRANCHES = "Раздели" +MAIN_SHOWHIDE = "Покажи/Скрий меню" + +MAIN_CODEMIRROR_HELP = "Ctrl-F/Cmd-F (Търси) | Ctrl-G/Cmd-G (Търси следващ) | Shift-Ctrl-G/Shift-Cmd-G (Търси предходен) | Shift-Ctrl-F/Cmd-Option-F (Замени) | Shift-Ctrl-R / Shift-Cmd-Option-F (Замени всички) | F11 (На цял екран)" + +TEMPLATES_MESSAGE = "Съобщение:" +TEMPLATES_CACHE_SUCCESS = "Кешът е успешно изтрит." +TEMPLATES_CACHE_SUCCESS_LOG = "Изтрил кеша" +TEMPLATES_CACHE_DB_SUCCESS = "Таблицата _sessions е успешно изчистена." +TEMPLATES_CACHE_DB_SUCCESS_LOG = "Изчистил таблицата _sessions." +TEMPLATES_CACHE_CT_SUCCESS = "Изтрити са компилираните шаблони." +TEMPLATES_CACHE_CT_SUCCESS_LOG = "Изтрил компилираните шаблони" +TEMPLATES_CACHE_MC_SUCCESS = "изтрити компилираните шаблони на модулите." +TEMPLATES_CACHE_MC_SUCCESS_LOG = "Изтрил компилираните шаблони на модулите" +TEMPLATES_CACHE_SU_SUCCESS = "Изтрити сесии на потребителите." +TEMPLATES_CACHE_SU_SUCCESS_LOG = "Изтрил сесиите на потребителите" +TEMPLATES_CACHE_SC_SUCCESS = "Изтрит кеш на sql заявките." +TEMPLATES_CACHE_SC_SUCCESS_LOG = "Изтрил кеш на sql заявките." +TEMPLATES_THUMBNAILS_SUCCESS = "Миниатюрите са успешно изтрити." +TEMPLATES_THUMBNAILS_SUCCESS_LOG = "Изтрил миниатюрите" + +EXIT_ADMIN = "Завършил сесия в Административния панел" +LOGIN_ADMIN = "Започнал сесия в Административния панел" +ERROR_ADMIN = "Грешка при вход в Административния панел" + +WRONG_PASS = "Грешка:
Грешно потребителско име или парола!" +WRONG_CAPTCHA = "Грешка:
Грешен защитен код" + +oficial_site = "Официален сайт" +support = "Техническо обслужване" + +// 3.1.9 +MAIN_BLOCKS = "Визуални блокове" \ No newline at end of file diff --git a/admin/lang/bg/modules.txt b/admin/lang/bg/modules.txt new file mode 100644 index 0000000..757ebac --- /dev/null +++ b/admin/lang/bg/modules.txt @@ -0,0 +1,38 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[modules] +MODULES_SUB_TITLE = "Управление на модулите" +MODULES_TIP = "В този раздел може да инсталирате, деинсталирате или обновявате модулите, както и да редактирате спесифичните им настройки." +MODULES_NAME = "Наименование на модула" +MODULES_INFO = "Информация" +MODULES_TEMPLATE = "Шаблон за изход" +MODULES_SYSTEM_TAG = "Системен таг" +MODULES_VERSION = "Версия" +MODULES_ACTIONS = "Действия" +MODULES_SETTINGS = "Параметри" +MODULES_SETTINGS_INFO = "Информация" +MODULES_DELETE = "Изтриване на модул" +MODULES_DELETE_CONFIRM = "Модулът се изтрива само на програмно ниво. В последствие може да бъде инсталиран.

Сигурни ли сте, че желаете да изтриете този модул?" +MODULES_INSTALL = "Инсталиране на модул" +MODULES_REMOVE = "Изтриване на модула от сървъра" +MODULES_REINSTALL = "Преинсталиране на модула" +MODULES_REINSTALL_CONF = "Сигурни ли сте, че желаете да преинсталирате този модул?" +MODULES_UPDATE = "Обновяване на модула" +MODULES_STOP = "Спиране на модула" +MODULES_START = "Стартиране на модула" +MODULES_BUTTON_SAVE = "Запазване на промените" +MODULES_LEGEND = "Легенда" +MODULES_AUTHOR = "Автор на модула" +MODULES_ERROR = "Възникна грешка при зареждане на модула " +MODULES_INSTALLED = "Инсталирани модули" +MODULES_NOT_INSTALLED = "Неинсталирани модули" +MODULES_SETUP = "Премини към управлението на модула" +MODULES_NO_INSTALL = "Съобщение:
Липсват инсталирани модули." +MODULES_NOT_INSTALL = "Сообщение:
Липсват неинсталирани модули." +MODULES_ACTION_INSTALL = "е инсталирал модул" +MODULES_ACTION_ONLINE = "е стартирал модул" +MODULES_ACTION_OFFLINE = "е спрял модул" +MODULES_ACTION_REINSTALL = "е преинсталирал модул" +MODULES_ACTION_UPDATE = "е обновил модул" +MODULES_ACTION_DELETE = "е изтрил модула от системата" +MODULES_ACTION_REMOVE = "е изтрил модула от сървъра" \ No newline at end of file diff --git a/admin/lang/bg/navigation.txt b/admin/lang/bg/navigation.txt new file mode 100644 index 0000000..6f1bfbe --- /dev/null +++ b/admin/lang/bg/navigation.txt @@ -0,0 +1,130 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[navi] +NAVI_ID = "ID" +NAVI_SUB_TITLE = "Управление менюта за навигация" +NAVI_SUB_TITLE2 = "Управление на редовете в менюто" +NAVI_SUB_TITLE3 = "Редактиране шаблон на меню" +NAVI_SUB_TITLE4 = "Създаване на нов шаблон за менюто" +NAVI_TIP_TEMPLATE = "В този раздел са всички менюта в системата. Тук Вие може да измените шаблона за всяко меню, както и да изтриете или добавите нови редове." +NAVI_TIP_TEMPLATE2 = "В този раздел, като използвате HTML, Вие може да създадете шаблон за това меню навигация. Също така може да изберете групите потребители, които ще имат достъп към даденото меню. За избор на няколко групи натиснете клавиша CTRL." +NAVI_ITEMS_TIP = "Добавяне на нов ред в менюто" +NAVI_NEW_MENU = "Създаване на ново меню" +NAVI_LIST_TIP = "Списъка съдържа всички редове от даденото меню. Помнете, че максималното ниво на вложеност не може да бъде по-голямо от 2." +NAVI_LIST = "Списък на редовете на менюто" +NAVI_EDIT_TEMPLATE = "Редактиране шаблона на менюто" +NAVI_EDIT_ITEMS = "Редактиране пунктовете на менюто" +NAVI_OPEN_IN_THIS = "в текущия прозорец" +NAVI_OPEN_IN_NEW = "в нов прозорец" +NAVI_TARGET_WINDOW = "Отваряне" +NAVI_POSITION = "Позиция" +NAVI_LINK_TO_DOCUMENT = "Линк към документ/файл" +NAVI_ENTRIES_NO_ITEMS = "Съобщение:
В момента липсват редове в менюто." + +NAVI_LINK_TITLE = "Наименование ред от менюто" +NAVI_LINK_SOLUT = "Описание за реда" +NAVI_LINK_IMGID = "Id изображение" +NAVI_LINK_IMGTL = "Избери изображение" +NAVI_LINK_IMAGE = "Изображение за реда" +NAVI_TITLE = "Наименование" +NAVI_TITLE2 = "Наименование на менюто" +NAVI_BROWSE_DOCUMENTS = "Свързване със съществуващи документи" +NAVI_ADD_SUBITEM = "Добави нов подпункт" +NAVI_BUTTON_CHANGE = "Избери" +NAVI_BUTTON_OPTION = "Опции" +NAVI_BUTTON_SUBITEM = "+" +NAVI_BROWSE_MEDIAPOOL = "Свързване с файл на сървара" +NAVI_SYSTEM_TAG = "Системен таг" +NAVI_NAME = "Наименование на менюто" +NAVI_LINK_TARGET = "Таг, определящ начина на отваряне на документа ( в нов или в текущия прозорец )" +NAVI_LINK_URL = "Таг, определящ адреса за преход" +NAVI_LINK_NAME = "Таг, определящ наименованието на линковете, които ще бъдат показвани в менюто" +NAVI_LINK_ID = "Таг, определящ уникалния идентификатор на линка" +NAVI_LINK_INACTIVE = "Шаблон неактивен линк" +NAVI_LINK_ACTIVE = "Шаблон активен линк" +NAVI_HEADER_START = "Горна част шаблон" +NAVI_FOOTER_END = "Долна част шаблон" +NAVI_HEADER_TIP = "Например, заглавие "Каталог на стоки" (незадължително)" +NAVI_COPY_TEMPLATE = "Копиране шаблона на менюто" +NAVI_FOOTER_TIP = "Долна част шаблон (незадължително)" +NAVI_DELETE = "Изтриване на менюто" +NAVI_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете това меню?" +NAVI_HTML_START = "Начален HTML код" +NAVI_HTML_END = "Краен HTML код" +NAVI_LEVEL1 = "Шаблон за главното(първо) ниво на менюто" +NAVI_LEVEL2 = "Шаблон за първото от вложените нива на менюто" +NAVI_LEVEL3 = "Шаблон за второто от вложените нива на менюто" +NAVI_MARK_DELETE = "Маркирай този ред за изтриване" +NAVI_MARK_ACTIVE = "За да забраните временно даден ред от менюто, махнете маркера и натиснете "Запази промените"" +NAVI_GROUPS = "Групи потребители за които менюто ще е достъпно" +NAVI_ACTIONS = "Действия" +NAVI_OR_BUTTON = " или " +NAVI_BUTTON_SAVE = "Запази промените" +NAVI_BUTTON_SAVE_NEXT = "Запази и продължи редактирането (CTRL+S)" +NAVI_BUTTON_ADD = "Добави ред" +NAVI_BUTTON_ADD_MENU = "Създаване на меню" +NAVI_LEGEND = "Легенда" +NAVI_ENTER_NAME = "Моля, въведете наименованието на менюто за навигация." +NAVI_ALL = "Списък на менютата за навигация" +NAVI_PRINT_TYPE = "Тип на извеждане" +NAVI_EXPAND_ALL = "FULL EXPAND (разкриване на всички нива)" +NAVI_EXPAND_WAY = "Текущо и родителско ниво" +NAVI_EXPAND_LEVEL = "Само текущото ниво" +NAVI_MENU_NOT_FOUND = "Липсва меню id=" +NAVI_SAVE = "Шаблонът на менюто за навигации е успешно съхранен" +NAVI_SORTED = "Подреждането е успешно запазено" + +NAVI_REPORT_NEW = "Създал меню за навигация" +NAVI_REPORT_COPY = "Създал копие на меню за навигация" +NAVI_REPORT_EDIT = "Изменил шаблон меню за навигацияи" +NAVI_REPORT_DEL = "Изтрил меню за навигация" +NAVI_REPORT_ADDIT = "Добавил ред в меню за навигация" +NAVI_REPORT_DELIT = "Изтрил ред в меню за навигация" +NAVI_REPORT_FLEV = "на перво ниво" +NAVI_REPORT_SLEV = "на второ ниво" +NAVI_REPORT_TLEV = "на трето ниво" +NAVI_REPORT_DEACT = "Деактивирал ред в меню за навигация" +NAVI_REPORT_ACT = "Активирал ред в меню за навигация" +NAVI_REPORT_SAVED = "Шаблон на менюто за навигацията е успешно записан" +NAVI_REPORT_SAVED_ERR = "Неуспешно записване на шаблона за навигация.
Пробвайте отново." +NAVI_REPORT_ERROR = "Грешка" +NAVI_REPORT_SUCCESS = "Изпълнено" + +NAVI_ITEM_ON_OFF = "Вкл/Изкл пункт в меню" +NAVI_ITEM_EDIT = "Редактиране пункт в менюто" +NAVI_ITEM_DELETE = "Изтриване на пункта в менюто" +NAVI_ITEM_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете този пункт в менюто?" + +// v 3.2 +NAVI_ALIAS = "Алиас" +NAVI_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиасът не може да бъде чосло, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на модула." +NAVI_ACCEPT = "Този алиас можр да се използва" +NAVI_ER_SYN = "Грешен алиас!
Алиасът не трябва да е число, да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа" +NAVI_ER_EXISTS = "Грешен алиас!
Този алиас вече е използван в друга контактна форма" + +//from templates +NAVI_NOLINK_DOC = "Липсва свързан документ" +NAVI_EDIT_ITEM = "Редактиране на реда в менюто" +NAVI_LINK_FILEDOC = "Свържи с документ/файл" +NAVI_LINKED_DOC = "Свързан документ" +NAVI_DEL_LINKED_DOC = "Убрать связь с документом" +NAVI_LINK_DOC = "Свържи с документ" +NAVI_LINK_FILE = "Свържи с файл" +NAVI_NO_LINK = "Липсва свързан документ" +NAVI_STRUCTURE = "Структура" +NAVI_RETURN_TO_LIST = "Връщане към списъка" +NAVI_EDIT_TEMPLATE = "Редактиране на шаблон" +NAVI_ITEM_ADD = "Добави ред в менюто" +NAVI_OPEN_ALL = "Покажи всички" +NAVI_CLOSE_ALL = "Скрий всички" +NAVI_ITEM_DESCR = "Описание на реда в менюто" +NAVI_ITEM_IMAGE = "Изображение" +NAVI_ITEM_IMAGE_DESCR = "Активно изображение, наименованието трябва да завършва на _act" +NAVI_ITEM_IMAGE_ID = "Id на изображение" +NAVI_PLACE_INSERT = "Място за вмъкване на поднивото" +NAVI_EXAMPLE = "Пример" +NAVI_ITEM_EVEN = "четен" +NAVI_ITEM_ODD = "нечетен" +NAVI_TAG = "Таг за вмъкване на редовете" +NAVI_LAVEL_TEMPL = "Шаблон на нивото" +NAVI_CONDITIONS = "Условия" \ No newline at end of file diff --git a/admin/lang/bg/request.txt b/admin/lang/bg/request.txt new file mode 100644 index 0000000..57b2b7d --- /dev/null +++ b/admin/lang/bg/request.txt @@ -0,0 +1,191 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[request] +REQUEST_ID = "ID" +REQUEST_DELETE = "Изтриване заявка" +REQUEST_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете тази заявка?" +REQUEST_TITLE = "Управление на заявките" +REQUEST_NAME = "Наименование на заявката" +REQUEST_NAME2 = "Наименование на заявка:" +REQUEST_NAME3 = "Наименование" +REQUEST_CACHE = "Кеширане" +REQUEST_CACHE_ELEMENTS = "Кеширане на елементите на заявката" +REQUEST_SETTINGS = "Параметри на заявката" +REQUEST_TIP = "В този раздел са всички заявки в системата. За да използвате заявката включете "Системния таг" на нужното място във вашия шаблон или документ." +REQUEST_EDIT_TIP = "В този раздел може да редактирате заявката, да промените рубриката, шаблона за изход, а също така и условията на заявката." +REQUEST_NEW = "Създаване на нова заявка" +REQUEST_EDIT = "Редактиране на заявката" +REQUEST_EDIT2 = "Редактиране на заявка" +REQUEST_SYSTEM_TAG = "Системен таг" +REQUEST_AUTHOR = "Автор" +REQUEST_DATE_CREATE = "Дата на създаване" +REQUEST_ACTIONS = "Действия" +REQUEST_NO_DESCRIPTION = "Заявка без описание" +REQUEST_NO_REQUST = "Липсват заявки." +REQUEST_DATE_FORMAT = "%d.%m.%y г." +REQUEST_DATE_FORMAT2 = "%d.%m.%y г. в %H:%M" +REQUEST_IN = "в" +REQUEST_COPY = "Копиране на заявка" +REQUEST_COPY_FAILED = "Неуспешно копиране на заявката" +REQUEST_PLEASE_NAME = "Моля, въведете наименование за копираната заявка" +REQUEST_CONDITION_EDIT = "Условия за заявка" +REQUEST_CONDITION_IF = "Условия" +REQUEST_PLEASE_SELECT = "Моля, изберете рубрика" +REQUEST_SELECT_RUBRIK = "Изберете рубрика:" +REQUEST_SELECT_INFO = "Сигурни ли сте, че желаете да промените рубриката" +REQUEST_NEW_TIP = "Внимание! Преди да създадете нова заявка Вие трябва да изберете рубриката, от която ще се извеждат и филтрират документи." +REQUEST_DESCRIPTION = "Описание на заявката" +REQUEST_INTERNAL_INFO = "(използва се във системата)" +REQUEST_BUTTON_COND = "Добави/Промени" +REQUEST_CONDITION = "Условия на заявката" +REQUEST_ACTION_AFTER = "Върни се към редактирането на заявката след създаването, за да въведете условията на заявката." +REQUEST_SORT_BY = "Сортиране по параметър на документа:" +REQUEST_SORT_BY_NAT = "Сортиране по поле на документа:" +REQUEST_ASC_DESC = "В ред:" +REQUEST_DESC = "низходящ" +REQUEST_ASC = "възходящ" +REQUEST_BY_DATE = "Дата на създаване (публикация)" +REQUEST_BY_DATECHANGE = "Дата на променя (на документа)" +REQUEST_BY_NAME = "Наименование на документа" +REQUEST_BY_EDIT = "Име на автор" +REQUEST_BY_PRINTED = "Брой разпечатки" +REQUEST_BY_VIEWS = "Брой прегледи" +REQUEST_BY_RAND = "В случаен ред (високо натоварване)" +REQUEST_DOC_PER_PAGE = "Брой на страница" +REQUEST_DOC_PER_PAGE_ALL = "Извеждане на всички" +REQUEST_SHOW_NAVI = "Показване на навигация" +REQUEST_USE_LANG = "Само на езика на потребителя:" +REQUEST_USE_QUERY = "Исполване на GET заявки в навигацията по страници" +REQUEST_TEMPLATE_QUERY = "Основен шаблон на заявката" +REQUEST_MAIN_CONTENT = "Системен таг, отговарящ за извеждане елементите на заявката, указани в поле "Елементи на заявката"" +REQUEST_DOC_COUNT = "Системен таг, отговарящ за извеждане брой елементи на заявката" +REQUEST_DOCITEMNUM_INFO= "Системен таг, отговарящ за извеждане поредния номер на елемента на заявката" +REQUEST_MAIN_NAVI = "Системен таг, отговарящ за извеждане на постранична навигация за заявката (< 1 2 3 >)" +REQUEST_MEDIAPATH = "Системен таг, определящ пътя до папката с шаблоните (Например: [tag:mediapath]images/logo.gif)" +REQUEST_PATH = "Системен таг, определящ корена на инсталацията" +REQUEST_DOCDB = "Системен таг за извеждане на поле от документа от БД" +REQUEST_LANGFILE = "Системен таг за извеждане на езикова променлива от файла" +REQUEST_LANGUAGE = "Таг за зареждане на езиковитв файлове. Препоръчително е да се указва тагът, преди основния шаблон." +REQUEST_LANG = "Съдържанието ще бъде показано, ако езикът на документа съвпада с указания." + +REQUEST_TEMPLATE_ITEMS = "Шаблон за оформление на елементите на заявката" +REQUEST_TEMPLATE_INFO = "В това поле, като използвате HTML-код, Вие може да определите начина на оформление на вътрешните елементи на заявката (Например, оформление списъка с новините). Всички елементи, оформени според дадения шаблон, ще се изобразяват циклично в "Основния паблон" на заявката, според условията на заявката." +REQUEST_TEMPLATE_SAVED = "Заявката е съхранена успешно" +REQUEST_SELECT_IN_LIST = "Моля, изберете поле от рубриката от списъка по-долу." +REQUEST_RUB_INFO = "Системен таг, отговарящ за изход на съдържанието на полето от рубриката. ID-номер на поле. ХХХ-брой символи за изобразяване." +REQUEST_LINK_INFO = "Системен таг, определящ линка към документа. Например, < a href="[tag:link]">Линк < /a >" +REQUEST_RUBRIK_FIELD = "Системен таг на полето" +REQUEST_THUMBNAIL = "Таг, отговарящ за създаването на миниатюра(thumbail)(При условие,че в шаблона за полето в рубриката(шаблон за заявка) е избрано за извеждане: [tag:parametr:0])" +REQUEST_FIELD_NAME = "Наименование на полето" +REQUEST_FIELD_TYPE = "Тип на полето" +REQUEST_FIELD_G_UNKNOW = "Без група" + +REQUEST_BUTTON_ADD = "Създай заявка" +REQUEST_BUTTON_ADD_NEXT = "Създай и продължи редактирането" +REQUEST_BUTTON_SAVE = "Запиши промените" +REQUEST_BUTTON_SAVE_NEXT = "Приложи (CTRL+S)" +REQUEST_BUTTON_CLOSE = "Затвори прозореца" + +REQUEST_INSERT_INFO = "Натиснете върху системния таг, за да го добавите в шаблона" +REQUEST_CONDITIONS = "Управление условията на заявката" +REQUEST_CONDITION_TIP = "В този раздел Вие можа да определяте специални условия за избор на данни за заявката. Условията за заявкара позволяват точно да се определи избора на данни по определени параметри." +REQUEST_NEW_CONDITION = "Добави ново условие" +REQUEST_FROM_FILED = "Избери от поле" +REQUEST_OPERATOR = "Където значението" +REQUEST_VALUE = "Значение" +REQUEST_COND_SELF = "Равно" +REQUEST_COND_NOSELF = "Различно" +REQUEST_COND_USE = "Съдържа значение" +REQUEST_COND_NOTUSE = "Не съдържа значение" +REQUEST_COND_START = "Започва с" +REQUEST_SMALL1 = "По малко или равно" +REQUEST_BIG1 = "По голямо или равно" +REQUEST_SMALL2 = "По малко" +REQUEST_BIG2 = "По голямо" +REQUEST_N_COND_SELF = "Число равно" +REQUEST_N_SMALL1 = "Число по малко или равно" +REQUEST_N_BIG1 = "Число по голямо или равно" +REQUEST_N_SMALL2 = "Число по малко" +REQUEST_N_BIG2 = "Число по голямо" +REQUEST_SEGMENT = "Принадлежи отрезку (разделени с ,)" +REQUEST_INTERVAL = "Принадлежи на интервала (разделени с ,)" +REQUEST_IN = "В списъка (разделени с ,)" +REQUEST_NOTIN = "Не е в списъка(разделени с ,)" +REQUEST_ANY_NUM = "ОПАСНО!!! Число в заявка" +REQUEST_FREE = "ОПАСНО!!! Произволно условие [field]={Значение}" +REQUEST_MARK_DELETE = "Маркирай условието за изтриване" +REQUEST_CONR_AND = "И" +REQUEST_CONR_OR = "ИЛИ" +REQUEST_OR = " или " + +REQUEST_VIEWS_INFO = "Системен таг, извеждащ брой прегледи на документа" +REQUEST_COMMENTS_INFO = "Системен таг, извеждащ броя коментари към документа. Внимание! Работи само при инсталиран модул КОМЕНТАРИ!" +REQUEST_CONTROL_FIELD = "Системен таг, извеждащ панела ФИЛТЪР. Само за рубрики с полета тип падащ списък" +REQUEST_CONTROL_SORT = "Системен таг, извеждащ панела СОРТИРАНЕ по дата на публикация, наименование и брой прегледи на заявката" +REQUEST_NO_DROPDOWN = "В избраната рубрика липсват полета с тип падащ списък." +REQUEST_ENTER_NAME = "Моля, въведете наименование на заявката." +REQUEST_ALL = "Списък заявки" +REQUEST_IF_EMPTY = "Системен таг(pair), между които се въвежда шаблон за извеждане при отсъствие на резултат от заявката" +REQUEST_NOT_EMPTY = "Системен таг(pair), между които се въвежда шаблон за извеждане при наличие на резултати от заявката" +REQUEST_DOCID_INFO = "Системен таг за идентификатора на документа" +REQUEST_DOCTITLE_INFO = "Системен таг за наименованието на документа" +REQUEST_CDOCID_INFO = "Системен таг за идентификатора на текущия документ (в който се извежда заявката)" +REQUEST_DOCDATE_INFO = "Системен таг за датата на публикуване на документа" +REQUEST_CDOCDATE_INFO = "Системен таг за датата на публикуване на текущия документ (в който се извежда заявката)" +REQUEST_DOCTIME_INFO = "Системен таг за датата и часът на публикуване на документа" +REQUEST_CDOCTIME_INFO = "Системен таг за датата и часът на публикуване на текущия документ (в който се извежда заявката)" +REQUEST_DATE_INFO = "Системен таг за извеждане на дате и час на публикуване на документа - с избор на шаблон.
Пример: [tag:date:d.m.Y]
Може да се използват разделители (space - . /)" +REQUEST_CDATE_INFO = "Системен таг за извеждане на дате и час на публикуване на документа - с избор на шаблон.
Пример: [tag:date:d.m.Y]
(в който се извежда заявката)
Може да се използват разделители (space - . /)" +REQUEST_DOCAUTHOR_INFO = "Системен таг за автора на документа" +REQUEST_DOCAUTHOR_AVATAR = "Системен таг за аватара на автора на документа" +REQUEST_CDOCAUTHOR_INFO = "Системен таг за автора на текущия документ(в който се извежда заявката)" +REQUEST_SAMPLE = "Пример" +REQUEST_HIDE_CURRENT = "Не показвай в заявката текущия документ" +REQUEST_ONLY_OWNER = "Само СВОИТЕ документи" +REQUEST_CONDITION_JOIN = "Оператор" +REQUEST_CONDITION_SAVE = "Запази условията" +REQUEST_CONDITION_ADD = "Добави условие" + +REQUEST_SUCCESS = "Изпълнено" +REQUEST_ERROR = "Грешка" +REQUEST_CANCEL = "Отемени" + +REQUEST_SORTED = "Редът е успешно съхранен" +REQUEST_COND_MESSAGE = "Липсват условия за заявката" +REQUEST_COND_VALUE_ERR = "Празно поле Значение" +REQUEST_COND_NEW_ERR = "Неуспешно добавяне на условие
Опитайте отново" +REQUEST_COND_NEW_SUC = "Условието е успешно добавено" +REQUEST_COND_POST_OK = "Условията са успешно записани" +REQUEST_COND_POST_ERR = "Неуспешно съхраняване на условита за заявка
Опитайте отново" +REQUEST_COND_NO_POST = "Липсват данни за съхраняване
Опитайте отново" + +REQUEST_COND_ADD_SUC = "Добавил условия към заявката" +REQUEST_COND_CHA_SUC = "Променил условия към заявката" +REQUEST_COND_DEL_SUC = "Изтрил условия към заявката" +REQUEST_SAVE_CHA_SUC = "Редактирал заявката" +REQUEST_ADD_NEW_SUC = "Добавил нова заявка" +REQUEST_DELETE_SUC = "Изтрил заявка" +REQUEST_COPY_SUC = "Създал копие на заявката" + +REQUEST_HEADER_SELF = "Основни параметри на заявката" +REQUEST_HEADER_NAME = "Значение" +REQUEST_HEADER_PARAMETR = "Параметър" + +REQUEST_REPORT_ERR_TITLE = "Не е въведено наименование на заявката" +REQUEST_REPORT_ERR_TEXT = "Липсва основен шаблон за заявката" +REQUEST_REPORT_ERR_PHP = "Забранено е използването на PHP код" +REQUEST_REPORT_ERR_PHP_N = "Опит за използване на PHP код в шаблоне към заявката при създаване на заявката" +REQUEST_REPORT_ERR_PHP_E = "Опит за използване на PHP код в шаблона към заявката" +REQUEST_REPORT_ERR_RUBRIC= "Не е избрана рубрика" +REQUEST_BY_PARENT = "Родителски документ" +REQUEST_SHOW_STAT = "Покажи статистиката" + +// v 3.2 +NAVI_ALIAS = "Алиас" +NAVI_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиасът не може да бъде чосло, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на модула." +NAVI_ACCEPT = "Този алиас можр да се използва" +NAVI_ER_SYN = "Грешен алиас!
Алиасът не трябва да е число, да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа" +NAVI_ER_EXISTS = "Грешен алиас!
Този алиас вече е използван в друга контактна форма" +REQUEST_HEADER_EXTERNAL = "Външно обръщание +REQUEST_EXTERNAL = "Разреши външно обръщение" +REQUEST_ONLY_AJAX = "Изпълнение само чрез Ajax" \ No newline at end of file diff --git a/admin/lang/bg/rubs.txt b/admin/lang/bg/rubs.txt new file mode 100644 index 0000000..1cd3c1b --- /dev/null +++ b/admin/lang/bg/rubs.txt @@ -0,0 +1,282 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[rubs] +RUBRIK_SUB_TITLE = "Управление на рубрики" +RUBRIK_TIP = "В този раздел са всички рубрики в системата. Тук може да добавяте, редактирате или копирате рубриките. Може да редактирате шаблона за показване на документите в рубриката и правата за достъп." +RUBRIK_ID = "ID" +RUBRIK_NAME = "Наименование на рубрика" +RUBRIK_NAME2 = "Наименование на рубрика:" +RUBRIK_TEMPLATE_OUT = "Извеждане в шаблон" +RUBRIK_TEMPLATE_OUT2 = "Извеждане в шаблон:" +RUBRIK_URL_PREFIX = "Префикс за линка" +RUBRIK_URL_PREFIX2 = "Префикс за линка:" +RUBRIK_DOCS_VI = "Показвай документите в списъка" +RUBRIK_URL_PREFIX2 = "Префикс за линка:" +RUBRIK_COUNT_DOCS = "Брой документи" +RUBRIK_COUNT_FIELDS = "Брой полета" +RUBRIK_AUTHOR = "Автор" +RUBRIK_ACTION = "Действия" +RUBRIK_FORMAT = "Използвайте" +RUBRIK_FORMAT_TIME = "за линковете в формат за време" +RUBRIK_FORMAT_ID = "за вмъкване id документ" +RUBRIK_EDIT = "Редактиране полетата и правата на рубриката" +RUBRIK_EDIT_TMPLS = "Дополнительные шаблоны" +RUBRIK_NO_VIEW = "Извинете, но Вие нямате права за преглед на списъка с рубрики." +RUBRIK_NO_CHANGE1 = "Извинете, но Вие нямате права за редактиране полетата на рубриката." +RUBRIK_NO_CHANGE2 = "Извинете, но Вие нямате права за редактиране на шаблона на тази рубрика." +RUBRIK_NO_CHANGE3 = "Извинете, но Вие нямате права за създаване на нови рубрики." +RUBRIK_EDIT_TEMPLATE = "Редактиране шаблон на рубрика" +RUBRIK_EDIT_CODE = "Редактиране на изпълнимия код за рубриката" +RUBRIK_EDIT_CODE_T = "Редактиране на изпълнимия код за рубриката" +RUBRIK_EDIT_CODE_NO = "Нямате достъп за редактиране на изпълнимия код" +RUBRIK_DELETE = "Изтриване на тази рубрика" +RUBRIK_DELETE_LEGEND = "Изтрий рубриката" +RUBRIK_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете тази рубрика?" +RUBRIK_NO_PERMISSION = "Извинете, но вие нямате права за изтриване на рубрика." +RUBRIK_USE_DOCUMENTS = "Извинете, но вие не можете да изтриете тази рубрика, т.к. в нея има въведени документи." +RUBRIK_MULTIPLY = "Копиране на рубрика" +RUBRIK_NO_MULTIPLY = "Извинете, но нямате права за копиране на рубрика" +RUBRIK_BUTTON_SAVE = "Запази промените" +RUBRIK_BUTTON_TEMPL = "Редактиране на шаблон" +RUBRIK_BUTTON_FIELDS = "Редактиране на полета" +RUBRIK_BUTTON_CODE = "Редактиране код на рубрика" +RUBRIK_LEGEND = "Легенда" +RUBRIK_NEW = "Създаване на нова рубрика" +RUBRIK_NEW_TIP = "Създаване на нова рубрика. Моля, въведете наименованието на новата рубрика и изберете шаблон за извеждане." +RUBRIK_BUTTON_NEW = "Добави рубрика" +RUBRIK_EDIT_FIELDS = "Управление полетата и правата за достъп към рубриката" +RUBRIK_DESCRIPTION = "Описание на рубриката" +RUBRIK_NO_FIELDS = "Внимание! Вие не сте създали нито едно поле. Моля, добавете поне едно поле." +RUBRIK_FIELDS_INFO = "Тук може да създавате група от полета, които ще се използват в документите за тази рубрика." +RUBRIK_MULTIPLY2 = "Копиране на рубрика" +RUBRIK_MULTIPLY_TIP = "Моля, въведете наименование и префикс за линковете на новата рубрика" +RUBRIK_BUTTON_COPY = "Копиране" +RUBRIK_TEMPLATE_EDIT = "Редактиране шаблона на рубриката" +RUBRIK_TEMPLATE_NEW = "Създаване на шаблон за рубриката" +RUBRIK_TEMPLATE_SAVED = "Шаблонът е успешно записан" +RUBRIK_NO_FIELD = "В рубриката не се въведени полета" +RUBRIK_FIELD_NAME = "Наименование на полето" +RUBRIK_FIELD_GROUP = "Група" +RUBRIK_FIELD_GROUP_SEL = "Изберете група" +RUBRIK_FIELD_ALIAS = "Алиас(синоним) на полето" +RUBRIK_FIELD_TYPE = "Тип на полето" +RUBRIK_FIELD_UNKNOW = "Неизвестно" +RUBRIK_FIELD_G_UNKNOW = "Без група" +RUBRIK_POSITION = "Позиция" +RUBRIK_NEW_FIELD = "Създаване на ново поле в рубриката" +RUBRIK_BUTTON_ADD = "Добави поле" +RUBRIK_SET_PERMISSION = "Права за достъп към документите за групите потребители" +RUBRIK_USER_GROUP = "Група" +RUBRIK_DOC_READ = "Преглед" +RUBRIK_ALL_PERMISSION = "Всички права" +RUBRIK_CREATE_DOC = "Създаване с проверка" +RUBRIK_CREATE_DOC_NOW = "Създаване без проверка" +RUBRIK_EDIT_OWN = "Редактиране на свои" +RUBRIK_EDIT_DELREV = "Управление на ревизиите" +RUBRIK_EDIT_OTHER = "Редактиране на всички" +RUBRIK_VIEW_TIP = "Установете флага, ако желаете да разрешите дадената група потребители да преглеждат документите" +RUBRIK_ALL_TIP = "Установете флага, ако желаете да разрешите дадената група потребители да изпълняват всички действия с документите от тази рубрика." +RUBRIK_DOC_TIP = "Установете флага, ако желаете да разрешите дадената група потребители да създава документи.
Внимание!
Преди публикуване, документа трябва да бъде проверен от Администратор." +RUBRIK_DOC_NOW_TIP = "Установете флага, ако желаете да разрешите дадената група потребители да създават документи.
Внимание!
Докуентите ще се публикуват без проверка от Администратор." +RUBRIK_OWN_TIP = "Установете флага, ако желаете да разрешите дадената група потребители да редактират само своите документи" +RUBRIK_OTHER_TIP = "Установете флага, ако желаете да разрешите дадената група потребители да редактират своите и чуждите документи" +RUBRIK_DELREV_TIP = "Установете флага, ако желаете да разрешите дадената група потребители да работят с ревизиите на документите" +RUBRIK_BUTTON_PERM = "Запазете правата" +RUBRIK_FIELD_DEFAULT = "Значение по подразбиране" +RUBRIK_TEMPLATE_TIP = "В този раздел, с използване на HTML, вие трябва да създадете шаблон за извеждане на документа в публичната част на сайта." +RUBRIK_HTML = "Шаблон за извеждаме на рубриката" +RUBRIK_HTML_2 = "Шаблон за извеждане на HEADER" +RUBRIK_HTML_3 = "Шаблон за извеждане на TEASER" +RUBRIK_HTML_4 = "Шаблон за извеждане на ADMIN TEASER" +RUBRIK_PHP_DENIDED = "Грешка!
Вие нямате права за редактиране шаблона на рубриката, понеже той съдържа PHP код, а вие нямате права да използвате PHP код." +RUBRIK_PHP_MESSAGE = "Забранено използването на PHP код." +RUBRIK_EMPTY_MESSAGE = "Не е въведено наименование на полето." +RUBRIK_INSERT_HELP = "Натиснете за да добавите системния таг в шаблона" +RUBRIK_BUTTON_TPL = "Запази шаблона" +RUBRIK_BUTTON_TPL_NEXT = "Приложи (CTRL+S)" +RUBRIK_BUTTON_TPL_CLOSE = "Затвори" +RUBRIK_NO_RUBRIK = "Липсва такава рубрика!" +RUBRIK_NO_NAME = "Моля, въведете наименованието на рубриката" +RUBRIK_NAME_EXIST = "Извинете, но съществува рубтика с това наименование. Моля, въведете друго наименование на рубриката." +RUBRIK_PREFIX_EXIST = "Извинете, но съществува рубрика с такъе URL-префикс. Моля, въведете друг URL-префикс на рубриката." +RUBRIK_VIEWS_INFO = "Системен таг, извеждащ броя прегледи на документа" +RUBRIK_HIDE_INFO = "Системен таг, позволяващ скриването на текст, за определени групи потребители, където Х - номер на група, text - съобщение (ако не е указано се използва код по подразбиране, виж. общи настройки на системата)" +RUBRIK_THUMBNAIL = "Таг отговарящ за създаването на миниатюра(thumbail)(При условии, че в шаблона за полето в рубриката за извеждане в документа) е избрано: [tag:parametr:0])" +RUBRIK_LINK_HOME = "Линк към главната страница на сайта" +RUBRIK_MARK_DELETE = "Маркирай този ред за изтриване" +RUBRIK_MARK_DEL_ALL = "Маркирай всички" +RUBRIK_CHECK_SEARCH = "Търси по това поле" +RUBRIK_CHECK_NUMERIC = "Числово поле" +RUBRIK_SEARCH_TIP = "Отметнете полето, ако желаете по него да се осъществява търсене (работи с модул 'Търсене' версия минимум 2.0.2 )" +RUBRIK_NUMERIC_TIP = "Отметнете полето, ако значението на полето е винаги число. Използва се в заявките за сортиране" +RUBRIK_ALL = "Списък рубрики" +RUBRIK_EDIT_FIELDS_GROUPS = "Редактиране на група от полета" +RUBRIK_FIELDS_GROUPS = "Група от полета" +RUBRIK_ENTER_NAME = "Моля, въведете наименованието на рубриката." +RUBRIK_TEMPLATE_HIDE = "Покажи/скрий шаблоните за всички полета" +RUBRIK_FILED_TEMPLATE_H = "Редактиране на шаблона и описанието на полето" +RUBRIK_FILED_TEMPLATE_DESCR = "Описание на полето" +RUBRIK_FILED_TEMPLATE_F = "Шаблон на полето" +RUBRIK_DOCID_INFO = "Системен таг, идентификатор документа" +RUBRIK_DOCDATE_INFO = "Системен таг, дата на публикуване на документа" +RUBRIK_DOCTIME_INFO = "Системен таг, дата и час на публикуване на документа" +RUBRIK_DATE_INFO = "Системен таг, дата и час на публикуване на документа - по шаблон.
Пример: [tag:date:Y]" +RUBRIK_DOCAUTHOR_INFO = "Системен таг, автор на документа" +RUBRIK_TITLE_INFO = "Системен таг, заглавие на документа" +RUBRIK_PATH_INFO = "Системен таг, път към корена на инсталацията" +RUBRIK_MEDIAPATH_INFO = "Системен таг, път към папката с дизайна" +RUBRIK_PREFIX_BAD_CHAR = "Недопустими символи в префикса" +RUBRIK_FIELDS_TITLE = "Полета на рубриката" +RUBRIK_FIELDS_TPL = "Шаблон за изход на полето в документ" +RUBRIK_RUBRIK_TPL = "Шаблон за изход на полето в заявка" +RUBRIK_SORTED = "Редът е успешно записан" +RUBRIK_F_SORT_TIP = "За пренареждане на полетата, натиснете в/у кръстчето и като го държите, преместете полето" +RUBRIK_R_SORT_TIP = "За пренареждане на рубриките, натиснете в/у кръстчето и като го държите, преместете рубриката" +RUBRIK_META_GEN_TIP = "Автоматично генериране на ключови думи( keywords) и описание ( description ) за документа, възоснова на неговото съдържание" +RUBRIK_ALIAS_HISTORY_TIP = "Съхраняване историята на алиасите на документите" +RUBRIK_MOVE = "Премести" +RUBRIK_REQUEST_TPL = "Шаблон за извеждане на полето в заявката" +RUBRIK_BREADCRUMB = "Системен таг Breadcrumb" +RUBRIK_CODE = "Изпълним код за рубриката" +RUBRIK_START_CODE = "Код, изпълнявам преди зареждането на документа" +RUBRIK_CODE_START = "Код, изпълним преди съхраняването на документа" +RUBRIK_CODE_END = "Код, изпълним след съхраняването на документа" +RUBRIK_TAGS = "Таг" +RUBRIK_TAGS_ID = "Тег ID" +RUBRIK_TAGS_ALIAS = "Тег Алиас" +RUBRIK_HTML_T = "HTML код на шаблона" +RUBRIK_TAG_DESC = "Описание на тага" +RUBRIK_NEW_FIEL_TITLE = "За полетата Падащ списък и Мулти списък, Значенията по подразбиране се въвеждат разделени със запетая" +RUBRIK_LINK = "Свържи рубриката" +RUBRIK_LINK_DESC = "При задаването на връзка между рубриките, при добавянето на документи може автоматически да се поставят алиаси(имена)." +RUBRIK_NOLINK = "Не е избрано" +RUBRIK_OR = " или " + +RUBRIC_F_GROUP_TITLE = "Наименование на група" +RUBRIC_F_GROUP_DELETE = "Изтриване на група" +RUBRIC_F_GROUP_DELETE_H = "Сигурни ли сте, че желаета да изтриете групата?" +RUBRIC_NO_GROUPS = "В момента, за тази рубрика няма групи от полета" +RUBRIC_GROUP_ADD = "Добави група" +RUBRIK_NEW_GROUP = "Добави нова група" +RUBRIK_HEADER_GROUP = "Управление на групи от полета" + +RUBRIK_TEMPLATES_TAGS = "Таг" +RUBRIK_TEMPLATES_TAG_DESC = "Описание на тага" +RUBRIK_TEMPLATES_THEME_FOLDER = "Наименование на шаблона (Име на папката с файлове за дадения шаблон)" +RUBRIK_TEMPLATES_PAGENAME = "Наименование на сайта" +RUBRIK_TEMPLATES_TITLE = "Наименование на страницата" +RUBRIK_TEMPLATES_KEYWORDS = "Ключови думи (Meta - Keywords)" +RUBRIK_TEMPLATES_DESCRIPTION = "Описание на страницата (Meta - Description)" +RUBRIK_TEMPLATES_INDEXFOLLOW = "Тип индексиране" +RUBRIK_TEMPLATES_PATH = "Път към корена на инсталацията" +RUBRIK_TEMPLATES_MEDIAPATH = "Път до папката с шаблона (Пример: [tag:mediapath]images/logo.gif)" +RUBRIK_TEMPLATES_CSS = "Компресира няколко css-файла в един. Връща път.
FFF - имена на файлове, разделени със запетая
P - път към папката с файлове, незадължително. По подразбиране - [tag:mediapath]css/

Пример: href="[tag:css:reset.css,style.css]"" +RUBRIK_TEMPLATES_JS = "Компресира няколко js-файла в един. Връща път.
FFF - имена на файлове, разделени със запетая
P - път към папката с файлове, незадължително. По подразбиране - [tag:mediapath]js/

Пример: href="[tag:js:common.js,main.js]"" + +RUBRIK_RUB_INFO = "Системен таг, отговарящ за извеждане на съдържанието на поле от рубрика. ID-номер на полето. ХХХ-брой символи за извеждане." +RUBRIK_SELECT_IN_LIST = "Моля, изберете поле от рубриката от списъка, показан по-долу." +RUBRIK_TEMPLATE_ITEMS = "Шаблон за извеждане на елементите на заявката" +RUBRIK_DOCID_INFO = "Системен таг, съответстващ на идентификатора на документа" +RUBRIK_DOCTITLE_INFO = "Системен таг, съответстващ на наименованието на документа" +RUBRIK_CDOCID_INFO = "Системен таг, съответстващ на идентификатора на текущия документ(в който се извежда заявката)" +RUBRIK_DOCDATE_INFO = "Системен таг, съответстващ на датата на публикуване на документа" +RUBRIK_CDOCDATE_INFO = "Системен таг, съответстващ на датата на публикуване на текущия документ(в който се извежда заявката)" +RUBRIK_DOCTIME_INFO = "Системен таг, съответстващ на датата и часът на публикуване на документа" +RUBRIK_CDOCTIME_INFO = "Системен таг, съответстващ на датата и часът на публикуване на текущия документ(в който се извежда заявката)" +RUBRIK_DATE_INFO = "Системен таг, дата и час на публикуване на документа - по шаблон.
Пример: [tag:date:d.m.Y]
Може да се използват разделители (space - . /)" +RUBRIK_CDATE_INFO = "Системен таг, дата и час на публикуване на документа - по шаблон.
Пример: [tag:date:d.m.Y]
(в който се извежда заявката)
Може да се използват разделители (space - . /)" +RUBRIK_DOCAUTHOR_INFO = "Системен таг, съответстващ на автора на документа" +RUBRIK_DOCAUTHOR_AVATAR = "Системен таг, съответстващ на аватаре на автора на документа" +RUBRIK_CDOCAUTHOR_INFO = "Системен таг, съответстващ на автора на текущия документ(в който се извежда заявката)" +RUBRIK_VIEWS_INFO = "Системен таг, извеждащ брой прегледи на документа" +RUBRIK_COMMENTS_INFO = "Системен таг, извеждащ брой коментари към документа. Внимание! Работи само при инсталиран модул Коментари!" +RUBRIK_PATH = "Системен таг, път към корена на инсталацията" +RUBRIK_MEDIAPATH = "Системен таг, път към папките с шаблона (Например: [tag:mediapath]images/logo.gif)" +RUBRIK_THUMBNAIL = "Таг, отговарящ за създаването на миниатюри (При условие, че шаблона за полето в рубриката(шаблон за извеждане в заявка) е избрано: [tag:parametr:0])" + +RUBRIK_ALIAS_HEAD = "Въвеждане алиас за поле" +RUBRIK_ALIAS_HEAD_T = "Може да използвате само латински символи и цифри!
Пример: header" +RUBRIK_ALIAS_HEAD_R = "Рубрика:" +RUBRIK_ALIAS_HEAD_F = "Поле:" +RUBRIK_ALIAS_ALIAS = "Алиас на полето" +RUBRIK_ALIAS_NAME = "Наименование на алиаса" +RUBRIK_ALIAS_BUTT = "Запази" + +RUBRIK_ALIAS_ERROR = "Грешка:" +RUBRIK_ALIAS_RUBID = "Неправилно избрана рубрика" +RUBRIK_ALIAS_FIELDID = "Неправилно избрано поле" +RUBRIK_ALIAS_MATCH = "Неправилно въведен алиас" +RUBRIK_ALIAS_USED = "Този алиас вече се използва" + +RUBRIK_REPORT_QUICKSAVE = "Изпълнил бързо записване на настройките на рубриките" +RUBRIK_REPORT_SORTE = "Изпълнил сортиране на рубриките" +RUBRIK_REPORT_SORTE_FIELDS = "Изпълнил сортировка на полетата в рубрика" +RUBRIK_REPORT_PERMISION = "Променил правата за достъп към документите на рубриката" +RUBRIK_REPORT_COPY = "Създал копие на рубрика" +RUBRIK_REPORT_TEMPL_RUB = "Редактирал шаблон на рубрика" +RUBRIK_REPORT_FIELD_EDIT = "Редактирал поле" +RUBRIK_REPORT_FIELD_DEL = "Изтрил поле" +RUBRIK_REPORT_RUB = "рубрика" + +RUBRIK_REP_QUICKSAVE_H = "Изпълнено" +RUBRIK_REP_QUICKSAVE_T = "Настройките на рубриката са успешно записани" + +RUBRIK_REPORT_ADD = "Добавил рубрика" +RUBRIK_REPORT_SAVE_TPL = "Записал шаблоба за офорление на рубриката" + +RUBRIK_CODE_SAVED = "Изпълнимия код за рубриката е успешно записан" +RUBRIK_CODE_SAVED_ERR = "Неуспешно записване на изпълнимия код за рубриката.
Моля, опитайте отново." +RUBRIK_CODE_ERROR = "Грешка" +RUBRIK_CODE_SUCCESS = "Изпълнено" +RUBRIK_CODE_UPDATE = "Променил изпълнимия код за рубрика" + +RUBRIK_LOG_NEW_FIELD = "Добавил поле в рубрика" +RUBRIK_LOG_DEL_RUBRIC = "Изтрил рубрика" +RUBRIK_LOG_NEW_RUBRIC = "Създал рубрика" + +RUBRIK_FILDS_SAVED = "Успешно записано" +RUBRIK_FILD_SAVED = "Полето е добавено успешно" +RUBRIK_FILDS_REPORT = "Записал полетета на рубрика" +RUBRIK_FILDS_ERROR = "Грешка" +RUBRIK_FILDS_SUCCESS = "Изпълнено" + +RUBRIC_ERROR = "Грешка" +RUBRIC_SUCCESS = "Изпълнено" +RUBRIC_SAVED_PHP_ERR = "Забранено е използването в шаблоните на PHP код" +RUBRIC_SAVED_TPL_ERR = "Неуспешно запазване на шаблона на рубриката.
Моля, опитайте отново." +RUBRIC_SAVED_TPL = "Шаблонът на рубриката е успешно записан." +RUBRIC_SAVED_FLDTPL = "Шаблонът на полето е успешно записан." +RUBRIK_TAG_SYSBLOCK = "Системен таг за извеждане на системен блок" +RUBRIK_TAG_TEASER = "Системен таг за извеждане на тизер" +RUBRIK_TAG_ALIAS = "Системен таг за извеждане алиаса на документа" +RUBRIK_TAG_REQUEST = "Системен таг за извеждане на заявка" +RUBRIC_SAVED_PERMS = "Правава за достъп до документите са успешно записани " +RUBRIK_IFELSE = "Условия" +RUBRIK_IFELSE_1 = "извеждаме ако полето не е празно" +RUBRIK_IFELSE_2 = "иначе извеждаме ако полето е празно" +RUBRIK_SAMPLE = "Пример" +RUBRIK_TAG_DOCDB = "Системный тег вывода поля документа из БД" +RUBRIK_TAG_LANGFILE = "Системный тег для вывода языковой переменной из файла" + +RUBRIC_TMPLS_BUTTON = "Допълнителни шаблони за рубриката" +RUBRIC_TMPLS_HEAD = "Списък на допълнителните шаблони на рубриката" +RUBRIC_TMPLS_ADD = "Добави нов шаблон" +RUBRIC_TMPLS_ID = "id" +RUBRIC_TMPLS_NAME = "Наименование" +RUBRIC_TMPLS_NAME_FULL = "Наименование на шаблона на рубриката" +RUBRIC_TMPLS_AUTHOR = "Автор" +RUBRIC_TMPLS_DATE = "Дата" +RUBRIC_TMPLS_COUNT_DOCS = "Кол-во документи" +RUBRIC_TMPLS_ACTIONS = "Действия" +RUBRIC_TMPLS_COPY = "Копирай шаблона" +RUBRIC_TMPLS_COPY_TIP = "Моля, въведете наименование на шаблона" +RUBRIC_TMPLS_COPY_TIP2 = "Моля, въведете наименование на копирания шаблон" +RUBRIC_TMPLS_EDIT = "Редактиране" +RUBRIC_TMPLS_DELETE = "Изтриване" +RUBRIC_TMPLS_DELETE_C = "Сигурни ли сте, че желаете да изтриете шаблона?" +RUBRIC_TMPLS_TIP = "Вие може да създавате неограничен брой шаблони за една рубрика" +RUBRIC_TMPLS_NO_ITEMS = "Съобщение
В моментта липсват допълнителни шаблони." +RUBRIC_TMPLS_FROM = "Създай копие на основния шаблон" +RUBRIC_TMPLS_INNAME = "Въведете наименование на шаблона" +RUBRIC_TEMPL_REPORT = "Редайтирал допълнителен шаблон за рубрика" +RUBRIC_TMPLS_LOG_DEL = "Изтрил допълнителен шаблон за рубрика" \ No newline at end of file diff --git a/admin/lang/bg/scripts.js b/admin/lang/bg/scripts.js new file mode 100644 index 0000000..61f4f81 --- /dev/null +++ b/admin/lang/bg/scripts.js @@ -0,0 +1,62 @@ +var logoutTitle = "Изход от панела за управление"; +var logoutConfirm = "Сигурни ли сте, че желаете да излезете?"; +var clearCacheTitle = "Изтриване на кеша"; +var clearCacheConfirm = "Сигурни ли сте, че желаете да изтриете кеша?"; +var clearCacheSessTitle = "Изтриване на кеша и сесиите"; +var clearCacheSessConfirm = "Сигурни ли сте, че желаете да изтриете кеша и сесиите?"; +var clearThumbTitle = "Изтриване на миниатюрите(thumbails)"; +var clearThumbConfirm = "Сигурни ли сте, че желаете да изтриите всички миниатюри на изображенията
от директорията за съхраняване на файлове (UPLOAD_DIR)?"; +var clearRevTitle = "Изтриване ревизиите на документите"; +var clearRevConfirm = "Сигурни ли сте, че желаете да изтриете всички ревизии на документите?"; +var clearCountTitle = "Зануляване на дневния брояч на документите"; +var clearCountConfirm = "Сигурни ли сте, че желаете да изтриите дневния брояч на документите?"; +var cacheShowTitle = "Покажи размера на кеша"; +var cacheShowConfirm = "Сигурни ли сте, че желаете да видите размера на кеша?
Това може да отнеме известно време."; +var ajaxErrorStatus = "Няма съединение.
Моля, провете данните за връзка."; +var ajaxErrorStatus404 = "Търсената страница не е намерена. [404]"; +var ajaxErrorStatus401 = "Заявката не може да бъде изпълнена.
Грешка при авторизация за изпълнение на тази заявка. [401]"; +var ajaxErrorStatus500 = "Вътрешна грешка.
Пробвайте да повторите своята заявка по-късно. [500]"; +var ajaxErrorStatusJSON = "Некоректен отговор на сървъра
Данните не са в JSON формат."; +var ajaxErrorStatusTimeOut = "Времето за заявка изтече."; +var ajaxErrorStatusAbort = "Ajax заявката е прекъсната."; +var ajaxErrorStatusMess = "Грешка:
"; +var delCascadTitle = "Изтриване на изображение"; +var delCascadConfirm = "Сигурни ли сте, че желаете да изтриете?"; +var saveMessageOk = "Данните са записани"; + +//===== Date & Time Pickers =====// +$.datepicker.regional['bg'] = { + closeText: 'Затвори', + prevText: '<Пред', + nextText: 'След>', + currentText: 'Днес', + monthNames: ['Януари', 'Февруари', 'Март', 'Април', 'Май', 'Юни', + 'Юли', 'Август', 'Септември', 'Октомври', 'Ноември', 'Декември' + ], + monthNamesShort: ['Яну', 'Фев', 'Мар', 'Апр', 'Май', 'Юни', + 'Юли', 'Авг', 'Сеп', 'Окт', 'Ное', 'Дек' + ], + dayNames: ['неделя', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота'], + dayNamesShort: ['нед', 'пон', 'вто', 'сря', 'чет', 'пет', 'съб'], + dayNamesMin: ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], + weekHeader: 'Не', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' +}; +$.datepicker.setDefaults($.datepicker.regional['bg']); + +$.timepicker.regional['bg'] = { + timeOnlyTitle: 'Изберете време', + timeText: 'Време', + hourText: 'Час', + minuteText: 'Минути', + secondText: 'Секунди', + millisecText: 'милисекунди', + currentText: 'Сега', + closeText: 'Затвори', + ampm: false +}; +$.timepicker.setDefaults($.timepicker.regional['bg']); \ No newline at end of file diff --git a/admin/lang/bg/settings.txt b/admin/lang/bg/settings.txt new file mode 100644 index 0000000..28a6d66 --- /dev/null +++ b/admin/lang/bg/settings.txt @@ -0,0 +1,116 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[settings] +SETTINGS_COUNTRIES = "Управление на държавите" +SETTINGS_COUNTRIES_ALL = "Списък държави" +SETTINGS_COUNTRY_TIP = "Моля, изберете държави, които да бъдат достъпни при регистрацията на нови потребители в системата. Помнете, че избрания от вас списък може да бъде използван и от други модули в системата." +SETTINGS_ACTIVE = "Активна?" +SETTINGS_COUNTRY_NAME = "Наименование държава" +SETTINGS_IN_EC = "Член на ЕС?" +SETTINGS_YES = "Да" +SETTINGS_NO = "Не" +SETTINGS_BUTTON_SAVE = "Запиши промените" +SETTINGS_BUTTON_SAVE_AJAX = "Приложи (CTRL+S)" +SETTINGS_OR = "или" +SETTINGS_MAIN_TITLE = "Управление на общите настройки на системата" +SETTINGS_CASE_TITLE = "Допълнителни настройки" +SETTINGS_MAIN = "Общи настройки на системата" +SETTINGS_SAVED = "Настройките на системата са успешно записани" +SETTINGS_SAVED_ERR = "Неуспешно записване на настройките.
Пробвайте отново." +SETTINGS_SAVE_INFO = "В този раздел Вие може да редактирате глобалните параметри на системата. Моля, бъдете пределно внимателни и понете, че Грешно въведени параметри могат да доведат до неработеща ситема." +SETTINGS_SAVE_CONFIRM = "Сигурни ли сте, че желате да запазите настройките на системата?" +SETTINGS_SITE_NAME = "Наименование на сайта:" +SETTINGS_SITE_COUNTRY = "Държава на сайта:" +SETTINGS_EMAIL_SENDER = "Имейл от който се изпраща:" +SETTINGS_EMAIL_NAME = "Име от което се изпраща имейла:" +SETTINGS_MAIL_TRANSPORT = "Метод за изпращане на писмата:" +SETTINGS_MAIL = "mail" +SETTINGS_SENDMAIL = "sendmail" +SETTINGS_SMTP = "smtp" +SETTINGS_SMTP_SERVER = "Сървър SMTP:" +SETTINGS_MAIL_PORT = "Порт SMTP:" +SETTINGS_SMTP_NAME = "Потребител:" +SETTINGS_SMTP_PASS = "Парола:" +SETTINGS_SMTP_ENCRYPT = "Кодиране" +SETTINGS_SMTP_NOENCRYPT = "не" +SETTINGS_MAIL_PATH = "Път до папката sendmail:" +SETTINGS_SYMBOL_BREAK = "Принудителен пренос след (знака):" +SETTINGS_SYMBOL_BREAK_INFO = "Не повече от 1000 според RFC 2822" +SETTINGS_SYMBOLS = "символа" +SETTINGS_TEXT_EMAIL = "Съобщение до потребителя след създаването на акаунта, където:" +SETTINGS_TEXT_INFO = "%NAME% - Име на потребител
%HOST% - Линк към сайта
%PASSWORD% - Парола
%EMAIL% - Имейл на потребителя
%EMAILSIGNATURE% - Подпис на съобщението" +SETTINGS_EMAIL_FOOTER = "Текст на подписа:" +SETTINGS_ERROR_PAGE = "Страница с грешка HTTP 404: Page not found" +SETTINGS_PAGE_DEFAULT = "(по подразбиране Id:2)" +SETTINGS_TEXT_PERM = "Текст на съобщението, ако потребителя няма права:" +SETTINGS_HIDDEN_TEXT = "Текст на съобщението, ако потребителя няма права за разглеждане на скрит таг [tag:hide:X,X]...[/tag:hide]" + +SETTINGS_NAVI_BOX = "Контейнер за постранична навигация:
Пример: <ul>%s</ul>" +SETTINGS_LINK_BOX = "Контейнер за елементите на постраничната навигация:
Пример: <li>%s</li>" +SETTINGS_TOTAL_BOX = "Контейнер за текста преди номерата на страниците:
Пример: <span>%s</span>" +SETTINGS_ACTIVE_LINK_BOX= "Контейнер за активния елемент:
Пример: <span class="active">%s</span>" +SETTINGS_PAGE_SEPAR = "Контейнер за етикета за наличие на страница:
Пример: <li>%s</li>" +SETTINGS_PAGE_BEFORE = "Текст пред номерата на страниците:
Пример: Страница %d от %d" +SETTINGS_PAGE_START = "Текст за линка "Перва":" +SETTINGS_PAGE_END = "Текст за линка "Последна":" +SETTINGS_PAGE_SEPARATOR = "Текст на етикета за наличие на страници освен видимите:" +SETTINGS_PAGE_NEXT = "Текст на линка "Следваща":" +SETTINGS_PAGE_PREV = "Текст на линка "Предходна":" + +SETTINGS_MAIN_BREADCRUMBS = "Настройки за извеждането на «Breadcrumb»" +SETTINGS_BREAD_BOX = "Контейнер «Breadcrumb»:
Пример: <ul class="breadcrumb">%s</ul>" +SETTINGS_BREAD_MAIN = "Показывать первый элемент: Главная страница:
Да/Нет" +SETTINGS_BREAD_HOST = "Добавлять адрес хоста в url:
Да/Нет" +SETTINGS_BREAD_SEPPARATOR = "Разделител между линковете:
Пример: <li> → </li>" +SETTINGS_BREAD_SEPP_USE = "Покажи:
Да/Не" +SETTINGS_BREAD_BOX_LINK = "Контейнер за линка:
Пример: <li>%s</li>" +SETTINGS_BREAD_LINK_TPL = "Шаблон ссылки
Используются теги: [name], [link], [count]" +SETTINGS_BREAD_BOX_LASTLINK = "Показване на последния елемент:" +SETTINGS_BREAD_SELF_BOX = "Контейнер за последния елемент:
Пример: <li class="active">%s</li>" + + +SETTINGS_DATE_FORMAT = "Формат за дата:" +SETTINGS_TIME_FORMAT = "Формат за дата и час:" +SETTINGS_CLEAR_CACHE = "Изтриване на кеша" +SETTINGS_USE_DOCTIME = "Използване на датата на публикация на документите" +SETTINGS_INFO = "Допълнително" +SETTINGS_MAIN_SETTINGS = "Общи настройки на системата" +SETTINGS_MAIN_MAIL = "Настройки на пощата" +SETTINGS_MAIN_PAGENAVI = "Настройки на извеждането на пострничната навигация" +SETTINGS_NAME = "Параметър" +SETTINGS_VALUE = "Значение" +SETTINGS_USE_EDITOR = "Редактор по подразбиране" +SETTINGS_EDITOR_ELFINDER = "Elrte и Elfinder" +SETTINGS_EDITOR_CKEDITOR = "CKEditor" + +SETTINGS_ERROR = "Грешка" +SETTINGS_SUCCESS = "Изпълнено" + +SETTINGS_SAVE_DOP = "Променил допълнителните настройки на системата" +SETTINGS_SAVE_MAIN = "Променил общите настройки на системата" +SETTINGS_SAVE_COUNTRY = "Променил настройките за държавите" + +SETTINGS_LANG_EDIT = "Управление на езиците" +SETTINGS_LANG_TITLE = "Внимание! Настройката на езиците трябва да стане, задължително преди добавянето на документите в сайта!" +SETTINGS_LANG_AEDIT = "Редактиране" +SETTINGS_LANG_AON = "Включи" +SETTINGS_LANG_AOFF = "Изключи" +SETTINGS_LANG_ADEFAULT = "Включи по подразбиране" +SETTINGS_LANG_ADEFAULT_HINT = "" +SETTINGS_LANG_ID = "Id" +SETTINGS_LANG_FLAG = "Флаг" +SETTINGS_LANG_SYSTEM = "Системно" +SETTINGS_LANG_PREFIX = "Префикс" +SETTINGS_LANG_NAME = "Наименование" +SETTINGS_LANG_DEFAULT = "По подразбиране" +SETTINGS_LANG_ACTION = "Действия" +SETTINGS_LANG_ADD = "Добави език" +SETTINGS_LANG_SAVE = "Запази промените" + +SETTINGS_REV_DELETED = "Ревизиите на документите са успешно изтрити" +SETTINGS_REV_DELETED_ERR = "Неуспешно изтриване на ревизиите на документите.
Опитайте отново." +SETTINGS_REV_UPDATE = "Изтрил ревизиите на документите" +SETTINGS_COUNT_DELETED = "Дневния брояч на документите
е успешно занулен." +SETTINGS_COUNT_DELETED_ERR = "Неуспешно изтриване на дневния
брояч на документите.
Опитайте отново." +SETTINGS_COUNT_UPDATE = "Занулил дневния брояч на документите" +SETTINGS_CACHE_LIFETIME = "Внимание!!! Включено кеширование запроса к настройкам системы. Изменения вступят в силу, только после окончания времени жизни кеша или отключения кеширования" \ No newline at end of file diff --git a/admin/lang/bg/sysblocks.txt b/admin/lang/bg/sysblocks.txt new file mode 100644 index 0000000..1d69d89 --- /dev/null +++ b/admin/lang/bg/sysblocks.txt @@ -0,0 +1,76 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +SYSBLOCK_HEAD = "Системни блокове" +SYSBLOCK_EDIT = "Управление на системни блокове" +SYSBLOCK_EDIT_TIP = "В този раздел се намират всички системни блокове." +SYSBLOCK_ID = "Id" +SYSBLOCK_NAME = "Наименование на системния блок" +SYSBLOCK_HTML = "Код на системния блок" +SYSBLOCK_TAGS = "Таг" +SYSBLOCK_TAGS_2 = "HTML Tags" +SYSBLOCK_EXTERNAL = "Разреши външно обръщение от линк" +SYSBLOCK_EXTERNAL_H = "Външно обръщение от линк" +SYSBLOCK_EXTERNAL_GO = "Преход" +SYSBLOCK_AJAX = "Разреши да се изпълнява само чрез Ajax" +SYSBLOCK_AJAX_H = "Изпълнява се само чрез Ajax" + +SYSBLOCK_VISUAL = "Визуален редактор" +SYSBLOCK_VISUAL_H = "Визуален редактор" + +SYSBLOCK_MEDIAPATH = "Системен таг, път до папката с дизайна" +SYSBLOCK_BREADCRUMB = "Системен таг, Breadcrumb" +SYSBLOCK_DOCID_INFO = "Системен таг, идентификатор на документа" +SYSBLOCK_PATH = "Път до корена на инсталацията" +SYSBLOCK_HOME = "Линк към главната страница на сайта" + +SYSBLOCK_AUTHOR = "Автор" +SYSBLOCK_DATE = "Дата на създаване" +SYSBLOCK_TAG = "Системен таг" +SYSBLOCK_ACTIONS = "Действия" +SYSBLOCK_NO_ITEMS = "Съобщение:
В момента няма въведени системни блокове." +SYSBLOCK_BUTTON_SAVE = "Запази промените" +SYSBLOCK_BUTTON_ADD = "Добави системен блок" +SYSBLOCK_BUTTON_COPY = "Копиране" +SYSBLOCK_INSERT_H = "Добавяне на ситемен блок" +SYSBLOCK_EDIT_H = "Редактиране на системен блок" +SYSBLOCK_INNAME = "Въведете наименование на системния блок" +SYSBLOCK_ENTER_NAME = "Моля, въведете наименование на системния блок" +SYSBLOCK_INSERT = "Тук може да добавите или редактирате избрания от вас системен блок" + +SYSBLOCK_LINK = "Системният блок е достъпен чрез линка:" + +SYSBLOCK_SAVE = "Добави" +SYSBLOCK_SAVEDIT = "Запази промените" +SYSBLOCK_SAVE_NEXT = "Добави и продолжи редактирането" +SYSBLOCK_SAVEDIT_NEXT = "Приложи (CTRL+S)" + +SYSBLOCK_INTEXT = "Системен блок" +SYSBLOCK_ADD = "Добави нов системен блок" +SYSBLOCK_ADD_BUTTON = "Добави" +SYSBLOCK_EDIT_HINT = "Редактиране на системен блок" +SYSBLOCK_DELETE_HINT = "Изтриване на системен блок" +SYSBLOCK_DEL_HINT = "Сигурни ли сте, че желаете да изтриете системния блок?" +SYSBLOCK_LIST_LINK = "Списък системни блокове" +SYSBLOCK_FILE = "Файл на шаблона" +SYSBLOCK_SAVED = "Системният блок е успешно съхранен." +SYSBLOCK_COPY_TITLE = "Копиране на системен блок" +SYSBLOCK_COPY = "Копиране на системен блок" +SYSBLOCK_COPY_TIP = "Моля, въведете наименование на системен блок" +SYSBLOCK_COPY_TIP2 = "Моля, въведете наименование на копирания системен блок" +SYSBLOCK_EXIST = "Извинете, съществува системен блок с това наименование" +SYSBLOCK_SQLUPDATE = "е променил системен блок" +SYSBLOCK_SQLNEW = "е създал нов системен блок" +SYSBLOCK_SQLDEL = "е изтрил системен блок" +SYSBLOCK_OR = " или " + +SYSBLOCK_SAVED = "Системният блок е успешно записан" +SYSBLOCK_SAVED_ERR = "Неуспешно записване на системния блок.
Опитайте отново." +SYSBLOCK_ERROR = "Грешка" +SYSBLOCK_SUCCESS = "Изпълнено" + +// v 3.2 +NAVI_ALIAS = "Алиас" +NAVI_I = "Опционално. Алиасът позволява да се използва лесно запомнящсе таг [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиасът не може да бъде чосло, може да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа и трябва да бъде уникален в пределите на модула." +NAVI_ACCEPT = "Този алиас можр да се използва" +NAVI_ER_SYN = "Грешен алиас!
Алиасът не трябва да е число, да съдържа само цифри, латински букви, долна черта, тире и е с дължина не-повече от 20 символа" +NAVI_ER_EXISTS = "Грешен алиас!
Този алиас вече е използван в друга контактна форма \ No newline at end of file diff --git a/admin/lang/bg/templates.txt b/admin/lang/bg/templates.txt new file mode 100644 index 0000000..d3c32a0 --- /dev/null +++ b/admin/lang/bg/templates.txt @@ -0,0 +1,122 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +TEMPLATES_SUB_TITLE = "Управление на шаблони" +TEMPLATES_TIP1 = "В този раздел са всички шаблони, изполвани в системата. Тук може да изтриете, редактирате или копирате шаблон, за да създадете на негова база нов." +TEMPLATES_ID = "ID" +TEMPLATES_NAME = "Наименование шаблон" +TEMPLATES_NAME2 = "Наименование шаблон:" +TEMPLATES_NAME3 = "Въведете наименованието на шаблона:" +TEMPLATES_AUTHOR = "Автор" +TEMPLATES_DATE = "Дата на създаване" +TEMPLATES_ACTION = "Действия" +TEMPLATES_DATE_FORMAT = "%d.%m.%y г." +TEMPLATES_DATE_FORMAT2 = "%H:%M" +TEMPLATES_IN = "в" +TEMPLATES_EDIT = "Редактиране на шаблон" +TEMPLATES_NO_CHANGE = "Извинете, но нямате достатъчно права за да редактирате шаблона" +TEMPLATES_DELETE = "Изтриване на шаблон" +TEMPLATES_DELETE_CONF = "Сигурни ли сте, че желаете да изтриете този шаблон?" +TEMPLATES_NO_DELETE2 = "Извинете, този шаблон не може да бъде изтрит, т.к. се използва в рубрика" +TEMPLATES_NO_DELETE3 = "Извинете, но Вие нямате достатъчно права за да изтриете шаблона" +TEMPLATES_COPY = "Копиране на шаблон" +TEMPLATES_NO_COPY = "Извинете, но нямате достатъчно права за да копирате шаблона" +TEMPLATES_LEGEND = "Легенда" +TEMPLATES_COPY_TITLE = "Копиране на шаблона" +TEMPLATES_TIP2 = "Моля, въведете наименование на копирания шаблон" +TEMPLATES_TIP3 = "Моля, въведете наименование на шаблона" +TEMPLATES_BUTTON_COPY = "Копиране" +TEMPLATES_TAG_INSERT = "Натиснете върху наименованието на системния таг, за да го добавите в полето на шаблона" +TEMPLATES_TITLE_NEW = "Създаване на нов шаблон" +TEMPLATES_TITLE_EDIT = "Редактиране на шаблон" +TEMPLATES_WARNING1 = "Моля, бъдете възможно най-внимателни при редактирането на шаблона и помнете, че грешно въведения код може да развли външния вид на сайта" +TEMPLATES_WARNING2 = "В този раздел вие може да създавате ръчно нов шаблон, а също така и да заредите готова структура на шаблона от съществуващ файл. Моля, помнете, че файловете с готовата структура на шаблона трябва да бъдат разположени в директори /inc/data/prefabs/templates/" +TEMPLATES_HTML = "HTML код на шаблона" +TEMPLATES_USE_PHP = "Извинете, но вие нямате достатъчно права за да редактирате шаблона, т.к. той използва PHP код" +TEMPLATES_BUTTON_SAVE = "Запази промените" +TEMPLATES_BUTTON_SAVE_NEXT = "Приложи(CTRL+S)" +TEMPLATES_FILE_SAVED = "Файлът е успешно записан" +TEMPLATES_BUTTON_ADD = "Добави шаблон" +TEMPLATES_BUTTON_ADD_NEXT = "Добави и продължи редактирането" +TEMPLATES_BUTTON_LOAD = "Зареди" +TEMPLATES_LOAD_INFO = "Моля, изберете от списъка файл с готова структура на шаблона" +TEMPLATES_EXIST = "Извинете, вече съществува шаблон с това наименование" +TEMPLATES_NO_NAME = "Моля, въведете наименование на шаблона" +TEMPLATES_ALL = "Списък шаблони" +TEMPLATES_OR = " или " + +TEMPLATES_FILE_NAME = "Наименование на файла" +TEMPLATES_CSS_FILES = "Списък css файлове" +TEMPLATES_JS_FILES = "Списък js файлове" +TEMPLATES_FILES = "Файлов мениджър" +TEMPLATES_EDIT_FILE = "Редактиране на файл" +TEMPLATES_DEL_FILE = "Изтриване на файл" + +TEMPLATES_TAGS = "Таг" +TEMPLATES_TAG_DESC = "Описание на тага" +TEMPLATES_THEME_FOLDER = "Наименование на шаблона (име на папка с файловете за дадения шаблон)" +TEMPLATES_FOLDER = "Папка:" +TEMPLATES_PAGENAME = "Наименование на сайта" +TEMPLATES_FILENAME = "Наименование на файла" +TEMPLATES_TITLE = "Наименование на страницата" +TEMPLATES_KEYWORDS = "Ключови думи (Meta - Keywords)" +TEMPLATES_DESCRIPTION = "Описание на страницата (Meta - Description)" +TEMPLATES_INDEXFOLLOW = "Тип индексиране" +TEMPLATES_CANONICAL = "Каноническа страница – препоръчвания екземпляр от страници с много близко съдържание." +TEMPLATES_PATH = "Път към корена на инсталацията" +TEMPLATES_MEDIAPATH = "Път до папката със шаблона (Пример: [tag:mediapath]images/logo.gif)" + +TEMPLATES_CSS = "Събира няколко css-файлов в един. Връща път.
FFF - имената на файловете, разделени със запетая
P - път към папката с файловете, незадължителен. По подразбиране - [tag:mediapath]css/

Пример: href="[tag:css:reset.css,style.css]"" + +TEMPLATES_JS = "Събира няколко js-файлове в един. Връща път.
FFF - имената на файловете, разделени със запетая
P - път към папката с файловете, незадължителен. По подразбиране - [tag:mediapath]js/

Пример: href="[tag:js:common.js,main.js]"" + +TEMPLATES_MEDIAPATH = "Път до папката с шаблона (Пример: [tag:mediapath]images/logo.gif)" +TEMPLATES_MAINCONTENT = "Таг за главното съдържание" +TEMPLATES_ALIAS = "Линк към текущия документ (Alias)" +TEMPLATES_SYSBLOCK = "Системен таг за Системни блокове" +TEMPLATES_TEASER = "Системен таг за Тизери" +TEMPLATES_PRINTLINK = "Линк за "Версия за печат"" +TEMPLATES_HOME = "Линк към главната страница на сайта" +TEMPLATES_BREADCRUMB = "Системен таг Breadcrumb" +TEMPLATES_VERSION = "Показване на лицензна информация" +TEMPLATES_NAVIGATION = "Меню за навигация (ххх - номер на менюто)" +TEMPLATES_IF_PRINT = "Съдържание ще бъде показано при печат." +TEMPLATES_DONOT_PRINT = "Съдържанието няма да бъде показано при печат." +TEMPLATES_RUBHEADER = "Настройва се шаблона на рубриката
(Шаблон за извеждане на HEADER)" +TEMPLATES_NO_ITEMS = "В момента липсват файлове" +TEMPLATES_DOMAIN = "Системен таз за извеждане на домейна" +TEMPLATES_DOCDB = "Системен таг за извеждане на поле на документ от БД" +TEMPLATES_LANGFILE = "Системен таг за извеждане на езикова променлива от файла" +TEMPLATES_LANGUAGE = "Таг за зареждане на езиковите файлове. Препоръчително тагът да е преди основния шаблон." +TEMPLATES_LANG = "Съдържанието ще бъде показано ако езика на документа съвпада с указания" + +TEMPLATES_CACHE_SUCCESS = "Кешът е успешно изтрит." +TEMPLATES_CACHE_SUCCESS_LOG = "е изтрил кеша" + +TEMPLATES_CSS_TITLE = "Моля, бъдете много внимателни при редактирането на шаблона и помнете, че грешно въведения код може да промени или повреде външното оформление на сайта." +TEMPLATES_CSS_EDITOR = "Редактор на CSS файлове" + +TEMPLATES_JS_TITLE = "Моля, бъдете много внимателни при редактирането на шаблона и помнете, че грешно въведения код може да повреди външния вид на сайта" +TEMPLATES_JS_EDITOR = "Редактор на CSS файлове" + +TEMPLATES_REPORT_NEW = "Създал шаблон" +TEMPLATES_REPORT_CHANGE = "Променил шаблон" +TEMPLATES_REPORT_PHP = "Опит за използване на PHP код в шаблона" +TEMPLATES_REPORT_PHP_CSS = "Опит за използване на PHP код в css файл" +TEMPLATES_REPORT_PHP_JS = "Опит за използване на PHP код в js файл" +TEMPLATES_REPORT_PHP_ERR = "Използването на PHP кода е забранено" +TEMPLATES_REPORT_ID_ERR = "Опит за изтриване на основния шаблон" +TEMPLATES_REPORT_DELETE = "Изтрил шаблон" +TEMPLATES_REPORT_FILE = "Редактирал файл" +TEMPLATES_REPORT_COPY = "Създал копие на шаблона" +TEMPLATES_REPORT_DEL_OK = "Файлът е успешно изтрит" +TEMPLATES_REPORT_DEL_ER = "Неуспешно изтриване на файл" + +TEMPLATES_REPORT_ERROR_TEXT = "HTML кода на шаблона е празен" +TEMPLATES_REPORT_ERROR_TITLE = "Не е попълнено - Наименование на шаблона" + +TEMPLATES_SAVED = "Шаблонът е успешно запазен" +TEMPLATES_SAVED_FILE = "Файлът е успешно записан" +TEMPLATES_SAVED_ERR = "Неуспешно запазване на шаблона.
Опитайте отново." +TEMPLATES_SAVED_ERR_FILE = "Неуспешно запазване на файла.
Опитайте отново." +TEMPLATES_ERROR = "Грешка" +TEMPLATES_SUCCESS = "Изпълнено" \ No newline at end of file diff --git a/admin/lang/bg/user.txt b/admin/lang/bg/user.txt new file mode 100644 index 0000000..4afb52e --- /dev/null +++ b/admin/lang/bg/user.txt @@ -0,0 +1,92 @@ +# npop 04,2017 Neli Popova, npop@abv.bg + +[user] +USER_SUB_TITLE = "Управление на потребители" +USER_TIP1 = "В този раздел са всички потребители в системата. Вие може да редактирате параметрите на потребителя, изтриете потребител, а също така да преместите потребител в друга група." +USER_ID = "ID" +USER_NAME = "Име и Фамилия на потребител" +USER_NAME2 = "Име на потребител" +USER_GROUP = "Принадлежи към група" +USER_STATUS_WAIT = "Очаква активация" +USER_LAST_VISIT = "Последен вход" +USER_REGISTER_DATE = "Дата на регистрация" +USER_ACTION = "Действия" +USER_DELETE = "Изтриване на потребителя" +USER_EDIT = "Редактиране на потребителя" +USER_DATE_FORMAT = "%d.%m.%Y %H:%M" +USER_NO_CHANGE = "Извинете, но нямате права за редактиране на потребители" +USER_DELETE_CONFIRM = "Сигурни ли сте, че желаете да изтриете дадения потребител?" +USER_LEGEND = "Легенда" +USER_BUTTON_SAVE = "Запази промените" +USER_ORDERS = "История заявки " +USER_DOWNLOADS = "История заявки ПО" +USER_MARK_DELETE = "Маркирай за изтриване" +USER_NEW_TITLE = "Създаване на нов потребител" +USER_NEW_TIP = "За да добавите нов потребител, запълнете полетата със съответните данни. Моля, бъдете крайно внимателнипри избора на група за потребителя. Грешно въведената група може да ограничи достъпа на потребителя к определени раздели на сайта или обратно да разреши достъп към закритите раздели." +USER_EDIT_TITLE = "Редактиране на потребител" +USER_EDIT_TIP = "В този раздел Вие може да редактирате параметрите на потребителите, а също така да промените паролата и групата на потребителя." +USER_ERRORS = "Грешка: " +USER_FIRSTNAME = "Име на потребител" +USER_FIRSTNAME_ADD = "Въведете име на потребител" +USER_LASTNAME = "Фамилия на потребител" +USER_EMAIL = "E-mail адрес" +USER_NICK = "Ник във форума" +USER_SIGNATURE = "Подпис във форума" +USER_AVATAR = "Аватар на потребителя" +USER_TAX = "Облагане с данък" +USER_COMPANY = "Компания" +USER_HOUSE_STREET = "Улица / Номер:" +USER_ZIP_CODE = "Пощенски код:" +USER_CITY = "Град:" +USER_PASSWORD = "Парола:" +USER_PASSWORD_CHANGE = "промени" +USER_PASSWORD_SHOW = "Покажи паролата" +USER_YES = "Да" +USER_NO = "Не" +USER_COUNTRY = "Държава:" +USER_PHONE = "Телефон за контакти:" +USER_FAX = "Факс:" +USER_BIRTHDAY = "Дата на раждане:" +USER_BIRTHDAY_FORMAT = " във формат (ДД.ММ.ГГГГ)" +USER_NOTICE = "Допълнителна информация:" +USER_MAIN_GROUP = "Основна група:" +USER_SECOND_GROUP = "Допълнителна група:" +USER_SECOND_INFO = "За избор на няколко групи натиснете клавиша CTRL" +USER_STATUS = "Статус на потребителя:" +USER_ACTIVE = "Активен" +USER_INACTIVE = "Неактивен" +USER_BUTTON_ADD = "Добави потребител" +USER_SEND_INFO = "Изпрати е-майл съобщение на потребителя:" +USER_MESSAGE_SUBJECT = "Тема на съобщението:" +USER_MESSAGE_TEXT = "Текст на съобщението:" +USER_EMAIL_EXIST = "Извинете, но въведения имайл адрес вече се използва в системата." +USER_ERROR_DATEFORMAT = "Датата на раждане е въведена с грешен формат." +USER_PASSWORD_SHORT = "Въведената парола е много кратка. Моля, използвайте минимум 5 символа." +USER_PASSWORD_ERROR = "Полето Парола съдържа недопустими символи." +USER_NO_EMAIL = "Полето Имейл не е попълнено. Моля, въведете валиден имейл адрес.." +USER_NO_PASSWORD = "Полето Парола не е попълнено. Моля, въведете паролата.." +USER_EMAIL_ERROR = "Полето Имейл адрес съдържа недопустими символи. Моля, проверете въведения имейл адрес." +USER_NO_FIRSTNAME = "Полето Собствено име на потребител не е попълнено. Моля, въведете Собствено име на потребител." +USER_NO_USERNAME = "Полето Потребителско име не заполнено. Моля, въведете Потребителско име." +USER_ERROR_FIRSTNAME = "Полето Собствено име съдържа недопустими символи." +USER_ERROR_USERNAME = "Полето Потребителско име съдържа недопустими символи." +USER_NO_LASTNAME = "Полето Фамилия на потребителя не е попълнено. Моля, въведете Фамилия на потребителя." +USER_ERROR_LASTNAME = "Полето Фамилия на потребителя съдържа недопустими символи." +USER_MAIL_BODY1 = "Здравейте, %USER%,%N%%N%" +USER_MAIL_BODY2 = "Вашият акаунт е успешно активиран. Моля, използвайте вашите регистрационни данни за вход в сайта %HOST%." +USER_MAIL_FOOTER = "%N%%N%С уважение, %HOMEPAGENAME%%N%%N%%HOST%" +USER_MAIL_SUBJECT = "Вашият акаунт е активиран" +USER_MAIL_PASSWORD = "Информация за смяна на паролата" +USER_MAIL_PASSWORD2 = "Съобщение за промяна на парола.%N%%N%Вашата нова парола е: %NEWPASS%" +USER_NEW_ADD = "Създаване на нов потребител" +USER_ALL = "Списък на потребители" +USER_LOGIN = "Потребителско име в системата:" +SETTINGS_NAME = "Параметър" +SETTINGS_VALUE = "Значение" +USER_LIST_EMPTY = "не са открити потребители, съответстващи на зададените условия за търсене.
Пробвайте да промените условията за търсене." +USER_REPORT_ADD = "Добавил потребител" +USER_REPORT_EDIT = "Редактирал параметрите на потребителя" +USER_REPORT_DEL = "Изтрил потребителя" +USER_REPORT_GROUP = "Променил групата на потребителя" +USER_YOUR_NOT_CHANGE = "Грешка! Извинете, но вие нямате права за редактиране на дадения потребител." +USER_WARNING_TIP = "Внимание! Бъдете пределно внимателни при редактирането на дадения потребител." \ No newline at end of file diff --git a/admin/lang/cz/dbactions.txt b/admin/lang/cz/dbactions.txt new file mode 100644 index 0000000..1841068 --- /dev/null +++ b/admin/lang/cz/dbactions.txt @@ -0,0 +1,49 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +DB_SUB_TITLE = "Správa databáze" +DB_ACTION_WARNING = "Varování!\nVeškeré úpravy v databázi provádíte na vlastní zodpovědnost a riziko.\n\nPamatujte, že jakékoliv akce vykonané s databází mohou poškodit stávající informace.\n\n Přejete si pokračovat?\n\n" +DB_ACTION_RESET = "Varování!\nPokoušíte se otevřít databázi ze zálohy. Veškeré stávající informace budou odstraněny a přepsány.\n Berte prosím na vědomí, že po obnovení databáze bude zapotřebí znovu provést autorizaci.\n\nPřejete si pokračovat?\n\n" +DB_OPTION_LIST = "Struktura databáze." +DB_BUTTON_ACTION = "Provést akci" +DB_OPTIMIZE_DATABASE = "Optimalizace databáze." +DB_OPTIMIZE_INFO = "Tato volba umožňuje zvýšit produktivitu a snížit velikost Vaší databáze. Doporučený interval mezi optimalizacemi musí být nejméně jednou týdně." +DB_REPAIR_DATABASE = "Obnovení poškozených tabulek" +DB_REPAIR_INFO = "Tato volba umožňuje vykonat pokus o obnovení poškozených tabulek v databázi v případě chybných výstupních dat na webových stránkách." +DB_BACKUP_DATABASE = "Vytvoření zálohy" +DB_BACKUP_INFO = "Tato volba umožňuje vytvořit zálohu jak celé databáze, tak i samostatných tabulek. Vyberte prosím ze seznamu vlevo tabulky, pro které chcete vytvořit zálohu. Pro výběr vícero tabulek držte CTRL." +DB_RESTORE_TITLE = "Obnovení databáze ze zálohy" +DB_RESTORE_FILE = "Obnovení databáze ze souboru" +DB_BUTTON_RESTORE = "Obnovit" +DB_ACTION = "Vyberte akci" +DB_TIPS = "Varování! Veškeré úpravy v databázi provádíte na vlastní zodpovědnost a riziko. Pamatujte, že jakékoliv akce vykonané s databází mohou poškodit stávající informace" +DB_BACKUP_SERVER = "Uložit zálohu na serveru" +DB_SC = "Databázová operace byla úspěšně splněna." + +DB_OPTIMIZE_DATABASE_SC = "Optimalizace databáze byla úspěšně splněna." +DB_REPAIR_DATABASE_SC = "Obnovení poškozených tabulek bylo úspěšně splněno." + +DB_REPORT_DUMP = "Zálohování databáze dokončeno" +DB_REPORT_DUMP_RECOVER = "Obnovení databáze ze zálohy dokončeno" +DB_REPORT_DUMP_OPTIM = "Optimalizace databáze dokončena" +DB_REPORT_DUMP_TABLE = "Obnovení tabulek databáze dokončeno" + +DB_FILE_DATA = "Vytvořeno" +DB_FILE_SIZE = "Velikost" +DB_FILE_NAME = "Název" +DB_ACTIONS = "Akce" +DB_ACTIONS_EDIT = "Editovat" +DB_ACTIONS_DEL = "Odstranit" +DB_ACTIONS_RESTORE = "Obnovit" +DB_ACTIONS_SAVE = "Uložit do počítače" + +DB_REPORT_DUMP_DEL_OK = "Vymazat zálohu databáze" +DB_REPORT_DUMP_DEL_ER = "Nepodařilo se vymazat zálohu databáze" +DB_REPORT_DUMP_ER = "Chyba: Import databáze se nezdařil, jelikož soubor výpisu je poškozen nebo chybí." + +DB_ACTIONS_RESTORE_H = "Obnovit zálohu" +DB_ACTIONS_RESTORE_T = "Jste si jisti, že chcete obnovit zálohu databáze?" + +DB_ACTIONS_DELETE_H = "Odstanit soubor" +DB_ACTIONS_DELETE_T = "Jste si jisti, že chcete smazat zálohu databáze?" + +DB_NO_FILES_MESS = "V současné době nejsou k dispozici žádné záložní soubory databáze." diff --git a/admin/lang/cz/docs.txt b/admin/lang/cz/docs.txt new file mode 100644 index 0000000..c239e6c --- /dev/null +++ b/admin/lang/cz/docs.txt @@ -0,0 +1,260 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[Docs] +DOC_SUB_TITLE = "Správa dokumentu" +DOC_TIPS = "Zde je seznam všech dokumentů v systému. Můžete zde provádět základní operace s dokumenty::. revize , Upravení , odstranění dokumentu , a takézanechat poznámky ke každému dokumentu. " +DOC_DATE_FORMAT = "% D. M.%% Y% H:% M" +DOC_LEGEND = "Hodnoty ikon" +DOC_LEGEND_EDIT = "Upravit dokument" +DOC_LEGEND_SHOW = "zobrazit stránku v novém okně" +DOC_LEGEND_ENABLE= "aktivovat dokument" +DOC_LEGEND_DISABLE = "deaktivovat dokument" +DOC_LEGEND_TEMP_DELETE = "dočasně odstranit dokument (do koše)" +DOC_LEGEND_RESTORE = "Obnovit dokument (z koše)" +DOC_LEGEND_FINAL_DELETE = "Trvale smazat dokument" +DOC_CHOSE_RUB = "Vybrat rubriku" +DOC_ID = "ID" +DOC_URL_RUB = "URL" +DOC_TITLE = "Název dokumentu" +DOC_URL_TITLE= "Odkaz na dokument" +DOC_IN_RUBRIK = "Rubrika" +DOC_IN_NEW = "Nový dokument" +DOC_CREATED = "Publikováné" +DOC_EDIT = "Upraveno" +DOC_PRINTED= "Rozepsáné" +DOC_CLICKS = "Náhledy" +DOC_AUTHOR = "Autor" +DOC_ACTIONS = "Akce" +DOC_EDIT_TITLE = "Upravit tento dokument" +DOC_CHANGE_RUBRIC= "Přesunout dokument do jiné rubriky" +DOC_CHANGE_AUTOR = "Změna autora dokumentu" +DOC_SHOW_TITLE = "Náhled dokumentu (bez CNC Linků)" +DOC_SHOW2_TITLE= "Náhled dokumentu (s CNC Linky)" +DOC_SHOW3_TITLE = "Dokument Bez názvu" +DOC_CREATE_NOTICE_TITLE = "Zanechat poznámky" +DOC_REPLY_NOTICE_TITLE = "Podívat se / odpověďět na poznámky" +DOC_ENABLE_TITLE= "Publikovat dokument" +DOC_DISABLE_TITLE = "Stáhnout dokument z publikace" +DOC_TEMPORARY_DELETE = "Vložit dokument do koše" +DOC_RESTORE_DELETE = "Obnovit dokument z koše" +DOC_FINAL_DELETE= "Odstranit dokument" +DOC_ICON_COMMENT = "Jsou poznámky" +DOC_ICON_PUBLIC = "Dokument stažen z publikace" +DOC_ICON_RECYCLE = "Dokument přesunut do koše" +DOC_SORT_TEXT= "Řadit dokumenty za:" +DOC_TEMPORARY_CONFIRM = "Jste si jisti, že chcete vložit dokument do koše?" +DOC_FINAL_CONFIRM = "Jste si jisti, že chcete smazat tento dokument?" +DOC_INSERT_LINK_TIP = "Chcete-li vybrat požadovaný dokument, klikněte na "Vybrat"" +DOC_BUTTON_INSERT_LINK = "Vybrat" +DOC_BUTTON_LINK_POPUP = "Vyberte v novém okně" +DOC_BUTTON_ADD_DOCUMENT = "Přidat dokument" +DOC_BUTTON_ADD_DOCUMENT_NEXT = "Přidat a pokračovat v úpravách (Ctrl + S)" +DOC_BUTTON_EDIT_DOCUMENT = "Uložit změny" +DOC_BUTTON_EDIT_DOCUMENT_NEXT = "Použít (Ctrl + S)" +DOC_ADD_DOCUMENT = "Přidávání nového dokumentu" +DOC_EDIT_DOCUMENT = "editování dokumentu" +DOC_OPTIONS = "Nastavení dokumentu" +DOC_NAME = "Název dokumentu:
(HTML < title>) " +DOC_URL = "Pseudonym dokumentu:
(SEO alias) " +DOC_URL_LINK = "Nahrazení pseudonymů" +DOC_URL_INFO = " Chcete-li, aby odkaz na dokument vypadal následovně:
http://www.domain.tld/phone/samsung/
piště do tohoto pole: phone/samsung

přípona odkazu je automaticky přidána na výstupu
spolu s uvedeným nastavením inc / config.php

V názvu je povolena:
AZ - latinka;
а-я - azbuka (je-li povoleno) ;
/ - lomítko;
-- pomlčka
_ - podtržení

název odkaz by neměl obsahovat:.
tisk / nebo / print / nebo / print;
page-XX / nebo / page-XX / nebo / page-XX;
apage-XX / nebo / apage-XX / nebo / apage-XX;
artpage-XX / nebo / artpage-XX / nebo / artpage-XX;
kde XX - čísla " +DOC_URL_LOG = "Využívat historii pseudonymů pro přesměrování" +DOC_URL_LOG_T = "Ukládat nebo neukládat historii pseudonymů dokumentu pro příští přesměrování" +DOC_URL_LOG_RUBRIC = "Využívat nastavení rubrik" +DOC_URL_LOG_USE = "vždy" +DOC_FIELD_G_UNKNOW = "Bez skupiny" +DOC_PROPERTY = "Nastavení dokumentu" +DOC_URL_LOG_NOTUSE= "Nepoužívat" +DOC_QUERIES = "Dostupné požadavky:" +DOC_META_TITLE = "TITLE - řádek, který se zobrazí v záhlaví okna prohlížeče, tento tag je důležitý pro optimalizaci pro vyhledávače, protože umožňuje ovládat systém, stejně jako některými jinými tagy." +DOC_META_KEYWORDS= "Klíčová slova:
(meta keywords) " +DOC_META_KEYWORDS_INFO = " Popisuje obsah stránky, mohou se započítat vyhledávacími systémy.

Některá z klíčových slov, musí být přítomen v textu na stránce. " +DOC_META_DESCRIPTION= "Popis stránky:
(meta description) " +DOC_META_DESCRIPTION_INFO = "Malý text, který popisuje obsah stránky, může se také započítat do vyhledávače, zobrazeny jako vysvětlení ve výsledcích vyhledávání nebo internetových adresářů." +DOC_CAN_SEARCH= "Povolit hledání dokumentu:
(vyhledávání modulu) " +DOC_INDEX_TYPE = "Typ indexování stránky:
(meta robots) " +DOC_INDEX_FOLLOW= "Indexovat a přecházet na odkaz" +DOC_INDEX_NOFOLLOW = "index, ale nepřecházet na odkaz" +DOC_NOINDEX_NOFOLLOW = "Neindexovat a nepřecházet na odkaz" +DOC_SITEMAP_FREQ= "Obnovovací frekvence
sitemap.xml " +DOC_SITEMAP_FREQ_DOC = "Obnovovací frekvence stránky" +DOC_SITEMAP_ALWAYS = "Vždy" +DOC_SITEMAP_HOURLY = "Každou hodinu" +DOC_SITEMAP_DAILY = "Denně" +DOC_SITEMAP_WEEKLY = "Každý týden" +DOC_SITEMAP_MONTHLY = "Každý měsíc" +DOC_SITEMAP_YEARLY = "Ročně" +DOC_SITEMAP_NEVER = "Nikdy" +DOC_SITEMAP_PRIORITY = "Priority
sitemap.xml " +DOC_SITEMAP_PRIORITY_DOC = "Priority této stránky co se týče srovnání s jinými stránkami" +DOC_SITEMAP_PRIORITY_LOW = "nejnižší priorita" +DOC_SITEMAP_PRIORITY_MID = "Střední priorita" +DOC_SITEMAP_PRIORITY_HIG = "nejvyšší priorita" +DOC_START_PUBLICATION = "Start publikování:" +DOC_END_PUBLICATION = "Konec publikování" +DOC_STATUS = "Stav dokumentu" +DOC_STATUS_ACTIVE= "Aktivní" +DOC_STATUS_INACTIVE = "neaktivní" +DOC_ADD_IN_NAVIGATION = "Přidat podmenu" +DOC_USE_NAVIGATION = "Svázat s bodem menu" +DOC_USE_RUB_ALIAS= "Nahrazování pseudonymů nadřazených dokumentů, přiřazení nadřazený dokument pro drobečkovou navigaci." +DOC_USE_BREADCRUMB = "Svázat s dokumentem
(můžete využít pro drobečkovou navigaci) " +DOC_USE_LANG_PACK = "Svázat s dokumentem z jazykové skupiny" +DOC_NAVIGATION_INFO = "Chcete-li propojit dokument s bodem z menu, vyberte ze seznamu existující položky menu. Chcete-li dočasně připojit dokument z menu, ponechte pole prázdné." +DOC_MAIN_CONTENT = "Hlavní náplň dokumentu" +DOC_MAIN_NOCONTENT = "Žádná pole pro dokument" +DOC_AFTER_CREATE_TITLE = "Další kroky" +DOC_AFTER_CREATE_INFO = "Vyberte další kroky ze seznamu:" +DOC_EDIT_THIS_DOCUMENT= "Zpět k úpravám dokumentu" +DOC_INCLUDE_NAVIGATION = "Přidat vytvořený dokument do navigačního menu" +DOC_ADD_NEW_DOCUMENT = "Vložit nový dokument do této rubriky" +DOC_ADD_COPY_DOCUMENT = "Vložit kopii dokument do této rubriky" +DOC_DISPLAY_NEW_WINDOW= "Náhled v novém okně (Ctrl + O)" +DOC_CLOSE_WINDOW = "Přejít k seznamu dokumentů" +DOC_CLOSE_WINDOW_RUBRIC = "Přejít do seznamu dokumentů této rubriky" +DOC_TO_NAVI_TITLE = "Přidávání dokumentu v navigačním menu" +DOC_NAVIGATION_POSITION = "pozici v seznamu" +DOC_NAVIGATION_TITLE = "název bodu menu" +DOC_TARGET = "Otevírat" +DOC_TARGET_SELF = "ve stejném okně" +DOC_TARGET_BLANK = "V novém okně" +DOC_BUTTON_ADD_MENU = "Přidat do menu" +DOC_TOP_MENU_ITEM = "Nový bod prvního úrovně" +DOC_NOTICE = "Poznámky k dokumentu" +DOC_NOTICE_NEW_LINK = "Přidat novou poznámku" +DOC_NOTICE_AUTHOR = "Vložit:" +DOC_NOTICE_DELETE_LINK = "Smazat poznámku" +DOC_ALLOW_NOTICE = "Povolit komentář poznámek" +DOC_BUTTON_NOTICE = "Splnit" +DOC_NOTICE_TITLE = "Záhlaví" +DOC_NOTICE_TEXT= "Poznámka:" +DOC_BUTTON_ADD_NOTICE = "Přidat poznámku" +DOC_SEND_NOTICE_INFO = "Chcete-li přidat novou poznámku k dokumentu, vyplňte pole ve formuláři níže." +DOC_NEW_NOTICE_TITLE= "Přidat novou poznámku" +DOC_MAIL_BODY_CHECK = "Uživatel %USER% přidal nový dokument s názvem '%TITLE%'. %N% Zkontrolujte dokument před zveřejněním. " +DOC_MAIL_SUBJECT_CHECK = "Přidán nový dokument" +DOC_MAIL_BODY_USER = "Vítejte %USER%.%N% Úspěšně vytvořen dokument byl přidán do oznámení, Administrátor byl uvědoměn a po prověření bude publikován." +DOC_MAIL_SUBJECT_USER = "Váš dokument byl podán, čeká na ověření." +DOC_MAIL_BODY_NOTICE = "Uživatel %USER% přidal novou poznámku k dokumentu. %N% Přihlaste se do ovládacího panelu a klikněte na odkaz níže pro zobrazení poznámky:%N%%LINK%" +DOC_MAIL_SUBJECT_NOTICE = "Přidána nová poznámka k dokumentu" +DOC_NEW_PAGE = "Přidat novou stránku" +DOC_CLOSE_HELP_WINDOW = "

" +DOC_HELP= "Pomoc" +DOC_VIDEO_TYPE_HELP = " Vložit video souboru
Když přidáte video soubor, můžete určit šířku a výšku okna pro zobrazení videa. První hodnota určuje šířku okna, druhý výšku.

Například:

video.avi | 300 | 300

nebo video.avi | 100% | 300 " +DOC_FLASH_TYPE_HELP = " Vložení Flash filmu
Když přidáte Flash videa můžete určit šířku a výšku okna pro zobrazení. První hodnota určuje šířku, druhá výšku.

Například:..

flash.swf | 300 | 300

nebo flash.swf | 100% | 300 " +DOC_FILE_TYPE_HELP= " Vložení souborů
Když přidáte soubor, můžete zadat název odkazu. Je nutné zadat distributorský znak. |. a poté zadat název odkazu

například:

file.zip | Nahrát soubor " +DOC_NO_PERMISSION = "Je nám líto, ale nemáte oprávnění k úpravě tohoto dokumentu." +DOC_NO_PERMISSION_RUB = "Je nám líto, ale nemáte oprávnění k vytvoření dokumentu v této rubrice." +DOC_NO_DEL_REVISION = "Je nám líto, ale nemáte oprávnění k odstranění revize." +DOC_NO_RES_REVISION = "Je nám líto, ale nemáte oprávnění k obnovení revize." +DOC_EDIT_RUB = "Přesunout do jiné rubriky" +DOC_RUBRIC = "Rubrika" +DOC_SORT_RUB = "Uspořádat podle rubriky" +DOC_IMAGE = "Obrázky ve zprávách" +DOC_IMAGE_MAX_W = "Maximální šířka" +DOC_IMAGE_MAX_H = "Maximální výška" +DOC_INTRO= "Teaser
(text ve zprávách)" +DOC_ALIAS_CREATE = "Zformovat" +DOC_ENTER_NAME = "Vyberte rubriku, do které chcete přidat nový dokument." +DOC_SORT_NAME= "Vyberte prosím rubriku." +DOC_OR = "& nbsp; nebo & nbsp;" +DOC_NO_DOCS = " Dokumenty, které splňují tato kritéria, neexistují." +DOC_COPY= "Kopírovat dokument" +DOC_COPY_DOCUMENT = "kopírování dokumentu" +DOC_COPY_TIP = "Uveďte prosím název dokumentu" +DOC_ADD_NEW_LIGHT_TIP= "Chcete-li přidat nový dokument, vyberte rubriku." +DOC_ADD_NEW_LIGHT_ADD = "Přidávání dokumenti" +DOC_ADD_NEW_LIGHT_BTN = "Přidat dokument" +DOC_CHANGE_TITLE= "Převod dokumentů do jiné rubriky" +DOC_CHANGE_INFO = " Důležité! Pokud změníte rubriku, pole, které nebyly přeneseny, budou ztraceny!" +DOC_CHANGE_OLD_FIELD = "Pole dokumentu" +DOC_CHANGE_NEW_FIELD= "Přesunout do nového" +DOC_CHANGE_DROP_FIELD = "--nepřenášet--" +DOC_CHANGE_CREATE_FIELD = "-- vytvořit nový --" +DOC_CHANGE_BUTTON = "změnit" +DOC_CHANGE_AU_TITLE = "Změna autora dokumentu" +DOC_CHANGE_AU_INFO = " Důležité! Pokud změníte autora, předchozí autor může být zbaven práv upravovat dokument." +DOC_CHANGE_BUTTON = "Uložit" +DOC_IN_MENU = "do menu" +DOC_REVISSION= "Historie změn" +DOC_REVISSION_DATA = "Datum a čas změny" +DOC_REVISSION_USER = "Autor" +DOC_REVISSION_VIEW = "Náhled verze" +DOC_REVISSION_RECOVER= "Obnovit verzi" +DOC_REVISSION_RECOVER_T = "Opravdu chcete obnovit tuto verzi?" +DOC_REVISSION_DELETE = "Odstranit verzi" +DOC_REVISSION_DELETE_T= "Jste si jisti, že chcete smazat tuto verzi?" +DOC_REVISSION_NO_ITEMS = "Žádná data" +DOC_URL_ERROR_SYMBOL = "Neplatné znaky" +DOC_URL_ERROR_START = "začíná z /" +DOC_URL_ERROR_END= "Končí na/ (přípona URL začíná na /)" +DOC_URL_ERROR_SEGMENT = "Neplatné segmenty" +DOC_URL_ERROR_EMTY = "Nic k ověření" +DOC_URL_ERROR_DUPLICATES= "Přezdívka se již používá" +DOC_URL_H_ERROR_DUPLICATES = "Přezdívka se již používá v historii pseudonymů" +DOC_URL_CHECK_OK = "Toto URL může být použito" +DOC_URL_CHECK_ER= "URL obsahuje chyby:
" +DOC_REQUEST_NOT_INFO = "Chybí popis požadavku." +DOC_REVISION_DELETE = "Verze dokumentu odstraněna" +DOC_REVISION_RECOVER= "Verzi dokumentu obnovena" +DOC_BREADCRUMB_BTN = "Vybrat" +DOC_BREADCRUMB_TITLE = "Název odkaz v drobečkové navigaci" +DOC_BREADCRUMB_WITH = "Souvisí s" +DOC_DOCUMENT_OPEN= "Dokument zveřejněn" +DOC_DOCUMENT_CLOSE = "Dokument stažen z publikace" +DOC_DOCUMENT_DOC = "Dokument" +DOC_DOCUMENT_ACT = "Publikoval" +DOC_DOCUMENT_DISACT= "Odstraněno z publikace" +DOC_DOCUMENT_OPEN_ERR = "Tento dokument nemůže být neaktivní!" +DOC_DOCUMENT_OPEN_PRIVE = "K tomuto nemáte oprávnění!" +DOC_ACTION_SELECT = "Akce se zvolenými" +DOC_ACTION_SELECT_ACT= "Aktivní" +DOC_ACTION_SELECT_NACT = "Neaktivní" +DOC_ACTION_SELECT_TRASH = "dočasně odstraněny" +DOC_ACTION_SELECT_OUTTRASH = "Obnovit" +DOC_ACTION_SELECT_DEL = "Odstranit" +DOC_ACTION_BUTTON = "Uložit změny" +DOC_CHOOSE_LANG= "Výběr jazyka dokumentu" +DOC_LANG_VERSION = "Verze dokumentu v jiných jazycích" +DOC_LINK_CHOOSE = "Zvolte Dokument" +DOCUMENT_SAVED = "Dokument byl úspěšně uložen" +DOC_REV_DELETED = "Revize dokumenty úspěšně odstraněn" +DOC_REV_DELETED_ERR = "Nepodařilo se smazat revizi.
Zkuste znovu." +DOC_REV_ERROR = "Chyba" +DOC_REV_SUCCESS= "Hotovo" +DOC_REV_UPDATE = "Revize dokumentů odstraněny" +DOC_ALIASES = "Správce přesměrování dokumentů"DOC_ALIASES_LIST_N= "Název dokumentu" +DOC_ALIASES_LIST_RB = "Rubrika" +DOC_ALIASES_LIST_CH = "Změněno" +DOC_ALIASES_LIST_CR = "Množství" +DOC_ALIASES_LIST_AT = "Akce" +DOC_ALIASES_TITLE= "Zde je seznam všech dokumentů, ve kterých jsou vnitřní přesměrování.
Můžete provádět základní operace s dokumenty, jako je prohlížení, editaci, mazání, či přesměrování." +DOC_ALIASES_BREAD_RUB = "Rubrika" +DOC_ALIASES_BREAD_DOC = "Dokument" +DOC_ALIASES_BREAD_URL = "Hlavní URL" +DOC_ALIASES_DOC_LIST = "Seznam dokumentů s přesměrováním" +DOC_ALIASES_ADD = "Přidat nové přesměrování" +DOC_ALIASES_ADD_VAL = "Hodnota přesměrování" +DOC_ALIASES_LIST = "Seznam přesměrování" +DOC_ALIASES_LIST_EMPT = "Prázdný seznam" +DOC_ALIASES_TABL_H_URL= "Alias ​​přesměrování" +DOC_ALIASES_TABL_H_ADD = "Vloženo" +DOC_ALIASES_TABL_H_AUT = "Autor" +DOC_ALIASES_TABL_CHECK = "Zaškrtněte tuto možnost pro odstranění" +DOC_ALIASES_GO= "Přejít k přesměrování" +DOC_ALIASES_DEL_T = "Odstranit alias" +DOC_ALIASES_DEL_C = "Jste si jisti, že chcete smazat alias?" +DOC_ALIASES_BUTT_DEL = "Odstranit" +DOC_ALIASES_BUTT_CLO = "Zavřít okno" +DOC_ALIASES_BUTT_APP= "Použít" +DOC_ALIASES_BUTT_CNL = "Zrušit" +DOC_ALIASES_BUTT_SAV = "Uložit" +DOC_ALIASES_BUTT_ADD = "Vložit" +DOC_ALIASES_REP_OK = "Hotovo" +DOC_ALIASES_REP_OK_T = "Přesměrování úspěšně přidáno" +DOC_ALIASES_REP_OK_T_E= "Přesměrování úspěšně obnoveno" +DOC_ALIASES_REP_ER = "Chyba" +DOC_ALIASES_REP_ER_T = "NEpodařilo se přidat přesměrování. Zkuste znovu." +DOC_ALIASES_REP_ER_T_E = "Nepodařilo se aktualizovat přesměrování. Zkuste znovu." +DOC_RUBRIC_TMPLS= "Vyberte šablonu rubriky" +DOC_RUBRIC_TMPLS_HINT = "Můžete nastavit dokument pro výstup, jakoukoliv šablonu z této rubriky" diff --git a/admin/lang/cz/groups.txt b/admin/lang/cz/groups.txt new file mode 100644 index 0000000..af4654d --- /dev/null +++ b/admin/lang/cz/groups.txt @@ -0,0 +1,121 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[groups] +UGROUP_TITLE = "Správce skupin uživatelů" +UGROUP_TITLE2 = "Správce skupiny uživatelů" +UGROUP_TITLE_MENU = "Skupina uživatelů" +UGROUP_INFO = " Zde je seznam všech skupin uživatelů v systému. Každé skupině můžete přiřadit osobní práva, která dovolují, či omezují, akce užvatelů, a to jak v Ovládacích panelech, tak i na veřejné části stránek." +UGROUP_ID = "ID" +UGROUP_NAME = "Název skupiny" +UGROUP_COUNT = "Uživatelé ve skupině" +UGROUP_ACTIONS = "Akce" +UGROUP_IN_GROUP = "Zobrazit seznam uživatelů patřící do této skupiny" +UGROUP_EDIT = "Upravit název a práva skupiny" +UGROUP_NO_PERMISSION = "Je nám líto, nemáte dostatečná práva k provádění úprav." +UGROUP_DELETE = "Smazat skupinu" +UGROUP_USERS_IN_GROUP = "V současné době nelze smazat skupinu, jelikož ve skupině jsou stále přiřazení uživatelé." +UGROUP_DELETE_CONFIRM = "Opravdu chcete smazat skupinu?" +UGROUP_NO_DELETABLE = "Nelze smazat systémovou skupinu." +UGROUP_NO_PERM_DELETE = "Je nám líto, nemáte dostatečná práva ke smazání skupiny." +UGROUP_NEW_GROUP = "Přidat novou skupinu" +UGROUP_NEW_NAME = "Název skupiny:" +UGROUP_BUTTON_ADD = "Přidat" +UGROUP_LEGEND_LINK = "Hodnota ikony" +UGROUP_LEGEND_EDIT = "Upravit skupinu uživatelů" +UGROUP_LEGEND_DELETE = "Odstranit skupinu uživatelů" +UGROUP_ENTER_NAME = "Zadejte prosím název skupiny uživetelů" +UGROUP_WARNING_TIP = "Varování! Buďte opatrní při udělování práv této skupině uživatelů. Pamatujte, že umožňujete přístup do úseků, které mohou způsobit nestabilitu systému." +UGROUP_YOUR_NOT_CHANGE = "Chyba! Je nám líto, nemáte dostatečná práva k provádění úprav této skupiny uživatelů." +UGROUP_NOT_EXIST = "Chyba! Je nám líto, ale skupina, kterou hledáte, neexistuje. " +UGROUP_NO_MODULES = "Nejsou nainstalované moduly" +UGROUP_MODULES_RIGHT = " Zadejte prosím moduly, do kterých budou mít uživatelé přístup." +UGROUP_CONTROL_RIGHT = "Zadejte prosím oddíly Ovládacích panelů, ke kterým bude povolen, či zakázán, přístup pro tuto skupinu uživatelů." +UGROUP_BUTTON_SAVE = "Uložit změny" +UGROUP_BUTTON_SAVE_AJAX = "Použít(CTRL+S)" +UGROUP_SAVE_CONFIRM = "Opravdu chcete uložit práva pro tuto skupinu uživatelů?" +UGROUP_NAME_EDIT = "Upravit název skupiny" +UGROUP_OR = "nebo" +UGROUP_SAVED = "Práva skupiny úspěšně uložena" +UGROUP_SAVED_ERR = "Nepodařilo se uložit změny.
Zkuste znovu." +UGROUP_ERROR = "Chyba" +UGROUP_SUCCESS = "Hotovo" +UGROUP_SAVE_MAIN = "Práva pro skupinu změnena" + +UGROUP_REPORT_ADD = "Skupina uživetelůp vytvořena" +UGROUP_REPORT_DEL = "Skupina uživatelů smazána" + +alles = "Povolit všechna práva (Pozor!)" +adminpanel = "Přístup k Ovládacímu panelu" + +gen_settings = "Přístup k obecným nastavením systému" +gen_settings_more = "Přístup k pokročilým nastavením systému +gen_settings_countries = "Přístup k nastavení seznamu zemí." +gen_settings_languages = "Přístup k nastavení jazyků" + +logs_view = "Přístup k zobrazení systémových zpráv." +logs_clear = "Přístup k odstranění systémových zpráv" + +db_actions = "Přístup ke správě databáze (Zálohování, obnovení, aktualizace)" + +modules_view = "Přístup k seznamu modulů" +modules_admin = "Přístup k modulům (Nastavení, správa, použití)" +modules_system = "Přístup ke správě modulů (smazání, instalace)" + +navigation_view = " Přístup k seznamu navigačního menu" +navigation_edit = "Přístup ke správě navigačního menu (Vytvoření, úprava, odstranění)" + +remark_view = "Přístup k poznámkám" +remark_edit = " Přístup ke správě poznámek v dokumentech(Vytvoření, úprava, odstranění)" + +document_php = "Přístup k využití PHP kódu v dokumentech(Pozor!)" +document_view = "Přístup k seznamenu dokumentů (práva k přístupu k dokumentům závisí od nastavení rubriky)" +document_revisions = "Přístup k odstranění všech revizí dokumentů" + +rubric_view = "Přístup k zobrazení seznamu rubrik" +rubric_edit = "Přístup ke správe rubrik (Vytvoření, úprava, odstranění)" +rubric_php = "Přístup k využití PHP kódu v šablonách rubrik(Pozor!)" +rubric_perms = "Přístup ke správě přístupu k dokumentům rubriky" +rubric_code = "Přístup ke spustitelným částem kódu(Pozorі!)" + +template_view = "Přístup k setnamu šablon" +template_edit = "Přístup ke správě šablon (Stvoření, úprava, odstranění)" +template_php = "Přístup k využití PHP kodu v šablonách (Pozorі!)" + +request_view = "Přístup k seznamu požadavků" +request_edit = "Přístup ke správě požadavků (Vytvoření, úprava, odstranění)" +request_php = "Přístup k využití PHP kodu v šablonách požadavků (Pozor!)" + +sysblocks_view = "Přístup k zobrazení seznamu systémových bloků" +sysblocks_edit = "Přístup k řízení systémových bloků (Vytvoření, úprava, odstranění)" + +user_view = "Přístup k seznamu uživatelů" +user_edit = " Přístup k úpravě parametrů uživatelůД" +user_perms = "Přístup ke správě práv uživatelů" + +group_view = "Přístup k seznamu skupin uživatelů" +group_edit = "Přístup ke správe práv skupin uživatelů (Vytvoření, úprava, odstranění)" + +mediapool_int = "Přístup k Správce dokumentů" +mediapool_add = "Přístup k přidávání nových souborů na server (ve Správci dokumentů)" +mediapool_del = " Přístup k odstranění souborů ze serveru(ve Správci dokumentů)" +mediapool_finder = "Přístup ke Správci dokumentů (elFinder)" + +cache_clear = "Přístup ke smazání chache" +cache_thumb = " Přístup ke smazání preview zobrazení(thumbnail)" + +logs = "Systémové zprávy" +cache = "Správa cache" +gen = "Systémová nastavení" +db = "Databáze" +sysblocks = "Systémové bloky" +rubric = "Rubriky" +document = "Dokumenty" +modules = "Moduly" +mediapool = "Správce souborů" +navigation = "Navigace" +request = "Požadavky" +template = "Šablony" +remark = "Poznámky dokumentů" +document = "Dokumenty" +user = "Uživatelé" +group = "Uživatelské skupiny" \ No newline at end of file diff --git a/admin/lang/cz/logs.txt b/admin/lang/cz/logs.txt new file mode 100644 index 0000000..a289b34 --- /dev/null +++ b/admin/lang/cz/logs.txt @@ -0,0 +1,55 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[logs] +LOGS_SUB_TITLE = "Správce systémových zpráv" +LOGS_TITLE = "Systémový protokol" +LOGS_TIP = "Zde je seznam všech činností, které se provádí v Ovládacím panelu." +LOGS_ID = "№" +LOGS_IP = "IP-adresa" +LOGS_DATE = "Data" +LOGS_USER = "Uživatel" +LOGS_ACTION = "Akce" +LOGS_BUTTON_DELETE = "Smazat protokol" +LOGS_DELETE_CONFIRM = "Jste si jistí, že chcete vymazat protokol systémových zpráv?" +LOGS_BUTTON_EXPORT = "Export protokolu systémových zpráv" +LOGS_BUTTON_EXPORT_404 = "Export chybového protokolu 404" +LOGS_DATE_FORMAT = "%d.%m.%y g." +LOGS_DATE_FORMAT2 = "%H:%M" +LOGS_IN = "v" +LOGS_CLEAR = "Systémové zprávy úspěšně smazány." +LOGS_CLEAN = "Protokol událostí smazán" +LOGS_EXPORT = "Protokol událostí exportován" + +LOGS_404_SUB_TITLE = "Protokol chyb 404" +LOGS_404_TITLE = "Protokol chyb 404" +LOGS_404_TIP = "Zde je seznam všech chyb 404" +LOGS_404_ID = "№" +LOGS_404_IP = "IP-adresa" +LOGS_404_DATE = "Datum" +LOGS_404_ACTION = "Akce" +LOGS_404_BUTTON_DELETE = "Smazat protokol" +LOGS_404_DELETE_CONFIRM = "Opravdu si přejete vymazat protokol chyb 404?" +LOGS_404_BUTTON_EXPORT = "Export protokolu chyb" +LOGS_404_DATE_FORMAT = "%d.%m.%y g." +LOGS_404_DATE_FORMAT2 = "%H:%M" +LOGS_404_IN = "v" +LOGS_404_CLEAR = "Systémové zprávy úspěšně smazány." +LOGS_404_CLEAN = "Protokol chyb 404 smazán" +LOGS_404_EXPORT = "Protokol chyb 404 exportován" + +LOGS_SQL_SUB_TITLE = "Protokol MySQL chyb" +LOGS_SQL_TITLE = "Protokol MySQL chyb" +LOGS_SQL_TIP = "Zde je seznam všech MySQL chyb." +LOGS_SQL_ID = "№" +LOGS_SQL_IP = "IP-adresa" +LOGS_SQL_DATE = "Datum" +LOGS_SQL_ACTION = "Akce" +LOGS_SQL_BUTTON_DELETE = "Smazat protokol MySQL chyb" +LOGS_SQL_DELETE_CONFIRM = "Opravdu si přejete smazat protokol MySQL chyb?" +LOGS_SQL_BUTTON_EXPORT = "Export protokolu MySQL chyb" +LOGS_SQL_DATE_FORMAT = "%d.%m.%y g." +LOGS_SQL_DATE_FORMAT2 = "%H:%M" +LOGS_SQL_IN = "v" +LOGS_SQL_CLEAR = "Protokol chyb MySQL úspěšně smazán." +LOGS_SQL_CLEAN = "Protokol MySQL chyb smazán" +LOGS_SQL_EXPORT = "Protokol MySQL chyb exportován" \ No newline at end of file diff --git a/admin/lang/cz/main.txt b/admin/lang/cz/main.txt new file mode 100644 index 0000000..55194ec --- /dev/null +++ b/admin/lang/cz/main.txt @@ -0,0 +1,302 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +MAIN_WELCOME = "Vítejte v Ovládacích panelech!" +MAIN_WELCOME_INFO = "Na hlavní stránce si můžete vybrat jednu z nejčastěji prováděných akcí." + +MAIN_PAGE = "Hlavní strana" + +MAIN_LOGIN_INTRO = "Autorizace" +MAIN_LOGIN_BACK_SITE = "Návrat na stránku" +MAIN_LOGIN_NAME = "Login:" +MAIN_LOGIN_PASSWORD = "Heslo:" +MAIN_LOGIN_BUTTON = "Vejít" +MAIN_LOGIN_REGISTER = "Registrace" +MAIN_LOGIN_LOST = "Zapomněli jste heslo?" +MAIN_LOGIN_HELP = "Nápověda" +MAIN_LOGIN_REMEMBER = "Zapamatovat si mně" +MAIN_LOGIN_CAP_CODE = "Kód:" +MAIN_LOGIN_CAP_CODE_REF = "Update kódu:" +MAIN_LOGIN_CAP_CODE_REFR = "Update kódu" + +MAIN_LINK_HOME = "Hlavní menu" +MAIN_LINK_AUTHOR = "Stránka podpory" +MAIN_LINK_DATABASE = "Správce databáze" +MAIN_LINK_NAVIGATION = "Správce navigačního menu" +MAIN_LINK_MODULES = "Správce modulů" +MAIN_LINK_MODULES_H = "Moduly" +MAIN_LINK_SETTINGS = "Správce nastavení" +MAIN_LINK_SETTINGS_H = "Nastavení" +MAIN_LINK_USERS = "Správce uživatelů" +MAIN_LINK_TEMPLATES = "Správce šablon" +MAIN_LINK_RUBRICS = "Správce rubrik" +MAIN_LINK_DOCUMENT = "Správce dokumentů" +MAIN_LINK_QUERYES = "Správa požadavků" +MAIN_LINK_GROUPS = "Správce skupin" +MAIN_LINK_LANG = "Správa jazyků" + +MAIN_BUTTON_LOGIN = "Vejít" +MAIN_BUTTON_ADD = "Přidat" +MAIN_BUTTON_LOGOUT = "Odejít" + +MAIN_SETTINGS_EDIT_1 = "Obecná nastavení" +MAIN_SETTINGS_EDIT_2 = "Pokročilá nastavení" +MAIN_SETTINGS_EDIT_3 = "Správce zemí" +MAIN_SETTINGS_EDIT_4 = "Vytvořit zálohu BD" + +MAIN_LINK_DOC_TIPS = "Zde je seznam všech dokumentů v systému." +MAIN_LINK_RUBRIK_TIP = "Zde je seznam všech rubrik v systému." +MAIN_LINK_REQUEST_TIP = "Zde je seznam všech existujících požadavků v systému." +MAIN_LINK_NAVI_TIP = "Zde je seznam všech navigačních menu v systému." +MAIN_LINK_TEMPLATES_TIP = "Zde je seznam všech šablon použitých v systému." +MAIN_LINK_MODULES_TIP = "Zde je seznam všech dostupných modulů v systému." +MAIN_LINK_SETTINGS_TIP = "Zde jsou všechny globální parametry systému." +MAIN_LINK_DB_TIP = "Zde můžete pracovat s databázovým systémem." +MAIN_LINK_USER_TIP = "Zde je seznam všech uživatelů v systému." +MAIN_LINK_UGROUP_TIP = "Zde je seznam všechny skupiny uživatelů v systému." + +MAIN_PAGE_TITLE = "Ovládací panely" +MAIN_LOGIN_TEXT = "Autorizace" +MAIN_LOGIN_TEXT2 = "Zadejte prosím své údaje:" +MAIN_LOGIN_CAPTCHA = "Zadejte kód:" +MAIN_SELECT_LANGUAGE = "Jazyk:" +MAIN_SELECT_THEME = "Téma designu:" +MAIN_YOUR_EMAIL = "E-mail:" +MAIN_YOUR_LOGIN = "Login nebo e-mail:" +MAIN_YOUR_PASSWORD = "Heslo:" + +MAIN_LINK_SITE = "Náhled stránky" +MAIN_LINK_HOME = "Na hlavní" +MAIN_LINK_LOGOUT = "Ukončit práci s Ovládacím panelem" +MAIN_LINK_LOGOUT_QUEST = "Opravdu chcete ukončit?" +MAIN_LINK_CACHE_CLEAR = "Čištění Cache" +MAIN_LINK_CACHE_CLEAR_QUEST = "Opravdu chcete vyprázdnit mezipaměť?" + +MAIN_LINK_SITE_ON = "Zapnout editor" +MAIN_LINK_SITE_OFF = "Vypnout editor" + +MAIN_LINK_EDIT = "Editovat stránku" +MAIN_ADD_IN_RUB = "Vložit nový dokument:" +MAIN_DOCUMENTS_ALL = "Seznam dokumentů:" +MAIN_SEARCH_DOCUMENTS = "Hledat dokumenty:" +MAIN_SORT_DOCUMENTS = "Rychlý výběr:" +MAIN_TIME_PERIOD = "Perioda publikace" +MAIN_TIME_START = "Počátek" +MAIN_TIME_END = "Konec" +MAIN_BUTTON_SEARCH = "Hledat" +MAIN_TITLE_SEARCH = "Název dokumentu:" +MAIN_TITLE_DOC_NAME = "Název dokumentu" +MAIN_TITLE_DOC_ID = "ID dokumentu" +MAIN_SEARCH_HELP = Využití vyhledávače

Použijte znak "+" дpro rychlé vložení slova do vyhledávače.
Použijte znak "-" pro vylouření slova z vyhledávání

je nutné využít mezery před znaky "+" a "-"." +MAIN_ID_SEARCH = "ID dokumentu:" +MAIN_SELECT_RUBRIK = "V rubrice:" +MAIN_ALL_RUBRUKS = "Všechny rubriky" +MAIN_ALL_DOCUMENTS = "Jakýkoli status" +MAIN_DOCUMENT_STATUS = "Status dokumentu" +MAIN_DOCUMENT_ACTIVE = "Pouze aktivní" +MAIN_DOCUMENT_INACTIVE = "Pouze neaktivní" +MAIN_TEMP_DELETE_DOCS = "Dočasně odstraněn" +MAIN_RESULTS_ON_PAGE = "Výsledky na stránce:" +MAIN_OPEN_MEDIAPATH = "Náhled na serveru" +MAIN_NAVI_UGROUPS = "Uživatelské skupiny" +MAIN_UGROUP_EDIT = "Upravit práva skupiny" +MAIN_UGROUP_DELETE = "Odstranit skupinu" +MAIN_LOGS = "Systémové události" +MAIN_NAVI_MODULES = "Správce modulů" +MAIN_NAVIGATION = "Menu navigace" +MAIN_NAVIGATION_NEW = "Přidat nové menu" +MAIN_QUERIES = "Požadavky" +MAIN_REQUEST_NEW = "Přidat nový požadavek" +MAIN_RUBRIKS = "Rubriky" +MAIN_RUBRIK_NEW = "Přidat novou rubriku" +MAIN_RUBRIK_EDIT_FIELDS = "Upravit pole rubriky" +MAIN_RUBRIK_EDIT_TEMPL = "Upravit šablonu rubriky" +MAIN_SETTINGS = "Nastavení systému" +MAIN_COUNTRY_EDIT = "Správce zemí" +MAIN_SYSBLOCKS = "Systémové bloky" +MAIN_TEMPLATES = "Šablony" +MAIN_TEMPLATES_NEW = "Přidat novou šablonu" +MAIN_USERS = "Uživatelé" +MAIN_DATABASE_INFO = "Databáze" +MAIN_NAVI_DOCUMENTS = "Dokumenty" +MAIN_BROWSE_DOCUMENTS = "Zobrazit v dokumentech" +MAIN_USERS_LIST = "Seznam uživatelů" +MAIN_USER_ADD = "Přidat nového uživatele" +MAIN_SEARCH_USERS = "Hledání uživatelů přes:" +MAIN_USER_PARAMS = "Jméno, ID, E-mail, e-mailovou doménu" +MAIN_USER_STATUS = "Se statusem:" +MAIN_USER_STATUS_ALL = "Jakýkoli status" +MAIN_USER_STATUS_ACTIVE = "Aktivní" +MAIN_USER_STATUS_INACTIVE = "Očekává aktivaci" +MAIN_USER_GROUP = "Je ve skupině:" +MAIN_USER_ONLINE = "Vítejte," +MAIN_USER_PERM = "Status:" +MAIN_ALL_USER_GROUP = "Jakýkoli" +MAIN_BUTTON_SEARCH_USER = "Najít uživatele s parametry" +MAIN_NO_PERMISSION = "Je nám líto, ale k tomuto nemáte oprávnění" +MAIN_LOGOUT_CONFIRM = "Opravdu chcete skončit?" + +MAIN_START_DOC_TITLE = "Poslední dokumenty" +MAIN_START_DOC_ID = "ID" +MAIN_START_DOC_NAME = "Název" +MAIN_START_DOC_RUBRIC = "Rubrika" +MAIN_START_DOC_DATE = "Publikováno" +MAIN_START_DOC_AUTOR = "Autor" + +MAIN_START_SEARCH = "Vyhledávání:" +MAIN_START_SEARCH_T = "Hledat dokument" + +MAIN_START_LOGS_LOG = "Historie operací" +MAIN_START_LOGS_404 = "Chyby 404" +MAIN_START_LOGS_SQL = "Chyby MySQL" + +MAIN_TABLE_SUCC = "Počet úspěšně nahraných tabulek: " +MAIN_TABLE_ERROR = "Počet tabulek s chybami: " +MAIN_SQL_FILE_ERROR = "SQL soubor má nesprávný formát nebo obsahuje chyby ve struktuře požadavků." +MAIN_RESTORE_OK = "Databáze úspěšně obnovena" + +MAIN_NO_PERM_MODULES = "Je nám líto, ale nemáte sdostatečná práva řídit tento modul" +MAIN_MP_FILE_DELETE = "Odstranit soubor" +MAIN_MP_DELETE_CONFIRM = "Opravdu chcete odstranit soubor: " +MAIN_MP_DOC_FOLDER = "Seznam složek / souborů" +MAIN_MP_FILE_SIZE = "Velikost souboru" +MAIN_MP_FILE_DATE = "Datum vytvoření" +MAIN_MP_ACTIONS = "Akce" +MAIN_MP_FILE_INFO = "Chcete-li přidat soubor, klepněte na jeho název a poté na tlačítko vložit soubor" +MAIN_MP_UP_LEVEL = "Jít o úroveň výše" +MAIN_MP_CREATE_FOLDER = "Vytvořit složku" +MAIN_MP_UPLOAD_FILE = "Stáhnout soubor" +MAIN_MP_FILE_INSERT = "Vložit soubor" +MAIN_MP_DIR_INSERT = "Vybrat složku" +MAIN_MP_SELECT_FILES = "Vybrat soubory ke stažení" +MAIN_MP_IMAGE_RESIZE = "Změnit velikost nahraných obrázků" +MAIN_MP_IMAGE_WIDTH = "Šířka" +MAIN_MP_IMAGE_HEIGHT = "Výška" +MAIN_BUTTON_UPLOAD = "Stáhnout" +MAIN_BUTTON_WAIT = "Čekejte prosím" +MAIN_MP_PLEASE_SELECT = "Vyberte prosím soubor" +MAIN_ADD_IN = "Vyberte rubriku:" +MAIN_GROUP_DELETE_CONFIRM = "Opravdu chcete odstranit tuto skupinu?" +MAIN_RUBRIKS_LIST = "Seznam rubrik" +MAIN_USER = "Uživatel:" +ButtonSave = "Uložit" +MAIN_NEW_PAGE = "Přidat novou stránku" +MAIN_BUTTON_SORT = "Odebrat" +MAIN_QUICK_MODULE = "Správce modulů" +MAIN_STAT = "Statistika" +MAIN_STAT_SYSTEM_INFO = "Systémové informace" +MAIN_STAT_DOCUMENTS = "Všechny dokumenty:" +MAIN_STAT_RUBRICS = "Všechny rubriky:" +MAIN_STAT_QUERIES = "Všechny požadavky:" +MAIN_STAT_TEMPLATES = "Všechny šablony:" +MAIN_STAT_MYSQL = "Velikost databáze:" +MAIN_STAT_CACHE = "Celková velikost mezipaměti:" +MAIN_STAT_CACHE_SHOW = "Ukázat" +MAIN_STAT_MODULES = "Nainstalováno modulů:" +MAIN_STAT_MODULES_OFF = "Vypnuté moduly:" +MAIN_STAT_USERS = "Všechny uživetelé:" +MAIN_STAT_USERS_WAIT = "Očekávající aktivaci:" +MAIN_STAT_AVE = "AVE.cms" +MAIN_STAT_DOMEN = "Doména" +MAIN_STAT_PHP = "PHP Verze:" +MAIN_STAT_MYSQL_VERSION = "MySQL Verze:" +MAIN_STAT_CLEAR_CACHE = "Smazat mezipaměť" +MAIN_STAT_CLEAR_CACHE_FULL= "Vymazat mezipaměť a relaci" +MAIN_STAT_CLEAR_THUMB = "Smazat miniatury" +MAIN_STAT_CLEAR_REV = "Smazat revize" +MAIN_STAT_CLEAR_COUNT = "Vynulovat počítadlo" +MAIN_ADD_FOLDER = "Zadejte prosím jméno nové složky:" +MAIN_NO_ADD_FOLDER = "Chybí název složky nebo akce byla zrušena!" +MAIN_NO_ADD_TEMPL = "Chybí název šablony nebo akce byla zrušena!" +MAIN_NO_ADD_GROUP = "Chybí název skupiny nebo akce byla zrušena!" +MAIN_NO_ADD_RUB = "Chybí název rubriky nebo akce byla zrušena!" +MAIN_NO_ADD_QUERY = "Chybí název požadavku nebo akce byla zrušena!" +MAIN_NO_ADD_NAV = "Chybí název navigace nebo akce byla zrušena!" +MAIN_NO_ADD_BLOCK = "Chybí název systémového bloku nebo akce byla zrušena!" +MAIN_NO_ADD_USER = "Chybí jméno uživatele nebo akce byla zrušena!" +MAIN_NO_ADD_DOCS = "Chybí název dokumentu nebo akce byla zrušena!" +MAIN_CLEAR_CACHE_OK = "Mezipaměť smazána" +MAIN_FILE_MANAGER_TITLE = "Správce souborů" +MAIN_FILE_MANAGER_TIP = "Vyberte požadovaný soubor a klikněte na "vložit soubor"" + +MAIN_SVN_NEW = "Vyšla nová verze" +MAIN_SVN_SAIT = "Přejít na stránky" +MAIN_SVN_REPOS = "Přejít na stránky úložiště" +MAIN_SVN_MAILTO = "Napsat zprávu" +MAIN_SVN_LOOK = "Zobrazit revizi na stránce úložiště" +MAIN_SVN_RECOM = "Doporučeno aktualizovat!" + +MAIN_FINDER = "Správce souborů" + +MAIN_ADD_NEW_GROUP = "Přidat novou skupinu" +MAIN_ADD_NEW_GROUP_NAME = "Název skupiny:" + +MAIN_ADD_NEW_USER = "Přidat nového uživatele" +MAIN_ADD_NEW_USER_NAME = "Jméno uživatele:" + +MAIN_ADD_NEW_NAV = "Додати нову навігацію" +MAIN_ADD_NEW_NAV_NAME = "Název navigace:" + +MAIN_ADD_NEW_TEMPL = "Přidat novou šablonu" +MAIN_ADD_NEW_TEMPL_NAME = "Název šablony:" + +MAIN_ADD_NEW_REQUEST = "Přidat nový požadavek" +MAIN_ADD_NEW_REQUEST_NAME = "Název požadavku:" + +MAIN_ADD_NEW_RUB = "Přidat novou rubriku" +MAIN_ADD_NEW_RUB_NAME = "Název rubriky:" + +MAIN_ADD_NEW_BLOCK = "Přidat nový systémový blok" +MAIN_ADD_NEW_BLOCK_NAME = "Název systémového bloku:" + +MAIN_USERS_LAST_TIME = "V poslední době byl:" + +MAIN_LOGS_ID = "№" +MAIN_LOGS_IP = "IP-adresa" +MAIN_LOGS_DATE = "Datum" +MAIN_LOGS_USER = "Uživatel" +MAIN_LOGS_ACTION = "Akce" + +MAIN_DOC_SHOW3_TITLE = "Dokument Bez Názvu" +MAIN_DOC_EDIT_TITLE = "Upravit tento dokument" +MAIN_DOC_SHOW_TITLE = "Zobrazit dokument (bez CNC linků)" +MAIN_DOC_SHOW2_TITLE = "Zobrazit dokument (s CNC linky)" + +MAIN_ADD_DOC = "Dokument" +MAIN_ADD_RUB = "Rubriky" +MAIN_ADD_REQ = "Požadavek" +MAIN_ADD_SYS = "Systémový blok" +MAIN_ADD_TEM = "Šablona" +MAIN_ADD_NAV = "Navigaci" +MAIN_ADD_USR = "Uživatele" +MAIN_ADD_GRP = "Skupiny" + +MAIN_BRANCHES = "Sekce" +MAIN_SHOWHIDE = "Ukázat/schovat menu" + +MAIN_CODEMIRROR_HELP = "Ctrl-F/Cmd-F (Hledat) | Ctrl-G/Cmd-G (Pokračovat ve hledání) | Shift-Ctrl-G/Shift-Cmd-G (Najít předešlé) | Shift-Ctrl-F/Cmd-Option-F (Nahradit) | Shift-Ctrl-R / Shift-Cmd-Option-F (Nahradit vše) | F11 (Celá obrazovka)" + +TEMPLATES_MESSAGE = "Zpráva:" +TEMPLATES_CACHE_SUCCESS = "Mezipaměť úspěšně smazána." +TEMPLATES_CACHE_SUCCESS_LOG = "Mezipaměť smazána." +TEMPLATES_CACHE_DB_SUCCESS = "Tabulka _sessions úspěšně smazány." +TEMPLATES_CACHE_DB_SUCCESS_LOG = "Tabulka smazána _sessions." +TEMPLATES_CACHE_CT_SUCCESS = "Odstraněné zkompilované šablony." +TEMPLATES_CACHE_CT_SUCCESS_LOG = "Zkompilované šablony odstraněny." +TEMPLATES_CACHE_MC_SUCCESS = "Odstraněné zkompilované šablony modulů." +TEMPLATES_CACHE_MC_SUCCESS_LOG = "Zkompilované šablony modulů odstraněny." +TEMPLATES_CACHE_SU_SUCCESS= "Uživatelské relace odstraněny." +TEMPLATES_CACHE_SU_SUCCESS_LOG = "Uživatelské relace odstraněny." +TEMPLATES_CACHE_SC_SUCCESS = "Odstraněné mezipaměti SQL požadavků." +TEMPLATES_CACHE_SC_SUCCESS_LOG = "Mezipaměti SQL požadavků odstraněny." +TEMPLATES_THUMBNAILS_SUCCESS = "Miniatury úspěšně odstraněny." +TEMPLATES_THUMBNAILS_SUCCESS_LOG = "Miniatury odstraněny" + +EXIT_ADMIN = "Konec akce v Ovládacích panelech" +LOGIN_ADMIN = "Počátek akce v Ovládacích panelech" +ERROR_ADMIN = "Chyba při vstupu k Ovládacím panelům" + +WRONG_PASS = "Chyba:
Špatné jméno nebo heslo!" +WRONG_CAPTCHA = "Chyba:
Špatný bezpečnostní kód" + +oficial_site = "Oficiální stránky" +support = "Technická podpora" \ No newline at end of file diff --git a/admin/lang/cz/modules.txt b/admin/lang/cz/modules.txt new file mode 100644 index 0000000..3db2260 --- /dev/null +++ b/admin/lang/cz/modules.txt @@ -0,0 +1,38 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[modules] +MODULES_SUB_TITLE = "Správce modulů" +MODULES_TIP = "Zde je seznam všech dostupných modulů v systému. Můžete zde nastavit, vypnout či aktualizovat jakýkoli modul a udělat dodatečné personální změny pro kterýkoli z modulů." +MODULES_NAME = "Název modulu" +MODULES_INFO = "Informace" +MODULES_TEMPLATE = "Šablony výstupu" +MODULES_SYSTEM_TAG = "Tag systém" +MODULES_VERSION = "Verze" +MODULES_ACTIONS = "Akce" +MODULES_SETTINGS = "Parametry" +MODULES_SETTINGS_INFO = "Informace" +MODULES_DELETE = "Odstranit modul" +MODULES_DELETE_CONFIRM = "Nezapomeňte, že odstraněním modulu ze systému jej smažete pouze na programové úrovni. V budoucnu jej vždy můžete znovu nainstalovat.
Opravdu chcete odstranit tento modul?" +MODULES_INSTALL = "Nastavit modul" +MODULES_REMOVE = "Odstranit modul ze serveru" +MODULES_REINSTALL = "Resetovat modul" +MODULES_REINSTALL_CONF = "Opravdu chcete resetovat tento modul?" +MODULES_UPDATE = "Aktualizovat modul" +MODULES_STOP = "Vypnout modul" +MODULES_START = "Zapnout modul" +MODULES_BUTTON_SAVE = "Uložit změny" +MODULES_LEGEND = "Hodnota ikon" +MODULES_AUTHOR = "Autor modulu" +MODULES_ERROR = "Vyskytla se chyba při načítání modulu: " +MODULES_INSTALLED = "Instalovené moduly:" +MODULES_NOT_INSTALLED = "Neinstalované moduly:" +MODULES_SETUP = "Přejít do nastavení modulu" +MODULES_NO_INSTALL = "Zpráva:
Žádné nainstalované moduly." +MODULES_NOT_INSTALL = "Zpráva:
Žádné moduly k instalaci." +MODULES_ACTION_INSTALL = "Modul instalován" +MODULES_ACTION_ONLINE = "Modul zapnut" +MODULES_ACTION_OFFLINE = "Modul vypnut" +MODULES_ACTION_REINSTALL = "Modul přeinstalován" +MODULES_ACTION_UPDATE = "Modul aktualizován" +MODULES_ACTION_DELETE = "Modul odstraněn ze systému" +MODULES_ACTION_REMOVE = "Modul odstraněn ze serveru" \ No newline at end of file diff --git a/admin/lang/cz/navigation.txt b/admin/lang/cz/navigation.txt new file mode 100644 index 0000000..d5e3826 --- /dev/null +++ b/admin/lang/cz/navigation.txt @@ -0,0 +1,96 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[navi] +NAVI_ID = "ID" +NAVI_SUB_TITLE = "Ovládání menu navigace" +NAVI_SUB_TITLE2 = "Ovládací menu" +NAVI_SUB_TITLE3 = "Editace šablon menu" +NAVI_SUB_TITLE4 = "Vytvoření nové šablony menu" +NAVI_TIP_TEMPLATE = "Zde je seznam všech navigačních menu v systému. Můžete tu změnit šablonu výstupu jakéhokoli z dostupných menu a také přidat, či odebrat položky menu." +NAVI_TIP_TEMPLATE2 = "V této části můžete, za pomocí kodování HTML, vytvořit šablonu návrhu pro navigaci v menu. Můžete také vybrat skupinu uživatelů, kterým bude toto navigační menu k dispozici. Pro výběr několika skupin držte CTRL." +NAVI_ITEMS_TIP = "Vytvořit novou položku menu" +NAVI_NEW_MENU = "Vytvořit nové menu" +NAVI_LIST_TIP = "Seznam níže obsahuje všechny položky vztahující se k tomuto menu. Nezapomeňte, že maximální úroveň vložení nemůže být více jak dva." +NAVI_LIST = "Seznam položek menu" +NAVI_EDIT_TEMPLATE = "Editace šablon menu" +NAVI_EDIT_ITEMS = "Editace položek menu" +NAVI_OPEN_IN_THIS = "V aktuálním okně" +NAVI_OPEN_IN_NEW = "V novém okně" +NAVI_TARGET_WINDOW = "Otevřít" +NAVI_POSITION = "Pozice" +NAVI_LINK_TO_DOCUMENT = "Odkaz na dokument/soubor" +NAVI_ENTRIES_NO_ITEMS = "Zpráva:
V současné době zde nejsou žádné položky menu." + +NAVI_LINK_TITLE = "Název položky menu" +NAVI_LINK_SOLUT = "Popis položky menu:" +NAVI_LINK_IMGID = "ID obrázku:" +NAVI_LINK_IMGTL = "Vybrat obrázek:" +NAVI_LINK_IMAGE = "Zobrazení pro položku menu" +NAVI_TITLE = "Název navigačního menu:" +NAVI_TITLE2 = "Zadejte název navigačního menu:" +NAVI_BROWSE_DOCUMENTS = "Propojit s existujícím dokumentem" +NAVI_ADD_SUBITEM = "Vybrat novou položku" +NAVI_BUTTON_CHANGE = "Vybrat" +NAVI_BUTTON_OPTION = "Nastavení" +NAVI_BUTTON_SUBITEM = "+" +NAVI_BROWSE_MEDIAPOOL = "Propojit se souborem na serveru" +NAVI_SYSTEM_TAG = "Tag systém" +NAVI_NAME = "Název menu" +NAVI_LINK_TARGET = "Tag, který určuje typ otevření dokumentu (v novém, či aktuálním okně)" +NAVI_LINK_URL = "Tag, který určuje adresu přechodu" +NAVI_LINK_NAME = "Tag, který určuje název odkazu, který bude zobrazen v menu" +NAVI_LINK_ID = "Tag, který definuje unikátní identifikátor odkazu" +NAVI_LINK_INACTIVE = "Registrace neaktivního odkazu:" +NAVI_LINK_ACTIVE = "Registrace aktivního odkazu:" +NAVI_HEADER_START = "Horní část designu:" +NAVI_FOOTER_END = "Dolní část designu:" +NAVI_HEADER_TIP = "Například, nadpis
" Katalog zboží"
(volitelné)" +NAVI_COPY_TEMPLATE = "Kopírovat šablonu menu" +NAVI_FOOTER_TIP = "Spodní část designu menu
(volitelné)" +NAVI_DELETE = "Odstranit menu" +NAVI_DELETE_CONFIRM = "Opravdu chcete smazat toto navigační menu?" +NAVI_HTML_START = "Primární HTML kód:" +NAVI_HTML_END = "Konečný HTML kód:" +NAVI_LEVEL1 = " Šablona designu pro hlavní (první) položku menu." +NAVI_LEVEL2 = "Šablona designu pro první úroveň dílčích položek" +NAVI_LEVEL3 = "Šablona designu pro druhou úroveň dílčích položek" +NAVI_MARK_DELETE = "Označit tuto položku k odstranění" +NAVI_MARK_ACTIVE = " Aby bylo možné dočasně deaktivovat tuto položku menu, zrušte výběr a stiskněte "Uložit změny"" +NAVI_GROUPS = "Skupiny uživatelů, kterým bude menu dostupné:" +NAVI_ACTIONS = "Akce" +NAVI_OR_BUTTON = " nebo " +NAVI_BUTTON_SAVE = "Uložit změny" +NAVI_BUTTON_SAVE_NEXT = "Použít (CTRL+S)" +NAVI_BUTTON_ADD = "Přidat položku" +NAVI_BUTTON_ADD_MENU = "Vytvořit menu" +NAVI_LEGEND = "Hodnota ikon" +NAVI_ENTER_NAME = "Zadejte název navigačního menu." +NAVI_ALL = "Seznam navigačních menu" +NAVI_PRINT_TYPE = "Typ výstupu" +NAVI_EXPAND_ALL = "Plně (otevřít všechny úrovně)" +NAVI_EXPAND_WAY = "Současnou a rodičovskou úroveň" +NAVI_EXPAND_LEVEL = "Pouze současnou úroveň" +NAVI_MENU_NOT_FOUND = "Žádné menu ID=" +NAVI_SAVE = "Šablona navigačního menu úspěšně uložena" +NAVI_SORTED = "Postup úspěšně uložen" + +NAVI_REPORT_NEW = "Navigační menu vytvořeno" +NAVI_REPORT_COPY = "Záloha navigačního menu vytvořena" +NAVI_REPORT_EDIT = "Šablona navigačního menu změněna" +NAVI_REPORT_DEL = "Navigační menu smazáno" +NAVI_REPORT_ADDIT = "Přidat položku navigačního menu" +NAVI_REPORT_DELIT = "Odstranit položku navigačního menu" +NAVI_REPORT_FLEV = "Na první úroveň" +NAVI_REPORT_SLEV = "Na druhou úroveň" +NAVI_REPORT_TLEV = "Na třetí úroveň" +NAVI_REPORT_DEACT = "Položka navigačního menu deaktivována" +NAVI_REPORT_ACT = "Položka navigačního menu aktivována" +NAVI_REPORT_SAVED = "Šablona navigace úspěšně uložena." +NAVI_REPORT_SAVED_ERR = "Nezdařilo se uložit šablonu navigace..
Zkuste ještě jednou." +NAVI_REPORT_ERROR = "Chyba" +NAVI_REPORT_SUCCESS = "Hotovo" + +NAVI_ITEM_ON_OFF = "Zap/Vyp položku menu" +NAVI_ITEM_EDIT = "Editovat položku menu" +NAVI_ITEM_DELETE = "Odstranit tuto položku menu" +NAVI_ITEM_DELETE_CONFIRM = "Opravdu chcete odstranit tuto položku navigačního menu?" \ No newline at end of file diff --git a/admin/lang/cz/request.txt b/admin/lang/cz/request.txt new file mode 100644 index 0000000..ab38283 --- /dev/null +++ b/admin/lang/cz/request.txt @@ -0,0 +1,177 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[request] +REQUEST_ID = "ID" +REQUEST_DELETE = "Odstranit požadavek" +REQUEST_DELETE_CONFIRM = "Opravdu chcete odstranit tento požadavek??" +REQUEST_TITLE = "Správce požadavků" +REQUEST_NAME = "Název požadavků" +REQUEST_NAME2 = "Název požadavku:" +REQUEST_NAME3 = "Zadejte název požadavku:" +REQUEST_CACHE = "Uložit do mezipaměti:" +REQUEST_CACHE_ELEMENTS = "Uložit do mezipaměti prvky požadavku" +REQUEST_SETTINGS = "Parametry požadavku" +REQUEST_TIP = "Zde najdete seznam všech požadavků v systému. Pro využití požadavků umístěte "Systémový tag" na potřebném místě Vaší šablony, nebo dokumentu." +REQUEST_EDIT_TIP = "Zde můžete editovat požadavek, měníc rubriku pro získávání údajů, šablony výstupu a také podmínky volby dat." +REQUEST_NEW = "Vytvoření nového požadavku" +REQUEST_EDIT = "Editovat požadavek" +REQUEST_EDIT2 = "Editování požadavku" +REQUEST_SYSTEM_TAG = "Systémový tag" +REQUEST_AUTHOR = "Autor" +REQUEST_DATE_CREATE = "Datum vytvoření" +REQUEST_ACTIONS = "Akce" +REQUEST_NO_DESCRIPTION = "Požadavek bez popisu" +REQUEST_NO_REQUST = "Chybějící požadavek." +REQUEST_DATE_FORMAT = "%d.%m.%y g." +REQUEST_DATE_FORMAT2 = "%d.%m.%y g. v %H:%M" +REQUEST_IN = "v" +REQUEST_COPY = "Kopírovat požadavek" +REQUEST_COPY_FAILED = "Nezdařilo se kopírování požadavku" +REQUEST_PLEASE_NAME = "Zadejte prosím název zkopírovaného požadavku" +REQUEST_CONDITION_EDIT = "Podmínky pro požadavky" +REQUEST_CONDITION_IF = "Podmínky" +REQUEST_PLEASE_SELECT = "Vyberte, prosím, rubriku" +REQUEST_SELECT_RUBRIK = "Vyberte rubriku:" +REQUEST_SELECT_INFO = "Opravdu chcete změnit rubriku?" +REQUEST_NEW_TIP = "Pozor! Před tím, než vytvoříte nový požadavek, musíte vybrat rubriku, ze které budou čerpat dokumenty." +REQUEST_DESCRIPTION = "Popis požadavku:" +REQUEST_INTERNAL_INFO = "(použitý v rámci systému)" +REQUEST_BUTTON_COND = "Přidat / změnit" +REQUEST_CONDITION = "Podmínky požadavku:" +REQUEST_ACTION_AFTER = "Po vytvoření se vrátit k úpravě požadavků, pro dodání podmínek požadavku." +REQUEST_SORT_BY = "Třídit podle vlastností dokumentu:" +REQUEST_SORT_BY_NAT = "Třídit dle oblasti dokumentu:" +REQUEST_ASC_DESC = "V pořadí:" +REQUEST_DESC = "pokles" +REQUEST_ASC = "růst" +REQUEST_BY_DATE = "Datum vytvoření (publikace)" +REQUEST_BY_DATECHANGE = "Datum změny (dokumentu)" +REQUEST_BY_NAME = "Nadpis dokumentů" +REQUEST_BY_EDIT = "Název autora" +REQUEST_BY_PRINTED = "Počet výtisků" +REQUEST_BY_VIEWS = "Počet shlédnutí" +REQUEST_BY_RAND = "V náhodném pořadí (Vysoké zatížení)" +REQUEST_DOC_PER_PAGE = "Počet na stránce:" +REQUEST_DOC_PER_PAGE_ALL = "vyvést vše" +REQUEST_SHOW_NAVI = "Zobrazovat navigaci:" +REQUEST_USE_LANG = "Pouze jazyk uživatele:" +REQUEST_USE_QUERY = "Používat GET požadavky pro stránkovou navigaci" +REQUEST_TEMPLATE_QUERY = "Základní požadavek na design šablony" +REQUEST_MAIN_CONTENT = "Systémový tag, odpovídající za vývod prvků požadavků, uvedené v poli "prvky požadavků"" +REQUEST_DOC_COUNT = "Systémový tag, odpovídající za vývod počtu prvků požadavku" +REQUEST_DOCITEMNUM_INFO= "Systémový tag, odpovídající za vývod pořadového čísla prvku požadavku" +REQUEST_MAIN_NAVI = "Systémový tag, odpovídající za vývod stránková navigace pro požadavky (< 1 2 3 >)" +REQUEST_MEDIAPATH = "Systémový tag, který definuje cestu ke složce se šablonou (například: [tag:mediapath]images/logo.gif)" +REQUEST_PATH = "Systém tag, který definuje kořenový adresář instalace" +REQUEST_TEMPLATE_ITEMS = "Šablona designu pro pvy požadavku" +REQUEST_TEMPLATE_INFO = "Toto pole využívající HTML kód, můžete využít pro design vnitřních prvků požadavku.(např., design seznamu novin). Všechny prvky jsou navrženy podle tohoto vzoru se cyklicky zobrazí v "Základní šabloně" požadavku, dokud bude počet kusů odpovídat podmínkám požadavku." +REQUEST_TEMPLATE_SAVED = "Požadavek úspěšně uložen" +REQUEST_SELECT_IN_LIST = "Vyberte prosím pole rubriky ze seznamu níže" +REQUEST_RUB_INFO = "Systémový tag zodpovědný za výstup obsahu sloupce. ID-číslo sloupce. ХХХ-počet symbolů pro zobrazení." +REQUEST_LINK_INFO = "Systémový tag, který definuje odkaz na dokument například, < a href="[tag:link]">odkaz < /a >" +REQUEST_RUBRIK_FIELD = "Systémový tag pole" +REQUEST_THUMBNAIL = "Tag odpovídá za vytvoření miniatury (Za předpokladu, že v kategorii pole šablony (šablony pro výstup dotazu) byl zvolen výstup: [tag:parametr:0])" +REQUEST_FIELD_NAME = "Název sloupce" +REQUEST_FIELD_TYPE = "Typ pole" +REQUEST_FIELD_G_UNKNOW = "Bez skupiny" + +REQUEST_BUTTON_ADD = "Vytvořit požadavek" +REQUEST_BUTTON_ADD_NEXT = "Vytvořit a pokračovat" +REQUEST_BUTTON_SAVE = "Uložit změny" +REQUEST_BUTTON_SAVE_NEXT = "Použít (CTRL+S)" +REQUEST_BUTTON_CLOSE = "Zavřít okno" + +REQUEST_INSERT_INFO = "Stlačte systémový tag, k jeho přidání do šablony" +REQUEST_CONDITIONS = "Správa dotazu" +REQUEST_CONDITION_TIP = "Zde si můžete vytvořit speciální podmínky dat požadavku. Podmínky požadavku umožňují nejpřesněji určit výstupní data podle různých parametrů." +REQUEST_NEW_CONDITION = "Přidat novou podmínku" +REQUEST_FROM_FILED = "Vybrat z pole" +REQUEST_OPERATOR = "Tam, kde hodnota" +REQUEST_VALUE = "Hodnota" +REQUEST_COND_SELF = "Rovná se" +REQUEST_COND_NOSELF = "Nerovná se" +REQUEST_COND_USE = "Obsahuje" +REQUEST_COND_NOTUSE = "Neobsahuje" +REQUEST_COND_START = "Začíná z" +REQUEST_SMALL1 = "Menší nebo rovno" +REQUEST_BIG1 = "Větší nebo rovno" +REQUEST_SMALL2 = "Méně" +REQUEST_BIG2 = "Více" +REQUEST_N_COND_SELF = "Rovná se" +REQUEST_N_SMALL1 = "Menší nebo rovno" +REQUEST_N_BIG1 = "Větší nebo rovno" +REQUEST_N_SMALL2 = "Číslo menší" +REQUEST_N_BIG2 = "Číslo větší" +REQUEST_SEGMENT = "Nepatří intervalu (přes ,)" +REQUEST_INTERVAL = "Patří intrvalu (přes ,)" +REQUEST_IN = "v seznamu (přes ,)" +REQUEST_NOTIN = "Není v seznamu(přes ,)" +REQUEST_ANY_NUM = "NEBEZPEČÍ!!! Číslo v požadavku" +REQUEST_FREE = "NEBEZPEČÍ!!! Libovolná podmínka [field]={value}" +REQUEST_MARK_DELETE = " Označit podmínku pro odstranění" +REQUEST_CONR_AND = "A" +REQUEST_CONR_OR = "Nebo" +REQUEST_OR = " nebo " + +REQUEST_VIEWS_INFO = "Systémový tag, který ukazuje počet zhlédnutí dokumentu"REQUEST_COMMENTS_INFO = "Systémový tag, ukazující počet připomínek k dokumentu. Varování! Funguje pouze při nainstalovaném modulu!" +REQUEST_CONTROL_FIELD = "Systémový tag, odpovídající za vývod požadavku Ovládacího panelu. Pouze pro rubriky s poli typu rozevíracího seznamu." +REQUEST_CONTROL_SORT = "Systémový tag, odpovídající vývodu panelu pro třídění podle data vydání, název a četnost přehledů výstupních vývodů požadavku" +REQUEST_NO_DROPDOWN = "Ve vybrané rubrice nejsou žádná typové pole rozevíracího seznamu" +REQUEST_ENTER_NAME = "Zadejte prosím název požadavku." +REQUEST_ALL = "Seznam požadavků" +REQUEST_IF_EMPTY = "Párový systémový tag, ve kterém můžete určit výstupní vzor v nepřítomnosti výsledků požadavku." +REQUEST_NOT_EMPTY = "Párový systémový tag, ve kterém můžete určit výstupní vzor za přítomnosti výsledků požadavku." +REQUEST_DOCID_INFO = "Systémový tag, odpovídající ID dokumentu" +REQUEST_DOCTITLE_INFO = "Systémový tag, odpovídající názvu dokumentu" +REQUEST_CDOCID_INFO = "Systémový tag, odpovídající ID aktuálního dokumentu (ve kterém je požadavek na výstup)" +REQUEST_DOCDATE_INFO = "Systémový tag, odpovídající datu publikace dokumentu" +REQUEST_CDOCDATE_INFO = "Systémový tag, odpovídající datu publikace aktuálního dokumentu (ve kterém je požadavek na výstup)" +REQUEST_DOCTIME_INFO = "Systémový tag, odpovídající datu a času publikace dokumkentu" +REQUEST_CDOCTIME_INFO = "Systémový tag, odpovídající datu a času publikace aktuálního dokumentu (ve kterém je požadavek na výstup)" +REQUEST_DATE_INFO = "Systémový tag, datu a času publikace dokumentu - přizpůsobitelný vzhled.
Příklad: [tag:date:d.m.Y]
Můžete použít rozvody (space - . /)" +REQUEST_CDATE_INFO = "Systémový tag, datu a času publikace dokumentu - přizpůsobitelný vzhled.
Příklad: [tag:date:d.m.Y]
ve kterém je požadavek na výstup)
Můžete použít rozvody (space - . /)" +REQUEST_DOCAUTHOR_INFO = "Systémový tag, odpovídající autoru dokumentu" +REQUEST_DOCAUTHOR_AVATAR = "Systémový tag, odpovídající аватару автора документа" +REQUEST_CDOCAUTHOR_INFO = "Systémový tag, odpovídající autoru aktuálního dokumentu(ve kterém je požadavek na výstup)" +REQUEST_SAMPLE = "Příklad" +REQUEST_HIDE_CURRENT = "Neukazovat v aktuálním dokumentu požadavku" +REQUEST_ONLY_OWNER = "Pouze své (UserID) dokumenty" +REQUEST_CONDITION_JOIN = "Operátor" +REQUEST_CONDITION_SAVE = "Uložit podmínku" +REQUEST_CONDITION_ADD = "Přidat podmínku" + +REQUEST_SUCCESS = "Hotovo" +REQUEST_ERROR = "Chyba" +REQUEST_CANCEL = "Zrušit" + +REQUEST_SORTED = "Postup úspěšně uložen" +REQUEST_COND_MESSAGE = "Žádné podmínky požadavku" +REQUEST_COND_VALUE_ERR = "Prázdné pole hodnoty" +REQUEST_COND_NEW_ERR = "Nepodařilo se přidat novou podmínku
Zkuste znovu" +REQUEST_COND_NEW_SUC = "Požadavek úspěšně přidán" +REQUEST_COND_POST_OK = "Požadavky úspěšně uloženy" +REQUEST_COND_POST_ERR = "Nepodařilo se uložit podmínky požadavku
Zkuste znovu" +REQUEST_COND_NO_POST = "Žádná data k uložení
Zkuste znovu" + +REQUEST_COND_ADD_SUC = "Přidat podmínky požadavku" +REQUEST_COND_CHA_SUC = "Podmínky požadavku změněny" +REQUEST_COND_DEL_SUC = "Podmínky požadavku odstraněny" +REQUEST_SAVE_CHA_SUC = "Požadavek upraven" +REQUEST_ADD_NEW_SUC = "Přidat nový požadavek" +REQUEST_DELETE_SUC = "Požadavek odstraněn" +REQUEST_COPY_SUC = "Kopie požadavku vytvořena" + +REQUEST_HEADER_SELF = "Hlavní požadavky parametru" +REQUEST_HEADER_NAME = "Hodnota" +REQUEST_HEADER_PARAMETR = "Parametr" + +REQUEST_REPORT_ERR_TITLE = "Cyhbí název požadavku" +REQUEST_REPORT_ERR_TEXT = "Chybí základní šablona designu požadavku" +REQUEST_REPORT_ERR_PHP = "Je zakázáno využívat PHP kodu +REQUEST_REPORT_ERR_PHP_N = "Pokus využítí PHP kodu v šabloně požadavku při vytvoření požadavku" +REQUEST_REPORT_ERR_PHP_E += "Pokus použítí PHP kodu v šabloně požadavku" +REQUEST_REPORT_ERR_RUBRIC= "Není vybraná rubrika" +REQUEST_BY_PARENT = "Nadřazený dokument" +REQUEST_SHOW_STAT = "Zobrazit statistiky" + diff --git a/admin/lang/cz/rubs.txt b/admin/lang/cz/rubs.txt new file mode 100644 index 0000000..adb95b8 --- /dev/null +++ b/admin/lang/cz/rubs.txt @@ -0,0 +1,260 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[Rubs] +RUBRIK_SUB_TITLE = "Správce rubrik" +RUBRIK_TIP = "Zde je seznam všech rubrik v systému. Můžete zde upravit šablonu rubriky, oprávnění, odstranit rubriku, a také zkopírovat rubriku a na jejím základě vytvořit novou." +RUBRIK_ID = "ID" +RUBRIK_NAME = "Název rubriky" +RUBRIK_NAME2 = "Název rubriky" +RUBRIK_TEMPLATE_OUT = "Použít v šabloně" +RUBRIK_TEMPLATE_OUT2 = "Používat v šabloně" +RUBRIK_URL_PREFIX = "Prefix odkazu" +RUBRIK_URL_PREFIX2 = "Prefix odkazu" +RUBRIK_DOCS_VI = "Zobrazit dokument v seznamu" +RUBRIK_URL_PREFIX2 = "Prefix odkazu" +RUBRIK_COUNT_DOCS = "Počet dokumentů" +RUBRIK_COUNT_FIELDS = "Počet polí" +RUBRIK_AUTHOR = "Autor" +RUBRIK_ACTION = "akce" +RUBRIK_FORMAT= "Použít" +RUBRIK_FORMAT_TIME = "pro odkaz ve formátu času" +RUBRIK_FORMAT_ID = "pro vložení id dokumentu" +RUBRIK_EDIT = "Upravit pole a práva rubriky" +RUBRIK_EDIT_TMPLS = "Další šablony" +RUBRIK_NO_VIEW = "Je nám líto, ale nemáte oprávnění k zobrazení seznamu rubrik." +RUBRIK_NO_CHANGE1 = "Je nám líto, ale nemáte oprávnění k úpravě polí rubriky." +RUBRIK_NO_CHANGE2= "Je nám líto, ale nemáte oprávnění k úpravě šablonu této rubriky." +RUBRIK_NO_CHANGE3= "Je nám líto, ale nemáte oprávnění k vytvoření nových rubrik." +RUBRIK_EDIT_TEMPLATE = "Upravit šablonu rubriky" +RUBRIK_EDIT_CODE = "Upravit spustitelný kód rubrik" +RUBRIK_EDIT_CODE_T = "Upravit spustitelný kód rubrik" +RUBRIK_EDIT_CODE_NO = "Nemáte přístup k úpravě spustitelného kódi" +RUBRIK_DELETE = "Odstranit rubriku" +RUBRIK_DELETE_LEGEND = "Smazat rubriku" +RUBRIK_DELETE_CONFIRM = "Jste si jisti, že chcete smazat tuto rubriku?" +RUBRIK_NO_PERMISSION = "Je nám líto, ale nemáte oprávnění k odstranění rubriky." +RUBRIK_USE_DOCUMENTS = "Je nám líto, ale nemůžete odstranit tuto rubriku, protože obsahuje dokumenty." +RUBRIK_MULTIPLY = "Kopírovat rubriku" +RUBRIK_NO_MULTIPLY = "Je nám líto, ale nemáte oprávnění ke kopírování rubrik" +RUBRIK_BUTTON_SAVE = "Uložit změny" +RUBRIK_BUTTON_TEMPL = "Upravit šablonu" +RUBRIK_BUTTON_FIELDS = "Upravit pole" +RUBRIK_BUTTON_CODE = "Upravit kód rubriky" +RUBRIK_LEGEND = "Hodnota ikony" +RUBRIK_NEW = "Vytvořit novou rubriku" +RUBRIK_NEW_TIP= "Zde můžete vytvořit novou rubriku. Uveďte název nové rubriky a vyberte šablonu pro výstup." +RUBRIK_BUTTON_NEW = "Vytvořit rubriku" +RUBRIK_EDIT_FIELDS = "Správa polí a přístupová práva k rubrice" +RUBRIK_DESCRIPTION = "Popis rubriky" +RUBRIK_NO_FIELDS = " Důležité! Nevytvořili jstežádnou pole. Prosím, přidejte alespoň jedno pole." +RUBRIK_FIELDS_INFO = "Zde můžete vytvořit skupinu polí, které budou použity pro dokumenty v této kategorii." +RUBRIK_MULTIPLY2 = "Kopírování rubriky" +RUBRIK_MULTIPLY_TIP = "Uveďte prosím název a prefix pro odkaz na novou rubriku" +RUBRIK_BUTTON_COPY = "Kopírovat" +RUBRIK_TEMPLATE_EDIT = "Upravování šablony rubriky" +RUBRIK_TEMPLATE_NEW = "Vytvoření šablony rubriky" +RUBRIK_TEMPLATE_SAVED = "Šablona úspěšně uložena" +RUBRIK_NO_FIELD = "V této kategorii nejsou žádná pole" +RUBRIK_FIELD_NAME = "Název pole" +RUBRIK_FIELD_GROUP = "Skupina" +RUBRIK_FIELD_GROUP_SEL = "Vyberte skupinu" +RUBRIK_FIELD_ALIAS = "Alias ​​pole" +RUBRIK_FIELD_TYPE = "Typ pole" +RUBRIK_FIELD_UNKNOW = "Neznámý" +RUBRIK_FIELD_G_UNKNOW = "Žádná skupina" +RUBRIK_POSITION = "Pozice" +RUBRIK_NEW_FIELD = "Vytvoření nového pole pro rubriku" +RUBRIK_BUTTON_ADD = "Přidat pole" +RUBRIK_SET_PERMISSION = "Právo na přístup k dokumentům pro skupiny uživatelů" +RUBRIK_USER_GROUP = "Skupina" +RUBRIK_DOC_READ = "Zobrazit" +RUBRIK_ALL_PERMISSION = "Všechna práva" +RUBRIK_CREATE_DOC = "Vytvářet s kontrolou" +RUBRIK_CREATE_DOC_NOW = "Vytvořet bez kontroly" +RUBRIK_EDIT_OWN = "Editovat své" +RUBRIK_EDIT_DELREV = "Správa verzí" +RUBRIK_EDIT_OTHER = "Editovat vše" +RUBRIK_VIEW_TIP = "Zaškrtněte, pokud chcete povolit této skupině uživatelů prohlížení dokumentů" +RUBRIK_ALL_TIP = "Zaškrtněte, pokud chcete povolit této skupině uživatelů provádět jakékoliv akce s dokumenty v této rubrice." +RUBRIK_DOC_TIP= "Zaškrtněte, pokud chcete povolit této skupině uživatelů vytvářet dokumenty.
Pozor!
Před zveřejněním dokumentu, jej ověří Administrátor" +RUBRIK_DOC_NOW_TIP = "Zaškrtněte, pokud chcete povolit této skupině uživatelů vytvářet dokumenty.
Pozor!
Zveřejnění dokumentů bude provedeno bez kontroly Adminitrátora." +RUBRIK_OWN_TIP = "Zaškrtněte, pokud chcete povolit této skupině uživatelů upravovat pouze své dokumenty" +RUBRIK_OTHER_TIP = "Zaškrtněte, pokud chcete povolit této skupině uživatelů upravovat své i cizí dokumenty" +RUBRIK_DELREV_TIP = "Zaškrtněte, pokud chcete povolit této skupině uživatelů pracovat s revizemi dokumentů" +RUBRIK_BUTTON_PERM = "Uložit práva" +RUBRIK_FIELD_DEFAULT = "Výchozí hodnoty" +RUBRIK_TEMPLATE_TIP = "V této části pomocí jazyka HTML, musíte vytvořit design šablony pro dokumenty s úplnou revizi." +RUBRIK_HTML = "Šablona designu rubriky" +RUBRIK_HTML_2 = "Šablona designu HEADER" +RUBRIK_HTML_3 = "Šablona designu TEASER" +RUBRIK_HTML_4 = "Šablona designu ADMIN TEASER" +RUBRIK_PHP_DENIDED = " Chyba!
Nemáte povolení k úpravě šablony rubriky, protože používá PHP kód a Vy nemáte práva k užívání PHP kódu." +RUBRIK_PHP_MESSAGE = "Je zakázáno používat PHP kód." +RUBRIK_EMPTY_MESSAGE = "Nezadán název pole." +RUBRIK_INSERT_HELP = "Kliknutím přidate systémový tag do šablony" +RUBRIK_BUTTON_TPL = "Uložit šablonu" +RUBRIK_BUTTON_TPL_NEXT = "Použít (CTRL + S)" +RUBRIK_BUTTON_TPL_CLOSE = "Zavřít" +RUBRIK_NO_RUBRIK = "Rubrika neexistuje!" +RUBRIK_NO_NAME = "Zadejte název rubriky" +RUBRIK_NAME_EXIST = "Je nám líto, ale rubrika se stejným názvem již existuje. Zadejte jiný název kategorie." +RUBRIK_PREFIX_EXIST = "Je nám líto, ale rubrika s takovým URL prefixem již existuje. Zadejte jiný URL prefix rubriky." +RUBRIK_VIEWS_INFO = "Systemový tag, která zobrazuje počet zhlédnutí dokumentu" +RUBRIK_HIDE_INFO = "Systémový tag, který umožňuje skrýt text pro specifické skupiny uživatelů, kde X - číslo skupiny" +RUBRIK_THUMBNAIL = "Tag odpovědný za vytvoření miniatury (za předpokladu, že u šablony pole rubriky (šablona pro výstup dokumentů) je obrán výstup: [tag: parametr: 0])" +RUBRIK_LINK_HOME = "Odkaz na domovskou stránku webové stránky" +RUBRIK_MARK_DELETE = "Zaškrtněte tuto možnost pro odstranění" +RUBRIK_MARK_DEL_ALL = "Označit vše" +RUBRIK_CHECK_SEARCH = "Hledat v tomto poli"RUBRIK_CHECK_NUMERIC = "Číselné pole" +RUBRIK_SEARCH_TIP= "Zaškrtněte políčko, pokud chcete aby se takto provedlo hledání (práce s modulem" hledat "verze 2.0.2 a vyšší)" +RUBRIK_NUMERIC_TIP = "Zaškrtněte políčko pokud jsou hodnoty vždy číselné. Slouží k seřazení požadavků" +RUBRIK_ALL = "Seznam rubrik" +RUBRIK_EDIT_FIELDS_GROUPS = "Upravit skupinu pole" +RUBRIK_FIELDS_GROUPS = "Skupina polí" +RUBRIK_ENTER_NAME = "Zadejte název rubriky." +RUBRIK_TEMPLATE_HIDE= "Ukázat/ schovat šablony všech polí" +RUBRIK_FILED_TEMPLATE_H = "Upravit šablonu a popis polí" +RUBRIK_FILED_TEMPLATE_DESCR = "Popis pole" +RUBRIK_FILED_TEMPLATE_F = "Šablona pole" +RUBRIK_DOCID_INFO = "Systémový tag Identifikačního dokumentu" +RUBRIK_DOCDATE_INFO = "System tag, data vydání dokumentu" +RUBRIK_DOCTIME_INFO = "Systémový tag, datum a čas zveřejnění dokumentu" +RUBRIK_DATE_INFO = "Systémový tag, datum a čas zveřejnění dokumentu - přizpůsobitelný vzhledu
Příklad: [tag: Datum: Y]" +RUBRIK_DOCAUTHOR_INFO = "Systémový tag, autor dokumentu" +RUBRIK_TITLE_INFO = "Systémový tag, záhlaví dokumentu" +RUBRIK_PATH_INFO = "Systémový tag, cesta ke kořenové instalaci" +RUBRIK_MEDIAPATH_INFO = "Systémový tag, cesta ke složce designu" +RUBRIK_PREFIX_BAD_CHAR= "Neplatné znaky v prefixu" +RUBRIK_FIELDS_TITLE = "Pole rubriky" +RUBRIK_FIELDS_TPL = "Šablona výstupních polí v dokumentu" +RUBRIK_RUBRIK_TPL = "Šablona výstupních polí v požadavku" +RUBRIK_SORTED = "Nasatvení bylo úspěšně uloženo" +RUBRIK_F_SORT_TIP = "Chcete-li spravovat pole, stiskněte na křížek a, držíc ho, přetáhněte pole" +RUBRIK_R_SORT_TIP = "Chcete-li spravovat rubriky, stiskněte na křížek a, držíc ho, přetáhněte pole" +RUBRIK_META_GEN_TIP = "Automaticky generovat klíčová slova, popis pro dokument, na základě jeho obsahu" +RUBRIK_ALIAS_HISTORY_TIP = "Ukládat historii pseudonymů u dokumentů" +RUBRIK_MOVE = "Přemístit" +RUBRIK_REQUEST_TPL = "Výstupní šablona pole požadavku" +RUBRIK_BREADCRUMB = "Systémový tag drobečkové navigace" +RUBRIK_CODE = "spustitelný kód pro rubriky" +RUBRIK_START_CODE = "Kód, který se spouští před stažením dokumentu" +RUBRIK_CODE_START= "Kód se spouští před uložením dokumentu" +RUBRIK_CODE_END = "Kód, který se spouští po uložení dokumentu" +RUBRIK_TAGS = "tag" +RUBRIK_TAGS_ID = "tag ID" +RUBRIK_TAGS_ALIAS = "Tag Alias" +RUBRIK_HTML_T = "HTML kód šablony" +RUBRIK_TAG_DESC = "Popis tagu" +RUBRIK_NEW_FIEL_TITLE = "Pole pro rozevírací seznam a Univerzální seznamu , výchozí hodnoty se oddělují čárkami"RUBRIK_LINK = "Odkaz rubriky" +RUBRIK_LINK_DESC = "Zadáním odkazu mezi rubrikami, při přidání dokumentů, je možné automaticky dodat aliasy." +RUBRIK_NOLINK = "Nevybráno" +RUBRIK_OR = "Název skupiny" +RUBRIC_F_GROUP_DELETE = "Odstranit skupinu" +RUBRIC_F_GROUP_DELETE_H = "Opravdu chcete smazat skupinu?" +RUBRIC_NO_GROUPS = "V současné době v této rubrice nejsou žádné skupiny polí" +RUBRIC_GROUP_ADD = "Přidat skupinu" +RUBRIK_NEW_GROUP = "Přidat novou skupinu" +RUBRIK_HEADER_GROUP= "Správce skupiny polí" +RUBRIK_TEMPLATES_TAGS = "tag" +RUBRIK_TEMPLATES_TAG_DESC = "Popis tagu" +RUBRIK_TEMPLATES_THEME_FOLDER = "Název šablony (název souboru se složkami pro tuto šablonu)" +RUBRIK_TEMPLATES_PAGENAME = "Název webové stránky" +RUBRIK_TEMPLATES_TITLE= "Název stránky" +RUBRIK_TEMPLATES_KEYWORDS = "klíčová slova (Meta - Keywords)" +RUBRIK_TEMPLATES_DESCRIPTION = "popis stránky (Meta - Description)" +RUBRIK_TEMPLATES_INDEXFOLLOW = "Index zboží" +RUBRIK_TEMPLATES_PATH = "Instalace kořenové cesty" +RUBRIK_TEMPLATES_MEDIAPATH = "cesta ke složce se šablonou (Příklad: [tag: mediapath] images / logo.gif)" +RUBRIK_TEMPLATES_CSS = "Komprimuje několik CSS souborů do jednoho. Vrací cestu
FFF - Názvy souborů oddělené čárkou
P - cesta ke složce se soubory se nevyžaduje. Výchozí hodnota je - [tag: mediapath] css /
Příklad: href = & quot; [tag: css: reset.css, style.css] Termín "RUBRIK_TEMPLATES_JS= "Komprimuje několik JS-souborů do jednoho. Vrací cestu
FFF - Názvy souborů oddělené čárkou
P - cesta ke složce se soubory se nevyžaduje. Výchozí hodnota je - [tag: mediapath] js /
Příklad: href = & quot; [tag: JS: common.js, main.js] Termín "RUBRIK_RUB_INFO= "Systémový tag odpovídající za vývod obsahu pole rubriky. ID-číslo pole. Xxx počet symbolů pro zobrazení." RUBRIK_SELECT_IN_LIST = "Prosím vyberte pole rubriky ze seznamu níže" +RUBRIK_TEMPLATE_ITEMS = "3ablona designu pro prvky požadavku." +RUBRIK_DOCID_INFO = "Systémový tag, který odpovídá identifikátoru dokumentu" +RUBRIK_DOCTITLE_INFO = "Systemový tag, který odpovídá názvu dokument" +RUBRIK_CDOCID_INFO = "Systémový tag, který odpovídá ID aktuálního dokumentu (ke kterému se váže požadavek)" +RUBRIK_DOCDATE_INFO = "Systémový tag, který odpovídá datu vydání publikace" +RUBRIK_CDOCDATE_INFO = "Systémový tag, který odpovídá datu vydání aktuálního dokumentu (ke kterému se váže požadavek)" +RUBRIK_DOCTIME_INFO = "Systémový tag, který odpovídá datu a času zveřejnění dokumentu" +RUBRIK_CDOCTIME_INFO = "Systémový tag, který odpovídá datu a času zveřejnění tohoto dokumentu (ke kterému se váže požadavek)" +RUBRIK_DATE_INFO = "Systémový tag, data a času zveřejnění dokumentu - přizpůsobený vzhled
. Příklad: [tag: Datum: d.m.Y]
Můžete použít distribuční systémy (Space -. /)" +RUBRIK_CDATE_INFO = "System tag, datum a čas zveřejnění dokumentu - přizpůsobitelné vzhledu
Příklad: [tag: Datum: DMY]
(ve kterém je požadavek na výstup)
můžete použít rozvody (. Space - /) " +RUBRIK_DOCAUTHOR_INFO = "Systémový tag, který odpovídá autoru dokumentu" +RUBRIK_DOCAUTHOR_AVATAR = "Systémový tag, který odpovídá avataru autora dokumentu" +RUBRIK_CDOCAUTHOR_INFO = "Systémový tag, který odpovídá autoru tohoto dokumentu (ke kterému se váže požadavek)" +RUBRIK_VIEWS_INFO = "Systémový tag, který zobrazuje počet zhlédnutí dokumentu" +RUBRIK_COMMENTS_INFO = "Systémový tag, který ukazuje počet komentářů u dokumentu . Upozornění:! Funguje pouze při nainstalovaném modulu "RUBRIK_PATH= "Systémový tag, který identifikuje kořen instalace" +RUBRIK_MEDIAPATH = "System tag, který definuje cestu ke složce šablony (příklad: [Tag: mediapath] images / logo.gif)" +RUBRIK_THUMBNAIL = "Tag odpovídající za vytvoření miniatury(za předpokladu, že v šabloně pole rubriky (šablony pro výstup předpokladu) je vybrán výstup: [tag: parametr: 0])" +RUBRIK_ALIAS_HEAD = "Přiřadit alias pro pole" +RUBRIK_ALIAS_HEAD_T = "Můžete použít pouze latinky a čísla
Příklad:! záhlaví " +RUBRIK_ALIAS_HEAD_R = "Rubrika" +RUBRIK_ALIAS_HEAD_F = "pole" +RUBRIK_ALIAS_ALIAS = "Alias ​​pole" +RUBRIK_ALIAS_NAME= "Název aliasu" +RUBRIK_ALIAS_BUTT = "Uložit" +RUBRIK_ALIAS_ERROR = "Chyba" +RUBRIK_ALIAS_RUBID = "Nesprávná rubrika" +RUBRIK_ALIAS_FIELDID = "Nesprávné pole" +RUBRIK_ALIAS_MATCH = "Nesprávné hodnoty" +RUBRIK_ALIAS_USED = "Tato hodnota je již používána" +RUBRIK_REPORT_QUICKSAVE = "Provedeno rychlé uložení nastavení rubriky" +RUBRIK_REPORT_SORTE = "Roztřídění rubriky provedeno" +RUBRIK_REPORT_SORTE_FIELDS = "Roztřídění polí rubriky provedeno" +RUBRIK_REPORT_PERMISION = "Právo na přístup k dokumentům v rubrice změněno" +RUBRIK_REPORT_COPY = "Kopie rubriky vytvořena" +RUBRIK_REPORT_TEMPL_RUB = "Šablona rubriky upravena" +RUBRIK_REPORT_FIELD_EDIT= "Pole upraveno" +RUBRIK_REPORT_FIELD_DEL = "Pole smazáno" +RUBRIK_REPORT_RUB = "Rubriky" +RUBRIK_REP_QUICKSAVE_H = "Hotovo" +RUBRIK_REP_QUICKSAVE_T = "Nastavení rubrik úsěšně uloženo" +RUBRIK_REPORT_ADD = "Rubrika přidána" +RUBRIK_REPORT_SAVE_TPL = "Šablona designu rubriky uložena" +RUBRIK_CODE_SAVED = "Spustitelný kód rubriky úspěšně uložen" +RUBRIK_CODE_SAVED_ERR = "Nelze uložit spustitelný kód pro danou rubriku.
Zkuste znovu." +RUBRIK_CODE_ERROR = "Chyba" +RUBRIK_CODE_SUCCESS = "Hotovo" +RUBRIK_CODE_UPDATE = "Spustitelný kód pro rubriku změněn" +RUBRIK_LOG_NEW_FIELD = "Pole rubriky přidáno" +RUBRIK_LOG_DEL_RUBRIC = "Rubrika odstraněna" +RUBRIK_LOG_NEW_RUBRIC = "Rubrika vytvořena" +RUBRIK_FILDS_SAVED = "Úspěšně uloženo" +RUBRIK_FILD_SAVED = "Pole úspěšně přidáno" +RUBRIK_FILDS_REPORT = "Pole rubriky uloženo" +RUBRIK_FILDS_ERROR = "Chyba" +RUBRIK_FILDS_SUCCESS = "Hotovo" +RUBRIC_ERROR = "Chyba" +RUBRIC_SUCCESS = "Hotovo" +RUBRIC_SAVED_PHP_ERR = "Je zakázáno využívat PHP kód v šablonách" +RUBRIC_SAVED_TPL_ERR = "Nepodařilo se uložit šablonu rubriky.
Zkusteznovu." +RUBRIC_SAVED_TPL = "Šablona rubriky úspěšně uložena." +RUBRIC_SAVED_FLDTPL = "Šablona pole byla úspěšně uložena." +RUBRIK_TAG_SYSBLOCK = "Systémový tag výstupu systémového bloku." +RUBRIK_TAG_TEASER = "Systémový tag vývodu teaseru" +RUBRIK_TAG_ALIAS = "Systémový tag výstupu aliasu dokumenat" +RUBRIK_TAG_REQUEST = "Systémový tag výstupu dotazu" +RUBRIC_SAVED_PERMS = "Právo přístupu k dokumentům úspěšně uloženo" +RUBRIK_IFELSE = "Podmínky" +RUBRIK_IFELSE_1 = "Výstup v případě, pokud pole není prázdné" +RUBRIK_IFELSE_2 = "Jiný výstup, pokud je pole prázdné" +RUBRIK_SAMPLE = "Příklad" +RUBRIC_TMPLS_BUTTON = "Jiné šablony rubriky" +RUBRIC_TMPLS_HEAD = "Seznam dalších šablon rubriky" +RUBRIC_TMPLS_ADD = "Přidat novou šablonu" +RUBRIC_TMPLS_ID = "id" +RUBRIC_TMPLS_NAME = "Název" +RUBRIC_TMPLS_NAME_FULL = "Název šablony designu rubriky" +RUBRIC_TMPLS_AUTHOR = "Autor" +RUBRIC_TMPLS_DATE = "Datum" +RUBRIC_TMPLS_COUNT_DOCS = "Počet dokumentů" +RUBRIC_TMPLS_ACTIONS = "Akce" +RUBRIC_TMPLS_COPY = "Kopírovat šablonu" +RUBRIC_TMPLS_COPY_TIP = "Zadejte název šablony" +RUBRIC_TMPLS_COPY_TIP2 = "Uveďte prosím název kopírované šablony" +RUBRIC_TMPLS_EDIT = "Upravit" +RUBRIC_TMPLS_DELETE = "Odstranit" +RUBRIC_TMPLS_DELETE_C = "Opravdu chcete smazat šablonu?" +RUBRIC_TMPLS_TIP = "Můžete vytvořit neomezené množství šablon pro jednu rubriku" +RUBRIC_TMPLS_NO_ITEMS = " Zpráva:
Nejsou k dispozici žádné další šablony." +RUBRIC_TMPLS_FROM = "Kopie primární šablony vytvořena" +RUBRIC_TMPLS_INNAME = "Zadejte název šablony" +RUBRIC_TEMPL_REPORT = "Dodatečná šablona rubriky upravena" +RUBRIC_TMPLS_LOG_DEL = "Dodatečná šablona rubriky smazaná." diff --git a/admin/lang/cz/scripts.js b/admin/lang/cz/scripts.js new file mode 100644 index 0000000..ce2e152 --- /dev/null +++ b/admin/lang/cz/scripts.js @@ -0,0 +1,65 @@ +// Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +var logoutTitle = "východ z Ovládacích panelů"; +var logoutConfirm = "Opravdu chcete odejít?"; +var clearCacheTitle = "Smazání mezipaměti"; +var clearCacheConfirm = "Opravdu chcete smazat mezipaměť?"; +var clearCacheSessTitle = "Mazání mezipaměti a relací"; +var clearCacheSessConfirm = "Opravdu chcete vymazat mezipaměť a relace?"; +var clearThumbTitle = "Odstranit miniatury"; +var clearThumbConfirm = "Opravdu chcete vymazat všechny miniatury zobrazení?
z adresáře pro ukládání souborů (UPLOAD_DIR)?"; +var clearRevTitle = "Smazat revizi dokumentů"; +var clearRevConfirm = "Opravdu chcete vymazat všechny revize dokumentů?"; +var clearCountTitle = "Resetovat denní počítadlo dokumentů"; +var clearCountConfirm = "Opravdu chcete vynulovat denní počítadlo dokumentů?"; +var cacheShowTitle = "Zobrazit velikost cache"; +var cacheShowConfirm = "Jste si jisti, že chcete vidět velikost cache?
může to trvat nějaký čas."; +var ajaxErrorStatus = "Žádné spojení.
Zkontrolujte připojení."; +var ajaxErrorStatus404 = "Stránka, kterou hledáte nebyla nalezena. [404]"; +var ajaxErrorStatus401 = "Požadavek nelze splnit.
Chyba autorizaca pro vykonání požadavku [401]"; +var ajaxErrorStatus500 = "Došlo k vnitřní chybě.
Zkuste to znovu později. [500]"; +var ajaxErrorStatusJSON = "Špatná odpověď serveru
Data jsou ve špatném formátu JSON."; +var ajaxErrorStatusTimeOut = "Čas požadavku uplynul."; +var ajaxErrorStatusAbort = "Ajax požadavek přerušen."; +var ajaxErrorStatusMess = "Cyhba:
"; +var delCascadTitle = "odstranit zobrazení; +var delCascadConfirm += "Opravdu chcete smazat?"; +var saveMessageOk = "Data uložena"; + +//===== Date & Time Pickers =====// +$.datepicker.regional['cz'] = { + closeText: 'Zavřít', + prevText: '', + currentText: 'Nyní', + monthNames: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', + 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec' + ], + monthNamesShort: ['Led', 'Úno', 'Bře', 'Dub', 'Kvě', 'Čvn', + 'Čvc', 'Srp', 'Zář', 'Říj', 'Lis', 'Pro' + ], + dayNames: ['Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'], + dayNamesShort: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'], + dayNamesMin: ['Ne', 'Po', 'Út', 'St', 'Čt', 'Pá', 'So'], + weekHeader: 'Ne', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' +}; +$.datepicker.setDefaults($.datepicker.regional['cz']); + +$.timepicker.regional['cz'] = { + timeOnlyTitle: 'Vyberte čas', + timeText: 'Čas', + hourText: 'Hodiny', + minuteText: 'Minuty', + secondText: 'Sekundy', + millisecText: 'milisekundy', + currentText: 'Teď', + closeText: 'Zavřít', + ampm: false +}; +$.timepicker.setDefaults($.timepicker.regional['cz']); \ No newline at end of file diff --git a/admin/lang/cz/settings.txt b/admin/lang/cz/settings.txt new file mode 100644 index 0000000..496046e --- /dev/null +++ b/admin/lang/cz/settings.txt @@ -0,0 +1,111 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[settings] +SETTINGS_COUNTRIES = "Správce zemí" +SETTINGS_COUNTRIES_ALL = "Seznam zemí" +SETTINGS_COUNTRY_TIP = "Vyberte prosím země, které budou k dispozici při registraci nových uživatelů v systému. Pamatujte, že Vámi vybraný seznam může být použit jinými moduly v systému." +SETTINGS_ACTIVE = "Aktivní?" +SETTINGS_COUNTRY_NAME = "Název země" +SETTINGS_IN_EC = "Vztahuje se k EU?" +SETTINGS_YES = "Ano" +SETTINGS_NO = "Ne" +SETTINGS_BUTTON_SAVE = "Uložit změny" +SETTINGS_BUTTON_SAVE_AJAX = "Použít (CTRL+S)" +SETTINGS_OR = "nebo" +SETTINGS_MAIN_TITLE = "Správa obecných nastavení systému" +SETTINGS_CASE_TITLE = "Dodatečná nastavení" +SETTINGS_MAIN = "Obecná nastavení systému" +SETTINGS_SAVED = "Nastavení systému úspěšně uloženo" +SETTINGS_SAVED_ERR = "Nepodařilo se uložit nastavení.
Zkuste znovu." +SETTINGS_SAVE_INFO = "Zde můžete upravit globální parametry systému. Prosím, buďte nanejvýš opatrní a pamatujte, že nesprávné nastavení může vyřadit systém z provozu." +SETTINGS_SAVE_CONFIRM = "Opravdu chcete uložit nastavení systému?" +SETTINGS_SITE_NAME = "Název webové stránky:" +SETTINGS_SITE_COUNTRY = "Země webové stránky:" +SETTINGS_EMAIL_SENDER = "E-mail odesílatele" +SETTINGS_EMAIL_NAME = "jméno odesílatele e-mailu:" +SETTINGS_MAIL_TRANSPORT = "Způsob odeslání:" +SETTINGS_MAIL = "mail" +SETTINGS_SENDMAIL = "sendmail" +SETTINGS_SMTP = "smtp" +SETTINGS_SMTP_SERVER = "Server SMTP:" +SETTINGS_MAIL_PORT = "Port SMTP:" +SETTINGS_SMTP_NAME = "Uživatel:" +SETTINGS_SMTP_PASS = "Heslo:" +SETTINGS_SMTP_ENCRYPT = "Šifrování" +SETTINGS_SMTP_NOENCRYPT = "Ne" +SETTINGS_MAIL_PATH = "Cesta ke složce sendmail:" +SETTINGS_SYMBOL_BREAK = "Nucený přenos po (znaky):" +SETTINGS_SYMBOL_BREAK_INFO = "Ne více než 1000 podle RFC 2822" +SETTINGS_SYMBOLS = "znaky" +SETTINGS_TEXT_EMAIL = "Zpráva uživateli po vytvoření účtu, kde:" +SETTINGS_TEXT_INFO = "%NAME% - Jméno uživatele
%HOST% - Odkaz na stránky
%PASSWORD% - Heslo
%EMAIL% - E-mail uživatele
%EMAILSIGNATURE% - Podpis zprávy" +SETTINGS_EMAIL_FOOTER = "Text podpisu:" +SETTINGS_ERROR_PAGE = "Chyba HTTP Stránka 404: Stránka nebyla nalezena" +SETTINGS_PAGE_DEFAULT = "(default Id:2)" +SETTINGS_TEXT_PERM = "text zprávy v případě, že uživatel nemá práva:" +SETTINGS_HIDDEN_TEXT = "text zprávy v případě, že uživatel nemá práva pro dostup informací skryté tagem [tag:hide:X,X]...[/tag:hide]" + +SETTINGS_NAVI_BOX = "Box stránkové navigace:
Např.: <ul>%s</ul>" +SETTINGS_LINK_BOX = "Box prvků pro stránkovou navigaci:
Příklad: <li>%s</li>" +SETTINGS_TOTAL_BOX = "Box textu před čísly stránek:
Příklad: <span>%s</span>" +SETTINGS_ACTIVE_LINK_BOX= "Box aktivního prvku:
Např.: <span class="active">%s</span>" +SETTINGS_PAGE_SEPAR = "Box značící přítomnost stran:
Např.: <li>%s</li>" +SETTINGS_PAGE_BEFORE = "Text před čísly stránek:
Např.: strana %d z %d" +SETTINGS_PAGE_START = "Text odkazu "První":" +SETTINGS_PAGE_END = "Text odkazu "Poslední":" +SETTINGS_PAGE_SEPARATOR = "Text označující přítomnost stránek kromě viditelných" +SETTINGS_PAGE_NEXT = "Text odkazu "Další":" +SETTINGS_PAGE_PREV = "Text odkazu "Předchozí":" + +SETTINGS_MAIN_BREADCRUMBS = "Výstupní nastavení “drobečkové navigace”" +SETTINGS_BREAD_BOX = "Box “drobečková navigaced”:" +SETTINGS_BREAD_SEPPARATOR = "Dělič mezi odkazy:" +SETTINGS_BREAD_BOX_LINK = "Odkazový box:" +SETTINGS_BREAD_BOX_LASTLINK = "Ukazovat poslední prvek:" +SETTINGS_BREAD_SELF_BOX = "Box posledního prvku" + +SETTINGS_DATE_FORMAT = "Formát data:" +SETTINGS_TIME_FORMAT = "Formát data a času:" +SETTINGS_CLEAR_CACHE = "Smazat cache" +SETTINGS_USE_DOCTIME = "Použít datum zveřejnění dokumentů" +SETTINGS_INFO = "Pokročilé" +SETTINGS_MAIN_SETTINGS = "Obecná nastavení systému" +SETTINGS_MAIN_MAIL = "Nastavení pošty" +SETTINGS_MAIN_PAGENAVI = "Nastavení výstupu stránkové navigace" +SETTINGS_NAME = "Parametr" +SETTINGS_VALUE = "Hodnota" +SETTINGS_USE_EDITOR = "Výchozí editor" +SETTINGS_EDITOR_ELFINDER = "Elrte та Elfinder" +SETTINGS_EDITOR_CKEDITOR = "CKEditor" + +SETTINGS_ERROR = "Chyba" +SETTINGS_SUCCESS = "Hotovo" + +SETTINGS_SAVE_DOP = "Pokročilá nastavení systému změněna" +SETTINGS_SAVE_MAIN = "Obecná nastavení systému změněna" +SETTINGS_SAVE_COUNTRY = "Nastavení zemí změněno" + +SETTINGS_LANG_EDIT = "Správa jazyků" +SETTINGS_LANG_TITLE = "Pozor! Nastavení jazyku se musí odehrát před vyplněním stránky!" +SETTINGS_LANG_AEDIT = "Upravit" +SETTINGS_LANG_AON = "Zapnout" +SETTINGS_LANG_AOFF = "Vypnout" +SETTINGS_LANG_ADEFAULT = "Nastavit jako výchozí" +SETTINGS_LANG_ADEFAULT_HINT = "" +SETTINGS_LANG_ID = "Id" +SETTINGS_LANG_FLAG = "Checkbox" +SETTINGS_LANG_SYSTEM = "Systémové" +SETTINGS_LANG_PREFIX = "Prefix" +SETTINGS_LANG_NAME = "Název" +SETTINGS_LANG_DEFAULT = "Výchozí" +SETTINGS_LANG_ACTION = "Akce" +SETTINGS_LANG_ADD = "Přidat jazyk" +SETTINGS_LANG_SAVE = "Uložit změny" + +SETTINGS_REV_DELETED = "Revize dokomentů úspěšně odstraněny" +SETTINGS_REV_DELETED_ERR = "Nepodařilo se odstranit revizi dokumentů.
Zkuste znovu." +SETTINGS_REV_UPDATE = "Revize dokumentů odstraněna" +SETTINGS_COUNT_DELETED = "Počítadlo dokumentů
úspěšně vynulován." +SETTINGS_COUNT_DELETED_ERR = "Nepodařilo se vynulovat hrubé
počítadlo dokumentů.
Zkuste znovu." +SETTINGS_COUNT_UPDATE = "Počítadlo dokumentů vynulován" +SETTINGS_CACHE_LIFETIME = "Pozor!!! Povoleno ukládání mezipaměti do nastavení systému. Změny vejdou v platnost, pouze po skončení životnosti cache, nebo po zákazu ukládání do mezipaměti." diff --git a/admin/lang/cz/sysblocks.txt b/admin/lang/cz/sysblocks.txt new file mode 100644 index 0000000..37230ba --- /dev/null +++ b/admin/lang/cz/sysblocks.txt @@ -0,0 +1,69 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +SYSBLOCK_HEAD = "Systémové jednotky" +SYSBLOCK_EDIT = "Ovládání systémových jednotek" +SYSBLOCK_EDIT_TIP = "Tato část obsahuje veškeré systémové jednotky." +SYSBLOCK_ID = "Id" +SYSBLOCK_NAME = "Název systémové jednotky" +SYSBLOCK_HTML = "Kód systémové jednotky" +SYSBLOCK_TAGS = "Tag" +SYSBLOCK_TAGS_2 = "HTML Tagy" +SYSBLOCK_EXTERNAL = "Povolit externí přístup k odkazu" +SYSBLOCK_EXTERNAL_H = "externí přístup k odkazu" +SYSBLOCK_EXTERNAL_GO = "Přejít" +SYSBLOCK_AJAX = "Dovolit provádění pouze Ajax" +SYSBLOCK_AJAX_H = "provádět pouze Ajax" + +SYSBLOCK_VISUAL = "Візуальний редактор" +SYSBLOCK_VISUAL_H = "Vizuální editor" + +SYSBLOCK_MEDIAPATH = "Systémový tag, cesty do designové složky" +SYSBLOCK_BREADCRUMB = "Systémový tag chlebových drobečků" +SYSBLOCK_DOCID_INFO = "Systémový tag, identifikátor dokomentu" +SYSBLOCK_PATH = "Instalace kořenové cesty" +SYSBLOCK_HOME = " Odkaz na domovskou stránku webové stránky" + +SYSBLOCK_AUTHOR = "Autor" +SYSBLOCK_DATE = "Datum vytvoření" +SYSBLOCK_TAG = "Systémový tag" +SYSBLOCK_ACTIONS = "Akce" +SYSBLOCK_NO_ITEMS = "Zpráva:
V současné době zde nejsou žádné uložené systémové jednotky" +SYSBLOCK_BUTTON_SAVE = "Uložit změny" +SYSBLOCK_BUTTON_ADD = "Přidat systémovou jednotku" +SYSBLOCK_BUTTON_COPY = "Kopírovat" +SYSBLOCK_INSERT_H = "Přidání systémové jednotky" +SYSBLOCK_EDIT_H = "Úpravy systémové jednotky" +SYSBLOCK_INNAME = "Zadejte název systémové jednotky" +SYSBLOCK_ENTER_NAME = "Zadejte název systémové jednotky" +SYSBLOCK_INSERT = "Zde můžete přidat, či změnit vybranou systémovou jednotku" + +SYSBLOCK_LINK = "Systémová jednotka je dostupná na adrese:" + +SYSBLOCK_SAVE = "Přidat" +SYSBLOCK_SAVEDIT = "Uložit změny" +SYSBLOCK_SAVE_NEXT = "Přidat a pokračovat v úpravách" +SYSBLOCK_SAVEDIT_NEXT = "Použít (CTRL+S)" + +SYSBLOCK_INTEXT = "Systémová jednotka" +SYSBLOCK_ADD = "Přidat novou systémovou jednotku" +SYSBLOCK_ADD_BUTTON = "Přidat" +SYSBLOCK_EDIT_HINT = "Upravit systémovou jednotku" +SYSBLOCK_DELETE_HINT = "Odstranit systémovou jednotku" +SYSBLOCK_DEL_HINT = "Opravdu chcete odstranit systémovou jednotku?" +SYSBLOCK_LIST_LINK = "Seznam systémových jednotek" +SYSBLOCK_FILE = "Soubor šablony" +SYSBLOCK_SAVED = "Systémova jednotka úspěšně uložena." +SYSBLOCK_COPY_TITLE = "írování systémové jednotky" +SYSBLOCK_COPY = "Kopírovat systémovou jednotku" +SYSBLOCK_COPY_TIP = "Zadejte název systémové jednotky" +SYSBLOCK_COPY_TIP2 = "Zadejte název systémové jednotky, která se kopíruje" +SYSBLOCK_EXIST = "Je nám líto, ale tento systém jednotky se stejným názvem již existuje." +SYSBLOCK_SQLUPDATE = "Systémová jednotka změněna" +SYSBLOCK_SQLNEW = "Nová systémová jednotka stvořena" +SYSBLOCK_SQLDEL = "Systémová jednotka odstraněna" +SYSBLOCK_OR = " nebo " + +SYSBLOCK_SAVED = "Systémová jednotka úspěšně uložena" +SYSBLOCK_SAVED_ERR = " Nepodařilo se uložit systémovou jednotku
Zkuste znovu." +SYSBLOCK_ERROR = "Chyba" +SYSBLOCK_SUCCESS = "Hotovo" \ No newline at end of file diff --git a/admin/lang/cz/templates.txt b/admin/lang/cz/templates.txt new file mode 100644 index 0000000..06cc191 --- /dev/null +++ b/admin/lang/cz/templates.txt @@ -0,0 +1,119 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +TEMPLATES_SUB_TITLE = "Správce šablon" +TEMPLATES_TIP1 = "Zde je seznam všech šablon v systému. Můžete zde smazat, editovat, nebo zkopírovat šablonu a vytvořit tak na její bázi novou." +TEMPLATES_ID = "ID" +TEMPLATES_NAME = "Název šablony" +TEMPLATES_NAME2 = "Název šablony:" +TEMPLATES_NAME3 = "zadejte název šablony:" +TEMPLATES_AUTHOR = "Autor" +TEMPLATES_DATE = "Datum vytvoření" +TEMPLATES_ACTION = "Akce" +TEMPLATES_DATE_FORMAT = "%d.%m.%y g." +TEMPLATES_DATE_FORMAT2 = "%H:%M" +TEMPLATES_IN = "v" +TEMPLATES_EDIT = "Editovat šablonu" +TEMPLATES_NO_CHANGE = "Je nám líto, ale nemáte oprávnění pro úpravy šablon." +TEMPLATES_DELETE = "odstranit šablonu" +TEMPLATES_DELETE_CONF = "Opravdu chcete odstranit tuto šablonu?" +TEMPLATES_NO_DELETE2 = "Je nám líto, ale nemůžete odstranit tuto šablonu, jelikož tato šablona využívá rubriku, nebo modul." +TEMPLATES_NO_DELETE3 = "Je nám líto, ale nemáte oprávnění pro mazání šablon" +TEMPLATES_COPY = "Kopírovat šablonu" +TEMPLATES_NO_COPY = "Je nám líto, ale nemáte oprávnění pro kopírování šablon." +TEMPLATES_LEGEND = "Hodnota ikony" +TEMPLATES_COPY_TITLE = "kopírování šablony" +TEMPLATES_TIP2 = "Zadejte prosím název zkopírované šablony" +TEMPLATES_TIP3 = "Zadejte prosím název šablony" +TEMPLATES_BUTTON_COPY = "Kopírovat" +TEMPLATES_TAG_INSERT = "Stiskněte název systémového tagu pro jeho vložení do pole šablony" +TEMPLATES_TITLE_NEW = "Vytvoření nové šablony" +TEMPLATES_TITLE_EDIT = "editování šablony" +TEMPLATES_WARNING1 = "Buďte opatrní při úpravách šablon a pamatujte, že nesprávným zadáním kódu může dojít ke zničení externího designu stránky." +TEMPLATES_WARNING2 = "Zde můžete ručně vytvořit novou šablonu a nahrát hotovou strukturu šablony z existujícího souboru. Mějte na paměti, že soubory z hotovou strukturou musí být umístěny v adresáři /inc/data/prefabs/templates/" +TEMPLATES_HTML = "HTML kod šablony" +TEMPLATES_USE_PHP = "Je nám líto, ale nemáte oprávnění pro editování šablony, jelikož využívá PHP kód." +TEMPLATES_BUTTON_SAVE = "Uložit změny" +TEMPLATES_BUTTON_SAVE_NEXT = "Použít (CTRL+S)" +TEMPLATES_FILE_SAVED = "Soubor byl úspěšně uložen" +TEMPLATES_BUTTON_ADD = "Přidat šablonu" +TEMPLATES_BUTTON_ADD_NEXT = "Přidat a pokračovat v úpravách" +TEMPLATES_BUTTON_LOAD = "Stáhnout" +TEMPLATES_LOAD_INFO = "Vyberte prosím ze seznamu soubor s hotovou strukturou šablony." +TEMPLATES_EXIST = "Je nám líto, ale šablona s tímto názvem již existuje." +TEMPLATES_NO_NAME = "Zadejte porsím název šablony" +TEMPLATES_ALL = "Seznam šablon" +TEMPLATES_OR = " nebo " + +TEMPLATES_FILE_NAME = "Název souboru" +TEMPLATES_CSS_FILES = "Seznam css souborů" +TEMPLATES_JS_FILES = "Seznam js souborů" +TEMPLATES_FILES = "Správce souborů" +TEMPLATES_EDIT_FILE = "Upravit soubor" +TEMPLATES_DEL_FILE = "odstranit soubor" + +TEMPLATES_TAGS = "Tag" +TEMPLATES_TAG_DESC = "Popis tagu" +TEMPLATES_THEME_FOLDER = "Název šablony (název složky ze soubory pro tuto šablonu)" +TEMPLATES_FOLDER = "Složka:" +TEMPLATES_PAGENAME = "Název webové stránky" +TEMPLATES_FILENAME = "Název souboru" +TEMPLATES_TITLE = "Název stránky" +TEMPLATES_KEYWORDS = "Klíčová slova (Meta - Keywords)" +TEMPLATES_DESCRIPTION = "Popis stránky (Meta - Description)" +TEMPLATES_INDEXFOLLOW = "Index zboží" +TEMPLATES_CANONICAL = "Kanonická stránka - doporučený exemplář sady stránek s velmi podobným obsahem." +TEMPLATES_PATH = "Instalace kořenové cesty" +TEMPLATES_MEDIAPATH = "Cesty ke složce s šablonou (Např.: [tag:mediapath]images/logo.gif)" + +TEMPLATES_CSS = "Komprimuje několik CSS souborů do jednoho. Vrací cestu.
FFF - název souborů, oddělených čárkou
P - cesta ke složce se soubory není vyžadována. Výchozí - [tag:mediapath]css/

Např.: href="[tag:css:reset.css,style.css]"" + +TEMPLATES_JS = "Komprimuje několok js souborů do jednoho. Vrací cestu.
FFF - název souborů, oddělených čárkou
P - cesta ke složce se soubory není vyžadována. Výchozí - [tag:mediapath]js/

Např.: href="[tag:js:common.js,main.js]"" + +TEMPLATES_MEDIAPATH = "Cesta ke složce se šablonou (Např.: [tag:mediapath]images/logo.gif)" +TEMPLATES_MAINCONTENT = "Tag k hlavnímu obsahu" +TEMPLATES_QUICKFINDER = "Pop-up menu rychlé navigace" +TEMPLATES_DOCUMENT = "Odkaz na aktuální dokument" +TEMPLATES_ALIAS = "Odkaz na aktuální dokument (Alias)" +TEMPLATES_SYSBLOCK = "Systémový tag bloků" +TEMPLATES_TEASER = "Systémový tag hlavolamu" +TEMPLATES_PRINTLINK = "Odkaz na "Verze pro tisk"" +TEMPLATES_HOME = "Odkaz na hlavní stránku" +TEMPLATES_BREADCRUMB = "Systémový tag drobečkové navigace" +TEMPLATES_VERSION = "Zobrazení info o bezpečnosti informací" +TEMPLATES_NAVIGATION = "Menu navigace (ххх - číslo menu)" +TEMPLATES_IF_PRINT = "Obsah se zobrazí při tisku." +TEMPLATES_DONOT_PRINT = "Obsah se nezobrazí při tisku" +TEMPLATES_RUBHEADER = "Nastavitelná šablona kategorie
(Šablona designu HEADER)" +TEMPLATES_NO_ITEMS = "V současné době zde nejsou žádné soubory" + +TEMPLATES_CACHE_SUCCESS = "Cache úspěšně smazána" +TEMPLATES_CACHE_SUCCESS_LOG = "Cache smazán" + +TEMPLATES_CSS_TITLE = "Buďte opatrní při úpravách souborů a pamatujte, že nesprávným zadáním kódu může dojít ke zničení externího designu stránky" +TEMPLATES_CSS_EDITOR = "Editor CSS souborů" + +TEMPLATES_JS_TITLE = "Buďte opatrní při úpravách souborů a pamatujte, že nesprávným zadáním kódu může dojít ke zničení externího designu stránky" +TEMPLATES_JS_EDITOR = "Editor CSS souborů" + +TEMPLATES_REPORT_NEW = "Šablona vytvořena" +TEMPLATES_REPORT_CHANGE = "Šablona změněna" +TEMPLATES_REPORT_PHP = "Pokus využití PHP kodu v šabloně" +TEMPLATES_REPORT_PHP_CSS = "Pokus využití PHP kodu v css souboru" +TEMPLATES_REPORT_PHP_JS = "Pokus využití PHP kodu js sabouru" +TEMPLATES_REPORT_PHP_ERR = "Využití PHP kodu je zakázáno." +TEMPLATES_REPORT_ID_ERR = " Pokus o odstranění hlavní šablony" +TEMPLATES_REPORT_DELETE = "Šablona smazána" +TEMPLATES_REPORT_FILE = "Soubor upraven" +TEMPLATES_REPORT_COPY = "Kopie šablony vytvořena" +TEMPLATES_REPORT_DEL_OK = "Soubor úspěšně smazán" +TEMPLATES_REPORT_DEL_ER = "Nelze odstranit soubor" + +TEMPLATES_REPORT_ERROR_TEXT = "HTML kód šablony je prázdný" +TEMPLATES_REPORT_ERROR_TITLE = "Nevyplněný název šablony" + +TEMPLATES_SAVED = "Šablona úspěšně uložena" +TEMPLATES_SAVED_FILE = "Soubor úspěšně uložen" +TEMPLATES_SAVED_ERR = " Nepovedlo se uložit šablonu.
Zkuste ještě jednou." +TEMPLATES_SAVED_ERR_FILE = "Nepovedlo se uložit soubor.
Zkuste ještě jednou." +TEMPLATES_ERROR = "Chyba" +TEMPLATES_SUCCESS = "Hotovo" \ No newline at end of file diff --git a/admin/lang/cz/user.txt b/admin/lang/cz/user.txt new file mode 100644 index 0000000..6323b3f --- /dev/null +++ b/admin/lang/cz/user.txt @@ -0,0 +1,92 @@ +# Slavík))) 02,2017 Olga "Un.Known" Andělová # https://www.facebook.com/olga.andelova + +[user] +USER_SUB_TITLE = "Správce uživatelů" +USER_TIP1 = "Zde je uveden seznam uživatelů v systému. Můžete zde upravovat parametry uživatelů, odstranit uživatele, nebo jej převést do jiné skupiny." +USER_ID = "ID" +USER_NAME = "Jméno a příjmení uživatele" +USER_NAME2 = "Uživatelské jméno" +USER_GROUP = "Umístění ve skupině" +USER_STATUS_WAIT = "Očekává aktivaci" +USER_LAST_VISIT = "Poslední přihlášení" +USER_REGISTER_DATE = "Datum registrace" +USER_ACTION = "Akce" +USER_DELETE = "Odstranit uživatele" +USER_EDIT = "Upravit uživatele" +USER_DATE_FORMAT = "%d.%m.%Y %H:%M" +USER_NO_CHANGE = "Je nám líto, ale nemáte dostatečná práva k upravování uživatelů" +USER_DELETE_CONFIRM = "Opravdu chcete odstranit tohoto uživatele?" +USER_LEGEND = "Hodnoty ikon" +USER_BUTTON_SAVE = "Uložit změny" +USER_ORDERS = "Historie objednávek" +USER_DOWNLOADS = "Historie objednávek PO " +USER_MARK_DELETE = "Označit pro vymazání" +USER_NEW_TITLE = "Vytvořit nový účet" +USER_NEW_TIP = "Pro přidání nového uživatele vyplňte příslušné informace. Buďte opatrní při výběru skupiny pro tohoto uživatele. Neplatná skupina může omezit přístup uživatele k příslušným oddílům na webové stránce, či naopak umožnit přístup do uzavřených úseků." +USER_EDIT_TITLE = "Úprav uživatele" +USER_EDIT_TIP = " Zde můžete upravovat uživatelská nastavení také změnit heslo a skupinu uživatele." +USER_ERRORS = "Chyba:" +USER_FIRSTNAME = "Jméno:" +USER_FIRSTNAME_ADD = "Zadejte uživatelské jméno:" +USER_LASTNAME = "Příjmení:" +USER_EMAIL = "E-mailová adresa:" +USER_NICK = "Nick na fóru:" +USER_SIGNATURE = "Podpis na fóru:" +USER_AVATAR = "Avatar:" +USER_TAX = "Zdanění:" +USER_COMPANY = "Společnost:" +USER_HOUSE_STREET = "Ulice / Číslo budovy:" +USER_ZIP_CODE = "PSČ:" +USER_CITY = "Místo bydliště:" +USER_PASSWORD = "Heslo:" +USER_PASSWORD_CHANGE = "Změnit" +USER_PASSWORD_SHOW = "Ukázat heslo" +USER_YES = "Ano" +USER_NO = "Ne" +USER_COUNTRY = "Země:" +USER_PHONE = "Mobil:" +USER_FAX = "Fax:" +USER_BIRTHDAY = "Datum narození:" +USER_BIRTHDAY_FORMAT = " ve formátu (DD.MM.RRRR)" +USER_NOTICE = "Doplňující informace:" +USER_MAIN_GROUP = "Hlavní skupina:" +USER_SECOND_GROUP = "Další skupina:" +USER_SECOND_INFO = "Výběr několika skupin" +USER_STATUS = "Status uživatele:" +USER_ACTIVE = "Aktivní" +USER_INACTIVE = "Neaktivní" +USER_BUTTON_ADD = "Přidat uživatele" +USER_SEND_INFO = "Informovat uživatele poštou" +USER_MESSAGE_SUBJECT = "Téma zprávy:" +USER_MESSAGE_TEXT = "Text zprávy:" +USER_EMAIL_EXIST = "Je nám líto, ale zadané e-mailová adresa se již v systému používá." +USER_ERROR_DATEFORMAT = "Datum narození není uvedeno ve správném formátu." +USER_PASSWORD_SHORT = "Zadané heslo je příliš krátké. Zadejte prosím nejméně pět znaků." +USER_PASSWORD_ERROR = " Pole pro heslo obsahuje neplatné znaky." +USER_NO_EMAIL = "Pole E-mailová adresa není vyplněno. Zadejte, prosím, Váš e-mail." +USER_NO_PASSWORD = " Pole Heslo není vyplněno. Zadejt, prosím, Vaše heslo." +USER_EMAIL_ERROR = "E-mailová adresa obsahuje neplatné znaky, zkontrolujte zadanou adresu." +USER_NO_FIRSTNAME = "Pole Uživatelské jméno je prázdné, zadejte prosím jméno uživatele. " +USER_NO_USERNAME = "Pole login je prázdné, zadejte prosím login uživatele." +USER_ERROR_FIRSTNAME = "Pole Jménno uživatele obsahuje neplatné znaky." +USER_ERROR_USERNAME = "Pole login obsahuje neplatné znaky." +USER_NO_LASTNAME = "Pole příjmení uživatele je prázdné. Zadejte prosím příjmení uživatele." +USER_ERROR_LASTNAME = "Pole příjmení obsahuje neplatné znaky." +USER_MAIL_BODY1 = "Vítejte %USER%,%N%%N%" +USER_MAIL_BODY2 = "Váš účet byl úspěšně aktivován. Použijte své přihlašovací údaje pro přístup k webu. %HOST%." +USER_MAIL_FOOTER = "%N%%N%S pozdravy, %HOMEPAGENAME%%N%%N%%HOST%" +USER_MAIL_SUBJECT = "Váš účet byl aktivován" +USER_MAIL_PASSWORD = "Informace pro změnu hesla" +USER_MAIL_PASSWORD2 = "Upozorňujeme Vás na změnu hesla.%N%%N%Vaše nové heslo je: %NEWPASS%" +USER_NEW_ADD = "Vytvoření nového uživatele" +USER_ALL = "Seznam uživatelů" +USER_LOGIN = "Login v systému:" +SETTINGS_NAME = "Parametr" +SETTINGS_VALUE = "Hodnota" +USER_LIST_EMPTY = "Hledaný uživatel neexistuje.
Zkuste upravit parametry hledání." +USER_REPORT_ADD = "Uživatel přidán" +USER_REPORT_EDIT = "Uživatelské nastavení editováno" +USER_REPORT_DEL = "Uživatel odstraněn" +USER_REPORT_GROUP = "Skupina pro uživatele změněna" +USER_YOUR_NOT_CHANGE = "Chyba! Je nám líto, ale nemáte oprávnění pro úpravy tohoto uživatele." +USER_WARNING_TIP = "Pozor! Buďte opatrní při úpravě tohoto uživatele." \ No newline at end of file diff --git a/admin/lang/pl/blocks.txt b/admin/lang/pl/blocks.txt new file mode 100644 index 0000000..eb919b9 --- /dev/null +++ b/admin/lang/pl/blocks.txt @@ -0,0 +1,68 @@ +BLOCK_HEAD = "Візуальні блоки" +BLOCK_EDIT = "Керування візуальними блоками" +BLOCK_EDIT_TIP = "У цьому розділі надані усі візуальні блоки." +BLOCK_ID = "Id" +BLOCK_NAME = "Назва візуального блока" +BLOCK_HTML = "Код візуального блока" +BLOCK_TAGS = "Тег" +BLOCK_TAGS_2 = "HTML Tags" + + +BLOCK_VISUAL = "Візуальний редактор" +BLOCK_VISUAL_H = "Візуальний редактор" + +BLOCK_MEDIAPATH = "Системний тег, шлях до папки дизайна" +BLOCK_BREADCRUMB = "Системний тег хлібних крихт" +BLOCK_DOCID_INFO = "Системний тег, ідентифікатор документа" +BLOCK_PATH = "Кореневий шлях установки" +BLOCK_HOME = "Посилання на головну сторінку сайта" + +BLOCK_AUTHOR = "Автор" +BLOCK_DATE = "Дата створення" +BLOCK_TAG = "Системний тег" +BLOCK_ACTIONS = "Дія" +BLOCK_NO_ITEMS = "Повідомлення:
На даний час немає збережених візуальних блоків." +BLOCK_BUTTON_SAVE = "Зберегти зміни" +BLOCK_BUTTON_ADD = "Додати візуальний блок" +BLOCK_BUTTON_COPY = "Копіювати" +BLOCK_INSERT_H = "Додавання візуального блока" +BLOCK_EDIT_H = "Редагування візуального блока" +BLOCK_INNAME = "Введіть назву візуального блока" +BLOCK_ENTER_NAME = "Будь ласка, вкажіть назву візуального блока" +BLOCK_INSERT = "Тут Ви можете додати або змінити обраний Вами візуальний блок" + +BLOCK_SAVE = "Додати" +BLOCK_SAVEDIT = "Зберегти зміни" +BLOCK_SAVE_NEXT = "Додати та продовжити редагування" +BLOCK_SAVEDIT_NEXT = "Примінити (CTRL+S)" + +BLOCK_INTEXT = "Візуальний блок" +BLOCK_ADD = "Додати новый візуальний блок" +BLOCK_ADD_BUTTON = "Додати" +BLOCK_EDIT_HINT = "Редагувати візуальний блок" +BLOCK_DELETE_HINT = "Видалити блок" +BLOCK_DEL_HINT = "Ви впевнені, що бажаєте видалити візуальний блок?" +BLOCK_LIST_LINK = "Список візуальних блоків" +BLOCK_FILE = "Файл шаблона" +BLOCK_SAVED = "Блок успішно збережено." +BLOCK_COPY_TITLE = "Копіювання візуального блока" +BLOCK_COPY = "Копіювати візуальний блок" +BLOCK_COPY_TIP = "Будь ласка, вкажіть назву візуального блока" +BLOCK_COPY_TIP2 = "Будь ласка, вкажіть назву для зкопійованого візуального блока" +BLOCK_EXIST = "Даруйте, але візуальний блок з такою назвою уже існує" +BLOCK_SQLUPDATE = "Змінив блок" +BLOCK_SQLNEW = "Створив новий візуальний блок" +BLOCK_SQLDEL = "Видалив візуальний блок" +BLOCK_OR = " або " + +BLOCK_SAVED = "Візуальний блок успіщно збережено" +BLOCK_SAVED_ERR = "Не вдалося зберегти візуальний блок.
Спробуйте ще раз." +BLOCK_ERROR = "Помилка" +BLOCK_SUCCESS = "Виконано" + +BLOCK_DESCRIPTION = "Короткий опис" +BLOCK_ALIAS = "Аліас" +BLOCK_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:BLOCK:alias] замість [tag:BLOCK:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах цих блоків" +BLOCK_ACCEPT = "Цей аліас можна використовувати" +BLOCK_ER_SYN = "Неправильний аліас!
Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +BLOCK_ER_EXISTS = "Неправильний аліас!
Такий аліас уже прив’язаний до іншого візкального блока" \ No newline at end of file diff --git a/admin/lang/pl/dbactions.txt b/admin/lang/pl/dbactions.txt new file mode 100644 index 0000000..62d7a92 --- /dev/null +++ b/admin/lang/pl/dbactions.txt @@ -0,0 +1,49 @@ +# Język polski 02,2017 duncan + +DB_SUB_TITLE = "Zarządzanie bazami danych" +DB_ACTION_WARNING = "Uwaga!\nWszystkie działania codo pracy z bazą danych wykonujesz na własne ryzyko.\n\nProszę pamiętać, że wszelkie działania w bazie danych mogą uszkodzić istniejącą informację.\n\Czy na pewno chcesz kontynuować?\n\n" +DB_ACTION_RESET = "Uwaga!\nPróbujesz odzyskać bazę danych z kopii zapasowej. Wszystkie istniejące informacje zostaną usunięte i zaisane ponownie.\nProszę pamiętać, że podczas przywracania bazy danych, trzeba będzie awtoryzować się ponownie\n\nCzy na pewno chcesz kontynuować?\n\n" +DB_OPTION_LIST = "Struktura bazy danych" +DB_BUTTON_ACTION = " wykonać działanie" +DB_OPTIMIZE_DATABASE = "Optymalizacja bazy danych" +DB_OPTIMIZE_INFO = "Opcja ta pozwala zwiększyć wydajność i zmniejszyć rozmiar bazy danych. Zalecany odstęp pomiędzy optymalizacjami musi wynosić co najmniej 1 raz w tygodniu." +DB_REPAIR_DATABASE = "Odbudowa uszkodzonych tablic" +DB_REPAIR_INFO = "Ta funkcja pozwala wykonać próbę naprawy uszkodzonych tablic w bazie danych, w przypadku nieprawidłowego wyświetlania informacji na stronie internetowej." +DB_BACKUP_DATABASE = "Utworzenie kopii zapasowej " +DB_BACKUP_INFO = "Ta funkcja umożliwia utworzenie kopii zapasowej wszystkich baz danych, lub poszczególnych tablic. Proszę wybrać z listy po lewej te tablicy, dla których chcesz wykonać kopię zapasową. Aby wybrać wiele tablic przytrzymaj przycisk CTRL." +DB_RESTORE_TITLE = " Przywracanie bazę danych z kopii zapasowej" +DB_RESTORE_FILE = "Przywracanie bazy danych z pliku" +DB_BUTTON_RESTORE = " Przywrócić" +DB_ACTION = "Wybierz działanie" +DB_TIPS = "Uwaga! Wszystkie działania codo pracy z bazą danych wykonujesz na własne ryzyko. Należy pamiętać, że wszelkie działania w bazie danych mogą uszkodzić istniejącą informację." +DB_BACKUP_SERVER = "Przechować kopię zapasową na serwerze" +DB_SC = "Operacja z bazą danych jest wykonana pomyślnie" + +DB_OPTIMIZE_DATABASE_SC = "Optymalizacja bazy danyzh jest wykonana pomyślnie" +DB_REPAIR_DATABASE_SC = "Odbudowa uszkodzonych tablic jest wykonana pomyślnie" + +DB_REPORT_DUMP = "Kopiowanie zapasowe bazy danych jest zakończone" +DB_REPORT_DUMP_RECOVER = "Odnowienie bazy danych z kopii zapasowej jest zakończone" +DB_REPORT_DUMP_OPTIM = "Optymaizacja bazy danych jest zakończona" +DB_REPORT_DUMP_TABLE = "Odnowienie tablic bazy danych jest zakończone" + +DB_FILE_DATA = "Data utworzenia" +DB_FILE_SIZE = "Rozmiar" +DB_FILE_NAME = "Nazwa pliku" +DB_ACTIONS = "Działanie" +DB_ACTIONS_EDIT = "Edytować" +DB_ACTIONS_DEL = "Usunąć" +DB_ACTIONS_RESTORE = "Odnowić" +DB_ACTIONS_SAVE = "Zapisz w komputerze" + +DB_REPORT_DUMP_DEL_OK = "Plik kopii zapasowej bazy danych jest usunięty" +DB_REPORT_DUMP_DEL_ER = "Nie udało się usunąć pliku kopii zapasowej bazy danych" +DB_REPORT_DUMP_ER = " Błąd. Import bazy danych nie powiódł się, ponieważ plik zrzutu jest nieobecny lub uszkodzony" + +DB_ACTIONS_RESTORE_H = "Odnowić kopię zapasową" +DB_ACTIONS_RESTORE_T = "Czy na pewno chcesz odnowić kopię zapasową bazy danych?" + +DB_ACTIONS_DELETE_H = "Usunąć plik" +DB_ACTIONS_DELETE_T = "Czy na pewno chcesz usunąć plik kopii zapasowej bazy danych?" + +DB_NO_FILES_MESS = "Obecnie nie ma plików bazy danych kopii zapasowych" diff --git a/admin/lang/pl/docs.txt b/admin/lang/pl/docs.txt new file mode 100644 index 0000000..bed7639 --- /dev/null +++ b/admin/lang/pl/docs.txt @@ -0,0 +1,279 @@ +# Język polski 02,2017 duncan + +[docs] +DOC_SUB_TITLE = "Zarządzanie dokumentami" +DOC_TIPS = "Tutaj znajduje się lista wszystkich dokumentów znajdujących się w systemie. Można wykonywać podstawowe operacje na dokumentach, takich jak:. przegląd, redagowanie, usunięcie dokumentu , a także zostawić notatkę do dowolnego dokumentu." +DOC_DATE_FORMAT = "%d.%m.%Y %H:%M" +DOC_LEGEND = "Znaczenie piktogramu" +DOC_LEGEND_EDIT = "Redagowanie dokumentu" +DOC_LEGEND_SHOW = "Przegląd strony w nowym oknie" +DOC_LEGEND_ENABLE = "Zrobić dokument aktywnym" +DOC_LEGEND_DISABLE = "Zrobić dokument nieaktywnym" +DOC_LEGEND_TEMP_DELETE = "Tymczasowo usunąć dokument (w kosz)" +DOC_LEGEND_RESTORE = "Odnowić dokument (z kosza)" +DOC_LEGEND_FINAL_DELETE = "Ostateczne usunięcie dokumentu" +DOC_CHOSE_RUB = "Wybierz rubrykę" +DOC_ID = "ID" +DOC_URL_RUB = "URL" +DOC_TITLE = "Nazwa dokumentu" +DOC_URL_TITLE = "Link (odsyłacz) do dokumentu" +DOC_IN_RUBRIK = "Rubryka" +DOC_IN_NEW = "Nowy dokument" +DOC_CREATED = "Opublikowane" +DOC_EDIT = "Odredagowane" +DOC_PRINTED = "Nadrukowane" +DOC_CLICKS = "przeglądów" +DOC_AUTHOR = "Aauthor" +DOC_ACTIONS = "Działania" +DOC_EDIT_TITLE = "Edytuj ten dokument" +DOC_CHANGE_RUBRIC = "Przenieś ten dokument do innej rubryki" +DOC_CHANGE_AUTOR = "Zmień autora dokumentu" +DOC_SHOW_TITLE = "Przegląd dokumentu (odsyłacz bez CNC)" +DOC_SHOW2_TITLE = "Przegląd dokumentu (odsyłacz z CNC)" +DOC_SHOW3_TITLE = "Document bez nazwy" +DOC_CREATE_NOTICE_TITLE = "Zostawić notatkę" +DOC_REPLY_NOTICE_TITLE = "Obejrzeć / odpowiedźieć na notatkę" +DOC_ENABLE_TITLE = "Opublikować dokument" +DOC_DISABLE_TITLE = "Usuń dokument z publikacji" +DOC_TEMPORARY_DELETE = "Włóż dokument do kosza" +DOC_RESTORE_DELETE = "Przywróć dokument z kosza" +DOC_FINAL_DELETE = "Usuń dokument" +DOC_ICON_COMMENT = "Są notatki" +DOC_ICON_PUBLIC = "Dokument zdjęto z publikacji" +DOC_ICON_RECYCLE = "Dokument przeniesiono do kosza" +DOC_SORT_TEXT = "Uporządkuj dokumenty po:" +DOC_TEMPORARY_CONFIRM = "Czy na pewno chcesz umieścić dokument do kosza?" +DOC_FINAL_CONFIRM = "Czy na pewno chcesz usunąć ten dokument?" +DOC_INSERT_LINK_TIP = "Aby wybrać żądany dokument, kliknij na przycisk "Wybierz"" +DOC_BUTTON_INSERT_LINK = "Wybierz" +DOC_BUTTON_LINK_POPUP = "Wybierz w nowym oknie" +DOC_BUTTON_ADD_DOCUMENT = "Dodać dokument" +DOC_BUTTON_ADD_DOCUMENT_NEXT = "Dodać i kontynuować redagowanie (Ctrl + S)" +DOC_BUTTON_EDIT_DOCUMENT = "Zapisz zmiany" +DOC_BUTTON_EDIT_DOCUMENT_NEXT = "Zastosuj (Ctrl + S)" +DOC_ADD_DOCUMENT = "Dodaj nowy dokument" +DOC_EDIT_DOCUMENT = "Redagowanie dokumentu" +DOC_OPTIONS = "Ustawienia dokumentu" +DOC_NAME = "Nazwa dokumentu:
(HTML & lt;title>)" +DOC_URL = "Pseudonim dokumentu:
(SEO alias) " +DOC_URL_LINK = "Podstawianie aliasów" +DOC_URL_INFO = " Aby link na dokument wyglądał, na przykład, tak:
http :
//www.domain.tld/phone/samsung/
zapisz w tym oknie: phone/samsung

Przyrostek linku jest dodawany automatycznie przy wyprowadzeniu
według ustawień określonych w pliku inc/config.php

 W tytule pozwolone jest wykorzystanie:
a-z – liter łacińskich;
а-я - znaków cyrylicy (jeśli jest to dozwolone) ;
 / - ukośnik;
- — kreska
_ -

znak podkreślenia. Tytuł linku nie powinien zawierać:
print /  lub / print /  lub / print; page-XX /  lub / page-XX /  lub / page-XX ;
Apage-XX / lub / Apage-XX /  lub / Apage-XX ;
artpage-XX /  lub / artpage-XX /  lub / artpage-XX ;
 gdzie xx - cyfry " +DOC_URL_LOG = "Wykorzystać historię aliasów, dlia przekierowaninia" +DOC_URL_LOG_T = "Zapisywać lub nie zapisywać historię aliasów dokumentu dla następnego przekierowania" +DOC_URL_LOG_RUBRIC = "Używać ustawienia rubryki" +DOC_URL_LOG_USE = "Zawsze używać" +DOC_FIELD_G_UNKNOW = "Bez grupy" +DOC_PROPERTY = "Ustawienia dokumentu" +DOC_URL_LOG_NOTUSE = "Nie wykorzystywać" +DOC_QUERIES = "Dostępne zapytania" +DOC_META_TITLE = " TITLE (TYTUŁ) – to szereg, który będzie wyświetlany na pasku tytułowym przeglądarki, znacznik ten ma istotne znaczenie dla optymizacji wyszukiwarek, dla tego system pozwala nim kierować, a także kilkoma innymi znacznikami." +DOC_META_KEYWORDS = "Słowa kluczowe:
(meta keywords) " +DOC_META_KEYWORDS_INFO = " opisują zawartość strony, magą być uwzględnione przez wyszukiwarki.

 Niektóre z tych słów muszą być obece w tekście strony. " +DOC_META_DESCRIPTION = "Opis strony:
(meta opis) " +DOC_META_DESCRIPTION_INFO = "Mały tekst, który opisuje zawartość strony, może również zostać uznany przez wyszukiwarki, wyprowadza się jako wyjaśnienie w wynikach wyszukiwania lub katalogów internetowych." +DOC_CAN_SEARCH = "Pozwól na przeszukiwanie w dokumencie:
(dla modułu wyszukiwanie) " +DOC_INDEX_TYPE = "Typ indeksowania strony":
(meta robots)" +DOC_INDEX_FOLLOW = "Indeksować i przejść za linkiem" +DOC_INDEX_NOFOLLOW = "indeksować, ale nie przechodzić za linkiem " +DOC_NOINDEX_NOFOLLOW = "Nie indeksować i nie przechodzić za linkiem " +DOC_SITEMAP_FREQ = "Częstotliwość odświeżania
sitemap.xml " +DOC_SITEMAP_FREQ_DOC = "Częstotliwość odświeżania strony" +DOC_SITEMAP_ALWAYS = "Zawsze" +DOC_SITEMAP_HOURLY = "Każdą godzinę" +DOC_SITEMAP_DAILY = "Codziennie" +DOC_SITEMAP_WEEKLY = "Co tydzień" +DOC_SITEMAP_MONTHLY = "Każdy miesiąc" +DOC_SITEMAP_YEARLY = "Rocznie" +DOC_SITEMAP_NEVER = "Nigdy" +DOC_SITEMAP_PRIORITY = "Priorytet
sitemap.xml " +DOC_SITEMAP_PRIORITY_DOC = "Priorytet tej strony w stosunku do innych stron" +DOC_SITEMAP_PRIORITY_LOW = "Najniższy priorytet" +DOC_SITEMAP_PRIORITY_MID = "Średni priorytet" +DOC_SITEMAP_PRIORITY_HIG = "Najwyższy priorytet" +DOC_START_PUBLICATION = "Rozpocznij publikowanie" +DOC_END_PUBLICATION = "Koniec publikowania" +DOC_STATUS = "Status dokumentu" +DOC_STATUS_ACTIVE = "Aktywny" +DOC_STATUS_INACTIVE = "Nieaktywny" +DOC_ADD_IN_NAVIGATION = "Dodaj podpunkt menu" +DOC_USE_NAVIGATION = "Powiązać z punktem menu" +DOC_USE_RUB_ALIAS = "Podstawienia aliasów dokumentu nadrzędnego, cel dokumentu nadrzędnego nawigacji okruszkowej." +DOC_USE_BREADCRUMB = "Powiązać z dokumentem
(może być stosowany do nawigacji okruszkowej) " +DOC_USE_LANG_PACK = " Powiązać z dokumentem z grupy językowej" +DOC_NAVIGATION_INFO = "Aby połączyć ten dokument z punktem menu, wybierz z listy istniejący punkt menu, jeśli tymczasowo nie chcesz połączyć ten dokument z punktem menu, należy pozostawić to pole puste." +DOC_MAIN_CONTENT = "Główna treść dokumentu" +DOC_MAIN_NOCONTENT = "Nie ma pola do dokumentu" +DOC_AFTER_CREATE_TITLE = "Dalshe działania" +DOC_AFTER_CREATE_INFO = "Proszę wybrać swoje dalsze działania z poniższej listy:" +DOC_EDIT_THIS_DOCUMENT = "Powrót do redagowania dokumentu" +DOC_INCLUDE_NAVIGATION = "Dodaj wygenerowany dokument do menu nawigacji" +DOC_ADD_NEW_DOCUMENT = "Dodaj nowy dokument do tej rubryki" +DOC_ADD_COPY_DOCUMENT = "Dodaj kopię dokumentu do tej rubryki" +DOC_DISPLAY_NEW_WINDOW = "Zobaczyć w nowym oknie (Ctrl + O)" +DOC_CLOSE_WINDOW = "Przejść do listy dokumentów" +DOC_CLOSE_WINDOW_RUBRIC = " Przejść do listy dokumentów należących do tej rubryki" +DOC_TO_NAVI_TITLE = "Dodawanie dokumentu do menu nawigacji" +DOC_NAVIGATION_POSITION = "Pozycja na liście" +DOC_NAVIGATION_TITLE = "Nazwa punkta menu" +DOC_TARGET = "Otwierać:" +DOC_TARGET_SELF = "w tym samym oknie" +DOC_TARGET_BLANK = "w nowym oknie" +DOC_BUTTON_ADD_MENU = "Dodać do menu" +DOC_TOP_MENU_ITEM = "Nowy punkt 1-go poziomu" +DOC_NOTICE = "Notatki do dokumentu" +DOC_NOTICE_NEW_LINK = "Dodaj nową notatkę" +DOC_NOTICE_AUTHOR = "Dodaj:" +DOC_NOTICE_DELETE_LINK = "Usuń notatkę" +DOC_ALLOW_NOTICE = "Zezwolić komentarz do notatek" +DOC_BUTTON_NOTICE = "Wykonać" +DOC_NOTICE_TITLE = "Tytuł" +DOC_NOTICE_TEXT = "Notatka" +DOC_BUTTON_ADD_NOTICE = "Dodaj notatkę" +DOC_SEND_NOTICE_INFO = "Aby dodać nową notatkę do dokumentu, proszę, wypełnij pola w poniższym formularzu." +DOC_NEW_NOTICE_TITLE = "Dodaj nową notatkę" +DOC_MAIL_BODY_CHECK = "Użytkownik %USER% dodał nowy dokument o nazwie %TITLE%".% N % Proszę sprawdzić ten dokument przed publikacją." +DOC_MAIL_SUBJECT_CHECK = "Dodano nowy dokument" +DOC_MAIL_BODY_USER = "Witamy %USER%.%N% pomyślnie utworzony pzez Pana/Panią dokument był pomyślnie dodany, Administrator otrzymał powiadomienie o sprawdzeniu, po sprawdzeniu dokumentu, zostanie on opublikowany." +DOC_MAIL_SUBJECT_USER = "Dokument był dodany, czeka na sprawdzenie" +DOC_MAIL_BODY_NOTICE = "Użytkownik % USER% dodał nową notatkę do dokumentu %N% Autoryzuj się w Panelu sterowania, a następnie kliknij na link poniżej, aby zobaczyć notatkę:% N%" %% LINK +DOC_MAIL_SUBJECT_NOTICE = "Dodano nową notatkę do dokumentu" +DOC_NEW_PAGE = "Dodać nową stronę" +DOC_CLOSE_HELP_WINDOW = "

" +DOC_HELP = "Pomoc" +DOC_VIDEO_TYPE_HELP = " Dodanie pliku wideo
Po dodaniu pliku wideo można określić szerokość i wysokość okna, aby obejrzeć wideo. Pierwsza wartość określa szerokość okna, druga - wysokość.

na przykład:

 video.avi | 300 | 300

lub video.avi | 100% | 300 " +DOC_FLASH_TYPE_HELP = " Dodanie filmu Flash
Po dodaniu filmu Flash, można określić szerokość i wysokość okna przy przeglądzie. Pierwsza wartość określa szerokość, druga – wysokość

na przykład:

flash.swf | 300 | 300

lub flash.swf | 100% | 300 " +DOC_FILE_TYPE_HELP = " Dodanie pliku
Po dodaniu pliku, można zadać nazwę linku. Dla tego po nazwie pliku należy podać znak rozpodzielczy | , a następnie wprowadźić nazwę linku

na przykład:

 file.zip | Pobierz plik " +DOC_NO_PERMISSION = "Przepraszamy, ale nie masz uprawnień do edytowania tego dokumentu." +DOC_NO_PERMISSION_RUB = "Przepraszamy, ale nie jesteś upoważniony do utworzenia dokumentu w tej rubryce." +DOC_NO_DEL_REVISION = "Przepraszamy, ale nie jesteś upoważniony do usunięcia rewizji." +DOC_NO_RES_REVISION = "Przepraszamy, ale nie jesteś upoważniony do przywrócenia rewizji." +DOC_EDIT_RUB = "Przenieść do innej rubryki" +DOC_RUBRIC = "Rubryka" +DOC_SORT_RUB = "Sortuj według rubryk" +DOC_IMAGE = "Obrazy w liście wiadomośći" +DOC_IMAGE_MAX_W = "Maksymalna szerokość" +DOC_IMAGE_MAX_H = "Maksymalna wysokość" +DOC_INTRO = "
Teaser (tekst w liście wiadomośći)" +DOC_ALIAS_CREATE = "Sformować" +DOC_ENTER_NAME = "Wybierz rubrykę, do której chcesz dodać nowy dokument." +DOC_SORT_NAME = "Proszę wybrać rubrykę." +DOC_OR = "& nbsp; lub & nbsp;" +DOC_NO_DOCS = "Dokumenty, które spełniają te kryteria, są nieobecne". +DOC_COPY = "Skopiowaniać dokument" +DOC_COPY_DOCUMENT = "Kopiowanie dokumentu" +DOC_COPY_TIP = "Proszę podać nazwę dokumentu" +DOC_ADD_NEW_LIGHT_TIP = "Aby dodać nowy dokument, wybierz rubrykę." +DOC_ADD_NEW_LIGHT_ADD = "Dodawanie dokumentu" +DOC_ADD_NEW_LIGHT_BTN = "Dodać dokument" +DOC_CHANGE_TITLE = " przeniesienie dokumentu do innej rubryki" +DOC_CHANGE_INFO = " Uwaga! Po zmianie rubryki pola, które nie zostały przeniesione, zostaną utracone!" +DOC_CHANGE_OLD_FIELD = "Pole dokumentu" +DOC_CHANGE_NEW_FIELD = "Przenieść do nowego" +DOC_CHANGE_DROP_FIELD = "- nie przenosić -" +DOC_CHANGE_CREATE_FIELD = "- stworzyć nowy -" +DOC_CHANGE_BUTTON = "zmienić" +DOC_CHANGE_AU_TITLE = "Zmiana autora dokumentu" +DOC_CHANGE_AU_INFO = " Uwaga! Przy zmianie autora, poprzedni autor może być pozbawiony prawa do edycji tego dokumentu." +DOC_CHANGE_BUTTON = "Zapisz" +DOC_IN_MENU = "do menu" +DOC_REVISSION = "Historia zmian" +DOC_REVISSION_DATA = "Data i czas modyfikacji" +DOC_REVISSION_USER = "Author" +DOC_REVISSION_VIEW = "Zobaczyć wersję" +DOC_REVISSION_RECOVER = "Przywrócić wersję" +DOC_REVISSION_RECOVER_T = "Czy na pewno chcesz przywrócić tę wersję?" +DOC_REVISSION_DELETE = "Usunąć wersję" +DOC_REVISSION_DELETE_T = "Czy na pewno chcesz usunąć tę wersję?" +DOC_REVISSION_NO_ITEMS = "Obecnie brak danych" +DOC_URL_ERROR_SYMBOL = "Nieprawidłowe znaki" +DOC_URL_ERROR_START = "zaczyna się od /" +DOC_URL_ERROR_END = "kończy się na / (przy tym przyrostek URL zaczyna się od /)" +DOC_URL_ERROR_SEGMENT = "Nieprawidłowe segmenty" +DOC_URL_ERROR_EMTY = "Nic do sprawdzenia" +DOC_URL_ERROR_DUPLICATES = "Pseudonim (nick) jest już w użyciu" +DOC_URL_H_ERROR_DUPLICATES = " Pseudonim (nick jest już w użyciu w historii aliasów " +DOC_URL_CHECK_OK = "Ten adres URL może być używany" +DOC_URL_CHECK_ER = "URL zawiera błędy:
" +DOC_REQUEST_NOT_INFO = "Dla tego zapytania nie ma opisu" +DOC_REVISION_DELETE = "Usunięto wersję dokumentu" +DOC_REVISION_RECOVER = "Przywrócono wersję dokumentu" +DOC_BREADCRUMB_BTN = "Wybierz" +DOC_BREADCRUMB_TITLE = " Nazwa linku dla nawigacji okruszkowej" +DOC_BREADCRUMB_WITH = "Pozwiązany z" +DOC_DOCUMENT_OPEN = "Dokument opublikowany" +DOC_DOCUMENT_CLOSE = "Dokument zdjęty z publikacji" +DOC_DOCUMENT_DOC = "Dokument" +DOC_DOCUMENT_ACT = "Opublikowano" +DOC_DOCUMENT_DISACT = "Usunięty z publikacji" +DOC_DOCUMENT_OPEN_ERR = "Ten dokument nie może być nieaktywny!" +DOC_DOCUMENT_OPEN_PRIVE = "Nie masz do tego prawa!" +DOC_ACTION_SELECT = "Operacje z wybranymi" +DOC_ACTION_SELECT_ACT = "Aktywny" +DOC_ACTION_SELECT_NACT = "Nieaktywny" +DOC_ACTION_SELECT_TRASH = "Tymczasowo usunąć" +DOC_ACTION_SELECT_OUTTRASH = "Przywrócić" +DOC_ACTION_SELECT_DEL = "Usunąć" +DOC_ACTION_BUTTON = "Zapisz zmiany" +DOC_CHOOSE_LANG = "Wybierz język dokumentu" +DOC_LANG_VERSION = "Wersja dokumentu w innych językach" +DOC_LINK_CHOOSE = "Wybierz dokument" +DOCUMENT_SAVED = "Dokument zapisany pomyślnie" +DOC_REV_DELETED = "Rewizje dokumentów usunięte pomyślnie" +DOC_REV_DELETED_ERR = "Nie można usunąć rewizje dokumentów.
Spróbuj ponownie." +DOC_REV_ERROR = "Błąd" +DOC_REV_SUCCESS = "Gotowe" +DOC_REV_UPDATE = "Usunięto rewizje dokumentów" +DOC_ALIASES = "Kierowanie przekierowaniami dokumentów" +DOC_ALIASES_LIST_NM = "Nazwa dokumentu" +DOC_ALIASES_LIST_RB = "Rubryka" +DOC_ALIASES_LIST_CH = "Zmieniono" +DOC_ALIASES_LIST_CR = "Ilość" +DOC_ALIASES_LIST_AT = "Działania" +DOC_ALIASES_TITLE = "Tutaj znajduje się lista wszystkich dokumentów, w których znajdują się przekierowania wewnętrzne.
Tu można wykonać podstawowe operacje na dokumentach, takich jak: przegląd, edytowanie, usuwanie przekierowania." +DOC_ALIASES_BREAD_RUB = "Rubryka" +DOC_ALIASES_BREAD_DOC = "Dokument" +DOC_ALIASES_BREAD_URL = "Główny adres URL:" +DOC_ALIASES_DOC_LIST = "Lista dokumentów z przekierowaniami" +DOC_ALIASES_ADD = "Dodaj nowe przekierowanie" +DOC_ALIASES_ADD_VAL = "Wartość przekierowania" +DOC_ALIASES_LIST = "Lista przekierowań" +DOC_ALIASES_LIST_EMPT = "Lista pusta" +DOC_ALIASES_TABL_H_URL = "Alias przekierowania" +DOC_ALIASES_TABL_H_ADD = "Dodane" +DOC_ALIASES_TABL_H_AUT = "Author" +DOC_ALIASES_TABL_CHECK = "Zaznacz tę opcję, aby usunąć" +DOC_ALIASES_GO = "Przejść po linku" +DOC_ALIASES_DEL_T = "Usunąć alias" +DOC_ALIASES_DEL_C = "Czy na pewno chcesz usunąć alias?" +DOC_ALIASES_BUTT_DEL = "Usuń" +DOC_ALIASES_BUTT_CLO = "Zamknij okno" +DOC_ALIASES_BUTT_APP = "Zastosuj" +DOC_ALIASES_BUTT_CNL = "Anuluj" +DOC_ALIASES_BUTT_SAV = "Zapisz" +DOC_ALIASES_BUTT_ADD = "Dodaj" +DOC_ALIASES_REP_OK = "Gotowe" +DOC_ALIASES_REP_OK_T = "Przekierowanie pomyślnie dodane" +DOC_ALIASES_REP_OK_T_E = "Przekierowanie pomyślnie zmienione" +DOC_ALIASES_REP_ER = "Błąd" +DOC_ALIASES_REP_ER_T = "Nie można dodać przekierowanie. Spróbuj ponownie." +DOC_ALIASES_REP_ER_T_E = "Nie udało się zaktualizować przekierowanie. Spróbuj ponownie." +DOC_RUBRIC_TMPLS = "Wybierz szablon rubryk" +DOC_RUBRIC_TMPLS_HINT = "Można ustawić dowolny szablon z tej rubryki dla dokumentu, wyprowadzenia" + +DOC_SEARCH_FIELD = "Оберіть поле" +DOC_SEARCH_FIELD_LIKE = "Містить" +DOC_SEARCH_FIELD_EQ = "Дорівнює" +DOC_SEARCH_FIELD_TEXT = "Значення" +DOC_TEMPLATE_DEFAULT = "Використовувати по замовчуванню" +DOC_SHOW_LANG = "Показати" + +// 3.2 +DOC_TABS_META = "Meta дані" +DOC_TABS_URL = "URL документа" +DOC_TABS_DATE = "Дата публікації" +DOC_TABS_OTHER = "Інші параметри" + +DOC_WITHOUT_TITLE = "Документ без назви" +DOC_SAVE_ADD = "Додав" +DOC_SAVE_EDIT = "Відредагував" +DOC_SAVE_LOG_DOC = " документ" \ No newline at end of file diff --git a/admin/lang/pl/groups.txt b/admin/lang/pl/groups.txt new file mode 100644 index 0000000..661d225 --- /dev/null +++ b/admin/lang/pl/groups.txt @@ -0,0 +1,103 @@ +# Język polski 02,2017 duncan + +[groups] +UGROUP_TITLE = "Zarządzanie grupami użytkowników" +UGROUP_TITLE2 = " Zarządzanie grupą użytkowników" +UGROUP_TITLE_MENU = "Grupy użytkowników" +UGROUP_INFO = "Oto lista wszystkich grup użytkowników w systemie. Dla każdej grupy można przypisać prawa osobiste, które umożliwiają lub ograniczają działalność z Panelu sterowania i na Publicznej częąći strony internetowej." +UGROUP_ID = "ID" +UGROUP_NAME = "Nazwa grupy" +UGROUP_COUNT = "Użytkowników w grupie" +UGROUP_ACTIONS = "Działania" +UGROUP_IN_GROUP = "Zobacz listę ludzi, którzy należą do tej grupy" +UGROUP_EDIT = "Edytuj tytuł i prawa grupy" +UGROUP_NO_PERMISSION = "Przepraszamy, ale nie masz dostatecznych praw do edycji" +UGROUP_DELETE = "Usuń tę grupę" +UGROUP_USERS_IN_GROUP = "Obecnie nie można usunąć tę grupę, ponieważ są ludzie, którzy są w tej grupie." +UGROUP_DELETE_CONFIRM = "Czy na pewno chcesz usunąć tę grupę?" +UGROUP_NO_DELETABLE = "Nie można usunąć tę grupę, ponieważ jest ona systemną". +UGROUP_NO_PERM_DELETE = "Przepraszamy, ale nie masz dostatecznych praw do usunięcia grupy." +UGROUP_NEW_GROUP = "Dodaj nową grupę" +UGROUP_NEW_NAME = "Nazwa grupy" +UGROUP_BUTTON_ADD = "Dodaj" +UGROUP_LEGEND_LINK = "Znaczenie piktogram" +UGROUP_LEGEND_EDIT = "Edytuj grupę użytkowników" +UGROUP_LEGEND_DELETE = "Usuń grupę użytkowników" +UGROUP_ENTER_NAME = "Proszę podać nazwę użytkowników" +UGROUP_WARNING_TIP = " Ważne! Bądź ostrożny, gdy przypisujesz pewne prawa dla tej grupy użytkowników. Pamiętaj, że dajesz dostęp do niektórych rubryk, można sprawić, że system jest podatny." +UGROUP_YOUR_NOT_CHANGE = " Błąd! Przepraszamy, ale nie masz uprawnień do edytowania tej grupy użytkowników." +UGROUP_NOT_EXIST = " Błąd! Niestety, ale grupa użytkowników, których szukasz, nie istnieje." +UGROUP_NO_MODULES = "Brak zainstalowanych modułów" +UGROUP_MODULES_RIGHT = "Proszę podać moduły, które będą mieć dostęp do tej grupy użytkowników." +UGROUP_CONTROL_RIGHT = "Proszę wybrać rubryki na Panelu sterowania, które będą dozwolone lub ograniczone dla tej grupy użytkowników." +UGROUP_BUTTON_SAVE = "Zapisz zmiany" +UGROUP_BUTTON_SAVE_AJAX = "Zastosuj (CTRL + S)" +UGROUP_SAVE_CONFIRM = "Czy na pewno chcesz zachować prawa dla tej grupy użytkowników?" +UGROUP_NAME_EDIT = "Edytuj nazwę grupy" +UGROUP_OR = "lub" +UGROUP_SAVED = "Prawa grupy pomyślnie zapisane" +UGROUP_SAVED_ERR = "Nie można zapisać prawa grupy.
Spróbuj ponownie." +UGROUP_ERROR = "Błąd" +UGROUP_SUCCESS = "Gotowe" +UGROUP_SAVE_MAIN = "Zmieniono uprawnienia dla grup" +UGROUP_REPORT_ADD = "Stworzono grupę użytkowników" +UGROUP_REPORT_DEL = "Usunięto grupę użytkowników" +alles = "Zezwól wszystkie prawa (Należy zachować ostrożność!) " +adminpanel = "Dostęp do Panelu sterowania" +gen_settings = " Dostęp do zarządzania ustawieniami ogólnymi systemu" +gen_settings_more = " Dostęp do zarządzania ustawieniami dodatkowymi systemu" +gen_settings_countries = " Dostęp do zarządzania listą krajów" +gen_settings_languages = "Dostęp do zarządzania językami" +logs_view = "Dostęp do przeglądania wiadomości systemowych." +logs_clear = "Dostęp do usunięcia wiadomości systemowych" +db_actions = "Dostęp do zarządzania bazą danych ( Tworzenie kopii zapasowych, odzyskiwanie, optymalizacja )" +modules_view = "Dostęp do listy modułów" +modules_admin = "Dostęp do modułów (Ustawienia, zarządzanie, wykorzystanie) " +modules_system = " Dostęp do zarządzania modułami (usunieńcie, instalacja) " +navigation_view = "Dostęp do menu nawigacyjnego" +navigation_edit = "Dostęp do zarządzania menu nawigacyjnego (Tworzenie, edycja, usuwanie) " +remark_view = "Dostęp do notatek" +remark_edit = "Dostęp do zarządzania notatkami w dokumenach (Tworzenie, edycja, usuwanie) " +document_php = "Dostęp do używania kodu PHP w dokumentach (Należy zachować ostrożność!) " +document_view = "Dostęp do listy dokumentów (prawa dostępu do dokumentów, w zależności od konfiguracji rubryki)" +document_revisions = "Dostęp do usunięcia wszystkich rewizji dokumentów" +rubric_view = "Dostęp do przeglądu listy rubryk" +rubric_edit = " Dostęp do zarządzania rubrykami (Tworzenie, edycja, usuwanie) " +rubric_php = "Dostęp do użycia kodu PHP w szablonach rubryk (Należy zachować ostrożność!) " +rubric_perms = " Dostęp do zarządzania uprawnieniami dostępu dokumentów rubryki" +rubric_code = " Dostęp do wykonywalnego kodu dla rubryk (Należy zachować ostrożność!) " +template_view = "Dostęp do listy szablonów" +template_edit = " Dostęp do zarządzania szablonami (Tworzenie, edycja, usuwanie) " +template_php = "Dostęp do użytku kodu PHP w szablonach (Należy zachować ostrożność!) " +request_view = "Dostęp do listy wniosków" +request_edit = " Dostęp do zarządzania wniaskami (Tworzenie, edycja, usuwanie) " +request_php = "Dostęp do używania kodu PHP w szablonach wniosku (Należy zachować ostrożność!) " +sysblocks_view = "Dostęp do przeglądu listy bloków systemowych" +sysblocks_edit = "Dostęp do zarządzania lokami systemowymi (Tworzenie, edycja, usuwanie) " +user_view = "Dostęp do listy użytkowników" +user_edit = "Dostęp do edycji parametrów użytkowników" +user_perms = "Dostęp do kontrolowania praw użytkownika" +group_view = "Dostęp do listy grup użytkowników" +group_edit = "Dostęp do zarządzania prawami grupy użytkowników (Tworzenie, edycja, usuwanie) " +mediapool_int = "Dostęp do menedżera plików " +mediapool_add = "Dostęp do dodawania nowych plików na serwer (w menedżerze plików) " +mediapool_del = "Dostęp do usuwania plików z serwera (w menedżerze plików) " +mediapool_finder = "Dostęp do menedżera plików (elFinder) " +cache_clear = "Dostęp do usuwania pamięci podręcznej" +cache_thumb = "Dostęp do usuwania obrazów podglądu (miniaturek) " +kłody = "Komunikaty systemowe" +cache = "Zarządzanie pamięcą podręczną" +gen = "Preferencje systemowe" +db = "Baza danych" +sysblocks = "Bloki systemowe" +Rubryki = "Rubryki" +document = "Dokumenty" +Moduły = "Moduły" +Mediapool = "Menedżery plików" +Nawigacja = "Nawigacja" +request = "Wnioski" +template = "Szablony" +uwaga = "Notatki w dokumentach" +document = "Dokumenty" +user = "Użytkownicy" +group = "Grupy użytkowników" diff --git a/admin/lang/pl/logs.txt b/admin/lang/pl/logs.txt new file mode 100644 index 0000000..0b9c5de --- /dev/null +++ b/admin/lang/pl/logs.txt @@ -0,0 +1,53 @@ +# Język polski 02,2017 duncan + +[logs] +LOGS_SUB_TITLE = "Kierowanie komunikatami systemowymi" +LOGS_TITLE = "Dziennik zdarzeń systemowych" +LOGS_TIP = "Tutaj znajduje się lista wszystkich działań podejmowanych w Panelu sterowania." +LOGS_ID = "№" +LOGS_IP = "Adres IP" +LOGS_DATE = "Data" +LOGS_USER = "Użytkownik" +LOGS_ACTION = "Działania" +LOGS_BUTTON_DELETE = "Oczyśćić dziennik" +LOGS_DELETE_CONFIRM = "Czy na pewno chcesz wyczyścić dziennika komunikatów systemowych?" +LOGS_BUTTON_EXPORT = " Export dziennika komunikatów systemowych" +LOGS_BUTTON_EXPORT_404 = "Export dziennika błędów 404" +LOGS_DATE_FORMAT = "%d.%m.%y г." +LOGS_DATE_FORMAT2 = "%H:%M" +LOGS_IN = "w" +LOGS_CLEAR = "Komunikaty systemowe pomyślnie usunięte." +LOGS_CLEAN = "Oczyścił dziennik zdarzeń" +LOGS_EXPORT = "Eksportował dziennik zdarzeń" +LOGS_404_SUB_TITLE = "Dziennik błędów 404" +LOGS_404_TITLE = " Dziennik błędów 404" +LOGS_404_TIP = "Tutaj znajduje się lista wszystkich błędów 404." +LOGS_404_ID = "№" +LOGS_404_IP = "Adres IP" +LOGS_404_DATE = "Data" +LOGS_404_ACTION = "Działania" +LOGS_404_BUTTON_DELETE = "Oczyścić dziennik" +LOGS_404_DELETE_CONFIRM = "Czy na pewno chcesz usunąć dziennik błędów 404?" +LOGS_404_BUTTON_EXPORT = "Eksport dziennika błędów" +LOGS_404_DATE_FORMAT = "%d.%m.%y г." +LOGS_404_DATE_FORMAT2 = "%H:%M" +LOGS_404_IN = "w" +LOGS_404_CLEAR = "komunikaty systemowe pomyślnie usunięte." +LOGS_404_CLEAN = "wyczyszczony dziennik błędów 404" +LOGS_404_EXPORT = "Eksportował dziennik błędów 404" +LOGS_SQL_SUB_TITLE = "Dziennik błędów MySQL" +LOGS_SQL_TITLE = " Dziennik błędów MySQL" +LOGS_SQL_TIP = "Tutaj znajduje się lista wszystkich błędów MySQL." +LOGS_SQL_ID = "№" +LOGS_SQL_IP = "Adres IP" +LOGS_SQL_DATE = "Data" +LOGS_SQL_ACTION = "Działania" +LOGS_SQL_BUTTON_DELETE = "Wyczyść dziennik błędów MySQL " +LOGS_SQL_DELETE_CONFIRM = "Czy na pewno chcesz wyczyścić dziennik błędów MySQL?" +LOGS_SQL_BUTTON_EXPORT = "Export dziennika błędów MySQL" +LOGS_SQL_DATE_FORMAT = "%d.%m.%y г." +LOGS_SQL_DATE_FORMAT2 = "%H:%M" +LOGS_SQL_IN = "in" +LOGS_SQL_CLEAR = "Dziennik błędów MySQL pomyślnie usunięty." +LOGS_SQL_CLEAN = "Wyczyszczony dziennik błędów MySQL" +LOGS_SQL_EXPORT = "Eksportowany dziennik błędów MySQL" diff --git a/admin/lang/pl/main.txt b/admin/lang/pl/main.txt new file mode 100644 index 0000000..77af7e4 --- /dev/null +++ b/admin/lang/pl/main.txt @@ -0,0 +1,271 @@ +# Język polski 02,2017 duncan + +MAIN_WELCOME = "Witamy w Panelu sterowania!" +MAIN_WELCOME_INFO = "Na stronie głównej można wybrać jedną z najczęściej wykonywanych operacji." +MAIN_PAGE = "Strona główna" +MAIN_LOGIN_INTRO = "Autoryzacja" +MAIN_LOGIN_BACK_SITE = "Powrót do strony" +MAIN_LOGIN_NAME = "Login" +MAIN_LOGIN_PASSWORD = "Hasło" +MAIN_LOGIN_BUTTON = "Wejść" +MAIN_LOGIN_REGISTER = "Rejestracja" +MAIN_LOGIN_LOST = "Zapomniałeś hasła?" +MAIN_LOGIN_HELP = "Pomoc" +MAIN_LOGIN_REMEMBER = "Pamiętaj mnie" +MAIN_LOGIN_CAP_CODE = "Kod" +MAIN_LOGIN_CAP_CODE_REF = "Obnowić kod" +MAIN_LOGIN_CAP_CODE_REFR = " Obnowić kod" +MAIN_LINK_HOME = "Menu główne" +MAIN_LINK_AUTHOR = "Wsparcie strony" +MAIN_LINK_DATABASE = "Zarządzenie bazami danych" +MAIN_LINK_NAVIGATION = " Zarządzanie menu nawigacji" +MAIN_LINK_MODULES = "Zarządzanie modułami" +MAIN_LINK_MODULES_H = "Moduły" +MAIN_LINK_SETTINGS = "Zarządzaj ustawieniami" +MAIN_LINK_SETTINGS_H = "Ustawienia" +MAIN_LINK_USERS = "Zarządzanie użytkownikami" +MAIN_LINK_TEMPLATES = "Zarządzaj szablonami" +MAIN_LINK_RUBRICS = "Zarządzanie rubrykami" +MAIN_LINK_DOCUMENT = "Zarządzanie dokumentami" +MAIN_LINK_QUERYES = "Zarządzanie wnioskami" +MAIN_LINK_GROUPS = " Zarządzanie grupami" +MAIN_LINK_LANG = "Zarządzanie językami" +MAIN_BUTTON_LOGIN = "Wejść" +MAIN_BUTTON_ADD = "Dodać" +MAIN_BUTTON_LOGOUT = "Wyjść" +MAIN_SETTINGS_EDIT_1 = "Ustawienia ogólne" +MAIN_SETTINGS_EDIT_2 = "Ustawienia zaawansowane" +MAIN_SETTINGS_EDIT_3 = " Zarządzanie krajami" +MAIN_SETTINGS_EDIT_4 = "Stworzyć kopję rezerwową BD" +MAIN_LINK_DOC_TIPS = "Tutaj znajduje się lista wszystkich dokumentów znajdujących się w systemie." +MAIN_LINK_RUBRIK_TIP = "Tutaj znajduje się lista wszystkich rubryk w systemie." +MAIN_LINK_REQUEST_TIP = "Tutaj znajduje się lista wszystkich istniejących wniosków w systemie." +MAIN_LINK_NAVI_TIP = "Tutaj znajduje się lista wszystkich menu nawigacji w systemie." +MAIN_LINK_TEMPLATES_TIP = "Tutaj znajduje się lista wszystkich szablonów używanych w systemie." +MAIN_LINK_MODULES_TIP = "Tutaj znajduje się lista wszystkich dostępnych modułów w systemie." +MAIN_LINK_SETTINGS_TIP = " Tutaj znajdują się wszystkie globalne parametry systemu." +MAIN_LINK_DB_TIP = "Tutaj można pracować z systemem bazy danych." +MAIN_LINK_USER_TIP = "Tutaj znajduje się lista wszystkich użytkowników w systemie." +MAIN_LINK_UGROUP_TIP = " Tutaj znajduje się lista wszystkich grup użytkowników w systemie." +MAIN_PAGE_TITLE = "Panel sterowania" +MAIN_LOGIN_TEXT = "Autoryzacja" +MAIN_LOGIN_TEXT2 = "Proszę podać swoje dane" +MAIN_LOGIN_CAPTCHA = "Wpisz kod" +MAIN_SELECT_LANGUAGE = "Język" +MAIN_SELECT_THEME = "Temat wystroju" +MAIN_YOUR_EMAIL = "E-mail" +MAIN_YOUR_LOGIN = "Nazwa użytkownika lub adres e-mail:" +MAIN_YOUR_PASSWORD = "Hasło" +MAIN_LINK_SITE = "Przejdź na stronę" +MAIN_LINK_HOME = "Do strony głównej" +MAIN_LINK_LOGOUT = "Wyjśćie z panelu sterowania" +MAIN_LINK_LOGOUT_QUEST = "Czy na pewno chcesz wyjść?" +MAIN_LINK_CACHE_CLEAR = "Opróżnić pamięć podręczną " +MAIN_LINK_CACHE_CLEAR_QUEST = "Czy na pewno chcesz opróżnić pamięć podręczną?" +MAIN_LINK_SITE_ON = "Włącz edytor" +MAIN_LINK_SITE_OFF = "Wyłącz edytor" +MAIN_LINK_EDIT = "Edytuj stronę" +MAIN_ADD_IN_RUB = "Dodaj nowy dokument" +MAIN_DOCUMENTS_ALL = "Lista dokumentów" +MAIN_SEARCH_DOCUMENTS = "Szukaj dokumentów" +MAIN_SORT_DOCUMENTS = "Szybki wybór " +MAIN_TIME_PERIOD = "Okres publikacji" +MAIN_TIME_START = "Początek" +MAIN_TIME_END = "Koniec" +MAIN_BUTTON_SEARCH = "Szukaj" +MAIN_TITLE_SEARCH = "Nazwa dokumentu" +MAIN_TITLE_DOC_NAME = "Nazwa dokumentu" +MAIN_TITLE_DOC_ID = "ID Dokumentu" +MAIN_SEARCH_HELP = Korzystanie z wyszukiwarki
Użyj znak & quot; + & quot; . dla wyraźnego włączenia słowa do wyszukiwarki.
Wykorzystaj znak & quot; - & quot; aby wykluczyć słowa z wyszukiwarki
obowiązkowe jest używanie spacji przed znakami & quot; + & quot; i & quot; - & quot;." +MAIN_ID_SEARCH = "ID Dokumentu" +MAIN_SELECT_RUBRIK = "W rubryce" +MAIN_ALL_RUBRUKS = "Wszystkie rubryki" +MAIN_ALL_DOCUMENTS = "Dowolny status" +MAIN_DOCUMENT_STATUS = "Status dokumentu" +MAIN_DOCUMENT_ACTIVE = "Tylko aktywny" +MAIN_DOCUMENT_INACTIVE = "Tylko nieaktywny" +MAIN_TEMP_DELETE_DOCS = "Tymczasowo usunięty" +MAIN_RESULTS_ON_PAGE = "Wyników na stronie:" +MAIN_OPEN_MEDIAPATH = "Popatrzeć na serwerze" +MAIN_NAVI_UGROUPS = "Grupy użytkowników" +MAIN_UGROUP_EDIT = "Edytuj prawa grupy" +MAIN_UGROUP_DELETE = "Usuń tę grupę" +MAIN_LOGS = "Zdarzenia systemowe" +MAIN_NAVI_MODULES = "Zarządzanie modułami" +MAIN_NAVIGATION = "Menu nawigacyjne" +MAIN_NAVIGATION_NEW = "Dodaj nowe menu" +MAIN_QUERIES = "Wnioski" +MAIN_REQUEST_NEW = "Dodaj nowy wniosek" +MAIN_RUBRIKS = "Rubryki" +MAIN_RUBRIK_NEW = "Dodaj nową rubrykę" +MAIN_RUBRIK_EDIT_FIELDS = "Edytuj polia rubryki" +MAIN_RUBRIK_EDIT_TEMPL = "Edytuj szablon rubryki" +MAIN_SETTINGS = "Preferencje systemowe" +MAIN_COUNTRY_EDIT = "Zarządzanie krajami" +MAIN_SYSBLOCKS = "Bloki systemowe" +MAIN_TEMPLATES = "Szablony" +MAIN_TEMPLATES_NEW = "Dodaj nowy szablon" +MAIN_USERS = "Użytkownicy" +MAIN_DATABASE_INFO = "Baza danych" +MAIN_NAVI_DOCUMENTS = "Dokumenty" +MAIN_BROWSE_DOCUMENTS = "Popatrzeć w dokumentach" +MAIN_USERS_LIST = "Lista użytkowników" +MAIN_USER_ADD = "Dodaj nowego użytkownika" +MAIN_SEARCH_USERS = "Szukaj użytkowników po:" +MAIN_USER_PARAMS = "Imieniu, ID, E-mail, E-mail domena" +MAIN_USER_STATUS = "Ze statusem" +MAIN_USER_STATUS_ALL = "Każdy status" +MAIN_USER_STATUS_ACTIVE = "Aktywny" +MAIN_USER_STATUS_INACTIVE = "Oczekuje aktywacji" +MAIN_USER_GROUP = "Znajduje się w grupie" +MAIN_USER_ONLINE = "Witaj" +MAIN_USER_PERM = "Status" +MAIN_ALL_USER_GROUP = "W dowolny" +MAIN_BUTTON_SEARCH_USER = "Znajdź użytkowników za parametrami" +MAIN_NO_PERMISSION = "Przepraszamy, ale nie masz prawa dostępu do następujących rozdziałów" +MAIN_LOGOUT_CONFIRM = "Czy na pewno chcesz zakończyć?" +MAIN_START_DOC_TITLE = "Najnowsze dokumenty" +MAIN_START_DOC_ID = "ID" +MAIN_START_DOC_NAME = "Nazwa" +MAIN_START_DOC_RUBRIC = "Rubryka" +MAIN_START_DOC_DATE = "Opublikowane" +MAIN_START_DOC_AUTOR = "Author" +MAIN_START_SEARCH = "Szukaj" +MAIN_START_SEARCH_T = "Szukaj dokumentu" +MAIN_START_LOGS_LOG = "Historia transakcji" +MAIN_START_LOGS_404 = "Błąd 404" +MAIN_START_LOGS_SQL = "Błąd MySQL" +MAIN_TABLE_SUCC = "Liczba pomyślnie przesłanych tablic:" +MAIN_TABLE_ERROR = "Liczba tablic z błędami:" +MAIN_SQL_FILE_ERROR = "SQL plik jest uszkodzony lub zawiera błędy w strukturze wniosków". +MAIN_RESTORE_OK = "Baza danych jest z powodzeniem odnowiona" +MAIN_NO_PERM_MODULES = "Przepraszamy, ale nie masz praw do zarządzania tym modułem" +MAIN_MP_FILE_DELETE = "Usuń plik" +MAIN_MP_DELETE_CONFIRM = "Czy na pewno chcesz usunąć plik:" +MAIN_MP_DOC_FOLDER = "Lista folderów / plików" +MAIN_MP_FILE_SIZE = "Rozmiar pliku" +MAIN_MP_FILE_DATE = "Utworzony" +MAIN_MP_ACTIONS = "Działania" +MAIN_MP_FILE_INFO = "Aby dodać plik, kliknij na jego nazwę i potem na przycisk dodać plik" +MAIN_MP_UP_LEVEL = "Przejdź do góry o jeden poziom" +MAIN_MP_CREATE_FOLDER = "Stworzyć nowy folder" +MAIN_MP_UPLOAD_FILE = "Pobierz plik" +MAIN_MP_FILE_INSERT = "Wstaw plik" +MAIN_MP_DIR_INSERT = "Wybierz folder" +MAIN_MP_SELECT_FILES = "Wybierz pliki do pobirania" +MAIN_MP_IMAGE_RESIZE = "Zmień rozmiar pobranych zdjęć" +MAIN_MP_IMAGE_WIDTH = "Szerokość" +MAIN_MP_IMAGE_HEIGHT = "Wysokość" +MAIN_BUTTON_UPLOAD = "Pobierz" +MAIN_BUTTON_WAIT = "Proszę czekać ..." +MAIN_MP_PLEASE_SELECT = "Wybierz plik" +MAIN_ADD_IN = "Wybierz rubrykę" +MAIN_GROUP_DELETE_CONFIRM = "Czy na pewno chcesz usunąć tę grupę?" +MAIN_RUBRIKS_LIST = "Lista rubryk" +MAIN_USER = "Użytkownik" +ButtonSave = "Zapisz" +MAIN_NEW_PAGE = "Dodaj nową stronę" +MAIN_BUTTON_SORT = "Zabrać" +MAIN_QUICK_MODULE = "Zarządzanie modułami" +MAIN_STAT = "Statystyka" +MAIN_STAT_SYSTEM_INFO = "Informacje o systemie" +MAIN_STAT_DOCUMENTS = "Wszystkie dokumenty" +MAIN_STAT_RUBRICS = "Wszystkie kategorie" +MAIN_STAT_QUERIES = "Wszystkie wnioski" +MAIN_STAT_TEMPLATES = "Wszystkie szablony" +MAIN_STAT_MYSQL = "Rozmiar bazy danych" +MAIN_STAT_CACHE = "Całkowity rozmiar pamięci podręcznej" +MAIN_STAT_CACHE_SHOW = "Pokaż" +MAIN_STAT_MODULES = "Zainstalowane moduły:" +MAIN_STAT_MODULES_OFF = "Wyłączone moduły" +MAIN_STAT_USERS = "Wszystkie użytkowniki" +MAIN_STAT_USERS_WAIT = "Oczekują aktywacji" +MAIN_STAT_AVE = "AVE.cms" +MAIN_STAT_DOMEN = "Domain" +MAIN_STAT_PHP = "Wersja PHP" +MAIN_STAT_MYSQL_VERSION = " Wersja MySQL:" +MAIN_STAT_CLEAR_CACHE = "Wyczyść pamięć podręczną" +MAIN_STAT_CLEAR_CACHE_FULL = "Wyczyść pamięć podręczną i sesje" +MAIN_STAT_CLEAR_THUMB = "Wyczyść miniatury" +MAIN_STAT_CLEAR_REV = "Usuwanie rewizji" +MAIN_STAT_CLEAR_COUNT = "Reset licznika na dniówki" +MAIN_ADD_FOLDER = "Podaj nazwę nowego folderu" +MAIN_NO_ADD_FOLDER = "Nie podano nazwy folderu lub czynność odwołano!" +MAIN_NO_ADD_TEMPL = "Nie podano nazwy szablonu lub czynność odwołano!" +MAIN_NO_ADD_GROUP = "Nie podano nazwy grupy lub czynność odwołano!" +MAIN_NO_ADD_RUB = "Nie podano nazwy rubryki lub czynność odwołano!" +MAIN_NO_ADD_QUERY = "Nie podano nazwy wniosku lub czynność odwołano!" +MAIN_NO_ADD_NAV = "Nie podano nazwy nawigacji lub czynność odwołano!" +MAIN_NO_ADD_BLOCK = "Nie podano nazwy systemnego bloka lub czynność odwołano!" +MAIN_NO_ADD_USER = " Nie podano nazwy użytkownika lub czynność odwołano!" +MAIN_NO_ADD_DOCS = "Nie podano nazwy dokumentu lub czynność odwołano!" +MAIN_CLEAR_CACHE_OK = "Pamięć podręczna została wyczyszczona" +MAIN_FILE_MANAGER_TITLE = "File Manager" +MAIN_FILE_MANAGER_TIP = "Wybierz żądany plik i kliknij przycisk & quot; wstawić plik & quot;" +MAIN_SVN_NEW = "Nowa wersja" +MAIN_SVN_SAIT = "Przejść na stronę" +MAIN_SVN_REPOS = " Przejść na stronę repozytorium" +MAIN_SVN_MAILTO = "Napisać list" +MAIN_SVN_LOOK = "Zobaczyć na stronie repozytorium" +MAIN_SVN_RECOM = "Zalecane jest uaktualnienie!" +MAIN_FINDER = "File Manager" +MAIN_ADD_NEW_GROUP = "Dodaj nową grupę" +MAIN_ADD_NEW_GROUP_NAME = "Nazwa grupy" +MAIN_ADD_NEW_USER = "Dodaj nowego użytkownika" +MAIN_ADD_NEW_USER_NAME = "Nazwa użytkownika" +MAIN_ADD_NEW_NAV = "Dodaj nową nawigację" +MAIN_ADD_NEW_NAV_NAME = "Nazwa nawigacji" +MAIN_ADD_NEW_TEMPL = "Dodaj nowy szablon" +MAIN_ADD_NEW_TEMPL_NAME = "Nazwa szablonu" +MAIN_ADD_NEW_REQUEST = "Dodaj nowy wniosek" +MAIN_ADD_NEW_REQUEST_NAME = "Nazwa wniosku" +MAIN_ADD_NEW_RUB = "Dodaj nową rubrykę" +MAIN_ADD_NEW_RUB_NAME = "Nazwa rubryki" +MAIN_ADD_NEW_BLOCK = "Dodaj nowy blok systemowy" +MAIN_ADD_NEW_BLOCK_NAME "Nazwa bloku systemowego:" +MAIN_USERS_LAST_TIME = "Niedawno było" +MAIN_LOGS_ID = "№" +MAIN_LOGS_IP = "Adres IP" +MAIN_LOGS_DATE = "Data" +MAIN_LOGS_USER = "Użytkownik" +MAIN_LOGS_ACTION = "Działania" +MAIN_DOC_SHOW3_TITLE = "Dokument bez nazwy" +MAIN_DOC_EDIT_TITLE = "Edytuj ten dokument" +MAIN_DOC_SHOW_TITLE = "Wyświetl dokument (link bez CNC)" +MAIN_DOC_SHOW2_TITLE = "Zobacz dokument (link z CNC)" +MAIN_ADD_DOC = "Dokument" +MAIN_ADD_RUB = "Rubrykę" +MAIN_ADD_REQ = "Wniosek" +MAIN_ADD_SYS = "Blok systemowy" +MAIN_ADD_TEM = "Szablon" +MAIN_ADD_NAV = "Nawigację" +MAIN_ADD_USR = "Użytkownika" +MAIN_ADD_GRP = "Grupę" +MAIN_BRANCHES = "Sekcje" +MAIN_SHOWHIDE = "Pokaż / Ukryj menu" +MAIN_CODEMIRROR_HELP = " Ctrl- F / Cmd-F ( Szukaj) | Ctrl-G / Cmd-G ( Znajdź następny) | Shift-Ctrl -G / shift -Cmd-G (Znajdź poprzedni) | Shift-Ctrl -F / Cmd-Option-F ( Zamień) | Shift-Ctrl -R / Shift-Cmd-Option- F (Zamień wszystkie) | F11 (Pełny ekran) " +TEMPLATES_MESSAGE = " Wiadomość: " +TEMPLATES_CACHE_SUCCESS = "Pamięć podręczna została pomyślnie usunięta" +TEMPLATES_CACHE_SUCCESS_LOG = "Pamięć podręczna została wyczyszczona" +TEMPLATES_CACHE_DB_SUCCESS = "Tablica sessions została wyczyszczona" +TEMPLATES_CACHE_DB_SUCCESS_LOG = "Tablice _sessions zostały wyczyszczone". +TEMPLATES_CACHE_CT_SUCCESS = "Skompilowane szablony usunięte". +TEMPLATES_CACHE_CT_SUCCESS_LOG = "Skompilowane szablony usunięte " +TEMPLATES_CACHE_MC_SUCCESS = "Skompilowane szablony modułów usunięte". +TEMPLATES_CACHE_MC_SUCCESS_LOG = "Skompilowane szablony modułów usunięte" +TEMPLATES_CACHE_SU_SUCCESS = "Usunięto sesji użytkowników" +TEMPLATES_CACHE_SU_SUCCESS_LOG = "Sesje użytkowników usunięte" +TEMPLATES_CACHE_SC_SUCCESS = "Pamięć podręczna zapytań SQL usunięta" +TEMPLATES_CACHE_SC_SUCCESS_LOG = "Pamięć podręczna zapytań SQL usunięta " +TEMPLATES_THUMBNAILS_SUCCESS = "Miniatury pomyślnie usunięte." +TEMPLATES_THUMBNAILS_SUCCESS_LOG = "Usunięto miniatury" +EXIT_ADMIN = "Sesja zakończona w Panelu sterowania" +LOGIN_ADMIN = "Sesja rozpoczęta w Panelu sterowania" +ERROR_ADMIN = "Błąd przy wejściu do Panelu sterowania" +WRONG_PASS = " Błąd:
Nazwa użytkownika lub hasło nieprawidłowe!" +WRONG_CAPTCHA = " Błąd:
Nieprawidłowy kod bezpieczeństwa" +oficial_site = "Strona oficjalna" +support = "Pomoc techniczna" + +// 3.1.9 +MAIN_BLOCKS = "Візуальні блоки" \ No newline at end of file diff --git a/admin/lang/pl/modules.txt b/admin/lang/pl/modules.txt new file mode 100644 index 0000000..85dcfb1 --- /dev/null +++ b/admin/lang/pl/modules.txt @@ -0,0 +1,38 @@ +# Język polski 02,2017 duncan + +[modules] +MODULES_SUB_TITLE = "Zarządzanie modułami" +MODULES_TIP = "Tutaj znajduje się lista wszystkich dostępnych modułów w systemie. Można ustawić, wyłączyć, uaktualnić którykolwiek z modułów i wykonać dodatkowe ustawienia osobiste dla każdego z modułów." +MODULES_NAME = "Nazwa modułu" +MODULES_INFO = "Informacje" +MODULES_TEMPLATE = " Szablon wyprowadzenia" +MODULES_SYSTEM_TAG = "Znacznik systemowy" +MODULES_VERSION = "Wersja" +MODULES_ACTIONS = "Działania" +MODULES_SETTINGS = "Opcje" +MODULES_SETTINGS_INFO = "Informacje" +MODULES_DELETE = " Usuń moduł" +MODULES_DELETE_CONFIRM = "Pamiętaj, że usuwając moduł z systemu, usuwasz go tylko na poziomie programu. W związku z tym w przyszłości, zawsze można zainstalować go ponownie.
Czy na pewno chcesz usunąć ten moduł?" +Modules_install = "Ustawić moduł" +MODULES_REMOVE = "Usunąć moduł z serwera" +MODULES_REINSTALL = "Ponowne zainstalowanie modułu" +MODULES_REINSTALL_CONF = "Czy na pewno chcesz ponownie zainstalować ten moduł?" +MODULES_UPDATE = "Aktualizować moduł" +MODULES_STOP = "Wyłączyć moduł" +MODULES_START = "Włącz moduł" +MODULES_BUTTON_SAVE = "Zapisz zmiany" +MODULES_LEGEND = "Znaczenie piktogramu" +MODULES_AUTHOR = "Autor modułu" +MODULES_ERROR = "Stał się błąd przy załadowaniu modułu" +MODULES_INSTALLED = "Zainstalowane moduły" +MODULES_NOT_INSTALLED = "Niezainstalowane moduły " +MODULES_SETUP = "Idź do sterowania modułem" +MODULES_NO_INSTALL = " Wiadomość:
Nie ma zainstalowanych modułów". +MODULES_NOT_INSTALL = " Wiadomość:
Nie ma nieinstalowanych modułów." +MODULES_ACTION_INSTALL = "Moduł zainstalowany" +MODULES_ACTION_ONLINE = "Moduł wączony" +MODULES_ACTION_OFFLINE = "Moduł wyłączony" +MODULES_ACTION_REINSTALL = "Moduł ponownie zainstalowany" +MODULES_ACTION_UPDATE = "Aktualizacja modułu" +MODULES_ACTION_DELETE = "Usunięto moduł z systemu" +MODULES_ACTION_REMOVE = "Usunięto z modułem serwera" diff --git a/admin/lang/pl/navigation.txt b/admin/lang/pl/navigation.txt new file mode 100644 index 0000000..44b188b --- /dev/null +++ b/admin/lang/pl/navigation.txt @@ -0,0 +1,128 @@ +# Język polski 02,2017 duncan + +[navi] +NAVI_ID = "ID" +NAVI_SUB_TITLE = "Zarządzanie menu nawigacji" +NAVI_SUB_TITLE2 = "Zarządzanie punktami menu" +NAVI_SUB_TITLE3 = "Edycja szablona menu" +NAVI_SUB_TITLE4 = "Tworzenie nowych szablonów menu" +NAVI_TIP_TEMPLATE = "Tutaj znajduje się lista wszystkich menu nawigacji w systemie. Można zmienić wyjście szablony wyprowadzenia dowolnego z dostępnych menu i dodać lub usunąć punkty menu." +NAVI_TIP_TEMPLATE2 = "Tutaj, za pomocą języka znaczników HTML, można utworzyć szablon do menu nawigacji. Można również wybrać grupę użytkowników, która będzie dostępna w tym menu nawigacji. Aby wybrać wiele grup przytrzymaj przycisk Ctrl." +NAVI_ITEMS_TIP = "Utwórz nowy punkt menu" +NAVI_NEW_MENU = "Tworzenie nowego menu" +NAVI_LIST_TIP = "Lista poniżej zawiera wszystkie elementy związane z tym menu. Pamiętaj, że maksymalny poziom włożeń nie może zawierać więcej niż 2." +NAVI_LIST = "Lista punktów menu" +NAVI_EDIT_TEMPLATE = "Edycja szablonów menu" +NAVI_EDIT_ITEMS = " Edycja szablonów menu" +NAVI_OPEN_IN_THIS = "W bieżącym oknie" +NAVI_OPEN_IN_NEW = "W nowym oknie" +NAVI_TARGET_WINDOW = "Odkryj" +NAVI_POSITION = "Pozycja" +NAVI_LINK_TO_DOCUMENT = "Link do dokumentu / pliku" +NAVI_ENTRIES_NO_ITEMS = " Wiadomość:
Obecnie niema żadnych punktów menu." +NAVI_LINK_TITLE = "Nazwa punktu menu" +NAVI_LINK_SOLUT = "Opis dla punktu menu" +NAVI_LINK_IMGID = "ID obrazku" +NAVI_LINK_IMGTL = "Wybierz obrazek" +NAVI_LINK_IMAGE = "Obrazek dla punktu menu" +NAVI_TITLE = "Nazwa menu nawigacyjnego" +NAVI_TITLE2 = "Wprowadź nazwę menu nawigacyjnego" +NAVI_BROWSE_DOCUMENTS = "Link do istniejącego dokumentu" +NAVI_ADD_SUBITEM = "Dodaj nowy element" +NAVI_BUTTON_CHANGE = "Wybierz" +NAVI_BUTTON_OPTION = "Opcje" +NAVI_BUTTON_SUBITEM = "+" +NAVI_BROWSE_MEDIAPOOL = "Link do pliku na serwerze" +NAVI_SYSTEM_TAG = "Znacznik systemowy" +NAVI_NAME = "Nazwa Menu" +NAVI_LINK_TARGET = "Znacznik, który określa rodzaj odkrycia dokumentu (w nowym lub bieżącym oknie)" +NAVI_LINK_URL = "Znacznik, który określa adres dla przejścia" +NAVI_LINK_NAME = "Znacznik, który określa nazwę odnośnika, który będzie wyświetlany w menu" +NAVI_LINK_ID = "Znacznik, który definiuje unikalny identyfikator do odnośnika" +NAVI_LINK_INACTIVE = "Oprawa nieaktywnego odnośnika" +NAVI_LINK_ACTIVE = "Oprawa aktywnego odnośnika" +NAVI_HEADER_START = "Górna część oprawy" +NAVI_FOOTER_END = "Dolna część oprawy" +NAVI_HEADER_TIP = "Na przykład, tytuł
& quot; katalog artykułów & quot;
(opcjonalnie)" +NAVI_COPY_TEMPLATE = "Kopiuj szablon menu" +NAVI_FOOTER_TIP = "Niższa część oprawy menu
(opcjonalnie)" +NAVI_DELETE = "Usuń to menu" +NAVI_DELETE_CONFIRM = "Czy na pewno chcesz usunąć to menu nawigacji?" +NAVI_HTML_START = "Początkowy kod HTML" +NAVI_HTML_END = "Ostateczny kod HTML" +NAVI_LEVEL1 = "Szablon oprawy dla głównego (pierwszego) poziomu punktów menu" +NAVI_LEVEL2 = "Szablonu oprawydla pierwszego poziomu włożonych punktów menu" +NAVI_LEVEL3 = "Szablon oprawy dla drugiego poziomu włożonych punktów" +NAVI_MARK_DELETE = "Zaznacz tę opcję, aby usunąć" +NAVI_MARK_ACTIVE = "Aby tymczasowo wyłączyć ten punkt menu, usuń zaznaczenie i kliknij & quot; Zapisz zmiany & quot" +NAVI_GROUPS = "Grupy użytkowników, dla których będzie dostępne menu" +NAVI_ACTIONS = "Działania" +NAVI_OR_BUTTON = "& nbsp; lub & nbsp;" +NAVI_BUTTON_SAVE = "Zapisz zmiany" +NAVI_BUTTON_SAVE_NEXT = "Zastosuj (CTRL + S)" +NAVI_BUTTON_ADD = "Dodaj punkt" +NAVI_BUTTON_ADD_MENU = "Tworzenie menu" +NAVI_LEGEND = "Znaczenie piktogramy" +NAVI_ENTER_NAME = "Proszę podać nazwę menu nawigacji." +NAVI_ALL = "Lista menu nawigacji" +NAVI_PRINT_TYPE = "Typ wyjśćia" +NAVI_EXPAND_ALL = "W całości (ujawnić wszystkie poziomy)" +NAVI_EXPAND_WAY = "Bieżący i rodzicielski poziomy" +NAVI_EXPAND_LEVEL = "Tylko aktualny poziom" +NAVI_MENU_NOT_FOUND = "Niema menu id =" +NAVI_SAVE = "Szablon nawigacyjny zapisany" +NAVI_SORTED = "Porządek został dodany pomyślnie" +NAVI_REPORT_NEW = "Menu nawigacyjne stworzone" +NAVI_REPORT_COPY = "Utworzono kopię menu nawigacyjnego" +NAVI_REPORT_EDIT = "Zmieniono szablon menu nawigacyjnego" +NAVI_REPORT_DEL = "Usunięte menu nawigacyjne" +NAVI_REPORT_ADDIT = "Dodać punkt menu nawigacyjnego" +NAVI_REPORT_DELIT = "Usunięto punkt menu nawigacyjnego" +NAVI_REPORT_FLEV = "Na pierwszy poziom" +NAVI_REPORT_SLEV = "Na drugi poziom" +NAVI_REPORT_TLEV = "Na trzeci poziom" +NAVI_REPORT_DEACT = "Wyłączyć punkt menu nawigacyjnego" +NAVI_REPORT_ACT = "Aktywuj punkt menu nawigacyjnego" +NAVI_REPORT_SAVED = "Szablon nawigacyjny zapisany" +NAVI_REPORT_SAVED_ERR = "Nie można zapisać szablonu nawigacyjnego.
Spróbuj ponownie." +NAVI_REPORT_ERROR = "Błąd" +NAVI_REPORT_SUCCESS = "Gotowe" +NAVI_ITEM_ON_OFF = "Włącz / Wyłącz punkt menu" +NAVI_ITEM_EDIT = "Edytuj punkt menu" +NAVI_ITEM_DELETE = "Usuń ten punkt menu" +NAVI_ITEM_DELETE_CONFIRM = "Czy na pewno chcesz usunąć ten punkt menu nawigacyjnego?" + + +// v 3.2 +NAVI_ALIAS = "Аліас" +NAVI_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" +NAVI_ACCEPT = "Цей аліас можна використовувати" +NAVI_ER_SYN = "Неправильний аліас!
Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +NAVI_ER_EXISTS = "Неправильний аліас!
Цей аліас уже прив’язаний до іншого меню" + +//from templates +NAVI_NOLINK_DOC = "Немає зв’язаного документа" +NAVI_EDIT_ITEM = "Редагування пункта меню" +NAVI_LINK_FILEDOC = "Зв’язати з документом/файлом" +NAVI_LINKED_DOC = "Зв’язаний документ" +NAVI_DEL_LINKED_DOC = "Вилучити зв’язок з документом" +NAVI_LINK_DOC = "Зв’язати з документом" +NAVI_LINK_FILE = "Зв’язати з файлом" +NAVI_NO_LINK = "Немає зв’язаного документа" +NAVI_STRUCTURE = "Структура" +NAVI_RETURN_TO_LIST = "Повернутися до списку" +NAVI_EDIT_TEMPLATE = "Редагувати шаблон" +NAVI_ITEM_ADD = "Додати пункт меню" +NAVI_OPEN_ALL = "Розкрити усе" +NAVI_CLOSE_ALL = "Згоргути усе" +NAVI_ITEM_DESCR = "Опис пункта меню" +NAVI_ITEM_IMAGE = "Зображення" +NAVI_ITEM_IMAGE_DESCR = "Зображення активне, у кінці назви зображення має бути _act" +NAVI_ITEM_IMAGE_ID = "Id зображення" +NAVI_PLACE_INSERT = "Місце вставки підрівня" +NAVI_EXAMPLE = "Приклад" +NAVI_ITEM_EVEN = "парний" +NAVI_ITEM_ODD = "непарний" +NAVI_TAG = "Тег для вставки пунктів" +NAVI_LAVEL_TEMPL = "Шаблон рівня" +NAVI_CONDITIONS = "Умови" \ No newline at end of file diff --git a/admin/lang/pl/request.txt b/admin/lang/pl/request.txt new file mode 100644 index 0000000..c9b275a --- /dev/null +++ b/admin/lang/pl/request.txt @@ -0,0 +1,188 @@ +# Język polski 02,2017 duncan + +[request] +REQUEST_ID = "ID" +REQUEST_DELETE = "Usuń wniosek" +REQUEST_DELETE_CONFIRM = "Czy na pewno chcesz usunąć ten wniosek?" +REQUEST_TITLE = "Zarządzanie wnioskami" +REQUEST_NAME = "Nazwa wniosku" +REQUEST_NAME2 = "Nazwa wniosku" +REQUEST_NAME3 = "Wprowadź nazwę wniosku" +REQUEST_CACHE = "Dodaj do pamięci podręcznej" +REQUEST_CACHE_ELEMENTS = " Dodaj do pamięci podręcznej elementy wniosku" +REQUEST_SETTINGS = "Parametr wniosku" +REQUEST_TIP = "Tutaj znajduje się lista wszystkich istniejących wniosków w systemie. Aby wykorzystać wniosek, umieść " znacznik systemowy " we właściwym miejscu na szablonie lub dokumencie". +REQUEST_EDIT_TIP = "Tutaj można edytować wniosek, zamieniw rubrykę dla uzyskania danych, szablon wyprowadzenia, a także warunki wyboru danych." +REQUEST_NEW = "Utwórz nowy wniosek" +REQUEST_EDIT = "Edytuj wniosek" +REQUEST_EDIT2 = "Edytuj wniosek" +REQUEST_SYSTEM_TAG = "Znacznik systemowy" +REQUEST_AUTHOR = "Author" +REQUEST_DATE_CREATE = "Data utworzenia" +REQUEST_ACTIONS = "Działania" +REQUEST_NO_DESCRIPTION = "Wniosek bez opisu" +REQUEST_NO_REQUST = "Wnioski nieobecne" +REQUEST_DATE_FORMAT = "%d.%m .%w r." +REQUEST_DATE_FORMAT2 = "%d.%m.% w r. w %H:%M" +REQUEST_IN = "w" +REQUEST_COPY = "Kopiuj wniosek" +REQUEST_COPY_FAILED = "Nie można skopiować wniosek" +REQUEST_PLEASE_NAME = "Proszę podać nazwę dla kopiowanego wniosku" +REQUEST_CONDITION_EDIT = "Warunki dla wniosku" +REQUEST_CONDITION_IF = "Warunki" +REQUEST_PLEASE_SELECT = "Proszę wybrać rubrykę" +REQUEST_SELECT_RUBRIK = "Wybierz rubrykę" +REQUEST_SELECT_INFO = "Czy na pewno chcesz zmienić rubrykę" +REQUEST_NEW_TIP = " Ważne! Przed utworzeniem nowego wniosku, należy wybrać rubrykę, z której będą wyświetlane dokumenty." +REQUEST_DESCRIPTION = "Opis wniosku" +REQUEST_INTERNAL_INFO = "(używane w systemie)" +REQUEST_BUTTON_COND = "Dodawanie / Edycja" +REQUEST_CONDITION = "Warunki wniosku" +REQUEST_ACTION_AFTER = "Powrót do edytowania wniosku po utworzeniu, aby dodać warunki wniosku" +REQUEST_SORT_BY = "Sortuj według właściwości dokumentu" +REQUEST_SORT_BY_NAT = "Sortuj według pola dokumentu" +REQUEST_ASC_DESC = "Według" +REQUEST_DESC = "spadania" +REQUEST_ASC = "wzrostu" +REQUEST_BY_DATE = "daty utworzenia (publikacji)" +REQUEST_BY_DATECHANGE = "Daty zmiany (dokumentu)" +REQUEST_BY_NAME = "Nazwy dokumentu" +REQUEST_BY_EDIT = "Nazwy autora" +REQUEST_BY_PRINTED = "Liczby odbitek" +REQUEST_BY_VIEWS = "Liczby wyświetleń" +REQUEST_BY_RAND = "W praypadkowym porządku (duże obciążenie)" +REQUEST_DOC_PER_PAGE = "Liczba na stronie" +REQUEST_DOC_PER_PAGE_ALL = "Wyświetlij wszystko" +REQUEST_SHOW_NAVI = "Pokaż nawigacje" +REQUEST_USE_LANG = "Tylko język użytkownika" +REQUEST_USE_WNIOSEK = "Wykorzystaj tylko GET wnioski do wykorzystania w nawigacji stronicowania" +REQUEST_TEMPLATE_WNIOSEK = "Podstawowy szablon wyglądu wniosku" +REQUEST_MAIN_CONTENT = "Znacznik systemowy, który jest odpowiedzialny za wyjśćie elementów wniosku, określonych w "elementy wniosku& quot;" +REQUEST_DOC_COUNT = "Znacznik systemowy, który jest odpowiedzialny za wyjście liczby elementów wniosku" +REQUEST_DOCITEMNUM_INFO = "Znacznik systemowy, który jest odpowiedzialny za wyjście numeru seryjnego elementu wniosku" +REQUEST_MAIN_NAVI = "Znacznik systemowy, który jest odpowiedzialny za wyjście nawigacji stronicowania dla wniosku (< 1 2 3 >)" +REQUEST_MEDIAPATH = "Znacznik systemowy, który określa ścieżki do folderu z szablonem (np: [tag:mediapath]images/logo.gif)" +REQUEST_PATH = "Znacznik systemowy, który określa korzeń instalacji" +REQUEST_TEMPLATE_ITEMS = "Szablon projektu dla elementów wniosku" +REQUEST_TEMPLATE_INFO = "W tym polu, stosując kod HTML, można określić projekt dla wewnętrznych elementów wniosku (na przykład, wygląd listy wiadomości). Wszystkie elementy zostały zaprojektowane według tego szablonu, będą cyklicznie wyświetlane w "podstawowym szablonie" wniosku, dopóki liczba elementów będzię spełniać warunki złożenia wniosku". +REQUEST_TEMPLATE_SAVED = "Wniosek pomyślnie zapisany" +REQUEST_SELECT_IN_LIST = "Proszę wybrać pole rubryki z listy poniżej" +REQUEST_RUB_INFO = "Znacznika systemowy, który jest odpowiedzialny za wyjście zawartośći pola rubryki. ID pola. Xxx-liczba znaków do wyświetlania". +REQUEST_LINK_INFO = "Znacznik systemowy, który określa odnośnik do dokumentu, na przykład < a href = "[tag:link]">  odnośnik < /a>" +REQUEST_RUBRIK_FIELD = "Znacznik systemowy pola" +REQUEST_THUMBNAIL = "Znacznik jest odpowiedzialny za tworzenie miniatury (pod warunkiem, że w szablonie pola rubryki (szablon dla wyjścia we wniosku) jest wybrane wyjście: [tag: parametr:0])" +REQUEST_FIELD_NAME = "Nazwa pola" +REQUEST_FIELD_TYPE = "Typ pola" +REQUEST_FIELD_G_UNKNOW = "Bez grupy" +REQUEST_BUTTON_ADD = "Utwórz wniosek" +REQUEST_BUTTON_ADD_NEXT = " Utwórz i kontynuuj" +REQUEST_BUTTON_SAVE = "Zapisz zmiany" +REQUEST_BUTTON_SAVE_NEXT = "Zastosuj (CTRL + S)" +REQUEST_BUTTON_CLOSE = "Zamknij okno" +REQUEST_INSERT_INFO = "Kliknij na znacznik systemowy, aby dodaćgo do szablonu" +REQUEST_CONDITIONS = "Zarządzanie warunkami wniosku" +REQUEST_CONDITION_TIP = "Tutaj można stworzyć specjalne warunki wyboru danych do wniosku. Warunki wniosku pozwalają najdokładniej określić wyjście danych o różnych parametrach." +REQUEST_NEW_CONDITION = "Dodaj nowy warunek" +REQUEST_FROM_FILED = "Wybierz z pola" +REQUEST_OPERATOR = "Gdzie znaczenie" +REQUEST_VALUE = "Znaczenie" +REQUEST_COND_SELF = "Równe" +REQUEST_COND_NOSELF = "Nie równa się" +REQUEST_COND_USE = "Zawiera znaczenie" +REQUEST_COND_NOTUSE = "Nie zawiera znaczenia" +REQUEST_COND_START = "Zaczyna się od" +REQUEST_SMALL1 = "Mniejsze lub równe" +REQUEST_BIG1 = "Większe lub równe" +REQUEST_SMALL2 = "Mniejsze" +REQUEST_BIG2 = "Większe" +REQUEST_N_COND_SELF = "Liczba jest równa" +REQUEST_N_SMALL1 = "Liczba jest mniejsza niż lub równa" +REQUEST_N_BIG1 = "Liczba jest większa niż lub równa" +REQUEST_N_SMALL2 = "Liczba mniejsza" +REQUEST_N_BIG2 = "Liczba większa" +REQUEST_SEGMENT = "Należy segmentu (przez)" +REQUEST_INTERVAL = "Należy interwału (przez)" +REQUEST_IN = "W liscie (przez)" +REQUEST_NOTIN = "Nie ma na liście (przez)" +REQUEST_ANY_NUM = "NIEBEZPIECZEŃSTWO !!! Numer we wniosku" +REQUEST_FREE = "NIEBEZPIECZEŃSTWO !!! Dowolny warunek [field] = {znaczenie}" +REQUEST_MARK_DELETE = "Odznacz warunek, aby usunąć" +REQUEST_CONR_AND = "I" +REQUEST_CONR_OR = "Lub" +REQUEST_OR = "& nbsp; lib & nbsp;" +REQUEST_VIEWS_INFO = "Znacznik systemowy, który pokazuje liczbę odsłon dokumentu" +REQUEST_COMMENTS_INFO = "Znacznik systemowy, który pokazuje liczbę komentarzy do dokumentu Uwaga! Działa tylko przy zainstalowanym module!" +REQUEST_CONTROL_FIELD = "Znacznik systemowy, który jest odpowiedzialny wyjście Panelu sterowania wnioskiem. Tylko dla rubryk z polami typu lista rozwijana" +REQUEST_CONTROL_SORT = "Znacznik systemowy, który jest odpowiedzialny za wyjście panelu sortowania według daty publikacji, tytule i liczbie przeglądów wyników wyjścia wniosku" +REQUEST_NO_DROPDOWN = "W wybranej rubrycę nie ma pola takich jak lista rozwijana" +REQUEST_ENTER_NAME = "Proszę podać nazwę tego wniosku." +REQUEST_ALL = "Lista wniosków" +REQUEST_IF_EMPTY = "Sparowany znacznik systemowy, w którym można określić szablon wyjścia przy braku wyników roboty wniosku" +REQUEST_NOT_EMPTY = "Sparowany znacznik systemowy, w którym można określić szablon wyjścia przy obecnośći wyników roboty wniosku" +REQUEST_DOCID_INFO = "Znacznik systemowy, który odpowiada identyfikatoru dokumentu" +REQUEST_DOCTITLE_INFO = " Znacznik systemowy, który odpowiada imieniu dokumentu" +REQUEST_CDOCID_INFO = "Znacznik systemowy, który odpowiada ID bieżącego dokumentu (w którym wywodzi się wniosek)" +REQUEST_DOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji dokumentu" +REQUEST_CDOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji niniejszego dokumentu (w którym wywodzi się wniosek)" +REQUEST_DOCTIME_INFO = "Znacznik systemowy, który odpowiada odpowiada dacie i godzinie publikacji dokumentu" +REQUEST_CDOCTIME_INFO = "Znacznik systemowy, który odpowiada dacie i godzinie publikacji niniejszego dokumentu (którego wywodzi się wniosek)" +REQUEST_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - wygląd konfigurowany
. Przykład: [tag: data: DMY] 
 Można używać dystrybutorów (spacja - /)" +REQUEST_CDATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - wygląd konfigurowany
. Przykład: [tag: data: DMY] 
( W którym wywodzi się wniosek)
Można używać dystrybutorów (spacja - / )". +REQUEST_DOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autorowi dokumentu" +REQUEST_DOCAUTHOR_AVATAR = "Znacznik systemowy, który odpowiada awataru autora dokumentu" +REQUEST_CDOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autoru tego dokumentu (w którym wywodzi się wniosek)" +REQUEST_SAMPLE = "Przykład" +REQUEST_HIDE_CURRENT = "Nie pokazuj we wniosku bieżący dokument" +REQUEST_ONLY_OWNER = "Tylko swoje (UserID) dokumenty" +REQUEST_CONDITION_JOIN = "Operator" +REQUEST_CONDITION_SAVE = "Zapisz warunki" +REQUEST_CONDITION_ADD = "Dodaj warunek" +REQUEST_SUCCESS = "Gotowe" +REQUEST_ERROR = "Błąd" +REQUEST_CANCEL = "Anuluj" +REQUEST_SORTED = "Porządek został dodany pomyślnie" +REQUEST_COND_MESSAGE = "Niema warunków wniosku" +REQUEST_COND_VALUE_ERR = "Puste pole znaczenia" +REQUEST_COND_NEW_ERR = "Nie można dodać nowy warunek
Spróbuj ponownie" +REQUEST_COND_NEW_SUC = "Warunek pomyślnie dodany" +REQUEST_COND_POST_OK = "Warunki pomyślnie zapisane" +REQUEST_COND_POST_ERR = "Nie można zapisać warunki wniosku
Spróbuj ponownie" +REQUEST_COND_NO_POST = "Brak danych do zapisania
Spróbuj ponownie" +REQUEST_COND_ADD_SUC = "Dodaj warunki wniosku" +REQUEST_COND_CHA_SUC = "Zmieniono warunki wniosku" +REQUEST_COND_DEL_SUC = "Usunięto warunki wniosku" +REQUEST_SAVE_CHA_SUC = "Edytowane warunki wniosku" +REQUEST_ADD_NEW_SUC = "Dodaj nowe wniosku" +REQUEST_DELETE_SUC = "Usunięto wniosek" +REQUEST_COPY_SUC = "Stworzono kopię wniosku" +REQUEST_HEADER_SELF = "Główne parametry wniosku" +REQUEST_HEADER_NAME = "Znaczenie" +REQUEST_HEADER_PARAMETR = "Parametr" +REQUEST_REPORT_ERR_TITLE = "Nie ma nazwy wniosku" +REQUEST_REPORT_ERR_TEXT = "Nie ma podstawowego szablonu wniosku" +REQUEST_REPORT_ERR_PHP = "Nie używaj kodu PHP" +REQUEST_REPORT_ERR_PHP_N = "Próba użycia kodu PHP w szablonie wniosku przy tworzeniu wniosku" +REQUEST_REPORT_ERR_PHP_E = "Próba użycia kodu PHP w szablonie wniosku" +REQUEST_REPORT_ERR_RUBRIC = "Nie wybrano rubryki" +REQUEST_BY_PARENT = "Dokumentu nadrzędnemu" +REQUEST_SHOW_STAT = "Pokaż statystyki" + + +// v 3.1.9 +REQUEST_ALIAS = "Аліас" +REQUEST_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:request:alias] замість [tag:request:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" +REQUEST_ACCEPT = "Цей Аліас можна використовувати" +REQUEST_ER_SYN = "Неправильний Аліас!
Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +REQUEST_ER_EXISTS = "Неправильний Аліас!
Цей Аліас уже прив’язано до іншого запиту" +REQUEST_HEADER_EXTERNAL = "Зовнішнє звернення" +REQUEST_EXTERNAL = "Дозволити зовнішнє звернення" +REQUEST_ONLY_AJAX = "Виконувати тільки по Ajax" + +// v 3.2 +REQUEST_PAGINATION = "Посторінкова навігація" +REQUEST_NAVI_TPL = "Шаблон посторінкової навігації" +REQUEST_OTHER = "Інше" +REQUEST_SHOW_SQL = "Показати SQL запит" +REQUEST_DOC_ON_PAGE = "Число елементів запиту на сторінці" +REQUEST_PAGES_CURENT = "Номер сторінки пагінації" +REQUEST_PAGES_TOTAL = "Загальна кількість сторінок пагінації" \ No newline at end of file diff --git a/admin/lang/pl/rubs.txt b/admin/lang/pl/rubs.txt new file mode 100644 index 0000000..d800b7b --- /dev/null +++ b/admin/lang/pl/rubs.txt @@ -0,0 +1,267 @@ +# Język polski 02,2017 duncan + +[rubs] +RUBRIK_SUB_TITLE = "Zarządzanie rubrykami" +RUBRIK_TIP = "Tutaj znajduje się lista wszystkich rubryk w systemie. Można edytować szablon rubryki, uprawnienia, usunąć rubrykę i skopiować rubrykę, aby na jej podstawie utworzyć nową." +RUBRIK_ID = "ID" +RUBRIK_NAME = "Nazwa rubryki" +RUBRIK_NAME2 = "Nazwa rubryki:" +RUBRIK_TEMPLATE_OUT = "Użyj w szablonie" +RUBRIK_TEMPLATE_OUT2 = "Użyj w szablonie" +RUBRIK_URL_PREFIX = "Przedrostek dla linków" +RUBRIK_URL_PREFIX2 = "Przedrostek dla linków" +RUBRIK_DOCS_VI ="Pokaż dokumenty na liscię" +RUBRIK_URL_PREFIX2 = "Przedrostek dla linków" +RUBRIK_COUNT_DOCS Ilosc = "Ilość dokumentów" +RUBRIK_COUNT_FIELDS = "Ilość pól" +RUBRIK_AUTHOR = "Author" +RUBRIK_ACTION = "Działania" +RUBRIK_FORMAT = "Użyj" +RUBRIK_FORMAT_TIME = "Do linku w formacie czasu" +RUBRIK_FORMAT_ID = "Do wstawienia ID dokumentu" +RUBRIK_EDIT = "Edycja pola i uprawnienia rubryki" +RUBRIK_EDIT_TMPLS = "Dodatkowe szablony" +RUBRIK_NO_VIEW = "Przepraszamy, ale nie masz uprawnień, aby zobaczyć listę rubryk". +RUBRIK_NO_CHANGE1 = "Przepraszamy, ale nie masz uprawnień do edycji pola rubryki." +RUBRIK_NO_CHANGE2 = "Przepraszamy, ale nie masz uprawnień do edycji szablonu tej rubryki." +RUBRIK_NO_CHANGE3 = "Przepraszamy, ale nie masz uprawnień do tworzenia nowyhc rubryk". +RUBRIK_EDIT_TEMPLATE = "Edycja szablonu rubryki" +RUBRIK_EDIT_CODE = "Edytuj kod wykonywalny dla rubryk" +RUBRIK_EDIT_CODE_T = "Redagowanie kodu wykonywalnego dla rubryk" +RUBRIK_EDIT_CODE_NO = "Brak dostępu do edycji kodu wykonywalnego" +RUBRIK_DELETE = "Usunąć tę rubrykę" +RUBRIK_DELETE_LEGEND = "Usuń rubrykę" +RUBRIK_DELETE_CONFIRM = "Czy na pewno chcesz usunąć tę rubrykę?" +RUBRIK_NO_PERMISSION = "Przepraszamy, ale nie wolno usunąć rubrykę". +RUBRIK_USE_DOCUMENTS = "Przepraszamy, ale nie można usunąć tę rubrykę, ponieważ zawiera ona dokumenty". +RUBRIK_MULTIPLY = "Kopiuj rubrykę" +RUBRIK_NO_MULTIPLY = "Przepraszamy, ale nie masz uprawnień do kopiowania rubryk" +RUBRIK_BUTTON_SAVE = "Zapisz zmiany" +RUBRIK_BUTTON_TEMPL = "Edytuj szablon" +RUBRIK_BUTTON_FIELDS = "Edytuj pola" +RUBRIK_BUTTON_CODE = "Edytuj kod rubryki" +RUBRIK_LEGEND = "Znaczenie piktogramu" +RUBRIK_NEW = "Utwórz nową rubrykę" +RUBRIK_NEW_TIP = "Tutaj można utworzyć nową rubrykę. Proszę podać nazwę nowej rubryki i wybrać szablon dla wyjścia". +RUBRIK_BUTTON_NEW = "Tworzenie rubryki" +RUBRIK_EDIT_FIELDS = "Zarządzanie polami i prawami dostępu do rubryki" +RUBRIK_DESCRIPTION = "Opis rubryki" +RUBRIK_NO_FIELDS = " Uwaga! Nie utworzono żadnego pola. Należy dodać co najmniej jedno pole." +RUBRIK_FIELDS_INFO = "Tutaj można utworzyć grupę pól, które będą wykorzystywane do dokumentów znajdujących się w tej rybrycę." +RUBRIK_MULTIPLY2 = "Kopiowanie rubryki" +RUBRIK_MULTIPLY_TIP = "Proszę podać nazwę i prefiks do linku do nowej rubryki" +RUBRIK_BUTTON_COPY = "Kopiuj" +RUBRIK_TEMPLATE_EDIT = "Edycja szablonu rubryki" +RUBRIK_TEMPLATE_NEW = "Utwórz szablon rubryki" +RUBRIK_TEMPLATE_SAVED = "Szablon zapisany" +RUBRIK_NO_FIELD = "W tej rubryki nie ma pola" +RUBRIK_FIELD_NAME = "Nazwa pola" +RUBRIK_FIELD_GROUP = "Grupa" +RUBRIK_FIELD_GROUP_SEL = "Wybierz grupę" +RUBRIK_FIELD_ALIAS = "Alias pola" +RUBRIK_FIELD_TYPE = "Typ pola" +RUBRIK_FIELD_UNKNOW = "Nieznane" +RUBRIK_FIELD_G_UNKNOW = "Bez grupy" +RUBRIK_POSITION = "Pozycja" +RUBRIK_NEW_FIELD = "Utwórz nowe pole dla rubryki" +RUBRIK_BUTTON_ADD = "Dodaj pole" +RUBRIK_SET_PERMISSION = "Prawo dostępu do dokumentów dla grup użytkowników" +RUBRIK_USER_GROUP = "Grupa" +RUBRIK_DOC_READ = "Przegląd" +RUBRIK_ALL_PERMISSION = "Wszystkie prawa" +RUBRIK_CREATE_DOC = "Utwórz z kontrolą" +RUBRIK_CREATE_DOC_NOW = "Utwórz bez sprawdzania" +RUBRIK_EDIT_OWN = "Edytuj swoje" +RUBRIK_EDIT_DELREV = "Zarządzanie rewizjami" +RUBRIK_EDIT_OTHER = "Edycja wszystkich" +RUBRIK_VIEW_TIP = "Zaznacz, jeśli chcesz, aby ta grupa użytkowników przeglądała dokumenty" +RUBRIK_ALL_TIP = "Zaznacz, jeśli chcesz, aby włączyć tę grupę użytkowników do wykonywania jakichkolwiek działań z dokumentami, znajdujących się w tej rybrycę." +RUBRIK_DOC_TIP = "Zaznacz, jeśli chcesz, aby włączyć tę grupę użytkowników do tworzenia dokumentów.
Uwaga!
Przed publikacją dokumentu, musi on być zweryfikowany przez Administratora" +RUBRIK_DOC_NOW_TIP = "Zaznacz, jeśli chcesz, aby włączyć tę grupę użytkowników do tworzenia dokumentów.
Uwaga! />
Wydanie dokumentu będzie wykonywane bez sprawdzania Administratorem" +RUBRIK_OWN_TIP = "Zaznacz, jeśli chcesz, aby ta grupa użytkowników edytowała tylko swoje dokumenty" +RUBRIK_OTHER_TIP = "Zaznacz, jeśli chcesz, aby ta grupa użytkowników edytowała swoje i obce dokumenty" +RUBRIK_DELREV_TIP = "Zaznacz, jeśli chcesz, aby ta grupa użytkowników pracowała z rewizjami dokumentów" +RUBRIK_BUTTON_PERM = "Zapisz uprawnienia" +RUBRIK_FIELD_DEFAULT = "Znaczenia domyślne" +RUBRIK_TEMPLATE_TIP = "Tutaj, za pomocą języka znaczników HTML, należy utworzyć szablon dla dokumentów z pełnym przeglądem" +RUBRIK_HTML = "Szablon projektu rubryki" +RUBRIK_HTML_2 = "Szablon projektu HEADER" +RUBRIK_HTML_3 = "Szablon projektu TEASER" +RUBRIK_HTML_4 = "Szablon projektu ADMIN TEASER" +RUBRIK_PHP_DENIDED = " Błąd!
Nie masz uprawnień do edytowania rubryki szablonów, ponieważ wykorzystujesz kod PHP i nie masz uprawnień do korzystania z kodu PHP." +RUBRIK_PHP_MESSAGE = "Nie używaj kodu PHP." +RUBRIK_EMPTY_MESSAGE = "Nie podano nazwę pola". +RUBRIK_INSERT_HELP = "Kliknij, aby dodać znacznik systemowy od szablonu" +RUBRIK_BUTTON_TPL = "Zapisz szablon" +RUBRIK_BUTTON_TPL_NEXT = "Zastosuj (CTRL + S)" +RUBRIK_BUTTON_TPL_CLOSE = "Zamknij" +RUBRIK_NO_RUBRIK = "Nie ma takiej rubryki!" +RUBRIK_NO_NAME = "Proszę podać nazwę rubryki" +RUBRIK_NAME_EXIST = "Niestety, ale rubryka o tej samej nazwie już istnieje. Proszę podać inną nazwę rubryki." +RUBRIK_PREFIX_EXIST = "Przepraszamy, ale z takim URL-prefiksem już istnieje. Proszę podać inny adres URL-prefiks rubryki." +RUBRIK_VIEWS_INFO = "Znacznik systemowy, który pokazuje liczbę odsłon dla dokumentu" +RUBRIK_HIDE_INFO = "Znacznik systemowy, który pozwala na ukrycie tekstu dla określonych grup użytkowników, gdzie X – numer grupy" +RUBRIK_THUMBNAIL = "Znacznik jest odpowiedzialny za tworzenie miniatury (pod warunkiem, że w szablonie pola rubryki (szablon dla wyjścia w dokumencie) wybrane jest wyjście: [tag: parametr: 0])" +RUBRIK_LINK_HOME = "Link do strony głównej strony internetowej" +RUBRIK_MARK_DELETE = "Zaznacz tę opcję, aby usunąć" +RUBRIK_MARK_DEL_ALL = "Zaznacz wszystko" +RUBRIK_CHECK_SEARCH = "Szukaj w tym polu" +RUBRIK_CHECK_NUMERIC = "Pole numeryczne" +RUBRIK_SEARCH_TIP = "Zaznacz, jeśli chcesz przeprowadzać w nim poszukiwanie (współpracuje z modułem "szukaj" wersji 2.0.2 i nowsze)" +RUBRIK_NUMERIC_TIP = "Zaznacz, jeśli jego znaczenie jest zawsze liczbą. Służy do sortowania we wnioskach" +RUBRIK_ALL = "Lista rubryk" +RUBRIK_EDIT_FIELDS_GROUPS = "Edytuj grupy pól" +RUBRIK_FIELDS_GROUPS = "Grupy pól" +RUBRIK_ENTER_NAME = "Podaj nazwę rubryki." +RUBRIK_TEMPLATE_HIDE = "Pokaż / Zwiń szablony wszystkich pól" +RUBRIK_FILED_TEMPLATE_H = "Edytuj szablon i opis pola" +RUBRIK_FILED_TEMPLATE_DESCR = "Opis pola" +RUBRIK_FILED_TEMPLATE_F = "Szablon pola" +RUBRIK_DOCID_INFO = "Znacznik systemowy, identyfikator dokumentu" +RUBRIK_DOCDATE_INFO = "Znacznik systemowy, data publikacji dokumentu" +RUBRIK_DOCTIME_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu" +RUBRIK_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: Y] " +RUBRIK_DOCAUTHOR_INFO = "Znacznik systemowy, autor dokumentu" +RUBRIK_TITLE_INFO = "Znacznik systemowy, tytuł dokumentu" +RUBRIK_PATH_INFO = "Znacznik systemowy, ścieżki do instalacji root" +RUBRIK_MEDIAPATH_INFO = "Znacznik systemowy, ścieżki do folderu projektowania" +RUBRIK_PREFIX_BAD_CHAR = "Nieprawidłowe znaki w prefiksie" +RUBRIK_FIELDS_TITLE = "Pola rubryki" +RUBRIK_FIELDS_TPL = "Szablon wyjścia pola w dokumencie" +RUBRIK_RUBRIK_TPL = "Szablonu wyjścia pola we wniosku" +RUBRIK_SORTED = "Porządek został zapisaany pomyślnie" +RUBRIK_F_SORT_TIP = "Aby usprawnić pola kliknij na krzyżyk i, przytrzymując go, przeciągnij pole" +RUBRIK_R_SORT_TIP = "Aby usprawnić rubryki, kliknij na krzyżyk i, utrzymując go, przeciągnij pole" +RUBRIK_META_GEN_TIP = "Automatycznie generować słowa kluczowe, opis dokumentu na podstawie jego treści" +RUBRIK_ALIAS_HISTORY_TIP = "Przechowywanie historii aliasów w dokumencie" +RUBRIK_MOVE = "Przemieścić" +RUBRIK_REQUEST_TPL = "Szablon wyjścia pola we wniosku" +RUBRIK_BREADCRUMB = "Znacznik systemowy nawigacji okruszkowej" +RUBRIK_CODE = "Kod wykonywalny dla rubryk" +RUBRIK_START_CODE = "Kod, który jest wykonywany przed pobraniem dokumentu" +RUBRIK_CODE_START = "Kod, który jest wykonywany przed zapisaniem dokumentu" +RUBRIK_CODE_END = "Kod, który jest wykonywany po zapisaniu dokumentu" +RUBRIK_TAGS = "Znacznik" +RUBRIK_TAGS_ID = "Znacznik systemowy ID" +RUBRIK_TAGS_ALIAS = "Znacznik systemowy Alias" +RUBRIK_HTML_T = "HTML kod szablonu" +RUBRIK_TAG_DESC = "Opis znacznika" +RUBRIK_NEW_FIEL_TITLE = "Dla pól Lista rozwijana i Multi-lista , znaczenia domyślne są pisane przez przecinek" +RUBRIK_LINK = "Połączyć rubrykę" +RUBRIK_LINK_DESC = "Ustawianie połączenia pomiędzy rubrykami, podczas dodawania dokumentów możliwe jest automatyczny zastąpienie aliasów." +RUBRIK_NOLINK = "Nie wybrane" +RUBRIK_OR = "& nbsp; lub & nbsp;" +RUBRIC_F_GROUP_TITLE = "Nazwa grupy" +RUBRIC_F_GROUP_DELETE = "Usuń grupę" +RUBRIC_F_GROUP_DELETE_H = "Czy na pewno chcesz usunąć grupę?" +RUBRIC_NO_GROUPS = "Obecnie dla tej rubryki niema żadnych grup pól" +RUBRIC_GROUP_ADD = "Dodaj grupę" +RUBRIK_NEW_GROUP = "Dodaj nową grupę" +RUBRIK_HEADER_GROUP = "Zarządzania grupami pól" +RUBRIK_TEMPLATES_TAGS = "Znacznik" +RUBRIK_TEMPLATES_TAG_DESC = "Opis znacznika" +RUBRIK_TEMPLATES_THEME_FOLDER = "Nazwa szablonu (Nazwa folderu plików dla tego szablonu)" +RUBRIK_TEMPLATES_PAGENAME = "Nazwa strony internetowej" +RUBRIK_TEMPLATES_TITLE = "Nzawa strony" +RUBRIK_TEMPLATES_KEYWORDS = "Słowa kluczowe (Meta - słowa kluczowe)" +RUBRIK_TEMPLATES_DESCRIPTION = "Opis strony (Meta - Opis)" +RUBRIK_TEMPLATES_INDEXFOLLOW = "Typ indeksowania" +RUBRIK_TEMPLATES_PATH = "Ścieżka instalacji root" +RUBRIK_TEMPLATES_MEDIAPATH = "Ścieżka do folderu z szablonem (Przykład: [tag: mediapath] images / logo.gif)" +. RUBRIK_TEMPLATES_CSS = "Kompresuje kilka css-plików w jednym. Zwraca ścieżkę
FFF. - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami nie są wymagane. Domyślne - [tag: mediapath] css / 
 Przykład: href = & quot; [tag: CSS: reset.css, style.css] & quot; " +RUBRIK_TEMPLATES_JS = "Kompresuje kilka js-plików w jeden. Zwraca ścieżkę.
FFF. - nazwy plików oddzielone przecinkami
P ścieżki do folderu z plikami nie są wymagane. Domyślne - [tag: mediapath] js / 
 Przykład: href = & quot; [tag: JS: common.js, main.js] & quot; " +RUBRIK_RUB_INFO = "Znacznik systemowy, co odpowiada za wyjście zawartości rubryki. Numer ID pola. XXX - liczba znaków do wyświetlania". +RUBRIK_SELECT_IN_LIST = "Proszę wybrać pole rubryki z poniższej listy" +RUBRIK_TEMPLATE_ITEMS = "Szablon projektu dla elementów wniosku" +RUBRIK_DOCID_INFO = "Znacznik systemowy, który odpowiada identyfikatorowi dokumentu" +RUBRIK_DOCTITLE_INFO = "Znacznik systemowy, który pasuje do imienia dokumentu" +RUBRIK_CDOCID_INFO = "Znacznik systemowy, który odpowiada identyfikatorowi bieżącego dokumentu (w którym wywodzi się wniosek)" +RUBRIK_DOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji niniejszego dokumentu" +RUBRIK_CDOCDATE_INFO = "Znacznik systemowy, który odpowiada dacie publikacji niniejszego dokumentu (w którym wywodzi się wniosek)" +RUBRIK_DOCTIME_INFO = "Znacznik systemowy, który odpowiada dacie i godzinie publikacji dokumentu" +RUBRIK_CDOCTIME_INFO = "Znacznik systemow, który odpowiada dacie i godzinie publikacji niniejszego dokumentu (w którym wywodzi się wniosek)" +RUBRIK_DATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: DMY] 
 Można używać systemów dystrybucyjnych (Spacja - /)" +RUBRIK_CDATE_INFO = "Znacznik systemowy, data i godzina publikacji dokumentu - konfigurowalny wygląd
. Przykład: [tag: data: DMY] 
(W którym wywodzi się wniosek)
Można używać systemów dystrybucyjnych (spacja - / ) " +RUBRIK_DOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autoru dokumentu" +RUBRIK_DOCAUTHOR_AVATAR = "Znacznik systemowy, który odpowiada awataru autora dokumentu" +RUBRIK_CDOCAUTHOR_INFO = "Znacznik systemowy, który odpowiada autoru tego dokumentu (w którym wywodzi się wniosek)" +RUBRIK_VIEWS_INFO = "Znacznik systemowy, który pokazuje liczbę przeglądów dokumentu" +RUBRIK_COMMENTS_INFO = "Znacznik systemowy, który pokazuje liczbę przeglądów dokumentu Uwaga! Działa tylko w module " +RUBRIK_PATH = "Znacznik systemowy, identyfikujący instalacje root" +RUBRIK_MEDIAPATH = "Znacznik systemowy, który określa ścieżki do folderu z szablonem (Przykład: [TAG: mediapath] images / logo.gif)" +RUBRIK_THUMBNAIL = "Znacznik systemowy jest odpowiedzialny za tworzenie miniatury (Pod warunkiem, że w szablonie pola rubryki (szablon dla wyjścia do wniosku) wybrany hest wyjście: [tag: parametr: 0])" +RUBRIK_ALIAS_HEAD = "Przypisywanie aliasu w polu" +RUBRIK_ALIAS_HEAD_T = "Można używać tylko łacińskich liter i cyfr
Przykład: header " +RUBRIK_ALIAS_HEAD_R = "Rubryka" +RUBRIK_ALIAS_HEAD_F = "Pole" +RUBRIK_ALIAS_ALIAS = "Alias pola" +RUBRIK_ALIAS_NAME = "Nazwa aliasa" +RUBRIK_ALIAS_BUTT = "Zapisz" +RUBRIK_ALIAS_BŁĄD = "Błąd" +RUBRIK_ALIAS_RUBID = "Nieprawidłowo podano rubrykę" +RUBRIK_ALIAS_FIELDID = "Nieprawidłowo podano pole" +RUBRIK_ALIAS_MATCH = "Nieprawidłowo podano znaczenie" +RUBRIK_ALIAS_USED = "To znaczenie jest już wykorzystywane" +RUBRIK_REPORT_QUICKSAVE = "Zakończone szybkie zapisywanie ustawień rubryk" +RUBRIK_REPORT_SORTE = "Wykonane sortowanie rubryk" +RUBRIK_REPORT_SORTE_FIELDS = "Wykonane sortowanie pól rubryki" +RUBRIK_REPORT_PERMISION = "Zmieniono prawo dostępu do dokumentów należących do rubryki" +RUBRIK_REPORT_COPY = "Utworzono kopię rubryki" +RUBRIK_REPORT_TEMPL_RUB = "Odedytowano szablon rubryki" +RUBRIK_REPORT_FIELD_EDIT = "Odedytowano pole" +RUBRIK_REPORT_FIELD_DEL = "Usunięto pole" +RUBRIK_REPORT_RUB = "Rubryki" +RUBRIK_REP_QUICKSAVE_H = "Gotowe" +RUBRIK_REP_QUICKSAVE_T = "Ustawienia rubryki zostały pomyślnie zapisane" +RUBRIK_REPORT_ADD = "Dodano rubrykę" +RUBRIK_REPORT_SAVE_TPL = "Zapisano szablon projektu rubryki" +RUBRIK_CODE_SAVED = "Kod wykonywalny dla rubryki pomyślnie zapisany" +RUBRIK_CODE_SAVED_ERR = "Nie można zapisać kod wykonywalny dla danej rubryki.
Spróbuj ponownie." +RUBRIK_CODE_BŁĄD = "Błąd" +RUBRIK_CODE_SUCCESS = "Gotowe" +RUBRIK_CODE_UPDATE = "Zmieniono kod wykonywalny dla rubryki" +RUBRIK_LOG_NEW_FIELD = "Dodano pole rubryki" +RUBRIK_LOG_DEL_RUBRIC = "Usunięto rubrykę" +RUBRIK_LOG_NEW_RUBRIC = "Utworzono rubrykę" +RUBRIK_FILDS_SAVED = "Pomyślnie zapisane" +RUBRIK_FILD_SAVED = "Pole dodane pomyślnie" +RUBRIK_FILDS_REPORT = "Zapisano pola rubryki" +RUBRIK_FILDS_BŁĄD = "Błąd" +RUBRIK_FILDS_SUCCESS = "Gotowe" +RUBRIC_BŁĄD = "Błąd" +RUBRIC_SUCCESS = "Gotowe" +RUBRIC_SAVED_PHP_ERR = "Nie używaj kodu PHP w szablonach" +RUBRIC_SAVED_TPL_ERR = "Nie można zapisać rubrykę szablonów.
Spróbuj ponownie." +RUBRIC_SAVED_TPL = "Szablon rubryki pomyślnie zapisany" +RUBRIC_SAVED_FLDTPL = "Szablon pola pomyślnie zapisany" +RUBRIK_TAG_SYSBLOCK = "Znacznik systemowy wyjśćia bloku systemowego" +RUBRIK_TAG_TEASER = "Znacznik systemowy wyjścia teaser’a" +RUBRIK_TAG_ALIAS = "Znacznik systemowy wyjścia alias’a dokumentu" +RUBRIK_TAG_REQUEST = " Znacznik systemowy wyjścia wniosku" +RUBRIC_SAVED_PERMS = "Prawo dostępu do dokumentów pomyślnie zapisane" +RUBRIK_IFELSE = "Warunki" +RUBRIK_IFELSE_1 = "Wyjście, jeśli pole nie jest puste" +RUBRIK_IFELSE_2 = "Inne wyjście, jeśli pole jest puste" +RUBRIK_SAMPLE = "Przykład" +RUBRIC_TMPLS_BUTTON = "Dodatkowe szablony rubryki" +RUBRIC_TMPLS_HEAD = "Lista dodatkowych szablonów rubryki" +RUBRIC_TMPLS_ADD = "Dodaj nowy szablon" +RUBRIC_TMPLS_ID = "ID" +RUBRIC_TMPLS_NAME = "Nazwa" +RUBRIC_TMPLS_NAME_FULL = "Nazwa szablonu projektu rubryki" +RUBRIC_TMPLS_AUTHOR = "Author" +RUBRIC_TMPLS_DATE = "Data" +RUBRIC_TMPLS_COUNT_DOCS = "Ilosc dokumentów" +RUBRIC_TMPLS_ACTIONS = "Działania" +RUBRIC_TMPLS_COPY = "Kopiuj szablon" +RUBRIC_TMPLS_COPY_TIP = "Proszę podać nazwę szablonu" +RUBRIC_TMPLS_COPY_TIP2 = "Proszę podać nazwę szablonu, który jest kopiowany" +RUBRIC_TMPLS_EDIT = "Edytuj" +RUBRIC_TMPLS_DELETE = "Usuń" +RUBRIC_TMPLS_DELETE_C = "Czy na pewno chcesz usunąć ten szablon?" +RUBRIC_TMPLS_TIP = "Można utworzyć nieograniczoną ilosc szablonów dla jednej z rubryk" +RUBRIC_TMPLS_NO_ITEMS = " Wiadomość:
Na razie nie ma żadnych dodatkowych szablonów". +RUBRIC_TMPLS_FROM = "Stworzyć kopię podstawowego szablonu" +RUBRIC_TMPLS_INNAME = "Wprowadź nazwę dla szablonu" +RUBRIC_TEMPL_REPORT = "Odedytowano dodatkowy szablon rubryki" +RUBRIC_TMPLS_LOG_DEL = "Usunięto dodatkowy szablon rubryki" diff --git a/admin/lang/pl/scripts.js b/admin/lang/pl/scripts.js new file mode 100644 index 0000000..e4b7ee2 --- /dev/null +++ b/admin/lang/pl/scripts.js @@ -0,0 +1,64 @@ +// Język polski 02,2017 duncan + +var logoutTitle = "Wyjdz z Panelu sterowania"; +var logoutConfirm = "Czy na pewno chcesz zakończyć?"; +var clearCacheTitle = "Opróżnij pamięć podręczną"; +var clearCacheConfirm = "Czy na pewno chcesz opróżnić pamięć podręczną?"; +var clearCacheSessTitle = "Czyszczenie pamięci podręcznej i sesji"; +var clearCacheSessConfirm = "Czy na pewno chcesz wyczyścić pamięć podręczną i sesji?"; +var clearThumbTitle = "Usuń miniatury"; +var clearThumbConfirm = "Czy na pewno chcesz usunąć wszystkie miniaturki obrazków
z katalogu zapisywania plików (UPLOAD_DIR)?"; +var clearRevTitle = "Usuń rewizji dokumentów"; +var clearRevConfirm = "Czy na pewno chcesz usunąć wszystkie rewizje dokumentów?"; +var clearCountTitle = "Wyzerować codzienny licznik dokumentów"; +var clearCountConfirm = "Czy na pewno chcesz wyzerować codzienny licznik dokumentów?"; +var cacheShowTitle = "Pokaż rozmiar pamięci podręcznej"; +var cacheShowConfirm = "Czy na pewno chcesz sprawdzić rozmiar pamięci podręcznej
może zająć trochę czasu."; +var ajaxErrorStatus = "Brak połączenia
Sprawdź połączenie."; +var ajaxErrorStatus404 = "Strona, której szukasz nie została odnaleziona [404]."; +var ajaxErrorStatus401 = "Żądanie nie może być spełnione
Błąd autoryzacji dla spełnienia tego żądania [401]"; +var ajaxErrorStatus500 = "Wystąpił błąd wewnętrzny
Spróbuj ponownie później [500]"; +var ajaxErrorStatusJSON = "Nieprawidłowa odpowiedź serwera
Dane nie są w formacie JSON."; +var ajaxErrorStatusTimeOut = "Limit czasu zapytania."; +var ajaxErrorStatusAbort = "Żądanie Ajax przerwane."; +var ajaxErrorStatusMess = "Błąd:
"; +var delCascadTitle = "Usuń obrazek"; +var delCascadConfirm = "Czy na pewno chcesz usunąć?"; +var saveMessageOk = "Dane zapisane"; + +//===== Date & Time Pickers =====// +$.datepicker.regional['pl'] = { + closeText: 'Zamknij', + prevText: '', + currentText: 'Dzisiaj', + monthNames: ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', + 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień' + ], + monthNamesShort: ['Sty', 'Lut', 'Mar', 'Kvi', 'Maj', 'Sze', + 'Lip', 'Sie', 'Wrs', 'Paź', 'Lis', 'Gru' + ], + dayNames: ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'], + dayNamesShort: ['niedz', 'pon', 'wt', 'śr', 'czw', 'piąt', 'sob'], + dayNamesMin: ['Ni', 'Pn', 'Wt', 'Sr', 'Cz', 'Pt', 'So'], + weekHeader: 'Nie', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' +}; +$.datepicker.setDefaults($.datepicker.regional['pl']); + +$.timepicker.regional['pl'] = { + timeOnlyTitle: 'Wybierz czas', + timeText: 'Czas', + hourText: 'Godziny', + minuteText: 'Minuty', + secondText: 'Sekundy', + millisecText: 'Milisekundy', + currentText: 'Teraz', + closeText: 'Zamknij', + ampm: false +}; +$.timepicker.setDefaults($.timepicker.regional['pl']); \ No newline at end of file diff --git a/admin/lang/pl/settings.txt b/admin/lang/pl/settings.txt new file mode 100644 index 0000000..75d04d2 --- /dev/null +++ b/admin/lang/pl/settings.txt @@ -0,0 +1,132 @@ +# Język polski 02,2017 duncan + +[settings] +SETTINGS_COUNTRIES = "Zarządzanie krajami" +SETTINGS_COUNTRIES_ALL = "Lista krajów" +SETTINGS_COUNTRY_TIP = "Proszę wybrać kraje, które będą dostępne do wyboru przy rejestracji nowych użytkowników w systemie. Pamiętaj, że obrana lista krajów może być wykorzystywana przez inne moduły w systemie." +SETTINGS_ACTIVE = "Aktywna?" +SETTINGS_COUNTRY_NAME = "Nazwa kraju" +SETTINGS_IN_EC = "Odnosi się do UE?" +SETTINGS_YES = "Tak" +SETTINGS_NO = "Nie" +SETTINGS_BUTTON_SAVE = "Zapisz zmiany" +SETTINGS_BUTTON_SAVE_AJAX = "Zastosuj (CTRL + S)" +SETTINGS_OR = "lub" +SETTINGS_MAIN_TITLE = "Zarządzanie ustawieniami ogólnymi systemu" +SETTINGS_CASE_TITLE = "Ustawienia zaawansowane" +SETTINGS_MAIN = "Ogólne ustawienia systemowe" +Settings_saved = "Ustawienia systemowe pomyślnie zapisane" +SETTINGS_SAVED_ERR = "Nie można zapisać ustawień.
Spróbuj ponownie." +SETTINGS_SAVE_INFO = "Tutaj można edytować globalne parametry systemu. Należy być maksymalnie ostrożnym i pamiętać, że nieprawidłowe ustawienia mogą sprawić, że system nie będzie działać" +SETTINGS_SAVE_CONFIRM = "Czy na pewno chcesz zapisać ustawienia systemowe?" +SETTINGS_SITE_NAME = "Nazwa strony internetowej" +SETTINGS_SITE_COUNTRY = "Kraj strony internetowej" +SETTINGS_EMAIL_SENDER = "E-mail nadawcy" +SETTINGS_EMAIL_NAME = "Imię nadawcy E-mail:" +SETTINGS_MAIL_TRANSPORT = "Metoda wysyłania poczty" +SETTINGS_MAIL = "poczta" +SETTINGS_SENDMAIL = "wyśij mail" +SETTINGS_SMTP = "SMTP" +SETTINGS_SMTP_SERVER = "Serwer SMTP" +SETTINGS_MAIL_PORT = "Port SMTP:" +SETTINGS_SMTP_NAME = "Użytkownik" +SETTINGS_SMTP_PASS = "Hasło" +SETTINGS_SMTP_ENCRYPT = "Szyfrowanie" +SETTINGS_SMTP_NOENCRYPT = "Nie" +SETTINGS_MAIL_PATH = "Ścieżki do foldera sendmail:" +SETTINGS_SYMBOL_BREAK = "Wymuszone przeniesienie po (znaków):" +SETTINGS_SYMBOL_BREAK_INFO = "Nie więcej niż 1000 zgodnie z RFC 2822" +SETTINGS_SYMBOLS = "symboli" +SETTINGS_TEXT_EMAIL = "Wiadomość do użytkownika po utworzeniu konta, gdzie" +SETTINGS_TEXT_INFO = "%NAME% - Imię użytkownika />
% HOST% - odnośnik do strony internetowej
% HASŁO% - Hasło
% EMAIL% - E-mail użytkownika
%EMAILSIGNATURE% - Podpis wiadomośći" +SETTINGS_EMAIL_FOOTER = "Tekst podpisu" +SETTINGS_ERROR_PAGE = "Strona z błędem HTTP Page 404: Nie znaleziono strony" +SETTINGS_PAGE_DEFAULT = "(domyślnie ID: 2)" +SETTINGS_TEXT_PERM = "Tekst wiadomości, jeśli użytkownik nie ma praw:" +SETTINGS_HIDDEN_TEXT = "Tekst wiadomości bez praw dostępu do informacji ukrytej znacznikiem [tag: hide: x, x] ... [/ tag: hide]" +SETTINGS_NAVI_BOX = "Kontener nawigacji stronicowanej:
Przykład: & lt; ul & gt; % s & lt; / ul & gt; " +SETTINGS_LINK_BOX = "Kontener dla elementów nawigacji stronicowanej:
Przykład: & lt; li & gt; % s & lt; / li & gt; " +SETTINGS_TOTAL_BOX = "Kontener dla tekstu przed numerami stron:
Przykład: & lt; span & gt; % s & lt; / span & gt; " +SETTINGS_ACTIVE_LINK_BOX = "Kontener dla aktywnego elementu:
Przykład: & lt; span class ="aktywny"& gt;% s & lt; / span & gt; " +SETTINGS_PAGE_SEPAR = "Kontener dla metki obecności stron:
Przykład: & lt; li & gt; % s & lt; / li & gt; " +SETTINGS_PAGE_BEFORE = "Tekst przed numerami stron:
Przykład: Strona%d od %d" +SETTINGS_PAGE_START = "Tekst odnośnika " Pierwsza& quot;:" +SETTINGS_PAGE_END = " Tekst odnośnika "Ostatnia":" +SETTINGS_PAGE_SEPARATOR = "Tekst metki codo obecnośći stron, z wyjątkiem widocznych" +SETTINGS_PAGE_NEXT = "Tekst odnośnika " następna & quot;:" +SETTINGS_PAGE_PREV = "Tekst odnośnika & quot; poprzednia & quot;:" +SETTINGS_MAIN_BREADCRUMBS = "Ustawienia wyjścia "nawigacji okruszkowej"" +SETTINGS_BREAD_BOX = "Kontener "nawigacji okruszkowej":" +SETTINGS_BREAD_SEPPARATOR = "Przegroda między linkami" +SETTINGS_BREAD_BOX_LINK = "Kontener dla linków" +SETTINGS_BREAD_BOX_LASTLINK = "Pokaż ostatni element" +SETTINGS_BREAD_SELF_BOX = "Kontener dla ostatniego elementu" +SETTINGS_DATE_FORMAT = "Format daty" +SETTINGS_TIME_FORMAT = "Format daty i czasu" +SETTINGS_CLEAR_CACHE = "Wyczyść pamięć podręczną" +SETTINGS_USE_DOCTIME = "Użyj daty publikacji dokumentów" +SETTINGS_INFO = "Dodatkowo" +SETTINGS_MAIN_SETTINGS = "Ogólne ustawienia systemowe" +SETTINGS_MAIN_MAIL = "Ustawienia poczty" +SETTINGS_MAIN_PAGENAVI = "Ustawienia wyjścia nawigacji stronicowania" +SETTINGS_NAME = "Parametr" +SETTINGS_VALUE = "Znaczenie" +SETTINGS_USE_EDITOR = "Domyślny edytor" +SETTINGS_EDITOR_ELFINDER = "Elrte i Elfinder" +SETTINGS_EDITOR_CKEDITOR = "CKEditor" +SETTINGS_ERROR = "Błąd" +SETTINGS_SUCCESS = "Gotowe" +SETTINGS_SAVE_DOP = "Zmieniono ustawienia dodatkowe systemu" +SETTINGS_SAVE_MAIN = "Zmieniono ustawienia ogólne systemu" +SETTINGS_SAVE_COUNTRY = "Zmieniono ustawienia krajów" +SETTINGS_LANG_EDIT = "Zarządzanie językami" +SETTINGS_LANG_TITLE = " Uwaga! Ustawienia języków powinne odbywać się wyraźnie przed wypełnieniem strony internetowej!" +SETTINGS_LANG_AEDIT = "Edycja" +SETTINGS_LANG_AON = "Włącz" +SETTINGS_LANG_AOFF = "Wyłącz" +SETTINGS_LANG_ADEFAULT = "Ustaw jako domyślne" +SETTINGS_LANG_ADEFAULT_HINT = "" +SETTINGS_LANG_ID = "ID" +SETTINGS_LANG_FLAG = "Proporzec" +SETTINGS_LANG_SYSTEM = "Systemowe" +SETTINGS_LANG_PREFIX = "Przedrostek" +SETTINGS_LANG_NAME = "Nazwa" +SETTINGS_LANG_DEFAULT = "Domyślny" +SETTINGS_LANG_ACTION = "Działania" +SETTINGS_LANG_ADD = "Dodaj język" +SETTINGS_LANG_SAVE = "Zapisz zmiany" +SETTINGS_REV_DELETED = "Przeglądów dokumentów usunięte pomyślnie" +SETTINGS_REV_DELETED_ERR = "Nie można usunąć przeglądu dokumentów.
Spróbuj ponownie." +SETTINGS_REV_UPDATE = "Usunięto przegląd dokumentów" +SETTINGS_COUNT_DELETED = "Licznik dokumentów na dniuwki
pomyślnie zresetowany." +SETTINGS_COUNT_DELETED_ERR = "Nie można wyczyścić licznik dokumentów />
na dniuwki.
Spróbuj ponownie." +SETTINGS_COUNT_UPDATE = "Wyczyszczono licznik dokumentów na dniuwki" +SETTINGS_CACHE_LIFETIME = "Uwaga!!! Włączono dodanie do pamięci podręcznej wniosku do ustawień systemowych. Zmiany te stają się skuteczne dopiero po upływie czasu żywotności pamięci podręcznej lub wyłączenia buforowania" + + + +// v3.2 +SETTINGS_PAGINATION = "Налаштування пагінації" +PAGINATION_ADD = "Створити шаблон пагінації" +PAGINATION_NAME = "Найменування" +PAGINATION_ACTIONS = "Дії" +PAGINATION_EDIT_HINT = "Редагувати" +PAGINATION_DELETE_HINT = "Видалити пагінацію" +PAGINATION_DEL_HINT = "Ви впевнені, що бажаєте видалити цей шаблон пагінації?" +PAGINATION_SAVED = "Шаблон пагінації успішно збережено" +PAGINATION_SAVED_ERR = "Не вдалося зберегти шаблон пагінації.
Спробуйте ще раз." +PAGINATION_ERROR = "Помилка" +PAGINATION_SUCCESS = "Виконано" + +pagination_name = "Найменування" +pagination_navigation_box = "Контейнер посторінкової навігації
Приклад: <ul class="pagination pagination-sm">%s</ul>" +pagination_link_box = "Контейнер для елемента
Приклад: <li>%s</li>" +pagination_active_link_box = "Контейнер для активного елемента
Приклад: <li class="active">%s</li>" +pagination_link_template = "Шаблон посилання елемента
[link] - посилання на сторінку
[page] - Номер сторінки для посилання
[name] - Номер сторінки
" +pagination_link_active_template = "Шаблон активного посилання елемента
[link] - посилання на сторінку
[page] - Номер сторінки для посилання
[name] - Номер сторінки
" +pagination_separator_box = "Контейнер для мітки про наявність сторінок
Приклад: <li>%s</li>" +pagination_separator_label = "Текст для мітки про наявність сторінок" +pagination_start_label = "Текст посилання “Перша”" +pagination_end_label = "Текст посилання “Остання”" +pagination_next_label = "Текст посилання “Наступна”" +pagination_prev_label = "Текст посилання “Попередня”" \ No newline at end of file diff --git a/admin/lang/pl/sysblocks.txt b/admin/lang/pl/sysblocks.txt new file mode 100644 index 0000000..6f103cc --- /dev/null +++ b/admin/lang/pl/sysblocks.txt @@ -0,0 +1,71 @@ +# Język polski 02,2017 duncan + +SYSBLOCK_HEAD = "Bloki systemowe" +SYSBLOCK_EDIT = "Kierowanie blokami systemowymi" +SYSBLOCK_EDIT_TIP = "Ta sekcja zawiera wszystkie bloki systemowe." +SYSBLOCK_ID = "id" +SYSBLOCK_NAME = "Nazwa bloku systemowego" +SYSBLOCK_HTML = "Kod bloku systemowego" +SYSBLOCK_TAGS = "Znacznik" +Tagi SYSBLOCK_TAGS_2 = "Znaczniki HTML" +SYSBLOCK_EXTERNAL = "Zezwólić zwracanie zewnętrzne za linkiem" +SYSBLOCK_EXTERNAL_H = "Zwracanie zewnętrzne za linkiem" +SYSBLOCK_EXTERNAL_GO = "Przejść" +SYSBLOCK_AJAX = "Zezwolić wykonywanie wyłącznie przez Ajax" +SYSBLOCK_AJAX_H = "wykonywane wyłącznie przez Ajax" +SYSBLOCK_VISUAL = "wizualny edytor" +SYSBLOCK_VISUAL_H = "wizualny edytor" +SYSBLOCK_MEDIAPATH = "Znacznik systemowy, drogi do folderu designu" +SYSBLOCK_BREADCRUMB = "Znacznik systemowy nawigacji okruszkowej" +SYSBLOCK_DOCID_INFO = "Znacznik systemowy, identyfiktor dokumentu" +SYSBLOCK_PATH = "Droga korzenna instalacji" +SYSBLOCK_HOME = "Link do strony głównej strony internetowej" +SYSBLOCK_AUTHOR = "Author" +SYSBLOCK_DATE = "Data stworzenia" +SYSBLOCK_TAG = "Znacznik systemowy" +SYSBLOCK_ACTIONS = "Działania" +SYSBLOCK_NO_ITEMS = " Wiadomość:
Obecnie nia ma zapisanych bloków systemowych." +SYSBLOCK_BUTTON_SAVE = "Zapisz zmiany" +SYSBLOCK_BUTTON_ADD = "Dodaj bloku systemowego" +SYSBLOCK_BUTTON_COPY = "Kopiuj" +SYSBLOCK_INSERT_H = "Dodawanie bloku systemowego" +SYSBLOCK_EDIT_H = "Edytuj bloku systemowego" +SYSBLOCK_INNAME = "Wprowadź nazwę bloku systemowego" +SYSBLOCK_ENTER_NAME = "Proszę podać bloku systemowego" +SYSBLOCK_INSERT = "Tutaj można dodać lub zmienić wybraną blok systemowy" +SYSBLOCK_LINK = "Blok systemowy dostępny jest pod adresem:" +SYSBLOCK_SAVE = "Dodaj" +SYSBLOCK_SAVEDIT = "Zapisz zmiany" +SYSBLOCK_SAVE_NEXT = "Dodać i kontynuować edycję" +SYSBLOCK_SAVEDIT_NEXT = "Zastosuj (CTRL + S)" +SYSBLOCK_INTEXT = "Blok systemowy" +SYSBLOCK_ADD = "Dodaj nowy blok systemowy" +SYSBLOCK_ADD_BUTTON = "Dodaj" +SYSBLOCK_EDIT_HINT = "Edytuj blok systemowy" +SYSBLOCK_DELETE_HINT = "Usunąć blok systemowy" +SYSBLOCK_DEL_HINT = "Czy na pewno chcesz usunąć blok systemowy?" +SYSBLOCK_LIST_LINK = "Lista bloków systemowych" +SYSBLOCK_FILE = "Plik szablonu" +SYSBLOCK_SAVED = "Blok systemowy pomyślnie sapisany." +SYSBLOCK_COPY_TITLE = "Kopiowanie bloku systemowego" +SYSBLOCK_COPY = "Kopiuj blok systemowy" +SYSBLOCK_COPY_TIP = "Proszę podać nazwę bloku systemowego" +SYSBLOCK_COPY_TIP2 = "Proszę podać nazwę bloku systemowego, który jest kopiowany" +SYSBLOCK_EXIST = "Niestety, ale blok systemowy o tej samej nazwie już istnieje" +SYSBLOCK_SQLUPDATE = "Zmieniono blok systemowy" +SYSBLOCK_SQLNEW = "Stworzono nowy blok systemowy" +SYSBLOCK_SQLDEL = "Usunięto blok systemowy" +SYSBLOCK_OR = "& nbsp; lub & nbsp;" +SYSBLOCK_SAVED = "Blok systemowy pomyślnie sapisany" +SYSBLOCK_SAVED_ERR = "Nie można zapisać blok systemowy.
Spróbuj ponownie." +SYSBLOCK_ERROR = "Błąd" +SYSBLOCK_SUCCESS = "Gotowe" + + +// v 3.2 +SYSBLOCK_DESCRIPTION = "Короткий опис" +SYSBLOCK_ALIAS = "Аліас" +SYSBLOCK_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах цих блоків" +SYSBLOCK_ACCEPT = "Цей аліас можна використовувати" +SYSBLOCK_ER_SYN = "Неправильний аліас!
Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +SYSBLOCK_ER_EXISTS = "Неправильний аліас!
Такий аліас уже прив’язаний до іншого системного блока" diff --git a/admin/lang/pl/templates.txt b/admin/lang/pl/templates.txt new file mode 100644 index 0000000..1a3e47f --- /dev/null +++ b/admin/lang/pl/templates.txt @@ -0,0 +1,108 @@ +# Język polski 02,2017 duncan + +TEMPLATES_SUB_TITLE = "Zarządzanie szablonami" +TEMPLATES_TIP1 = "Tutaj znajduje się lista wszystkich szablonów używanych w systemie. Można usuwać, edytować lub skopiować szablon do tworzenia na jego podstawie nowy". +TEMPLATES_ID = "ID" +TEMPLATES_NAME = "Nazwa szablonu" +TEMPLATES_NAME2 = "Nazwa szablonu" +TEMPLATES_NAME3 = "Wprowadź nazwę szablonu" +TEMPLATES_AUTHOR = "Author" +TEMPLATES_DATE = "Utworzony" +TEMPLATES_ACTION = "Działania" +TEMPLATES_DATE_FORMAT = "%d.%m.%y r." +TEMPLATES_DATE_FORMAT2 = "%H:%M" +TEMPLATES_IN = "w" +TEMPLATES_EDIT = "Edytuj szablon" +TEMPLATES_NO_CHANGE = "Przepraszamy, ale nie masz praw do edycji szablonu" +TEMPLATES_DELETE = "Usuń szablon" +TEMPLATES_DELETE_CONF = "Czy na pewno chcesz usunąć ten szablon?" +TEMPLATES_NO_DELETE2 = "Przepraszamy, ale nie można usunąć ten szablon, który jest wykorzystywany przez rubrykik lub moduły" +TEMPLATES_NO_DELETE3 = "Przepraszamy, ale nie masz praw do usunięcia szablonu" +TEMPLATES_COPY = "Kopiuj szablon" +TEMPLATES_NO_COPY = "Przepraszamy, ale nie masz praw do kopiowania szablonu" +TEMPLATES_LEGEND = "Znaczenie piktogramów" +TEMPLATES_COPY_TITLE = "Kopiuj szablon" +TEMPLATES_TIP2 = "Proszę podać nazwę dla kopiowanego szablonu" +TEMPLATES_TIP3 = "Proszę podać nazwę dla szablonu" +TEMPLATES_BUTTON_COPY = "Kopiuj" +TEMPLATES_ZNACZNIK_INSERT = "Kliknij na nazwę znacznika systemowego, aby dodać go w pole szablonu" +TEMPLATES_TITLE_NEW = "Tworzenie nowego szablonu" +TEMPLATES_TITLE_EDIT = "Edytuj szablon" +TEMPLATES_WARNING1 = "Proszę być ostrożnym podczas edycji szablonu i pamiętać, że błędnie podany kod może zniszczyć zewnętrzną część strony internetowej" +TEMPLATES_WARNING2 = "Tutaj można utworzyć nowy szablon ręcznie i przesłać gotową strukturę szablonu z istniejącego pliku. Pamiętaj, że pliki z gotowej struktury powinny być umieszczone w katalogu /inc/data/prefabs/templates/" +TEMPLATES_HTML = "HTML kod szablonu" +TEMPLATES_USE_PHP = "Przepraszamy, ale nie masz praw do edycji szablonu, ponieważ używa on kodu PHP" +TEMPLATES_BUTTON_SAVE = "Zapisz zmiany" +TEMPLATES_BUTTON_SAVE_NEXT = "Zastosuj (CTRL + S)" +TEMPLATES_FILE_SAVED = "Plik zapisany pomyślnie" +TEMPLATES_BUTTON_ADD = "Dodaj szablon" +TEMPLATES_BUTTON_ADD_NEXT = "Dodać i kontynuować edycję" +TEMPLATES_BUTTON_LOAD = "Pobierz" +TEMPLATES_LOAD_INFO = "Wybierz z listy plik z gotową strukturą szablonu" +TEMPLATES_EXIST = "Niestety, ale szablon o tej nazwie już istnieje" +TEMPLATES_NO_NAME = "Proszę podać nazwę szablonu" +TEMPLATES_ALL = "Lista szablonów" +TEMPLATES_OR = "  lub  " +TEMPLATES_FILE_NAME = "Nazwa pliku" +TEMPLATES_CSS_FILES = "Lista plików css" +TEMPLATES_JS_FILES = "Lista plików js" +TEMPLATES_FILES = "Menedżer plików" +TEMPLATES_EDIT_FILE = "Edycja pliku" +TEMPLATES_DEL_FILE = "Usuń plik" +TEMPLATES_ZNACZNIKS = "Znacznik" +TEMPLATES_ZNACZNIK_DESC = "Opis znacznika" +TEMPLATES_THEME_FOLDER = "Nazwa szablonu (nazwa folderu z plikami dla tego szablonu)" +TEMPLATES_FOLDER = "Folder" +TEMPLATES_PAGENAME = "Nazwa strony internetowej" +TEMPLATES_FILENAME = "Nazwa pliku" +TEMPLATES_TITLE = "Tytuł strony" +TEMPLATES_KEYWORDS = "Słowa kluczowe (Meta - słowa kluczowe)" +TEMPLATES_DESCRIPTION = "Opis strony (Meta - Opis)" +TEMPLATES_INDEXFOLLOW = "Typ indeksowania" +TEMPLATES_CANONICAL = "Strona kanoniczna –to zalecana kopia z zestawu stron o bardzo podobnej treści." +TEMPLATES_PATH = "Ścieżka instalacji root" +TEMPLATES_MEDIAPATH = "Ścieżki do folderu z szablonem (Przykład: [znacznik:mediapath]images/logo.gif)" +TEMPLATES_CSS = "Kompresuje kilka css-plików w jednym. Zwraca ścieżkę.
FFF - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami, nie jest wymagane. Domyślne - [znacznik: mediapath] css / 
 Przykład: href ="[znacznik: CSS: reset.css, style.css]"" +TEMPLATES_JS = "Kompresuje kilka js-plików w jeden. Zwraca ścieżkę.
FFF - nazwy plików oddzielone przecinkami
P - ścieżki do folderu z plikami, nie jest wymagane. Domyślne - [znacznik:mediapath]js/
 Przykład: href ="[znacznik: JS: common.js, main.js] & quot;" +TEMPLATES_MEDIAPATH = "Ścieżki do folderu z szablonem (Przykład: [znacznik: mediapath]images/logo.gif)" +TEMPLATES_MAINCONTENT = "Znacznik dla głównej treści" +TEMPLATES_QUICKFINDER = "Menu kontekstowe szybkiej nawigacji" +TEMPLATES_DOCUMENT = "Link do bieżącego dokumentu" +TEMPLATES_ALIAS = "Link do bieżącego dokumentu (Alias)" +TEMPLATES_SYSBLOCK = "Znacznik systemowy bloków systemowych" +TEMPLATES_TEASER = " Znacznik systemowe teaserńw" +TEMPLATES_PRINTLINK = "Link do " Wersja od druku"" +TEMPLATES_HOME = "Link do strony głównej strony internetowej" +TEMPLATES_BREADCRUMB = "Znacznik systemowy nawigacji okruszkowej" +TEMPLATES_VERSION = "Wyświetlanie informacji o ochronie danych" +TEMPLATES_NAVIGATION = "Menu nawigacji (xxx - numer menu)" +TEMPLATES_IF_PRINT = "Zawartość będzie wyświetlana w wersji drukowanej". +TEMPLATES_DONOT_PRINT = " Zawartość nie pojawi się w wersji drukowanej" +TEMPLATES_RUBHEADER = "Ustawiany jest w szablonie rubryki
(Szablon projektu HEADER)" +TEMPLATES_NO_ITEMS = "Obecnie nie ma żadnych plików" +TEMPLATES_CACHE_SUCCESS = "Pamięć podręczna pomyślnie oczyszczona." +TEMPLATES_CACHE_SUCCESS_LOG = "Pamięć podręczna oczyszczona " +TEMPLATES_CSS_TITLE = "Proszę być ostrożnym podczas edycji plików i pamiętać, że błędnie podany kod może zniszczyć zewnętrzną część strony internetowej" +TEMPLATES_CSS_EDITOR = "Edytor plików CSS" +TEMPLATES_JS_TITLE = "Proszę być ostrożnym podczas edycji plików i pamiętać, że błędnie podany kod może zniszczyć zewnętrzną część strony internetowej" +TEMPLATES_JS_EDITOR = "Edytor plików CSS" +TEMPLATES_REPORT_NEW = "Utworzony szablon" +TEMPLATES_REPORT_CHANGE = "Zmieniono szablon" +TEMPLATES_REPORT_PHP = "Próba użycia kodu PHP w szablonie" +TEMPLATES_REPORT_PHP_CSS = "Próba użycia kodu PHP w pliku css" +TEMPLATES_REPORT_PHP_JS = "Próba użycia kodu PHP w pliku js" +TEMPLATES_REPORT_PHP_ERR = "Nie używaj kodu PHP" +TEMPLATES_REPORT_ID_ERR = "Próba oczyszczenia głównego szablonu" +TEMPLATES_REPORT_DELETE = "Usunięto szablon" +TEMPLATES_REPORT_FILE = "Edytowany plik" +TEMPLATES_REPORT_COPY = "Utworzono kopię szablonu" +TEMPLATES_REPORT_DEL_OK = "Plik został pomyślnie usunięty" +TEMPLATES_REPORT_DEL_ER = "Nie można usunąć pliku" +TEMPLATES_REPORT_ERROR_TEXT = "Kod HTML szablonu jest pusty " +TEMPLATES_REPORT_ERROR_TITLE = "Nie zapisana – nazwa szablonu" +TEMPLATES_SAVED = "Szablon pomyślnie zapisany" +TEMPLATES_SAVED_FILE = "Plik pomyślnie zapisany" +TEMPLATES_SAVED_ERR = "Nie można zapisać szablonu.
Spróbuj ponownie." +TEMPLATES_SAVED_ERR_FILE = "Nie można zapisać pliku.
Spróbuj ponownie." +TEMPLATES_ERROR = "Błąd" +TEMPLATES_SUCCESS = "Gotowe" diff --git a/admin/lang/pl/user.txt b/admin/lang/pl/user.txt new file mode 100644 index 0000000..603d606 --- /dev/null +++ b/admin/lang/pl/user.txt @@ -0,0 +1,92 @@ +# Język polski 02,2017 duncan + +[user] +USER_SUB_TITLE = "Zarządzanie użytkownikami" +USER_TIP1 = "Tutaj znajduje się lista wszystkich użytkowników w systemie. Można edytować ustawienia użytkownika, usunąć użytkownika i przenieść użytkownika do innej grupy." +USER_ID = "ID" +USER_NAME = "Imię i nazwisko użytkownika" +USER_NAME2 = "Imię użytkownika " +USER_GROUP = "Znajduje się w grupie" +USER_STATUS_WAIT = "Oczekuje aktywacji" +USER_LAST_VISIT = "Ostatnie logowanie" +USER_REGISTER_DATE = "Data rejestracji" +USER_ACTION = "Działania" +USER_DELETE = "Usuń użytkownika" +USER_EDIT = "Edycja użytkownika" +USER_DATE_FORMAT = "%d.%m.% Y% H:% M" +USER_NO_CHANGE = "Przepraszamy, ale nie masz praw do edycji użytkowników" +USER_DELETE_CONFIRM = "Czy na pewno chcesz usunąć tego użytkownika?" +USER_LEGEND = "Znaczenie piktogramów" +USER_BUTTON_SAVE = "Zapisz zmiany" +USER_ORDERS = "Historia zamówień" +USER_DOWNLOADS = " Historia zamówień PO" +USER_MARK_DELETE = "Zaznacz aby usunąć" +USER_NEW_TITLE = "Utwórz nowego użytkownika" +USER_NEW_TIP = "Aby dodać nowego użytkownika, należy wypełnić pola odpowiednimi informacjami. Należy uważać przy wyborze grupy dla tego użytkownika. Nieprawidłowa grupa może ograniczyć dostęp użytkownika do odpowiednich sekcji strony internetowej lub odwrotnie, umożliwić dostęp do sekcji zamkniętych." +USER_EDIT_TITLE = "Edycja użytkownika" +USER_EDIT_TIP = "Tutaj można edytować ustawienia użytkownika, a także zmienić hasło i grupę użytkownika ". +USER_ERRORS = "Błąd" +USER_FIRSTNAME = "Imię" +USER_FIRSTNAME_ADD = "Wprowadź imię użytkownika" +USER_LASTNAME = "Nazwisko" +USER_EMAIL ="Adres e-mail:" +USER_NICK = "Przydomek na forum" +USER_SIGNATURE = "Podpis na forum" +USER_AVATAR = "Avatar" +USER_TAX = "Opodatkować" +USER_COMPANY = "Spółka" +USER_HOUSE_STREET = "Ulica / Numer domu" +USER_ZIP_CODE = "Kod pocztowy" +USER_CITY = "Miasto zamieszkania" +User_password = "Hasło" +USER_PASSWORD_CHANGE = "Edycja" +USER_PASSWORD_SHOW = "Pokaż hasło" +USER_YES = "Tak" +USER_NO = "Nie" +USER_COUNTRY = "Kraj" +USER_PHONE = "Telefon" +USER_FAX = "Fax" +USER_BIRTHDAY = "Data urodzenia" +USER_BIRTHDAY_FORMAT = "W formacie (DD.MM.HHHH)" +USER_NOTICE = "Dodatkowe informacje" +USER_MAIN_GROUP = "Grupa główna" +USER_SECOND_GROUP = "Grupa dodatkowa" +USER_SECOND_INFO = "Wybierz kilka grup" +USER_STATUS = "Status użytkownika" +USER_ACTIVE = "Aktywny" +USER_INACTIVE = "Nieaktywny" +USER_BUTTON_ADD = "Dodaj użytkownika" +USER_SEND_INFO = "Poinformuj użytkownika przez mail’a" +USER_MESSAGE_SUBJECT = "Temat wiadomośći" +USER_MESSAGE_TEXT = "Tekst wiadomośći" +USER_EMAIL_EXIST = "Przepraszamy, ale podany adres e-mail jest już używany w systemie." +USER_ERROR_DATEFORMAT = "Data urodzenia wymieniona w nieodpowiednim formacie." +USER_PASSWORD_SHORT = "Podane hasło jest zbyt krótkie. Proszę użyć co najmniej 5 znaków." +USER_PASSWORD_ERROR = "Pole hasła zawiera nieprawidłowe znaki." +USER_NO_EMAIL = "Pole e-mail jest puste. Proszę podać adres e-mail." +USER_NO_PASSWORD = "Pole hasła jest puste. Proszę podać swoje hasło." +USER_EMAIL_ERROR = "Pole adresu e-mail zawiera nieprawidłowe znaki, sprawdź podany adres e-mail." +USER_NO_FIRSTNAME = "Pole użytkownika jest pusta. Proszę podać nazwę użytkownika." +USER_NO_USERNAME = "Pole login użytkownika jest puste. Proszę podać login użytkownika." +USER_ERROR_FIRSTNAME = "Pole imię użytkownika zawiera nieprawidłowe znaki." +USER_ERROR_USERNAME = "Pole login zawiera nieprawidłowe znaki." +USER_NO_LASTNAME = "Pole nazwisko użytkownika jest puste. Proszę podać nazwisko użytkownika" +USER_ERROR_LASTNAME = "Pole nazwisko użytkownika zawiera nieprawidłowe znaki." +USER_MAIL_BODY1 = "Witaj %USER%,% N %% N %" +USER_MAIL_BODY2 = "Twoje konto zostało aktywowane. Proszę używać hasła dostępu dla wejęćia na stronę intwrnetową %HOST%." +USER_MAIL_FOOTER = "%NN%% Z poważaniem, %HOMEPAGENAME%%%%NN%% HOST%" +USER_MAIL_SUBJECT = "Twoje konto zostało aktywowane" +USER_MAIL_PASSWORD = "Informacja o zmianię hasła" +USER_MAIL_PASSWORD2 = "Meldujemy o zresetowaniu hasła % N% N %% Nowe hasło: %NEWPASS%" +USER_NEW_ADD = "Utwórz nowe konto" +USER_ALL = "Lista użytkowników" +USER_LOGIN = "Logowanie w systemie" +SETTINGS_NAME = "Parametr" +SETTINGS_VALUE = "Znaczenie" +USER_LIST_EMPTY = "Brak użytkowników spełniających warunki wyszukiwania.
Spróbuj zmienić warunki wyszukiwania". +USER_REPORT_ADD = "Dodawanie użytkownika" +USER_REPORT_EDIT = "Edytowanie ustawień użytkownika" +USER_REPORT_DEL = "Usunieńcię użytkownika" +USER_REPORT_GROUP = "Zmieniono grupę dla użytkownika" +USER_YOUR_NOT_CHANGE = " Błąd! Przepraszamy, ale nie masz uprawnień do edytowania tego użytkownika." +USER_WARNING_TIP = " Uwaga! Bądź ostrożny podczas edycji tego użytkownika." diff --git a/admin/lang/ru/blocks.txt b/admin/lang/ru/blocks.txt new file mode 100644 index 0000000..4cebd00 --- /dev/null +++ b/admin/lang/ru/blocks.txt @@ -0,0 +1,69 @@ +BLOCK_HEAD = "Визуальные блоки" +BLOCK_EDIT = "Управление визуальными блоками" +BLOCK_EDIT_TIP = "В данном разделе предоставлены все визуальные блоки." +BLOCK_ID = "Id" +BLOCK_NAME = "Наименование визуального блока" +BLOCK_HTML = "Код визуального блока" +BLOCK_TAGS = "Тэг" +BLOCK_TAGS_2 = "HTML Tags" + + +BLOCK_VISUAL = "Визуальный редактор" +BLOCK_VISUAL_H = "Визуальный редактор" + +BLOCK_MEDIAPATH = "Системный тег, путь к папке дизайна" +BLOCK_BREADCRUMB = "Системный тег Хлебных крошек" +BLOCK_DOCID_INFO = "Системный тег, идентификатор документа" +BLOCK_PATH = "Корневой путь установки" +BLOCK_HOME = "Ссылка на главную страницу сайта" + +BLOCK_AUTHOR = "Автор" +BLOCK_DATE = "Дата создания" +BLOCK_TAG = "Системный тег" +BLOCK_ACTIONS = "Действия" +BLOCK_NO_ITEMS = "Сообщение:
В настоящий момент нет сохраненных визуальных блоков." +BLOCK_BUTTON_SAVE = "Сохранить изменения" +BLOCK_BUTTON_ADD = "Добавить визуальный блок" +BLOCK_BUTTON_COPY = "Копировать" +BLOCK_INSERT_H = "Добавление визуального блока" +BLOCK_EDIT_H = "Редактирование визуального блока" +BLOCK_INNAME = "Введите наименование визуального блока" +BLOCK_ENTER_NAME = "Пожалуйста, укажите наименование визуального блока" +BLOCK_INSERT = "Здесь вы можите добавить или изменить выбранный вами визуальный блок" + +BLOCK_SAVE = "Добавить" +BLOCK_SAVEDIT = "Сохранить изменения" +BLOCK_SAVE_NEXT = "Добавить и продолжить редактирование" +BLOCK_SAVEDIT_NEXT = "Применить (CTRL+S)" + +BLOCK_INTEXT = "Визуальный блок" +BLOCK_ADD = "Добавить новый визуальный блок" +BLOCK_ADD_BUTTON = "Добавить" +BLOCK_EDIT_HINT = "Редактировать визуальный блок" +BLOCK_DELETE_HINT = "Удалить блок" +BLOCK_DEL_HINT = "Вы уверены, что хотите удалить визуальный блок?" +BLOCK_LIST_LINK = "Список визуальных блоков" +BLOCK_FILE = "Файл шаблона" +BLOCK_SAVED = "Блок успешно сохранен." +BLOCK_COPY_TITLE = "Копирование визуального блока" +BLOCK_COPY = "Копировать визуальный блок" +BLOCK_COPY_TIP = "Пожалуйста, укажите наименование визуального блока" +BLOCK_COPY_TIP2 = "Пожалуйста, укажите наименование для копируемого визуального блока" +BLOCK_EXIST = "Извините, но визуальный блок с таким наименованием уже существует" +BLOCK_SQLUPDATE = "Изменил блок" +BLOCK_SQLNEW = "Создал новый визуальный блок" +BLOCK_SQLDEL = "Удалил визуальный блок" +BLOCK_OR = " или " + +BLOCK_SAVED = "Визуальный блок успешно сохранен" +BLOCK_SAVED_ERR = "Не удалось сохранить визуальный блок.
Попробуйте еще раз." +BLOCK_ERROR = "Ошибка" +BLOCK_SUCCESS = "Выполнено" + +// v 3.2 +BLOCK_DESCRIPTION = "Краткое описание" +BLOCK_ALIAS = "Алиас" +BLOCK_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:BLOCK:alias] вместо [tag:BLOCK:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах данных блоков" +BLOCK_ACCEPT = "Этот алиас можно использовать" +BLOCK_ER_SYN = "Неверный алиас!
Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание и иметь длину не более 20 символов" +BLOCK_ER_EXISTS = "Неверный алиас!
Данный алиас уже привязан к другому визуальному блоку" \ No newline at end of file diff --git a/admin/lang/ru/dbactions.txt b/admin/lang/ru/dbactions.txt new file mode 100644 index 0000000..4ab8f08 --- /dev/null +++ b/admin/lang/ru/dbactions.txt @@ -0,0 +1,47 @@ +DB_SUB_TITLE = "Управление базой данных" +DB_ACTION_WARNING = "Внимание!\nВсе действия по работе с базой данных Вы выполняете на свой страх и риск.\n\nПомните, что любые действия, проводимые с базой данных, могут повредить существующую информацию.\n\nВы уверены, что хотите продолжить?\n\n" +DB_ACTION_RESET = "Внимание!\nВы пытаетесь восстановить базу данных из резервной копии. Вся существующая информация будет удалена и перезаписана.\nПожалуйста, обратите внимание, что после восстановления базы данных, Вам потребуется выполнить авторизацию снова.\n\nВы уверены, что хотите продолжить?\n\n" +DB_OPTION_LIST = "Структура базы данных" +DB_BUTTON_ACTION = "Выполнить действие" +DB_OPTIMIZE_DATABASE = "Оптимизация базы данных" +DB_OPTIMIZE_INFO = "Данная возможность позволяет увеличить производительность и уменьшить размер Вашей базы данных. Рекомендуемый интервал между оптимизациями должнен быть не менее 1 раза в неделю." +DB_REPAIR_DATABASE = "Восстановление поврежденных таблиц" +DB_REPAIR_INFO = "Данная возможность позволяет выполнить попытку восстановления поврежденных таблиц в базе данных, в случае, некорректного вывода информации на страницах сайта." +DB_BACKUP_DATABASE = "Создание резервной копии" +DB_BACKUP_INFO = "Данная возможность позволяет выполнить резервную копию как всей базы данных, так и отдельных таблиц. Пожалуйста, выберите в списке слева таблицы, для которых Вы хотите выполнить резервную копию. Для выбора нескольких таблиц зажмите клавишу CTRL." +DB_RESTORE_TITLE = "Восстановление базы данных из резервной копии" +DB_RESTORE_FILE = "Восстановление базы данных из файла" +DB_BUTTON_RESTORE = "Восстановить" +DB_ACTION = "Выберите действие" +DB_TIPS = "Внимание! Все действия по работе с базой данных Вы выполняете на свой страх и риск. Помните, что любые действия, проводимые с базой данных, могут повредить существующую информацию." +DB_BACKUP_SERVER = "Сохранить резервную копию на сервере" +DB_SC = "Операция с базой данных успешно выполнена" + +DB_OPTIMIZE_DATABASE_SC = "Оптимизация базы данных успешно выполнена" +DB_REPAIR_DATABASE_SC = "Восстановление поврежденных таблиц успешно выполнено" + +DB_REPORT_DUMP = "Выполнил резервное копирование базы данных" +DB_REPORT_DUMP_RECOVER = "Выполнил восстановление базы данных из резервной копии" +DB_REPORT_DUMP_OPTIM = "Выполнил оптимизацию базы данных" +DB_REPORT_DUMP_TABLE = "Выполнил востановление таблиц базы данных" + +DB_FILE_DATA = "Дата создания" +DB_FILE_SIZE = "Размер" +DB_FILE_NAME = "Наименование файла" +DB_ACTIONS = "Дейтсвия" +DB_ACTIONS_EDIT = "Редактировать" +DB_ACTIONS_DEL = "Удалить" +DB_ACTIONS_RESTORE = "Востановить" +DB_ACTIONS_SAVE = "Сохранить на компьютер" + +DB_REPORT_DUMP_DEL_OK = "Удалил файл резервной копии базы данных" +DB_REPORT_DUMP_DEL_ER = "Не удалось удалить файл резервной копии базы данных" +DB_REPORT_DUMP_ER = "Ошибка: Импорт базы данных не выполнен, т.к. отсутсвует файл дампа или он поврежден." + +DB_ACTIONS_RESTORE_H = "Восстановить резеврную копию" +DB_ACTIONS_RESTORE_T = "Вы уверены что хотите восстановить резервную копию базы данных?" + +DB_ACTIONS_DELETE_H = "Удалить файл" +DB_ACTIONS_DELETE_T = "Вы уверены, что хотите удалить файл резервной копии базы данных?" + +DB_NO_FILES_MESS = "В настоящий момент, нет файлов резервных копий базы данных" diff --git a/admin/lang/ru/docs.txt b/admin/lang/ru/docs.txt new file mode 100755 index 0000000..7275e85 --- /dev/null +++ b/admin/lang/ru/docs.txt @@ -0,0 +1,300 @@ +[docs] +DOC_SUB_TITLE = "Управление документами" +DOC_TIPS = "В данном разделе приведен список всех документов в системе. Здесь Вы можете выполнить основные операции с документами, такие как: Просмотр, Редактирование, Удаление документа, а также оставить заметку для какого-либо документа." +DOC_DATE_FORMAT = "%d.%m.%Y %H:%M" +DOC_LEGEND = "Значения пиктограмм" +DOC_LEGEND_EDIT = "Редактировать документ" +DOC_LEGEND_SHOW = "Просмотр страницы в новом окне" +DOC_LEGEND_ENABLE = "Сделать документ активным" +DOC_LEGEND_DISABLE = "Сделать документ неактивным" +DOC_LEGEND_TEMP_DELETE = "Временно удалить документ (в корзину)" +DOC_LEGEND_RESTORE = "Восстановить документ (из корзины)" +DOC_LEGEND_FINAL_DELETE = "Окончательно удалить документ" +DOC_CHOSE_RUB = "Выберите рубрику" +DOC_ID = "ID" +DOC_URL_RUB = "URL" +DOC_TITLE = "Название документа" +DOC_URL_TITLE = "Ссылка на документ" +DOC_IN_RUBRIK = "Рубрика" +DOC_IN_NEW = "Новый документ" +DOC_CREATED = "Опубликован" +DOC_EDIT = "Отредактирован" +DOC_PRINTED = "Распечатан" +DOC_CLICKS = "Просмотрен" +DOC_AUTHOR = "Автор" +DOC_ACTIONS = "Действия" +DOC_EDIT_TITLE = "Редактировать данный документ" +DOC_CHANGE_RUBRIC = "Перенести данный документ в дуругую рубрику" +DOC_CHANGE_AUTOR = "Сменить автора документа" +DOC_SHOW_TITLE = "Просмотр документа (ссылка без ЧПУ)" +DOC_SHOW2_TITLE = "Просмотр документа (ссылка c ЧПУ)" +DOC_SHOW3_TITLE = "Документ без названия" +DOC_CREATE_NOTICE_TITLE = "Оставить заметку" +DOC_REPLY_NOTICE_TITLE = "Посмотреть/ответить на заметку" +DOC_ENABLE_TITLE = "Опубликовать документ" +DOC_DISABLE_TITLE = "Снять документ с публикации" +DOC_TEMPORARY_DELETE = "Положить документ в корзину" +DOC_RESTORE_DELETE = "Восстановить документ из корзины" +DOC_FINAL_DELETE = "Удалить документ" +DOC_ICON_COMMENT = "Имеются заметки" +DOC_ICON_PUBLIC = "Документ снят с публикации" +DOC_ICON_RECYCLE = "Документ помещен в корзину" +DOC_SORT_TEXT = "Сортировать документы по:" +DOC_TEMPORARY_CONFIRM = "Вы уверены, что хотите положить в корзину данный документ?" +DOC_FINAL_CONFIRM = "Вы уверены, что хотите удалить данный документ?" +DOC_INSERT_LINK_TIP = "Для выбора нужного документа, нажмите по кнопке "Выбрать"" +DOC_BUTTON_INSERT_LINK = "Выбрать" +DOC_BUTTON_LINK_POPUP = "Выбрать в новом окне" +DOC_BUTTON_ADD_DOCUMENT = "Добавить документ" +DOC_BUTTON_ADD_DOCUMENT_NEXT = "Добавить и продолжить редактирование (Ctrl+S)" +DOC_BUTTON_EDIT_DOCUMENT = "Сохранить изменения" +DOC_BUTTON_EDIT_DOCUMENT_NEXT = "Применить (Ctrl+S)" +DOC_ADD_DOCUMENT = "Добавление нового документа" +DOC_EDIT_DOCUMENT = "Редактирование документа" +DOC_OPTIONS = "Параметры документа" +DOC_NAME = "Название документа:
(HTML <title>)" +DOC_URL = "Псевдоним документа:
(SEO alias)" +DOC_URL_LINK = "Подстановка Алиасов" +DOC_URL_INFO = "Чтобы ссылка на документ выглядела, например, так:
http://www.domain.tld/phone/samsung/
напишите в это поле: phone/samsung

Суффикс ссылки автоматически добавляется при выводе
в соответствии с настройками указанными в файле inc/config.php

В названии разрешено использовать:
a-z — латинские символы;
а-я — символы кириллицы (если разрешено);
/ — слэш;
- — знак тире;
_ — знак подчеркивания.

Название ссылки не должно содержать:
print/ или /print/ или /print;
page-XX/ или /page-XX/ или /page-XX;
apage-XX/ или /apage-XX/ или /apage-XX;
artpage-XX/ или /artpage-XX/ или /artpage-XX;
где XX - цифры" +DOC_URL_LOG = "Использовать историю алиасов, для редиректа" +DOC_URL_LOG_T = "Сохранять или нет историю алиасов документа, для последующего редиректа" +DOC_URL_LOG_RUBRIC = "Использовать настройки рубрики" +DOC_URL_LOG_USE = "Использовать всегда" +DOC_FIELD_G_UNKNOW = "Без группы" +DOC_PROPERTY = "Параметры документа" +DOC_URL_LOG_NOTUSE = "Не использовать" +DOC_QUERIES = "Доступные запросы:" +DOC_META_TITLE = "TITLE - это строка, которая будет выведена в заголовке окна браузера. Этот тег важен для поисковой оптимизации, поэтому система позволяет управлять им, как и некоторыми другими тегами." +DOC_META_KEYWORDS = "Ключевые слова:
(meta keywords)" +DOC_META_KEYWORDS_INFO = "Описывают содержание страницы, могут учитываться поисковыми системами.

Часть перечисленых ключевых слов должна присутствовать в тексте страницы." +DOC_META_DESCRIPTION = "Описание страницы:
(meta description)" +DOC_META_DESCRIPTION_INFO= "Небольшой текст, описывающий содержание страницы. Также может учитываться поисковыми системами, выводиться в качестве пояснения в результатах поиска или интернет-каталогах." +DOC_CAN_SEARCH = "Разрешить поиск по документу:
(для модуля Поиск)" +DOC_INDEX_TYPE = "Тип индексирования страницы:
(meta robots)" +DOC_INDEX_FOLLOW = "Индексировать и переходить по ссылкам" +DOC_INDEX_NOFOLLOW = "Индексировать, но не переходить по ссылкам" +DOC_NOINDEX_NOFOLLOW = "Не индексировать и не переходить по ссылкам" +DOC_SITEMAP_FREQ = "Частота обновления
sitemap.xml" +DOC_SITEMAP_FREQ_DOC = "Частота обновления страницы" +DOC_SITEMAP_ALWAYS = "Всегда" +DOC_SITEMAP_HOURLY = "Ежечасно" +DOC_SITEMAP_DAILY = "Ежедневно" +DOC_SITEMAP_WEEKLY = "Еженедельно" +DOC_SITEMAP_MONTHLY = "Ежемесячно" +DOC_SITEMAP_YEARLY = "Ежегодно" +DOC_SITEMAP_NEVER = "Никогда" +DOC_SITEMAP_PRIORITY = "Приоритет
sitemap.xml" +DOC_SITEMAP_PRIORITY_DOC = "Приоритет данной страницы относительно остальных страниц" +DOC_SITEMAP_PRIORITY_LOW = "Низший приоритет" +DOC_SITEMAP_PRIORITY_MID = "Средний приоритет" +DOC_SITEMAP_PRIORITY_HIG = "Высший приоритет" +DOC_START_PUBLICATION = "Начало публикации:" +DOC_END_PUBLICATION = "Окончание публикации:" +DOC_STATUS = "Статус документа:" +DOC_STATUS_ACTIVE = "Активный" +DOC_STATUS_INACTIVE = "Не активный" +DOC_ADD_IN_NAVIGATION = "Добавить подпункт меню:" +DOC_USE_NAVIGATION = "Связать с пунктом меню:" +DOC_USE_RUB_ALIAS = "Подстановки алиасов родительских документов, назначение родительского документа для хлебных крошек." +DOC_USE_BREADCRUMB = "Связать с документом
(можно использовать для хлебных крошек)" +DOC_USE_LANG_PACK = "Связать с документом из языковой группы" +DOC_NAVIGATION_INFO = "Для того, чтобы связать данный документ с пунктом меню, выберите из списка существующий пункт меню. Если Вы временно не хотите связывать данный документ с пунктом меню, оставьте поле пустым." +DOC_MAIN_CONTENT = "Основное содержимое документа" +DOC_MAIN_NOCONTENT = "Отсутвуют поля для документа" +DOC_AFTER_CREATE_TITLE = "Дальнейшие действия" +DOC_AFTER_CREATE_INFO = "Пожалуйста, выберите Ваше дальнейшее действие из списка ниже:" +DOC_EDIT_THIS_DOCUMENT = "Вернуться к редактированию данного документа" +DOC_INCLUDE_NAVIGATION = "Добавить созданный документ в меню навигации" +DOC_ADD_NEW_DOCUMENT = "Добавить новый документ в данную рубрику" +DOC_ADD_COPY_DOCUMENT = "Добавить копию документа в данную рубрику" +DOC_DISPLAY_NEW_WINDOW = "Просмотреть в новом окне (Ctrl+O)" +DOC_CLOSE_WINDOW = "Перейти к списку документов" +DOC_CLOSE_WINDOW_RUBRIC = "Перейти к списку документов данной рубрики" +DOC_TO_NAVI_TITLE = "Добавление документа в меню навигации" +DOC_NAVIGATION_POSITION = "Позиция в списке:" +DOC_NAVIGATION_TITLE = "Название пунтка меню:" +DOC_TARGET = "Открывать:" +DOC_TARGET_SELF = "в том же окне" +DOC_TARGET_BLANK = "в новом окне" +DOC_BUTTON_ADD_MENU = "Добавить в меню" +DOC_TOP_MENU_ITEM = "Новый пункт 1-го уровня" +DOC_NOTICE = "Заметки к документу" +DOC_NOTICE_NEW_LINK = "Добавить новую заметку" +DOC_NOTICE_AUTHOR = "Добавил: " +DOC_NOTICE_DELETE_LINK = "Удалить заметку" +DOC_ALLOW_NOTICE = "Разрешить комментарий заметок" +DOC_BUTTON_NOTICE = "Выполнить" +DOC_NOTICE_TITLE = "Заголовок:" +DOC_NOTICE_TEXT = "Заметка:" +DOC_BUTTON_ADD_NOTICE = "Добавить заметку" +DOC_SEND_NOTICE_INFO = "Для того, чтобы добавить новую заметку к документу, пожалуйста, заполните поля в форме ниже." +DOC_NEW_NOTICE_TITLE = "Добавить новую заметку" +DOC_MAIL_BODY_CHECK = "Пользователь %USER% добавил новый документ с названием '%TITLE%'.%N%Пожалуйста, проверьте данный документ перед публикацией." +DOC_MAIL_SUBJECT_CHECK = "Добавлен новый документ" +DOC_MAIL_BODY_USER = "Здравствуйте %USER%.%N%Созданный Вами документ успешно добавлен и Администратору отправлено уведомление, о проверке, После проверки документа он будет опубликован." +DOC_MAIL_SUBJECT_USER = "Ваш документ добавлен и ожидает проверки" +DOC_MAIL_BODY_NOTICE = "Пользователь %USER% добавил новую заметку к документу.%N%Авторизуйтесь в Панели управления и перейдите по ссылке ниже, чтобы посмотреть заметку:%N%%LINK%" +DOC_MAIL_SUBJECT_NOTICE = "Добавлена новая заметка к документу" +DOC_NEW_PAGE = "Добавить новую страницу" +DOC_CLOSE_HELP_WINDOW = "

" +DOC_HELP = "Помощь" +DOC_VIDEO_TYPE_HELP = "Вставка видео файла
При добавлении видео файла, Вы можете указать ширину и высоту окна для просмотра ролика. Первое значение определяет ширину окна, второе высоту.

Например:

video.avi|300|300
или
video.avi|100%|300" +DOC_FLASH_TYPE_HELP = "Вставка флэш ролика
При добавлении флэш ролика, Вы можете указать ширину и высоту окна при просмотре. Первое значение определяет ширину, второе высоту.

Например:

flash.swf|300|300
или
flash.swf|100%|300" +DOC_FILE_TYPE_HELP = "Вставка Файла
При добавлении файла, Вы можете задать имя ссылки. Для этого необходимо после названия файла указать разделительный знак | и после него ввести название ссылки.

Например:

file.zip|Скачать файл" +DOC_NO_PERMISSION = "Извините, но Вы не имеете прав для редактирования данного документа." +DOC_NO_PERMISSION_RUB = "Извините, но Вы не имеете прав для создание документа в данной рубрике." +DOC_NO_DEL_REVISION = "Извините, но Вы не имеете прав для удаления ревизии." +DOC_NO_RES_REVISION = "Извините, но Вы не имеете прав для востановления ревизии." +DOC_EDIT_RUB = "Перенести в другую рубрику" +DOC_RUBRIC = "Рубрика" +DOC_SORT_RUB = "Сортировать по рубрикам" +DOC_IMAGE = "Изображение в списке новостей" +DOC_IMAGE_MAX_W = "Максимальная ширина" +DOC_IMAGE_MAX_H = "Максимальная высота" +DOC_INTRO = "Тизер
(текст в списке новостей)" +DOC_ALIAS_CREATE = "Сформировать" +DOC_ENTER_NAME = "Пожалуйста, выберите рубрику в которую вы хотите добавить новый документ." +DOC_SORT_NAME = "Пожалуйста, выберите рубрику." +DOC_OR = " или " +DOC_NO_DOCS = "Документы, удовлетворяющие данные критерии поиска, отсутствуют." + +DOC_COPY = "Копировать документ" +DOC_COPY_DOCUMENT = "Копирование документа" +DOC_COPY_TIP = "Пожалуйста, укажите название для документа" + +DOC_ADD_NEW_LIGHT_TIP = "Для добавления нового документа, пожалйста выберите рубрику." +DOC_ADD_NEW_LIGHT_ADD = "Добавление документа" +DOC_ADD_NEW_LIGHT_BTN = "Добавить документ" + +DOC_CHANGE_TITLE = "Перенос документа в другую рубрику" +DOC_CHANGE_INFO = "Внимание! При изменении рубрики неперенесенные поля теряются!" +DOC_CHANGE_OLD_FIELD = "Поле документа" +DOC_CHANGE_NEW_FIELD = "Перенести в новое" +DOC_CHANGE_DROP_FIELD = "-- не переносить --" +DOC_CHANGE_CREATE_FIELD = "-- создать новое --" +DOC_CHANGE_BUTTON = "Изменить" + +DOC_CHANGE_AU_TITLE = "Смена автора документа" +DOC_CHANGE_AU_INFO = "Внимание! При смене автора, предыдущий автор может лишиться прав на редактирование этого документа." +DOC_CHANGE_BUTTON = "Сохранить" + +DOC_IN_MENU = "в меню" + +DOC_REVISSION = "История изменений" +DOC_REVISSION_DATA = "Дата и время изменения" +DOC_REVISSION_USER = "Автор" +DOC_REVISSION_VIEW = "Посмотреть версию" +DOC_REVISSION_RECOVER = "Востановить версию" +DOC_REVISSION_RECOVER_T = "Вы уверены, что хотите данную востановить версию?" +DOC_REVISSION_DELETE = "Удалить версию" +DOC_REVISSION_DELETE_T = "Вы уверены, что хотите удалить данную версию?" +DOC_REVISSION_NO_ITEMS = "В настоящий момент нет данных" + +DOC_URL_ERROR_SYMBOL = "недопустимые символы" +DOC_URL_ERROR_START = "начинается c /" +DOC_URL_ERROR_END = "заканчивается на / (при этом суффикс URL начинается на /)" +DOC_URL_ERROR_SEGMENT = "недопустимые сегменты:" +DOC_URL_ERROR_EMTY = "нечего проверять" +DOC_URL_ERROR_DUPLICATES = "псевдоним уже используется" +DOC_URL_H_ERROR_DUPLICATES = "псевдоним уже используется в истории алиасов" +DOC_URL_CHECK_OK = "Данный URL можно использовать" +DOC_URL_CHECK_ER = "URL содержит ошибки:
" + +DOC_REQUEST_NOT_INFO = "Для данного запроса описания нет." + +DOC_REVISION_DELETE = "Удалил версию документа" +DOC_REVISION_RECOVER = "Восстановил версию документа" + +DOC_BREADCRUMB_BTN = "Выбрать" +DOC_BREADCRUMB_TITLE = "Название ссылки для хлебных крошек" +DOC_BREADCRUMB_WITH = "Связан с" + +DOC_DOCUMENT_OPEN = "Документ опубликован" +DOC_DOCUMENT_CLOSE = "Документ снят с публикации" + +DOC_DOCUMENT_DOC = "документ" +DOC_DOCUMENT_ACT = "Опубликовал" +DOC_DOCUMENT_DISACT = "Снял с публикации" + +DOC_DOCUMENT_OPEN_ERR = "Этот документ нельзя сделать неактивным!" +DOC_DOCUMENT_OPEN_PRIVE = "У вас недостаточно для этого прав!" + +DOC_ACTION_SELECT = "Действие с выбранными" +DOC_ACTION_SELECT_ACT = "Активный" +DOC_ACTION_SELECT_NACT = "Не активный" +DOC_ACTION_SELECT_TRASH = "Временно удалить" +DOC_ACTION_SELECT_OUTTRASH = "Восстановить" +DOC_ACTION_SELECT_DEL = "Удалить" +DOC_ACTION_BUTTON = "Сохранить изменения" + +DOC_CHOOSE_LANG = "Выбор языка документа" +DOC_LANG_VERSION = "Версия документа на других языках" +DOC_LINK_CHOOSE = "Выберите документ" +DOCUMENT_SAVED = "Документ успешно сохранен" + +DOC_REV_DELETED = "Ревизии документов успешно удалены" +DOC_REV_DELETED_ERR = "Не удалось удалить ревизии документов.
Попробуйте еще раз." +DOC_REV_ERROR = "Ошибка" +DOC_REV_SUCCESS = "Выполнено" +DOC_REV_UPDATE = "Удалил ревизии документов" + +DOC_ALIASES = "Управление редиректами документов" +DOC_ALIASES_LIST_NM = "Наименование документа" +DOC_ALIASES_LIST_RB = "Рубрика" +DOC_ALIASES_LIST_CH = "Изменено" +DOC_ALIASES_LIST_CR = "Кол-во" +DOC_ALIASES_LIST_AT = "Действия" +DOC_ALIASES_TITLE = "В данном разделе приведен список всех документов, у которых присутвуют внутренние редиректы.
Здесь Вы можете выполнить основные операции с документами, такие как: Просмотр, Редактирование, Удаление редиректа." +DOC_ALIASES_BREAD_RUB = "Рубрика:" +DOC_ALIASES_BREAD_DOC = "Документ:" +DOC_ALIASES_BREAD_URL = "Основной URL:" +DOC_ALIASES_DOC_LIST = "Список документов c редиректами" +DOC_ALIASES_ADD = "Добавить новый редирект" +DOC_ALIASES_ADD_VAL = "Значение редиректа" +DOC_ALIASES_LIST = "Список редиректов" +DOC_ALIASES_LIST_EMPT = "Список пуст" +DOC_ALIASES_TABL_H_URL = "Алиас редиректа" +DOC_ALIASES_TABL_H_ADD = "Добавлен" +DOC_ALIASES_TABL_H_AUT = "Автор" +DOC_ALIASES_TABL_CHECK = "Отметить данный пункт для удаления" +DOC_ALIASES_GO = "Перейти по ссылке" +DOC_ALIASES_DEL_T = "Удалить алиас" +DOC_ALIASES_DEL_C = "Вы уверены, что хотите удалить алиас?" +DOC_ALIASES_BUTT_DEL = "Удалить" +DOC_ALIASES_BUTT_CLO = "Закрыть окно" +DOC_ALIASES_BUTT_APP = "Применить" +DOC_ALIASES_BUTT_CNL = "Отменить" +DOC_ALIASES_BUTT_SAV = "Сохранить" +DOC_ALIASES_BUTT_ADD = "Добавить" +DOC_ALIASES_REP_OK = "Выполнено" +DOC_ALIASES_REP_OK_T = "Редирект успшно добавлен" +DOC_ALIASES_REP_OK_T_E = "Редирект успшно обновлен" +DOC_ALIASES_REP_ER = "Ошибка" +DOC_ALIASES_REP_ER_T = "Не удалось добавить редирект. Попробуйте еще раз." +DOC_ALIASES_REP_ER_T_E = "Не удалось обновить редирект. Попробуйте еще раз." + +DOC_RUBRIC_TMPLS = "Выбрать шаблон рубрики" +DOC_RUBRIC_TMPLS_HINT = "Вы можете задать документу, для вывода, любой шаблон из данной рубрики" + +DOC_SEARCH_FIELD = "Поле" +DOC_SEARCH_FIELD_SELECT = "Выберите поле" +DOC_SEARCH_FIELD_LIKE = "Содержит" +DOC_SEARCH_FIELD_EQ = "Равно" +DOC_SEARCH_FIELD_TEXT = "Значение" +DOC_TEMPLATE_DEFAULT = "Использовать по умолчанию" +DOC_SHOW_LANG = "Показать" + +// 3.2 +DOC_TABS_META = "Meta данные" +DOC_TABS_URL = "URL документа" +DOC_TABS_DATE = "Дата публикации" +DOC_TABS_OTHER = "Прочие параметры" + +DOC_WITHOUT_TITLE = "Документ без названия" +DOC_SAVE_ADD = "Добавил" +DOC_SAVE_EDIT = "Отредактировал" +DOC_SAVE_LOG_DOC = " документ" + +DOC_LANG = "Язык" +DOC_LANG_ID = "Язык документа:" +DOC_LANG_SELECT = "Выберите язык" \ No newline at end of file diff --git a/admin/lang/ru/groups.txt b/admin/lang/ru/groups.txt new file mode 100644 index 0000000..c877a6b --- /dev/null +++ b/admin/lang/ru/groups.txt @@ -0,0 +1,123 @@ +[groups] +UGROUP_TITLE = "Управление группами пользователей" +UGROUP_TITLE2 = "Управление группой пользователей" +UGROUP_TITLE_MENU = "Группы пользователей" +UGROUP_INFO = "В данном разделе приведен cписок всех групп пользователей в системе. Для каждой группы Вы можете назначить персональные права, которые разрешат или ограничат действия пользователей как в Панели управления, так и в Публичной части сайта." +UGROUP_ID = "ID" +UGROUP_NAME = "Название группы" +UGROUP_COUNT = "Пользователей в группе" +UGROUP_ACTIONS = "Действия" +UGROUP_IN_GROUP = "Просмотр списка пользователей, относящихся к данной группе" +UGROUP_EDIT = "Редактировать наименование и права группы" +UGROUP_NO_PERMISSION = "Извините, но у Вас недостаточно прав для редакирования" +UGROUP_DELETE = "Удалить данную группу" +UGROUP_USERS_IN_GROUP = "В настоящий момент Вы не можете удалить данную группу, т.к. есть пользователи состоящие в этой группе." +UGROUP_DELETE_CONFIRM = "Вы уверены, что хотите удалить данную группу?" +UGROUP_NO_DELETABLE = "Вы не можете удалить данную группу, т.к. она является системной." +UGROUP_NO_PERM_DELETE = "Извините, но у Вас недостаточно прав для удаления данной группы." +UGROUP_NEW_GROUP = "Добавить новую группу" +UGROUP_NEW_NAME = "Название группы:" +UGROUP_BUTTON_ADD = "Добавить" +UGROUP_LEGEND_LINK = "Значения пиктограмм" +UGROUP_LEGEND_EDIT = "Редактировать группу пользователей" +UGROUP_LEGEND_DELETE = "Удалить группу пользователей" +UGROUP_ENTER_NAME = "Пожалуйста, укажите название группы пользователей" +UGROUP_WARNING_TIP = "Внимание! Будьте предельно внимательны, при назначении тех или иных прав для данной группы пользователей. Помните, что разрешая доступ к некоторым разделам, Вы можете сделать систему уязвимой." +UGROUP_YOUR_NOT_CHANGE = "Ошибка! Извините, но Вы не имеете прав для редактирования данной группы пользователей." +UGROUP_NOT_EXIST = "Ошибка! Извините, но запрашиваемой Вами группы пользователей не существует." +UGROUP_NO_MODULES = "Нет установленных модулей" +UGROUP_MODULES_RIGHT = "Пожалуйста, укажите модули, к которым будет разрешен доступ для данной группы пользователей." +UGROUP_CONTROL_RIGHT = "Пожалуйста, укажите разделы Панели управления, к которым будет разрешен или ограничен доступ для данной группы пользователей." +UGROUP_BUTTON_SAVE = "Сохранить изменения" +UGROUP_BUTTON_SAVE_AJAX = "Применить (CTRL+S)" +UGROUP_SAVE_CONFIRM = "Вы уверены, что хотите сохранить права для данной группы пользователей?" +UGROUP_NAME_EDIT = "Редактировать наименование группы" +UGROUP_OR = "или" +UGROUP_SAVED = "Права для группы успешно сохранены" +UGROUP_SAVED_ERR = "Не удалось сохранить права для группы.
Попробуйте еще раз." +UGROUP_ERROR = "Ошибка" +UGROUP_SUCCESS = "Выполнено" +UGROUP_SAVE_MAIN = "Изменил права доступа для группы" + +UGROUP_REPORT_ADD = "Создал группу пользователей" +UGROUP_REPORT_DEL = "Удалил группу пользователей" + +alles = "Разрешить все права (Будьте предельно осторожны!)" +adminpanel = "Доступ к панели управления" + +gen_settings = "Доступ к управлению общими настройками системы" +gen_settings_more = "Доступ к управлению дополнительными настройками системы" +gen_settings_countries = "Доступ к управлению списку стран" +gen_settings_languages = "Доступ к управлению языками" + +logs_view = "Доступ к просмотру системных сообщ" +logs_clear = "Доступ к удалению системных сообщений" + +db_actions = "Доступ к управлению базой данных (Резервное копирование, Востановление, Оптимизация)" + +modules_view = "Доступ к списку модулей" +modules_admin = "Доступ к модулями (Настройка, Управление, Использование)" +modules_system = "Доступ к управлению модулями (Удаление, Установка)" + +navigation_view = "Доступ к списку меню навигаций" +navigation_edit = "Доступ к управлению меню навигацией (Создание, Редактирование, Удаление)" + +remark_view = "Доступ к списку заметок" +remark_edit = "Доступ к управлению заметками у документов (Создание, Редактирование, Удаление)" + +document_php = "Доступ к использованию PHP кода в документах (Будьте предельно осторожны!)" +document_view = "Доступ к списку документов (права доступа к документам зависят от настроек рубрики)" +document_revisions = "Доступ к удалению всех ревизий документов" + +rubric_view = "Доступ к просмотру списка рубрик" +rubric_edit = "Доступ к управлению рубриками (Создание, Редактирование, Удаление)" +rubric_php = "Доступ к использованию PHP кода в шаблонах рубрик (Будьте предельно осторожны!)" +rubric_perms = "Доступ к управлению правами доступа для документов рубрики" +rubric_code = "Доступ к исполняемому коду для рубрик (Будьте предельно осторожны!)" + +template_view = "Доступ к списку шаблонов" +template_edit = "Доступ к управлению шаблонами (Создание, Редактирование, Удаление)" +template_php = "Доступ к использованию PHP кода в шаблонах (Будьте предельно осторожны!)" + +request_view = "Доступ к списку запросов" +request_edit = "Доступ к управлению запросами (Создание, Редактирование, Удаление)" +request_php = "Доступ к использованию PHP кода в шаблонах запроса (Будьте предельно осторожны!)" + +blocks_view = "Доступ к просмотру списка визуальных блоков" +blocks_edit = "Доступ к управлению визуальными блоками (Создание, Редактирование, Удаление)" + +sysblocks_view = "Доступ к просмотру списка системных блоков" +sysblocks_edit = "Доступ к управлению системными блоками (Создание, Редактирование, Удаление)" + +user_view = "Доступ к списку пользователей" +user_edit = "Доступ к редактированию параметров пользователей" +user_perms = "Доступ к управлению правами пользователей" + +group_view = "Доступ к списку групп пользователей" +group_edit = "Доступ к управлению правами групп пользователей (Создание, Редактирование, Удаление)" + +mediapool_int = "Доступ к менеджеру файлов" +mediapool_add = "Доступ к добавлению новых файлов на сервер (в менеджере файлов)" +mediapool_del = "Доступ к удалению файлов с сервера (в менеджере файлов)" +mediapool_finder = "Доступ к Файловому менеджеру (elFinder)" + +cache_clear = "Доступ к удалению кеша" +cache_thumb = "Доступ к удалению превью изображений (thumbnail)" + +logs = "Системные сообщения" +cache = "Управление кешем" +gen = "Системные настройки" +db = "База данных" +blocks = "Визуальные блоки" +sysblocks = "Системные блоки" +rubric = "Рубрики" +document = "Документы" +modules = "Модули" +mediapool = "Файловые менеджеры" +navigation = "Навигация" +request = "Запросы" +template = "Шаблоны" +remark = "Заметки у документов" +document = "Документы" +user = "Пользователи" +group = "Группы пользователей" \ No newline at end of file diff --git a/admin/lang/ru/logs.txt b/admin/lang/ru/logs.txt new file mode 100644 index 0000000..85c2558 --- /dev/null +++ b/admin/lang/ru/logs.txt @@ -0,0 +1,53 @@ +[logs] +LOGS_SUB_TITLE = "Управление системными сообщениями" +LOGS_TITLE = "Журнал системных событий" +LOGS_TIP = "В данном разделе приведен список всех действий, осуществляемых в Панели управления." +LOGS_ID = "№" +LOGS_IP = "Ip-адрес" +LOGS_DATE = "Дата" +LOGS_USER = "Пользователь" +LOGS_ACTION = "Действие" +LOGS_BUTTON_DELETE = "Очистить журнал" +LOGS_DELETE_CONFIRM = "Вы уверены, что хотите очистить журнал системных сообщений?" +LOGS_BUTTON_EXPORT = "Экспорт журнала системных сообщений" +LOGS_BUTTON_EXPORT_404 = "Экспорт журнала ошибок 404" +LOGS_DATE_FORMAT = "%d.%m.%y г." +LOGS_DATE_FORMAT2 = "%H:%M" +LOGS_IN = "в" +LOGS_CLEAR = "Системные сообщения успешно удалены." +LOGS_CLEAN = "Очистил Журнал событий" +LOGS_EXPORT = "Экспортировал Журнал событий" + +LOGS_404_SUB_TITLE = "Журнал ошибок 404" +LOGS_404_TITLE = "Журнал ошибок 404" +LOGS_404_TIP = "В данном разделе приведен список всех ошибок 404." +LOGS_404_ID = "№" +LOGS_404_IP = "Ip-адрес" +LOGS_404_DATE = "Дата" +LOGS_404_ACTION = "Действие" +LOGS_404_BUTTON_DELETE = "Очистить журнал" +LOGS_404_DELETE_CONFIRM = "Вы уверены, что хотите очистить журнал ошибок 404?" +LOGS_404_BUTTON_EXPORT = "Экспорт журнала ошибок" +LOGS_404_DATE_FORMAT = "%d.%m.%y г." +LOGS_404_DATE_FORMAT2 = "%H:%M" +LOGS_404_IN = "в" +LOGS_404_CLEAR = "Системные сообщения успешно удалены." +LOGS_404_CLEAN = "Очистил Журнал ошибок 404" +LOGS_404_EXPORT = "Экспортировал Журнал ошибок 404" + +LOGS_SQL_SUB_TITLE = "Журнал MySQL ошибок" +LOGS_SQL_TITLE = "Журнал MySQL ошибок" +LOGS_SQL_TIP = "В данном разделе приведен список всех ошибок MySQL." +LOGS_SQL_ID = "№" +LOGS_SQL_IP = "Ip-адрес" +LOGS_SQL_DATE = "Дата" +LOGS_SQL_ACTION = "Действие" +LOGS_SQL_BUTTON_DELETE = "Очистить журнал MySQL ошибок" +LOGS_SQL_DELETE_CONFIRM = "Вы уверены, что хотите очистить журнал MySQL ошибок?" +LOGS_SQL_BUTTON_EXPORT = "Экспорт журнала MySQL ошибок" +LOGS_SQL_DATE_FORMAT = "%d.%m.%y г." +LOGS_SQL_DATE_FORMAT2 = "%H:%M" +LOGS_SQL_IN = "в" +LOGS_SQL_CLEAR = "Журнал ошибок MySQL успешно удален." +LOGS_SQL_CLEAN = "Очистил Журнал MySQL ошибок" +LOGS_SQL_EXPORT = "Экспортировал Журнал MySQL ошибок" \ No newline at end of file diff --git a/admin/lang/ru/main.txt b/admin/lang/ru/main.txt new file mode 100644 index 0000000..ac59830 --- /dev/null +++ b/admin/lang/ru/main.txt @@ -0,0 +1,303 @@ +MAIN_WELCOME = "Добро пожаловать в Панель управления!" +MAIN_WELCOME_INFO = "На главной странице Вы можете выбрать одно из наиболее часто используемый действий." + +MAIN_PAGE = "Главная страница" + +MAIN_LOGIN_INTRO = "Авторизация" +MAIN_LOGIN_BACK_SITE = "Вернуться на сайт" +MAIN_LOGIN_NAME = "Логин:" +MAIN_LOGIN_PASSWORD = "Пароль:" +MAIN_LOGIN_BUTTON = "Войти" +MAIN_LOGIN_REGISTER = "Регистрация" +MAIN_LOGIN_LOST = "Забыли пароль?" +MAIN_LOGIN_HELP = "Помощь" +MAIN_LOGIN_REMEMBER = "Запомнить меня" +MAIN_LOGIN_CAP_CODE = "Код:" +MAIN_LOGIN_CAP_CODE_REF = "Обновить код:" +MAIN_LOGIN_CAP_CODE_REFR = "Обновить код" + +MAIN_LINK_HOME = "Главное меню" +MAIN_LINK_AUTHOR = "Сайт поддержки" +MAIN_LINK_DATABASE = "Управление базой данных" +MAIN_LINK_NAVIGATION = "Управление меню навигации" +MAIN_LINK_MODULES = "Управление модулями" +MAIN_LINK_MODULES_H = "Модули" +MAIN_LINK_SETTINGS = "Управление настройками" +MAIN_LINK_SETTINGS_H = "Настройки" +MAIN_LINK_USERS = "Управление пользователями" +MAIN_LINK_TEMPLATES = "Управление шаблонами" +MAIN_LINK_RUBRICS = "Управление рубриками" +MAIN_LINK_DOCUMENT = "Управление документами" +MAIN_LINK_QUERYES = "Управление запросами" +MAIN_LINK_GROUPS = "Управление группами" +MAIN_LINK_LANG = "Управление языками" + +MAIN_BUTTON_LOGIN = "Войти" +MAIN_BUTTON_ADD = "Добавить" +MAIN_BUTTON_LOGOUT = "Выход" + +MAIN_SETTINGS_EDIT_1 = "Общие настройки" +MAIN_SETTINGS_EDIT_2 = "Дополнительные настройки" +MAIN_SETTINGS_EDIT_3 = "Управление странами" +MAIN_SETTINGS_EDIT_4 = "Создать резервную копию БД" + +MAIN_LINK_DOC_TIPS = "В данном разделе приведен список всех документов в системе." +MAIN_LINK_RUBRIK_TIP = "В данном разделе приведен список всех рубрик в системе." +MAIN_LINK_REQUEST_TIP = "В данном разделе приведен список всех существующих запросов в системе." +MAIN_LINK_NAVI_TIP = "В данном разделе приведен список всех меню навигаций в системе." +MAIN_LINK_TEMPLATES_TIP = "В данном разделе приведен список всех шаблонов используемых в системе." +MAIN_LINK_MODULES_TIP = "В данном разделе приведен список всех доступных модулей в системе." +MAIN_LINK_SETTINGS_TIP = "В данном разделе приведены все глобальные параметры системы." +MAIN_LINK_DB_TIP = "В данном разделе вы можете работать с базой данных системы." +MAIN_LINK_USER_TIP = "В данном разделе приведен список всех пользователей в системе." +MAIN_LINK_UGROUP_TIP = "В данном разделе приведен cписок всех групп пользователей в системе." + +MAIN_PAGE_TITLE = "Панель Управления" +MAIN_LOGIN_TEXT = "Авторизация" +MAIN_LOGIN_TEXT2 = "Пожалуйста, укажите Ваши данные:" +MAIN_LOGIN_CAPTCHA = "Введите код:" +MAIN_SELECT_LANGUAGE = "Язык:" +MAIN_SELECT_THEME = "Тема оформления:" +MAIN_YOUR_EMAIL = "E-mail:" +MAIN_YOUR_LOGIN = "Логин или E-mail:" +MAIN_YOUR_PASSWORD = "Пароль:" + +MAIN_LINK_SITE = "Посмотреть сайт" +MAIN_LINK_HOME = "На главную" +MAIN_LINK_LOGOUT = "Выход из панели управления" +MAIN_LINK_LOGOUT_QUEST = "Вы уверены, что хотите выйти?" +MAIN_LINK_CACHE_CLEAR = "Очистка кэша" +MAIN_LINK_CACHE_CLEAR_QUEST = "Вы уверены, что хотите очистить кэш?" + +MAIN_LINK_SITE_ON = "Включить редактор" +MAIN_LINK_SITE_OFF = "Выключить редактор" + +MAIN_LINK_EDIT = "Редактировать на сайте" +MAIN_ADD_IN_RUB = "Добавить новый документ:" +MAIN_DOCUMENTS_ALL = "Список документов:" +MAIN_SEARCH_DOCUMENTS = "Поиск документов:" +MAIN_SORT_DOCUMENTS = "Быстрый отбор:" +MAIN_TIME_PERIOD = "Период публикации" +MAIN_TIME_START = "Начало" +MAIN_TIME_END = "Окончание" +MAIN_BUTTON_SEARCH = "Поиск" +MAIN_TITLE_SEARCH = "Название документа:" +MAIN_TITLE_DOC_NAME = "Название документа" +MAIN_TITLE_DOC_ID = "ID документа" +MAIN_SEARCH_HELP = Использование поиска

Используйте знак "+" для строгого включения слова в поиск.
Используйте знак "-" для исключения слова из поиска.

Обязательно используйте пробел перед знаками "+" и "-"." +MAIN_ID_SEARCH = "ID документа:" +MAIN_SELECT_RUBRIK = "В рубрике:" +MAIN_ALL_RUBRUKS = "Все рубрики" +MAIN_ALL_DOCUMENTS = "любой статус" +MAIN_DOCUMENT_STATUS = "Статус документа" +MAIN_DOCUMENT_ACTIVE = "только активный" +MAIN_DOCUMENT_INACTIVE = "только неактивный" +MAIN_TEMP_DELETE_DOCS = "временно удаленный" +MAIN_RESULTS_ON_PAGE = "Результатов на странице:" +MAIN_OPEN_MEDIAPATH = "Посмотреть на сервере" +MAIN_NAVI_UGROUPS = "Группы пользователей" +MAIN_UGROUP_EDIT = "Редактировать права группы" +MAIN_UGROUP_DELETE = "Удалить данную группу" +MAIN_LOGS = "Системные события" +MAIN_NAVI_MODULES = "Управление модулями" +MAIN_NAVIGATION = "Меню навигаций" +MAIN_NAVIGATION_NEW = "Добавить новое меню" +MAIN_QUERIES = "Запросы" +MAIN_REQUEST_NEW = "Добавить новый запрос" +MAIN_RUBRIKS = "Рубрики" +MAIN_RUBRIK_NEW = "Добавить новую рубрику" +MAIN_RUBRIK_EDIT_FIELDS = "Редактировать поля рубрики" +MAIN_RUBRIK_EDIT_TEMPL = "Редактировать шаблон рубрики" +MAIN_SETTINGS = "Системные настройки" +MAIN_COUNTRY_EDIT = "Управление странами" +MAIN_SYSBLOCKS = "Системные блоки" +MAIN_TEMPLATES = "Шаблоны" +MAIN_TEMPLATES_NEW = "Добавить новый шаблон" +MAIN_USERS = "Пользователи" +MAIN_DATABASE_INFO = "База данных" +MAIN_NAVI_DOCUMENTS = "Документы" +MAIN_BROWSE_DOCUMENTS = "Посмотреть в документах" +MAIN_USERS_LIST = "Список пользователей" +MAIN_USER_ADD = "Добавить нового пользователя" +MAIN_SEARCH_USERS = "Поиск пользователей по:" +MAIN_USER_PARAMS = "Имени, Id, E-mail, E-mail домену" +MAIN_USER_STATUS = "Со статусом:" +MAIN_USER_STATUS_ALL = "Любой статус" +MAIN_USER_STATUS_ACTIVE = "Активный" +MAIN_USER_STATUS_INACTIVE = "Ожидающий активации" +MAIN_USER_GROUP = "Состоит в группе:" +MAIN_USER_ONLINE = "Добро пожаловать," +MAIN_USER_PERM = "Статус:" +MAIN_ALL_USER_GROUP = "В любой" +MAIN_BUTTON_SEARCH_USER = "Найти пользователей по параметрам" +MAIN_NO_PERMISSION = "Извините, но вы не имеете прав доступа к данному разделу" +MAIN_LOGOUT_CONFIRM = "Вы уверены, что хотите выйти?" + +MAIN_START_DOC_TITLE = "Последние документы" +MAIN_START_DOC_ID = "id" +MAIN_START_DOC_NAME = "Наименование" +MAIN_START_DOC_RUBRIC = "Рубрика" +MAIN_START_DOC_DATE = "Опубликован" +MAIN_START_DOC_AUTOR = "Автор" + +MAIN_START_SEARCH = "Поиск:" +MAIN_START_SEARCH_T = "Искать документ" + +MAIN_START_LOGS_LOG = "Журнал операций" +MAIN_START_LOGS_404 = "Ошибки 404" +MAIN_START_LOGS_SQL = "Ошибки MySQL" + +MAIN_TABLE_SUCC = "Количество успешно загруженных таблиц: " +MAIN_TABLE_ERROR = "Количество таблиц с ошибками: " +MAIN_SQL_FILE_ERROR = "SQL-файл имеет неверный формат или содержит ошибки в структуре запросов." +MAIN_RESTORE_OK = "База данных успешно восстановлена" + +MAIN_NO_PERM_MODULES = "Извините, но у вас недостаточно прав для управления данным модулем" +MAIN_MP_FILE_DELETE = "Удалить файл" +MAIN_MP_DELETE_CONFIRM = "Вы уверены, что хотите удалить файл: " +MAIN_MP_DOC_FOLDER = "Список папок / файлов" +MAIN_MP_FILE_SIZE = "Размер файла" +MAIN_MP_FILE_DATE = "Дата создания" +MAIN_MP_ACTIONS = "Действия" +MAIN_MP_FILE_INFO = "Чтобы добавить файл, нажмите на его название, а потом на кнопку Вставить файл" +MAIN_MP_UP_LEVEL = "Вернуться на уровень выше" +MAIN_MP_CREATE_FOLDER = "Создать папку" +MAIN_MP_UPLOAD_FILE = "Закачать файл" +MAIN_MP_FILE_INSERT = "Вставить файл" +MAIN_MP_DIR_INSERT = "Выбрать папку" +MAIN_MP_SELECT_FILES = "Выберите файлы для загрузки" +MAIN_MP_IMAGE_RESIZE = "Изменить размер загружаемых изображений" +MAIN_MP_IMAGE_WIDTH = "Ширина" +MAIN_MP_IMAGE_HEIGHT = "Высота" +MAIN_BUTTON_UPLOAD = "Закачать" +MAIN_BUTTON_WAIT = "Пожалуйста, подождите..." +MAIN_MP_PLEASE_SELECT = "Пожалуйста, выберите файл" +MAIN_ADD_IN = "Выберите рубрику:" +MAIN_GROUP_DELETE_CONFIRM = "Вы уверены, что хотите удалить данную группу?" +MAIN_RUBRIKS_LIST = "Список рубрик" +MAIN_USER = "Пользователь:" +ButtonSave = "Сохранить" +MAIN_NEW_PAGE = "Добавить новую страницу" +MAIN_BUTTON_SORT = "Отобрать" +MAIN_QUICK_MODULE = "Управление модулями" +MAIN_STAT = "Статистика" +MAIN_STAT_SYSTEM_INFO = "Системная информация" +MAIN_STAT_DOCUMENTS = "Всего документов:" +MAIN_STAT_RUBRICS = "Всего рубрик:" +MAIN_STAT_QUERIES = "Всего запросов:" +MAIN_STAT_TEMPLATES = "Всего шаблонов:" +MAIN_STAT_MYSQL = "Размер базы данных:" +MAIN_STAT_CACHE = "Общий размер кеша:" +MAIN_STAT_CACHE_SHOW = "Показать" +MAIN_STAT_MODULES = "Установлено модулей:" +MAIN_STAT_MODULES_OFF = "Отключено модулей:" +MAIN_STAT_USERS = "Всего пользователей:" +MAIN_STAT_USERS_WAIT = "Ожидают активацию:" +MAIN_STAT_AVE = "AVE.cms" +MAIN_STAT_DOMEN = "Домен" +MAIN_STAT_PHP = "PHP версия:" +MAIN_STAT_MYSQL_VERSION = "MySQL версия:" +MAIN_STAT_CLEAR_CACHE = "Очистить кэш" +MAIN_STAT_CLEAR_CACHE_FULL= "Очистить кэш и сессии" +MAIN_STAT_CLEAR_THUMB = "Удалить миниатюры" +MAIN_STAT_CLEAR_REV = "Удалить ревизии" +MAIN_STAT_CLEAR_COUNT = "Обнулить подневный счетчик" +MAIN_ADD_FOLDER = "Пожалуйста, введите имя для новой папки:" +MAIN_NO_ADD_FOLDER = "Не указано имя папки или действие отменено!" +MAIN_NO_ADD_TEMPL = "Не указано наименование шаблона или действие отменено!" +MAIN_NO_ADD_GROUP = "Не указано наименование группы или действие отменено!" +MAIN_NO_ADD_RUB = "Не указано наименование рубрики или действие отменено!" +MAIN_NO_ADD_QUERY = "Не указано наименование запроса или действие отменено!" +MAIN_NO_ADD_NAV = "Не указано наименование навигации или действие отменено!" +MAIN_NO_ADD_BLOCK = "Не указано наименование системного блока или действие отменено!" +MAIN_NO_ADD_USER = "Не указано имя пользователя или действие отменено!" +MAIN_NO_ADD_DOCS = "Не указано название документа или действие отменено!" +MAIN_CLEAR_CACHE_OK = "Кэш очищен" +MAIN_FILE_MANAGER_TITLE = "Файловый менеджер" +MAIN_FILE_MANAGER_TIP = "Выберите нужный файл и нажмите по кнопке "Вставить файл"" + +MAIN_SVN_NEW = "Вышла новая версия" +MAIN_SVN_SAIT = "Перейти на сайт" +MAIN_SVN_REPOS = "Перейти на сайт репозитория" +MAIN_SVN_MAILTO = "Написать письмо" +MAIN_SVN_LOOK = "Посмотреть ревизию на сайте репозитория" +MAIN_SVN_RECOM = "Рекомендуется обновиться!" + +MAIN_FINDER = "Файловый менеджер" + +MAIN_ADD_NEW_GROUP = "Добавить новую группу" +MAIN_ADD_NEW_GROUP_NAME = "Наименование группы:" + +MAIN_ADD_NEW_USER = "Добавить нового пользователя" +MAIN_ADD_NEW_USER_NAME = "Имя пользователя:" + +MAIN_ADD_NEW_NAV = "Добавить новую навигацию" +MAIN_ADD_NEW_NAV_NAME = "Наименование навигации:" + +MAIN_ADD_NEW_TEMPL = "Добавить новый шаблон" +MAIN_ADD_NEW_TEMPL_NAME = "Наименование шаблона:" + +MAIN_ADD_NEW_REQUEST = "Добавить новый запрос" +MAIN_ADD_NEW_REQUEST_NAME = "Наименование запроса:" + +MAIN_ADD_NEW_RUB = "Добавить новую рубрику" +MAIN_ADD_NEW_RUB_NAME = "Наименование рубрики:" + +MAIN_ADD_NEW_BLOCK = "Добавить новый системный блок" +MAIN_ADD_NEW_BLOCK_NAME = "Наименование системного блока:" + +MAIN_USERS_LAST_TIME = "За последнее время были:" + +MAIN_LOGS_ID = "№" +MAIN_LOGS_IP = "Ip-адрес" +MAIN_LOGS_DATE = "Дата" +MAIN_LOGS_USER = "Пользователь" +MAIN_LOGS_ACTION = "Действие" + +MAIN_DOC_SHOW3_TITLE = "Документ без названия" +MAIN_DOC_EDIT_TITLE = "Редактировать данный документ" +MAIN_DOC_SHOW_TITLE = "Просмотр документа (ссылка без ЧПУ)" +MAIN_DOC_SHOW2_TITLE = "Просмотр документа (ссылка c ЧПУ)" + +MAIN_ADD_DOC = "Документ" +MAIN_ADD_RUB = "Рубрику" +MAIN_ADD_REQ = "Запрос" +MAIN_ADD_SYS = "Системный блок" +MAIN_ADD_TEM = "Шаблон" +MAIN_ADD_NAV = "Навигацию" +MAIN_ADD_USR = "Пользователя" +MAIN_ADD_GRP = "Группу" + +MAIN_BRANCHES = "Разделы" +MAIN_SHOWHIDE = "Показать/Скрыть меню" + +MAIN_CODEMIRROR_HELP = "Ctrl-F/Cmd-F (Искать) | Ctrl-G/Cmd-G (Искать далее) | Shift-Ctrl-G/Shift-Cmd-G (Найти предыдущее) | Shift-Ctrl-F/Cmd-Option-F (Заменить) | Shift-Ctrl-R / Shift-Cmd-Option-F (Заменить все) | F11 (На полный экран)" + +TEMPLATES_MESSAGE = "Сообщение:" +TEMPLATES_CACHE_SUCCESS = "Кеш успешно очищен." +TEMPLATES_CACHE_SUCCESS_LOG = "Очистил кэш" +TEMPLATES_CACHE_DB_SUCCESS = "Таблица _sessions успешно очищена." +TEMPLATES_CACHE_DB_SUCCESS_LOG = "Очистил таблицу _sessions." +TEMPLATES_CACHE_CT_SUCCESS = "Удалены скомпилированные шаблоны." +TEMPLATES_CACHE_CT_SUCCESS_LOG = "Удалил скомпилированные шаблоны" +TEMPLATES_CACHE_MC_SUCCESS = "Удалены скомпилированные шаблоны модулей." +TEMPLATES_CACHE_MC_SUCCESS_LOG = "Удалил скомпилированные шаблоны модулей" +TEMPLATES_CACHE_SU_SUCCESS = "Удалены сессии пользователей." +TEMPLATES_CACHE_SU_SUCCESS_LOG = "Удалил сессии пользователей" +TEMPLATES_CACHE_SC_SUCCESS = "Удален кэш sql запросов." +TEMPLATES_CACHE_SC_SUCCESS_LOG = "Удалил кэш sql запросов" +TEMPLATES_THUMBNAILS_SUCCESS = "Миниатюры успешно удалены." +TEMPLATES_THUMBNAILS_SUCCESS_LOG = "Удалил миниатюры" + +EXIT_ADMIN = "Закончил сеанс в Панели управления" +LOGIN_ADMIN = "Начал сеанс в Панели управления" +ERROR_ADMIN = "Ошибка при входе в Панель управления" + +WRONG_PASS = "Ошибка:
Имя пользователя или пароль не правильные!" +WRONG_CAPTCHA = "Ошибка:
Неправильный защитный код" + +oficial_site = "Официальный сайт" +support = "Служба технической поддержки" + +// 3.1.9 +MAIN_BLOCKS = "Визуальные блоки" \ No newline at end of file diff --git a/admin/lang/ru/modules.txt b/admin/lang/ru/modules.txt new file mode 100644 index 0000000..f369c20 --- /dev/null +++ b/admin/lang/ru/modules.txt @@ -0,0 +1,36 @@ +[modules] +MODULES_SUB_TITLE = "Управление модулями" +MODULES_TIP = "В данном разделе приведен список всех доступных модулей в системе. Здесь Вы можете установить, отключить, обновить любой из модулей, а также выполнить дополнительные, персональные настройки для любого из модулей." +MODULES_NAME = "Название модуля" +MODULES_INFO = "Информация" +MODULES_TEMPLATE = "Шаблон вывода" +MODULES_SYSTEM_TAG = "Системный тег" +MODULES_VERSION = "Версия" +MODULES_ACTIONS = "Действия" +MODULES_SETTINGS = "Параметры" +MODULES_SETTINGS_INFO = "Информация" +MODULES_DELETE = "Удалить модуль" +MODULES_DELETE_CONFIRM = "Помните, что удаляя модуль из системы, Вы удаляете его только на программном уровне. Таким образом, в последствии, Вы всегда можете его установить заново.
Вы уверены, что хотите удалить данный модуль?" +MODULES_INSTALL = "Установить модуль" +MODULES_REMOVE = "Удалить модуль с сервера" +MODULES_REINSTALL = "Переустановить модуль" +MODULES_REINSTALL_CONF = "Вы уверены, что хотите переустановить данный модуль?" +MODULES_UPDATE = "Обновить модуль" +MODULES_STOP = "Отключить модуль" +MODULES_START = "Включить модуль" +MODULES_BUTTON_SAVE = "Сохранить изменения" +MODULES_LEGEND = "Значения пиктограмм" +MODULES_AUTHOR = "Автор модуля" +MODULES_ERROR = "Возникла ошибка при загрузке модуля: " +MODULES_INSTALLED = "Установленные модули:" +MODULES_NOT_INSTALLED = "Неустановленные модули:" +MODULES_SETUP = "Перейти к управлению модулем" +MODULES_NO_INSTALL = "Сообщение:
Нет установленных модулей." +MODULES_NOT_INSTALL = "Сообщение:
Нет неустановленных модулей." +MODULES_ACTION_INSTALL = "Установил модуль" +MODULES_ACTION_ONLINE = "Включил модуль" +MODULES_ACTION_OFFLINE = "Отключил модуль" +MODULES_ACTION_REINSTALL = "Переустановил модуль" +MODULES_ACTION_UPDATE = "Обновил модуль" +MODULES_ACTION_DELETE = "Удалил модуль из системы" +MODULES_ACTION_REMOVE = "Удалил модуль с сервера" \ No newline at end of file diff --git a/admin/lang/ru/navigation.txt b/admin/lang/ru/navigation.txt new file mode 100644 index 0000000..5ca1411 --- /dev/null +++ b/admin/lang/ru/navigation.txt @@ -0,0 +1,128 @@ +[navi] +NAVI_ID = "ID" +NAVI_SUB_TITLE = "Управление меню навигации" +NAVI_SUB_TITLE2 = "Управление пунктами меню" +NAVI_SUB_TITLE3 = "Редактирование шаблона меню" +NAVI_SUB_TITLE4 = "Создание нового шаблона меню" +NAVI_TIP_TEMPLATE = "В данном разделе приведен список всех меню навигаций в системе. Здесь Вы можете изменить шаблон вывода любого из доступных меню, а также добавить или удалить пункты меню." +NAVI_TIP_TEMPLATE2 = "В данном разделе, используя язык разметки HTML, Вы можете создать шаблон оформления для данного меню навигации. Также, Вы можете выбрать группы пользователей, которым будет доступно данное меню навигации. Для выбора нескольких групп зажмите клавишу CTRL." +NAVI_ITEMS_TIP = "Создание нового пункта меню" +NAVI_NEW_MENU = "Создание нового меню" +NAVI_LIST_TIP = "Cписок ниже содержит все пункты, относящиеся к данному меню. Помните, что максимальный уровень вложенности не может быть более 2." +NAVI_LIST = "Список пунктов меню" +NAVI_EDIT_TEMPLATE = "Редактирование шаблона меню" +NAVI_EDIT_ITEMS = "Редактирование пунктов меню" +NAVI_OPEN_IN_THIS = "в текущем окне" +NAVI_OPEN_IN_NEW = "в новом окне" +NAVI_TARGET_WINDOW = "Открывать" +NAVI_POSITION = "Позиция" +NAVI_LINK_TO_DOCUMENT = "Ссылка на документ/файл" +NAVI_ENTRIES_NO_ITEMS = "Сообщение:
В настоящий момент нет пунктов меню." + +NAVI_LINK_TITLE = "Название пункта меню" +NAVI_LINK_SOLUT = "Описание для пункта меню:" +NAVI_LINK_IMGID = "Id изображения:" +NAVI_LINK_IMGTL = "Выбрать изображение:" +NAVI_LINK_IMAGE = "Изображение для пункта меню" +NAVI_TITLE = "Наименование меню навигации:" +NAVI_TITLE2 = "Введите название меню навигации:" +NAVI_BROWSE_DOCUMENTS = "Связать с существующим документом" +NAVI_ADD_SUBITEM = "Добавить новый подпункт" +NAVI_BUTTON_CHANGE = "Выбрать" +NAVI_BUTTON_OPTION = "Опции" +NAVI_BUTTON_SUBITEM = "+" +NAVI_BROWSE_MEDIAPOOL = "Связать с файлом на сервере" +NAVI_SYSTEM_TAG = "Системный тег" +NAVI_NAME = "Наименование меню" +NAVI_LINK_TARGET = "Тег, определяющий тип открытия документа (в новом или текущем окне)" +NAVI_LINK_URL = "Тег, определяющий адрес для перехода" +NAVI_LINK_NAME = "Тег, определяющий название ссылки, которое будет отображено в меню" +NAVI_LINK_ID = "Тег, определяющий уникальный идентификатор ссылки" +NAVI_LINK_INACTIVE = "Оформление неактивной ссылки:" +NAVI_LINK_ACTIVE = "Оформление активной ссылки:" +NAVI_HEADER_START = "Верхняя часть оформления:" +NAVI_FOOTER_END = "Нижняя часть оформления:" +NAVI_HEADER_TIP = "Например, заголовок
"Каталог товаров"
(не обязательное)" +NAVI_COPY_TEMPLATE = "Копировать шаблон меню" +NAVI_FOOTER_TIP = "Нижняя часть оформления меню
(не обязательное)" +NAVI_DELETE = "Удалить данное меню" +NAVI_DELETE_CONFIRM = "Вы уверены, что хотите удалить данное меню навигации?" +NAVI_HTML_START = "Начальный HTML код:" +NAVI_HTML_END = "Конечный HTML код:" +NAVI_LEVEL1 = "Шаблон оформления для главного (первого) уровня пунктов меню" +NAVI_LEVEL2 = "Шаблон оформления для первого уровня вложенных пунктов меню" +NAVI_LEVEL3 = "Шаблон оформления для второго уровня вложенных пунктов" +NAVI_MARK_DELETE = "Отметить данный пункт для удаления" +NAVI_MARK_ACTIVE = "Для того, чтобы временно отключить данный пункт меню, снимите выделение и нажмите "Сохранить изменения"" +NAVI_GROUPS = "Группы пользователей, которым будет доступно меню:" +NAVI_ACTIONS = "Действия" +NAVI_OR_BUTTON = " или " +NAVI_BUTTON_SAVE = "Сохранить изменения" +NAVI_BUTTON_SAVE_NEXT = "Применить (CTRL+S)" +NAVI_BUTTON_ADD = "Добавить пункт" +NAVI_BUTTON_ADD_MENU = "Создать меню" +NAVI_LEGEND = "Значения пиктограмм" +NAVI_ENTER_NAME = "Пожалуйста, укажите название меню навигации." +NAVI_ALL = "Список меню навигаций" +NAVI_PRINT_TYPE = "Тип вывода" +NAVI_EXPAND_ALL = "Полностью (раскрывать все уровни)" +NAVI_EXPAND_WAY = "Текущий и родительский уровни" +NAVI_EXPAND_LEVEL = "Только текущий уровень" +NAVI_MENU_NOT_FOUND = "Отсутствует меню id=" +NAVI_SAVE = "Шаблон навигации успешно сохранен" +NAVI_SORTED = "Порядок успешно сохранён" + +NAVI_REPORT_NEW = "Создал меню навигации" +NAVI_REPORT_COPY = "Создал копию меню навигации" +NAVI_REPORT_EDIT = "Изменил шаблон меню навигации" +NAVI_REPORT_DEL = "Удалил меню навигации" +NAVI_REPORT_ADDIT = "Добавил пункт меню навигации" +NAVI_REPORT_DELIT = "Удалил пункт меню навигации" +NAVI_REPORT_FLEV = "на первый уровень" +NAVI_REPORT_SLEV = "на второй уровень" +NAVI_REPORT_TLEV = "на третий уровень" +NAVI_REPORT_DEACT = "Деактивировал пункт меню навигации" +NAVI_REPORT_ACT = "Активировал пункт меню навигации" +NAVI_REPORT_SAVED = "Шаблон навигации успешно сохранен" +NAVI_REPORT_SAVED_ERR = "Не удалось шаблон навигации.
Попробуйте еще раз." +NAVI_REPORT_ERROR = "Ошибка" +NAVI_REPORT_SUCCESS = "Выполнено" + +NAVI_ITEM_ON_OFF = "Вкл/Выкл пункт меню" +NAVI_ITEM_EDIT = "Редактировать пункт меню" +NAVI_ITEM_DELETE = "Удалить данный пункт меню" +NAVI_ITEM_DELETE_CONFIRM = "Вы уверены, что хотите удалить данный пукт меню навигации?" + +// v 3.2 +NAVI_ALIAS = "Алиас" +NAVI_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах модуля" +NAVI_ACCEPT = "Этот алиас можно использовать" +NAVI_ER_SYN = "Неверный алиас!
Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание и иметь длину не более 20 символов" +NAVI_ER_EXISTS = "Неверный алиас!
Данный алиас уже привязан к другому меню" + +//from templates +NAVI_NOLINK_DOC = "Нет связанного документа" +NAVI_EDIT_ITEM = "Редактирование пункта меню" +NAVI_LINK_FILEDOC = "Связать с документом/файлом" +NAVI_LINKED_DOC = "Связанный документ" +NAVI_DEL_LINKED_DOC = "Убрать связь с документом" +NAVI_LINK_DOC = "Связать с документом" +NAVI_LINK_FILE = "Связать с файлом" +NAVI_NO_LINK = "Нет связанного документа" +NAVI_STRUCTURE = "Структура" +NAVI_RETURN_TO_LIST = "Вернуться к списку" +NAVI_EDIT_TEMPLATE = "Редактировать шаблон" +NAVI_ITEM_ADD = "Добавить пункт меню" +NAVI_OPEN_ALL = "Раскрыть все" +NAVI_CLOSE_ALL = "Свернуть все" +NAVI_ITEM_DESCR = "Описание пункта меню" +NAVI_ITEM_IMAGE = "Изображение" +NAVI_ITEM_IMAGE_DESCR = "Изображение активное, в конце названия изображения должно быть _act" +NAVI_ITEM_IMAGE_ID = "Id изображения" +NAVI_PLACE_INSERT = "Место вставки подуровня" +NAVI_EXAMPLE = "Пример" +NAVI_ITEM_EVEN = "четный" +NAVI_ITEM_ODD = "нечетный" +NAVI_TAG = "Тег для вставки пунктов" +NAVI_LAVEL_TEMPL = "Шаблон уровня" +NAVI_CONDITIONS = "Условия" \ No newline at end of file diff --git a/admin/lang/ru/request.txt b/admin/lang/ru/request.txt new file mode 100644 index 0000000..eec323c --- /dev/null +++ b/admin/lang/ru/request.txt @@ -0,0 +1,196 @@ +[request] +REQUEST_ID = "ID" +REQUEST_DELETE = "Удалить запрос" +REQUEST_DELETE_CONFIRM = "Вы уверены, что хотите удалить данный запрос?" +REQUEST_TITLE = "Управление запросами" +REQUEST_NAME = "Наименование запроса" +REQUEST_NAME2 = "Наименование запроса:" +REQUEST_NAME3 = "Введите название запроса:" +REQUEST_CACHE = "Кешировать:" +REQUEST_CACHE_ELEMENTS = "Кешировать элементы запроса" +REQUEST_SETTINGS = "Параметры запроса" +REQUEST_TIP = "В данном разделе приведен список всех существующих запросов в системе. Для использования запроса разместите "Системный тег" в нужном месте Вашего шаблона или документа." +REQUEST_EDIT_TIP = "В данном разделе Вы можете отредактировать запрос, изменив рубрику для получения данных, шаблон вывода, а также условия выборки данных." +REQUEST_NEW = "Создание нового запроса" +REQUEST_EDIT = "Редактировать запрос" +REQUEST_EDIT2 = "Редактирование запроса" +REQUEST_SYSTEM_TAG = "Системный тег" +REQUEST_AUTHOR = "Автор" +REQUEST_DATE_CREATE = "Дата создания" +REQUEST_ACTIONS = "Действия" +REQUEST_NO_DESCRIPTION = "Запрос без описания" +REQUEST_NO_REQUST = "Запросы отсутсвуют." +REQUEST_DATE_FORMAT = "%d.%m.%y г." +REQUEST_DATE_FORMAT2 = "%d.%m.%y г. в %H:%M" +REQUEST_IN = "в" +REQUEST_COPY = "Копировать запрос" +REQUEST_COPY_FAILED = "Не удалось выполнить копирование запроса" +REQUEST_PLEASE_NAME = "Пожалуйста, укажите название для копируемого запроса" +REQUEST_CONDITION_EDIT = "Условия для запроса" +REQUEST_CONDITION_IF = "Условия" +REQUEST_PLEASE_SELECT = "Пожалуйста, выберите рубрику" +REQUEST_SELECT_RUBRIK = "Выберите рубрику:" +REQUEST_SELECT_INFO = "Вы уверены, что хотите изменить рубрику" +REQUEST_NEW_TIP = "Внимание! Прежде чем создать новый запрос Вы должны выбрать рубрику, из которой будут выводиться документы." +REQUEST_DESCRIPTION = "Описание запроса:" +REQUEST_INTERNAL_INFO = "(используется внутри системы)" +REQUEST_BUTTON_COND = "Добавить / Изменить" +REQUEST_CONDITION = "Условия запроса:" +REQUEST_ACTION_AFTER = "Вернуться к редактированию запроса после создания, чтобы добавить условия запроса." +REQUEST_SORT_BY = "Сортировать по параметру документа:" +REQUEST_SORT_BY_NAT = "Сортировать по полю документа:" +REQUEST_ASC_DESC = "В порядке:" +REQUEST_DESC = "убывания" +REQUEST_ASC = "возрастания" +REQUEST_BY_DATE = "Дате создания (публикации)" +REQUEST_BY_DATECHANGE = "Дате изменения (документа)" +REQUEST_BY_NAME = "Названию документов" +REQUEST_BY_EDIT = "Имени автора" +REQUEST_BY_PRINTED = "Количеству распечаток" +REQUEST_BY_VIEWS = "Количеству просмотров" +REQUEST_BY_RAND = "В случайном порядке (высокая нагрузка)" +REQUEST_DOC_PER_PAGE = "Количество на странице:" +REQUEST_DOC_PER_PAGE_ALL = "Выводить все" +REQUEST_SHOW_NAVI = "Показывать навигацию:" +REQUEST_USE_LANG = "Только на языке пользователя:" +REQUEST_USE_QUERY = "Использовать GET запросы в постраничной навигации" +REQUEST_TEMPLATE_QUERY = "Основной шаблон оформления запроса" +REQUEST_MAIN_CONTENT = "Системный тег отвечающий за вывод элементов запроса, указанных в поле "Элементы запроса"" +REQUEST_DOC_COUNT = "Системный тег отвечающий за вывод количества элементов запроса" +REQUEST_DOCITEMNUM_INFO= "Системный тег отвечающий за вывод порядкового номера элемента запроса" +REQUEST_MAIN_NAVI = "Системный тег отвечающий за вывод постраничной навигации для запроса (< 1 2 3 >)" +REQUEST_MEDIAPATH = "Системный тег определяющий путь до папки с шаблоном (Например: [tag:mediapath]images/logo.gif)" +REQUEST_PATH = "Системный тег определяющий корень установки" +REQUEST_DOCDB = "Системный тег вывода поля документа из БД" +REQUEST_LANGFILE = "Системный тег для вывода языковой переменной из файла" +REQUEST_LANGUAGE = "Тег включает подгрузку языковых файлов. Желательно указывать данный тег, до основного шаблона" +REQUEST_LANG = "Содержимое будет показано если язык документа совпадает с указанным" + +REQUEST_TEMPLATE_ITEMS = "Шаблон оформления для элементов запроса" +REQUEST_TEMPLATE_INFO = "В данном поле, используя HTML-код, Вы можете указать оформление для внутренних элементов запроса (Например, оформление списка новостей). Все элементы, оформленные согласно данному шаблону будут циклически отображаться в "Основном шаблоне" запроса, пока количество элементов, будет соответствовать условиям запроса." +REQUEST_TEMPLATE_SAVED = "Запрос успешно сохранен" +REQUEST_SELECT_IN_LIST = "Пожалуйста, выберите поле рубрики из списка, приведенного ниже" +REQUEST_RUB_INFO = "Системный тег отвечающий за вывод содержимого поля рубрики. ID-номер поля. ХХХ-количество символов для отображения." +REQUEST_LINK_INFO = "Системный тег определяющий ссылку на документ. Например, < a href="[tag:link]">Ссылка < /a >" +REQUEST_RUBRIK_FIELD = "Системный тег поля" +REQUEST_THUMBNAIL = "Тег отвечает за создание миниатюрки (При условии что в шаблоне поля рубрики (шаблон для вывода в запросе) выбран вывод: [tag:parametr:0])" +REQUEST_FIELD_NAME = "Название поля" +REQUEST_FIELD_TYPE = "Тип поля" +REQUEST_FIELD_G_UNKNOW = "Без группы" + +REQUEST_BUTTON_ADD = "Создать запрос" +REQUEST_BUTTON_ADD_NEXT = "Создать и продолжить" +REQUEST_BUTTON_SAVE = "Сохранить изменения" +REQUEST_BUTTON_SAVE_NEXT = "Применить (CTRL+S)" +REQUEST_BUTTON_CLOSE = "Закрыть окно" + +REQUEST_INSERT_INFO = "Нажмите на системный тег, чтобы добавить его в шаблон" +REQUEST_CONDITIONS = "Управление условиями запроса" +REQUEST_CONDITION_TIP = "В данном разделе Вы можете создать специальные условия выборки данных для запроса. Условия запроса позволяют наиболее точно определить вывод данных по тем или иным параметрам." +REQUEST_NEW_CONDITION = "Добавить новое условие" +REQUEST_FROM_FILED = "Выбрать из поля" +REQUEST_OPERATOR = "Где значение" +REQUEST_VALUE = "Значение" +REQUEST_COND_SELF = "Равно" +REQUEST_COND_NOSELF = "Не равно" +REQUEST_COND_USE = "Содержит значение" +REQUEST_COND_NOTUSE = "Не содержит значение" +REQUEST_COND_START = "Начинается с" +REQUEST_SMALL1 = "Меньше или равно" +REQUEST_BIG1 = "Больше или равно" +REQUEST_SMALL2 = "Меньше" +REQUEST_BIG2 = "Больше" +REQUEST_N_COND_SELF = "Число равно" +REQUEST_N_SMALL1 = "Число меньше или равно" +REQUEST_N_BIG1 = "Число больше или равно" +REQUEST_N_SMALL2 = "Число меньше" +REQUEST_N_BIG2 = "Число больше" +REQUEST_SEGMENT = "Принадлежит отрезку (через ,)" +REQUEST_INTERVAL = "Принадлежит интервалу (через ,)" +REQUEST_IN = "В списке (через ,)" +REQUEST_NOTIN = "Не в списке (через ,)" +REQUEST_ANY_NUM = "ОПАСНО!!! Число в запросе" +REQUEST_FREE = "ОПАСНО!!! Произвольное условие [field]={Значение}" +REQUEST_MARK_DELETE = "Отметить условие для удаления" +REQUEST_CONR_AND = "И" +REQUEST_CONR_OR = "ИЛИ" +REQUEST_OR = " или " + +REQUEST_VIEWS_INFO = "Системный тег отображающий количество просмотров для документа" +REQUEST_CONTROL_SORT = "Системный тег отвечающий за вывод панели сортировок по дате публикации, наименованию и количеству просмотров результатов вывода запроса" +REQUEST_NO_DROPDOWN = "В выбранной рубрике нет полей типа выпадающий список" +REQUEST_ENTER_NAME = "Пожалуйста, укажите название запроса." +REQUEST_ALL = "Список запросов" +REQUEST_IF_EMPTY = "Парный системный тег, внутри которого можно указать шаблон вывода при отсутствии результатов работы запроса" +REQUEST_NOT_EMPTY = "Парный системный тег, внутри которого можно указать шаблон вывода при наличии результатов работы запроса" +REQUEST_DOCID_INFO = "Системный тег, соответствующий идентификатору документа" +REQUEST_DOCTITLE_INFO = "Системный тег, соответствующий имени документа" +REQUEST_CDOCID_INFO = "Системный тег, соответствующий идентификатору текущего документа(в котором выводится запрос)" +REQUEST_DOCDATE_INFO = "Системный тег, соответствующий дате публикации документа" +REQUEST_CDOCDATE_INFO = "Системный тег, соответствующий дате публикации текущего документа(в котором выводится запрос)" +REQUEST_DOCTIME_INFO = "Системный тег, соответствующий дате и времени публикации документа" +REQUEST_CDOCTIME_INFO = "Системный тег, соответствующий дате и времени публикации текущего документа(в котором выводится запрос)" +REQUEST_DATE_INFO = "Системный тег, дата и время публикации документа - Настраиваемый вид.
Пример: [tag:date:d.m.Y]
Можно исрльзовать разделители (space - . /)" +REQUEST_CDATE_INFO = "Системный тег, дата и время публикации документа - Настраиваемый вид.
Пример: [tag:date:d.m.Y]
(в котором выводится запрос)
Можно исрльзовать разделители (space - . /)" +REQUEST_DOCAUTHOR_INFO = "Системный тег, соответствующий автору документа" +REQUEST_DOCAUTHOR_AVATAR = "Системный тег, соответствующий аватаре автора документа" +REQUEST_CDOCAUTHOR_INFO = "Системный тег, соответствующий автору текущего документа(в котором выводится запрос)" +REQUEST_SAMPLE = "Пример" +REQUEST_HIDE_CURRENT = "Не показывать в запросе текущий документ" +REQUEST_ONLY_OWNER = "Только СВОИ (UserID) документы" +REQUEST_CONDITION_JOIN = "Оператор" +REQUEST_CONDITION_SAVE = "Сохранить условия" +REQUEST_CONDITION_ADD = "Добавить условие" + +REQUEST_SUCCESS = "Выполнено" +REQUEST_ERROR = "Ошибка" +REQUEST_CANCEL = "Отменить" + +REQUEST_SORTED = "Порядок успешно сохранён" +REQUEST_COND_MESSAGE = "Условия запроса отсутсвуют" +REQUEST_COND_VALUE_ERR = "Пустое поле Значение" +REQUEST_COND_NEW_ERR = "Не удалось добавить новое условие
Попробуйте еще раз" +REQUEST_COND_NEW_SUC = "Условие успешно добавлено" +REQUEST_COND_POST_OK = "Условия успешно сохранены" +REQUEST_COND_POST_ERR = "Не удалось сохранить условия запроса
Попробуйте еще раз" +REQUEST_COND_NO_POST = "Нет данных для сохранения
Попробуйте еще раз" + +REQUEST_COND_ADD_SUC = "Добавил условия запроса" +REQUEST_COND_CHA_SUC = "Изменил условия запроса" +REQUEST_COND_DEL_SUC = "Удалил условия запроса" +REQUEST_SAVE_CHA_SUC = "Отредактировал запрос" +REQUEST_ADD_NEW_SUC = "Добавил новый запрос" +REQUEST_DELETE_SUC = "Удалил запрос" +REQUEST_COPY_SUC = "Создал копию запроса" + +REQUEST_HEADER_SELF = "Основные параметры запроса" +REQUEST_HEADER_NAME = "Значение" +REQUEST_HEADER_PARAMETR = "Параметр" + +REQUEST_REPORT_ERR_TITLE = "Отсутствует наименование запроса" +REQUEST_REPORT_ERR_TEXT = "Отсутствует основной шаблон оформления запроса" +REQUEST_REPORT_ERR_PHP = "Запрещено использовать PHP код" +REQUEST_REPORT_ERR_PHP_N = "Попытка использования PHP кода в шаблоне запроса при создании запроса" +REQUEST_REPORT_ERR_PHP_E = "Попытка использования PHP кода в шаблоне запроса" +REQUEST_REPORT_ERR_RUBRIC= "Не выбрана рубрика" +REQUEST_BY_PARENT = "Родительскому документу" +REQUEST_SHOW_STAT = "Показать статистику" + +// v 3.1.9 +REQUEST_ALIAS = "Алиас" +REQUEST_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:request:alias] вместо [tag:request:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах модуля" +REQUEST_ACCEPT = "Этот алиас можно использовать" +REQUEST_ER_SYN = "Неверный алиас!
Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание и иметь длину не более 20 символов" +REQUEST_ER_EXISTS = "Неверный алиас!
Данный алиас уже привязан к другому запросу" +REQUEST_HEADER_EXTERNAL = "Внешнее обращение" +REQUEST_EXTERNAL = "Разрешить внешнее обращение" +REQUEST_ONLY_AJAX = "Выполнять только по Ajax" + +// v 3.2 +REQUEST_PAGINATION = "Постраничная навигация" +REQUEST_NAVI_TPL = "Шаблон постраничной навигации" +REQUEST_OTHER = "Прочее" +REQUEST_SHOW_SQL = "Показать SQL запрос" +REQUEST_DOC_ON_PAGE = "Число элементов запроса на странице" +REQUEST_PAGES_CURENT = "Номер страницы пагинации" +REQUEST_PAGES_TOTAL = "Общее кол-во страниц пагинации" \ No newline at end of file diff --git a/admin/lang/ru/rubs.txt b/admin/lang/ru/rubs.txt new file mode 100755 index 0000000..e988636 --- /dev/null +++ b/admin/lang/ru/rubs.txt @@ -0,0 +1,280 @@ +[rubs] +RUBRIK_SUB_TITLE = "Управление рубриками" +RUBRIK_TIP = "В данном разделе приведен список всех рубрик в системе. Здесь вы можете отредактировать шаблон рубрики, права доступа, удалить рубрику, а также скопировать рубрику, чтобы создать на ее основе новую." +RUBRIK_ID = "ID" +RUBRIK_NAME = "Название рубрики" +RUBRIK_NAME2 = "Название рубрики:" +RUBRIK_TEMPLATE_OUT = "Использовать в шаблоне" +RUBRIK_TEMPLATE_OUT2 = "Использовать в шаблоне:" +RUBRIK_URL_PREFIX = "Префикс для ссылок" +RUBRIK_URL_PREFIX2 = "Префикс для ссылок:" +RUBRIK_DOCS_VI = "Отображать документы в списке" +RUBRIK_URL_PREFIX2 = "Префикс для ссылок:" +RUBRIK_COUNT_DOCS = "Кол-во документов" +RUBRIK_COUNT_FIELDS = "Кол-во полей" +RUBRIK_AUTHOR = "Автор" +RUBRIK_ACTION = "Действия" +RUBRIK_FORMAT = "Используйте" +RUBRIK_FORMAT_TIME = "для ссылок в формате времени" +RUBRIK_FORMAT_ID = "для вставки id документа" +RUBRIK_EDIT = "Редактировать поля и права рубрики" +RUBRIK_EDIT_TMPLS = "Дополнительные шаблоны" +RUBRIK_NO_VIEW = "Извините, но Вы не имеете прав на просмотр списка рубрик." +RUBRIK_NO_CHANGE1 = "Извините, но Вы не имеете прав на редактирование полей рубрики." +RUBRIK_NO_CHANGE2 = "Извините, но Вы не имеете прав на редактирование шаблона данной рубрики." +RUBRIK_NO_CHANGE3 = "Извините, но Вы не имеете прав на создание новых рубрик." +RUBRIK_EDIT_TEMPLATE = "Редактировать шаблон рубрики" +RUBRIK_EDIT_CODE = "Редактировать исполняемый код для рубрик" +RUBRIK_EDIT_CODE_T = "Редактирование исполняемого кода для рубрик" +RUBRIK_EDIT_CODE_NO = "Нет доступа для редактирования исполняемого кода" +RUBRIK_DELETE = "Удалить данную рубрику" +RUBRIK_DELETE_LEGEND = "Удалить рубрику" +RUBRIK_DELETE_CONFIRM = "Вы уверены, что хотите удалить данную рубрику?" +RUBRIK_NO_PERMISSION = "Извините, но вы не имеете прав на удаление рубрик." +RUBRIK_USE_DOCUMENTS = "Извините, но вы не можете удалить данную рубрику, т.к. в ней содержатся документы." +RUBRIK_MULTIPLY = "Копировать рубрику" +RUBRIK_NO_MULTIPLY = "Извините, но вы не имеете прав на копирование рубрик" +RUBRIK_BUTTON_SAVE = "Сохранить изменения" +RUBRIK_BUTTON_TEMPL = "Редактировать шаблон" +RUBRIK_BUTTON_FIELDS = "Редактировать поля" +RUBRIK_BUTTON_CODE = "Редактировать код рубрики" +RUBRIK_LEGEND = "Значения пиктограмм" +RUBRIK_NEW = "Создание новой рубрики" +RUBRIK_NEW_TIP = "В данном разделе вы можете создать новую рубрику. Пожалуйста, укажите название новой рубрики и выберите шаблон для вывода." +RUBRIK_BUTTON_NEW = "Создать рубрику" +RUBRIK_EDIT_FIELDS = "Управление полями и правами доступа к рубрике" +RUBRIK_DESCRIPTION = "Описание рубрики" +RUBRIK_NO_FIELDS = "Внимание! Вы не создали ни одного поля. Пожалуйста, добавьте хотя бы одно поле." +RUBRIK_FIELDS_INFO = "В данном разделе вы можете создать группу полей, которые будут использованы для документов в данной рубрике." +RUBRIK_MULTIPLY2 = "Копирование рубрики" +RUBRIK_MULTIPLY_TIP = "Пожалуйста, укажите название и префикс для ссылок новой рубрики" +RUBRIK_BUTTON_COPY = "Копировать" +RUBRIK_TEMPLATE_EDIT = "Редактирование шаблона рубрики" +RUBRIK_TEMPLATE_NEW = "Создание шаблона рубрики" +RUBRIK_TEMPLATE_SAVED = "Шаблон успешно сохранен" +RUBRIK_NO_FIELD = "В данной рубрике отсутсвуют поля" +RUBRIK_FIELD_NAME = "Название поля" +RUBRIK_FIELD_GROUP = "Группа" +RUBRIK_FIELD_GROUP_SEL = "Выберите группу" +RUBRIK_FIELD_ALIAS = "Алиас поля" +RUBRIK_FIELD_TYPE = "Тип поля" +RUBRIK_FIELD_UNKNOW = "Неизвестно" +RUBRIK_FIELD_G_UNKNOW = "Без группы" +RUBRIK_POSITION = "Позиция" +RUBRIK_NEW_FIELD = "Создание нового поля для рубрики" +RUBRIK_BUTTON_ADD = "Добавить поле" +RUBRIK_SET_PERMISSION = "Права доступа к документам для групп пользователей" +RUBRIK_USER_GROUP = "Группа" +RUBRIK_DOC_READ = "Просмотр" +RUBRIK_ALL_PERMISSION = "Все права" +RUBRIK_CREATE_DOC = "Создавать с проверкой" +RUBRIK_CREATE_DOC_NOW = "Создавать без проверки" +RUBRIK_EDIT_OWN = "Редактировать свои" +RUBRIK_EDIT_DELREV = "Управление ревизиями" +RUBRIK_EDIT_OTHER = "Редактировать все" +RUBRIK_VIEW_TIP = "Установите флажок, если вы хотите рарешить данной группе пользователей просмотр документов" +RUBRIK_ALL_TIP = "Установите флажок, если вы хотите рарешить данной группе пользователей выполнять любые действия с документами в данной рубрике." +RUBRIK_DOC_TIP = "Установите флажок, если вы хотите рарешить данной группе пользователей создавать документы.
Внимание!
Перед публикацией документа, он должен быть проверен Администратором" +RUBRIK_DOC_NOW_TIP = "Установите флажок, если вы хотите рарешить данной группе пользователей создавать документы.
Внимание!
Публикация документа будет осуществелена без проверки Администратора." +RUBRIK_OWN_TIP = "Установите флажок, если вы хотите рарешить данной группе пользователей редактировать только свои документы" +RUBRIK_OTHER_TIP = "Установите флажок, если вы хотите рарешить данной группе пользователей редактировать свои и чужие документы" +RUBRIK_DELREV_TIP = "Установите флажок, если вы хотите рарешить данной группе пользователей работать с ревизиями документов" +RUBRIK_BUTTON_PERM = "Сохранить права" +RUBRIK_FIELD_DEFAULT = "Значение по умолчанию" +RUBRIK_TEMPLATE_TIP = "В данном разделе, используя язык разметки HTML, вы должны создать шаблон оформления для документов при полном просмотре," +RUBRIK_HTML = "Шаблон оформления рубрики" +RUBRIK_HTML_2 = "Шаблон оформления HEADER" +RUBRIK_HTML_3 = "Шаблон оформления TEASER" +RUBRIK_HTML_4 = "Шаблон оформления ADMIN TEASER" +RUBRIK_PHP_DENIDED = "Ошибка!
Вы не имеете прав на редактирование шаблона рубрики, так как он используется PHP код, а вы не имеете прав на использование PHP кода." +RUBRIK_PHP_MESSAGE = "Запрещено использовать PHP код." +RUBRIK_EMPTY_MESSAGE = "Не задано наименование поля." +RUBRIK_INSERT_HELP = "Нажмите, чтобы добавить системный тег в шаблон" +RUBRIK_BUTTON_TPL = "Сохранить шаблон" +RUBRIK_BUTTON_TPL_NEXT = "Применить (CTRL+S)" +RUBRIK_BUTTON_TPL_CLOSE = "Закрыть" +RUBRIK_NO_RUBRIK = "Нет такой рубрики!" +RUBRIK_NO_NAME = "Пожалуйста, укажите название рубрики" +RUBRIK_NAME_EXIST = "Извините, но рубрика с таким названием уже существует. Пожалуйста, укажите другое название рубрики." +RUBRIK_PREFIX_EXIST = "Извините, но рубрика с таким URL-префиксом уже существует. Пожалуйста, укажите другой URL-префикс рубрики." +RUBRIK_VIEWS_INFO = "Системный тег, отображающий количество просмотров для документа" +RUBRIK_HIDE_INFO = "Системный тег, позволяющий скрыть текст для определенных групп пользователей, где Х - номер группы" +RUBRIK_THUMBNAIL = "Тег отвечает за создание миниатюрки (При условии что в шаблоне поля рубрики (шаблон для вывода в документе) выбран вывод: [tag:parametr:0])" +RUBRIK_LINK_HOME = "Ссылка на главную страницу сайта" +RUBRIK_MARK_DELETE = "Отметить данный пункт для удаления" +RUBRIK_MARK_DEL_ALL = "Отметить все" +RUBRIK_CHECK_SEARCH = "Искать по этому полю" +RUBRIK_CHECK_NUMERIC = "Числовое поле" +RUBRIK_SEARCH_TIP = "Отметьте поле, если хотите, чтобы по нему осуществлялся поиск (работает с модулем 'Поиск' версии 2.0.2 и выше)" +RUBRIK_NUMERIC_TIP = "Отметьте поле, если его значения всегда числовые. Используется в запросах для сортировки" +RUBRIK_ALL = "Список рубрик" +RUBRIK_EDIT_FIELDS_GROUPS = "Редактировать группы полей" +RUBRIK_FIELDS_GROUPS = "Группы полей" +RUBRIK_ENTER_NAME = "Пожалуйста, укажите название рубрики." +RUBRIK_TEMPLATE_HIDE = "Показать/свернуть шаблоны всех полей" +RUBRIK_FILED_TEMPLATE_H = "Редактировать шаблон и описание поля" +RUBRIK_FILED_TEMPLATE_DESCR = "Описание поля" +RUBRIK_FILED_TEMPLATE_F = "Шаблон поля" +RUBRIK_DOCID_INFO = "Системный тег, идентификатор документа" +RUBRIK_DOCDATE_INFO = "Системный тег, дата публикации документа" +RUBRIK_DOCTIME_INFO = "Системный тег, дата и время публикации документа" +RUBRIK_DATE_INFO = "Системный тег, дата и время публикации документа - Настраиваемый вид.
Пример: [tag:date:Y]" +RUBRIK_DOCAUTHOR_INFO = "Системный тег, автор документа" +RUBRIK_TITLE_INFO = "Системный тег, заголовка документа" +RUBRIK_PATH_INFO = "Системный тег, путь к корню установки" +RUBRIK_MEDIAPATH_INFO = "Системный тег, путь к папке дизайна" +RUBRIK_PREFIX_BAD_CHAR= "Недопустимые символы в префиксе" +RUBRIK_FIELDS_TITLE = "Поля рубрики" +RUBRIK_FIELDS_TPL = "Шаблон вывода поля в документе" +RUBRIK_RUBRIK_TPL = "Шаблон вывода поля в запросе" +RUBRIK_SORTED = "Порядок успешно сохранён" +RUBRIK_F_SORT_TIP = "Для упорядочивания полей нажмите на крестик и, удерживая его, перетащите поле" +RUBRIK_R_SORT_TIP = "Для упорядочивания рубрик нажмите на крестик и, удерживая его, перетащите поле" +RUBRIK_META_GEN_TIP = "Автоматически генерировать keywords, description для документа, на основе его контента" +RUBRIK_ALIAS_HISTORY_TIP = "Сохранять историю алиасов у документов" +RUBRIK_MOVE = "Переместить" +RUBRIK_REQUEST_TPL = "Шаблон вывода поля в запросе" +RUBRIK_BREADCRUMB = "Систменый тег Хлебных крошек" +RUBRIK_CODE = "Исполняемый код для рубрик" +RUBRIK_START_CODE = "Код, выполняемый перед загрузкой документа" +RUBRIK_CODE_START = "Код, выполняемый перед сохранением документа" +RUBRIK_CODE_END = "Код, выполняемый после сохранения документа" +RUBRIK_TAGS = "Тег" +RUBRIK_TAGS_ID = "Тег ID" +RUBRIK_TAGS_ALIAS = "Тег Алиас" +RUBRIK_HTML_T = "HTML код шаблона" +RUBRIK_TAG_DESC = "Описание тега" +RUBRIK_NEW_FIEL_TITLE = "Для полей Выпадающий список и Мульти список, Значение по умолчанию пишутся через запятую" +RUBRIK_LINK = "Связать рубрику" +RUBRIK_LINK_DESC = "Задавая связь между рубриками, при добавлении документов можно автоматически подставлять алиасы." +RUBRIK_NOLINK = "Не выбрано" +RUBRIK_OR = " или " + +RUBRIC_F_GROUP_TITLE = "Наименование группы" +RUBRIC_F_GROUP_DELETE = "Удалить группу" +RUBRIC_F_GROUP_DELETE_H = "Вы уверены, что хотите удалить группу?" +RUBRIC_NO_GROUPS = "В настоящий момент, для данной рубрики, нет групп полей" +RUBRIC_GROUP_ADD = "Добавить группу" +RUBRIK_NEW_GROUP = "Добавить новую группу" +RUBRIK_HEADER_GROUP = "Управление группами полей" + +RUBRIK_TEMPLATES_TAGS = "Тег" +RUBRIK_TEMPLATES_TAG_DESC = "Описание тега" +RUBRIK_TEMPLATES_THEME_FOLDER = "Наименование шаблона (Имя папки с файлами для данного шаблона)" +RUBRIK_TEMPLATES_PAGENAME = "Наименование сайта" +RUBRIK_TEMPLATES_TITLE = "Наименование страницы" +RUBRIK_TEMPLATES_KEYWORDS = "Ключевые слова (Meta - Keywords)" +RUBRIK_TEMPLATES_DESCRIPTION = "Описание страницы (Meta - Description)" +RUBRIK_TEMPLATES_INDEXFOLLOW = "Тип индексирования" +RUBRIK_TEMPLATES_PATH = "Корневой путь установки" +RUBRIK_TEMPLATES_MEDIAPATH = "Путь до папки с шаблоном (Пример: [tag:mediapath]images/logo.gif)" +RUBRIK_TEMPLATES_CSS = "Сжимает несколько css-файлов в один. Возвращает путь.
FFF - имена файлов через запятую
P - путь к папке с файлами, не обязательно. По умолчанию - [tag:mediapath]css/

Пример: href="[tag:css:reset.css,style.css]"" +RUBRIK_TEMPLATES_JS = "Сжимает несколько js-файлов в один. Возвращает путь.
FFF - имена файлов через запятую
P - путь к папке с файлами, не обязательно. По умолчанию - [tag:mediapath]js/

Пример: href="[tag:js:common.js,main.js]"" + +RUBRIK_RUB_INFO = "Системный тег отвечающий за вывод содержимого поля рубрики. ID-номер поля. ХХХ-количество символов для отображения." +RUBRIK_SELECT_IN_LIST = "Пожалуйста, выберите поле рубрики из списка, приведенного ниже" +RUBRIK_TEMPLATE_ITEMS = "Шаблон оформления для элементов запроса" +RUBRIK_DOCID_INFO = "Системный тег, соответствующий идентификатору документа" +RUBRIK_DOCTITLE_INFO = "Системный тег, соответствующий имени документа" +RUBRIK_CDOCID_INFO = "Системный тег, соответствующий идентификатору текущего документа(в котором выводится запрос)" +RUBRIK_DOCDATE_INFO = "Системный тег, соответствующий дате публикации документа" +RUBRIK_CDOCDATE_INFO = "Системный тег, соответствующий дате публикации текущего документа(в котором выводится запрос)" +RUBRIK_DOCTIME_INFO = "Системный тег, соответствующий дате и времени публикации документа" +RUBRIK_CDOCTIME_INFO = "Системный тег, соответствующий дате и времени публикации текущего документа(в котором выводится запрос)" +RUBRIK_DATE_INFO = "Системный тег, дата и время публикации документа - Настраиваемый вид.
Пример: [tag:date:d.m.Y]
Можно исрльзовать разделители (space - . /)" +RUBRIK_CDATE_INFO = "Системный тег, дата и время публикации документа - Настраиваемый вид.
Пример: [tag:date:d.m.Y]
(в котором выводится запрос)
Можно исрльзовать разделители (space - . /)" +RUBRIK_DOCAUTHOR_INFO = "Системный тег, соответствующий автору документа" +RUBRIK_DOCAUTHOR_AVATAR = "Системный тег, соответствующий аватаре автора документа" +RUBRIK_CDOCAUTHOR_INFO = "Системный тег, соответствующий автору текущего документа(в котором выводится запрос)" +RUBRIK_VIEWS_INFO = "Системный тег отображающий количество просмотров для документа" +RUBRIK_COMMENTS_INFO = "Системный тег отображающий количество комментариев для документа. Внимание! Работает только при установленном модуле!" +RUBRIK_PATH = "Системный тег определяющий корень установки" +RUBRIK_MEDIAPATH = "Системный тег определяющий путь до папки с шаблоном (Например: [tag:mediapath]images/logo.gif)" +RUBRIK_THUMBNAIL = "Тег отвечает за создание миниатюрки (При условии что в шаблоне поля рубрики (шаблон для вывода в запросе) выбран вывод: [tag:parametr:0])" + +RUBRIK_ALIAS_HEAD = "Назначение алиса для поля" +RUBRIK_ALIAS_HEAD_T = "Можно использовать только латинские символы и цифры!
Пример: header" +RUBRIK_ALIAS_HEAD_R = "Рубрика:" +RUBRIK_ALIAS_HEAD_F = "Поле:" +RUBRIK_ALIAS_ALIAS = "Алиас поля" +RUBRIK_ALIAS_NAME = "Наименование алиаса" +RUBRIK_ALIAS_BUTT = "Сохранить" + +RUBRIK_ALIAS_ERROR = "Ошибка:" +RUBRIK_ALIAS_RUBID = "Неверно указана рубрика" +RUBRIK_ALIAS_FIELDID = "Неверно указано поле" +RUBRIK_ALIAS_MATCH = "Неверно указано значение" +RUBRIK_ALIAS_USED = "Данное значение уже используется" + +RUBRIK_REPORT_QUICKSAVE = "Выполнил быстрое сохранение настроек рубрик" +RUBRIK_REPORT_SORTE = "Выполнил сортировку рубрик" +RUBRIK_REPORT_SORTE_FIELDS = "Выполнил сортировку полей рубрики" +RUBRIK_REPORT_PERMISION = "Изменил права доступа к документам рубрики" +RUBRIK_REPORT_COPY = "Создал копию рубрики" +RUBRIK_REPORT_TEMPL_RUB = "Отредактировал шаблон рубрики" +RUBRIK_REPORT_FIELD_EDIT = "Отредактировал поле" +RUBRIK_REPORT_FIELD_DEL = "Удалил поле" +RUBRIK_REPORT_RUB = "рубрики" + +RUBRIK_REP_QUICKSAVE_H = "Выполнено" +RUBRIK_REP_QUICKSAVE_T = "Настройки рубрик успешно сохранены" + +RUBRIK_REPORT_ADD = "Добавил рубрику" +RUBRIK_REPORT_SAVE_TPL = "Сохранил шаблон оформления рубрики" + +RUBRIK_CODE_SAVED = "Исполняемый код для рубрики успешно сохранен" +RUBRIK_CODE_SAVED_ERR = "Не удалось сохранить исполняемый код для рубрики.
Попробуйте еще раз." +RUBRIK_CODE_ERROR = "Ошибка" +RUBRIK_CODE_SUCCESS = "Выполнено" +RUBRIK_CODE_UPDATE = "Изменил исполняемый код для рубрики" + +RUBRIK_LOG_NEW_FIELD = "Добавил поле рубрики" +RUBRIK_LOG_DEL_RUBRIC = "Удалил рубрику" +RUBRIK_LOG_NEW_RUBRIC = "Создал рубрику" + +RUBRIK_FILDS_SAVED = "Успешно сохранено" +RUBRIK_FILD_SAVED = "Поле успешно добавлено" +RUBRIK_FILDS_REPORT = "Сохранил поля рубирки" +RUBRIK_FILDS_ERROR = "Ошибка" +RUBRIK_FILDS_SUCCESS = "Выполнено" + +RUBRIC_ERROR = "Ошибка" +RUBRIC_SUCCESS = "Выполнено" +RUBRIC_SAVED_PHP_ERR = "Запрещено использовать в шаблонах PHP код" +RUBRIC_SAVED_TPL_ERR = "Не удалось сохранить шаблон рубрики.
Попробуйте еще раз." +RUBRIC_SAVED_TPL = "Шаблон рубрики успешно сохранен." +RUBRIC_SAVED_FLDTPL = "Шаблон поля успешно сохранен." +RUBRIK_TAG_SYSBLOCK = "Системный тег вывода системного блока" +RUBRIK_TAG_TEASER = "Системный тег вывода тизера" +RUBRIK_TAG_ALIAS = "Системный тег вывода алиаса документа" +RUBRIK_TAG_REQUEST = "Системный тег вывода запроса" +RUBRIC_SAVED_PERMS = "Права доступа к документам успешно сохранены " +RUBRIK_IFELSE = "Условия" +RUBRIK_IFELSE_1 = "выводим если поле непустое" +RUBRIK_IFELSE_2 = "иначе выводим если поле пустое" +RUBRIK_SAMPLE = "Пример" +RUBRIK_TAG_DOCDB = "Системный тег вывода поля документа из БД" +RUBRIK_TAG_LANGFILE = "Системный тег для вывода языковой переменной из файла" + +RUBRIC_TMPLS_BUTTON = "Дополнительные шаблоны рубрики" +RUBRIC_TMPLS_HEAD = "Список дополнительных шаблонов рубрики" +RUBRIC_TMPLS_ADD = "Добавить новый шаблон" +RUBRIC_TMPLS_ID = "id" +RUBRIC_TMPLS_NAME = "Наименование" +RUBRIC_TMPLS_NAME_FULL = "Наименование шаблона оформления рубрики" +RUBRIC_TMPLS_AUTHOR = "Автор" +RUBRIC_TMPLS_DATE = "Дата" +RUBRIC_TMPLS_COUNT_DOCS = "Кол-во документов" +RUBRIC_TMPLS_ACTIONS = "Действия" +RUBRIC_TMPLS_COPY = "Копировать шаблон" +RUBRIC_TMPLS_COPY_TIP = "Пожалуйста, укажите наименование шаблона" +RUBRIC_TMPLS_COPY_TIP2 = "Пожалуйста, укажите наименование для копируемого шаблона" +RUBRIC_TMPLS_EDIT = "Редактировать" +RUBRIC_TMPLS_DELETE = "Удалить" +RUBRIC_TMPLS_DELETE_C = "Вы уверены, что хотите удалить шаблон?" +RUBRIC_TMPLS_TIP = "Вы можете создавать неограниченное кол-во шаблонов для одной рубрики" +RUBRIC_TMPLS_NO_ITEMS = "Сообщение:
В настоящий момент нет дополнительных шаблонов." +RUBRIC_TMPLS_FROM = "Создать копию основного шаблона" +RUBRIC_TMPLS_INNAME = "Введите наименование шаблона" +RUBRIC_TEMPL_REPORT = "Отредактировал дополнительный шаблон рубрики" +RUBRIC_TMPLS_LOG_DEL = "Удалил дополнительный шаблон рубрики" \ No newline at end of file diff --git a/admin/lang/ru/scripts.js b/admin/lang/ru/scripts.js new file mode 100644 index 0000000..349f1db --- /dev/null +++ b/admin/lang/ru/scripts.js @@ -0,0 +1,62 @@ +var logoutTitle = "Выход из панели управления"; +var logoutConfirm = "Вы уверены, что хотите выйти?"; +var clearCacheTitle = "Очистка кэша"; +var clearCacheConfirm = "Вы уверены, что хотите очистить кэш?"; +var clearCacheSessTitle = "Очистка кэша и сессий"; +var clearCacheSessConfirm = "Вы уверены, что хотите очистить кэш и сессии?"; +var clearThumbTitle = "Удаление миниатюр"; +var clearThumbConfirm = "Вы уверены, что хотите удалить все миниатюры изображений
из директории для хранения файлов (UPLOAD_DIR)?"; +var clearRevTitle = "Удаление ревизий документов"; +var clearRevConfirm = "Вы уверены, что хотите удалить все ревизии документов?"; +var clearCountTitle = "Обнулить подневный счетчик документов"; +var clearCountConfirm = "Вы уверены, что хотите обнулить подневный счетчик документов?"; +var cacheShowTitle = "Показать размер кеша"; +var cacheShowConfirm = "Вы уверены, что хотите посмотреть размер кэша?
Это может занять какое-то время."; +var ajaxErrorStatus = "Нет соеденения.
Проверьте свое подключение."; +var ajaxErrorStatus404 = "Запрашиваемая страница не найдена. [404]"; +var ajaxErrorStatus401 = "Запрос не может быть выполнен.
Ошибка авторизации для выполнения этого запроса. [401]"; +var ajaxErrorStatus500 = "Произошла внутреняя ошибка.
Попробуйте повторить свой запрос позже. [500]"; +var ajaxErrorStatusJSON = "Некорректный ответ сервера
Данные не в формате JSON."; +var ajaxErrorStatusTimeOut = "Вермя запроса вышло."; +var ajaxErrorStatusAbort = "Ajax запрос прерван."; +var ajaxErrorStatusMess = "Ошибка:
"; +var delCascadTitle = "Удалить изображение"; +var delCascadConfirm = "Вы уверены что хотите удалить?"; +var saveMessageOk = "Данные сохранены"; + +//===== Date & Time Pickers =====// +$.datepicker.regional['ru'] = { + closeText: 'Закрыть', + prevText: '<Пред', + nextText: 'След>', + currentText: 'Сегодня', + monthNames: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', + 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' + ], + monthNamesShort: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', + 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек' + ], + dayNames: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'], + dayNamesShort: ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'], + dayNamesMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], + weekHeader: 'Не', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' +}; +$.datepicker.setDefaults($.datepicker.regional['ru']); + +$.timepicker.regional['ru'] = { + timeOnlyTitle: 'Выберите время', + timeText: 'Время', + hourText: 'Часы', + minuteText: 'Минуты', + secondText: 'Секунды', + millisecText: 'миллисекунды', + currentText: 'Теперь', + closeText: 'Закрыть', + ampm: false +}; +$.timepicker.setDefaults($.timepicker.regional['ru']); \ No newline at end of file diff --git a/admin/lang/ru/settings.txt b/admin/lang/ru/settings.txt new file mode 100644 index 0000000..6d8d20f --- /dev/null +++ b/admin/lang/ru/settings.txt @@ -0,0 +1,140 @@ +[settings] +SETTINGS_COUNTRIES = "Управление странами" +SETTINGS_COUNTRIES_ALL = "Список стран" +SETTINGS_COUNTRY_TIP = "Пожалуйста, выберите страны, которые будут доступны для выбора при регистрации новых пользователей в системе. Помните, что выбранный вами список стран может быть использован другими модулями в системе." +SETTINGS_ACTIVE = "Активна?" +SETTINGS_COUNTRY_NAME = "Название страны" +SETTINGS_IN_EC = "Относится к ЕС?" +SETTINGS_YES = "Да" +SETTINGS_NO = "Нет" +SETTINGS_BUTTON_SAVE = "Сохранить изменения" +SETTINGS_BUTTON_SAVE_AJAX = "Применить (CTRL+S)" +SETTINGS_OR = "или" +SETTINGS_MAIN_TITLE = "Управление общими настройками системы" +SETTINGS_CASE_TITLE = "Дополнительные настройки" +SETTINGS_MAIN = "Общие настройки системы" +SETTINGS_SAVED = "Настройки системы успешно сохранены" +SETTINGS_SAVED_ERR = "Не удалось сохранить настройки.
Попробуйте еще раз." +SETTINGS_SAVE_INFO = "В данном разделе вы можете отредактировать глобальные параметры системы. Пожалуйста, будьте предельно внимательны и помните, что Неверные параметры могут сделать систему неработоспособной." +SETTINGS_SAVE_CONFIRM = "Вы уверены, что хотите сохранить параметры системы?" +SETTINGS_SITE_NAME = "Название cайта:" +SETTINGS_SITE_COUNTRY = "Страна сайта:" +SETTINGS_EMAIL_SENDER = "E-mail отправителя:" +SETTINGS_EMAIL_NAME = "Имя отправителя E-mail:" +SETTINGS_MAIL_TRANSPORT = "Метод отправки почты:" +SETTINGS_MAIL = "mail" +SETTINGS_SENDMAIL = "sendmail" +SETTINGS_SMTP = "smtp" +SETTINGS_SMTP_SERVER = "Сервер SMTP:" +SETTINGS_MAIL_PORT = "Порт SMTP:" +SETTINGS_SMTP_NAME = "Пользователь:" +SETTINGS_SMTP_PASS = "Пароль:" +SETTINGS_SMTP_ENCRYPT = "Шифрование" +SETTINGS_SMTP_NOENCRYPT = "нет" +SETTINGS_MAIL_PATH = "Путь до папки sendmail:" +SETTINGS_SYMBOL_BREAK = "Принудительный перенос после (знаков):" +SETTINGS_SYMBOL_BREAK_INFO = "Не более 1000 согласно RFC 2822" +SETTINGS_SYMBOLS = "символов" +SETTINGS_TEXT_EMAIL = "Cообщение пользователю после создания аккаунта, где:" +SETTINGS_TEXT_INFO = "%NAME% - Имя пользователя
%HOST% - Cсылка на сайт
%PASSWORD% - Пароль
%EMAIL% - E-mail пользователя
%EMAILSIGNATURE% - Подпись сообщения" +SETTINGS_EMAIL_FOOTER = "Текст подписи:" +SETTINGS_ERROR_PAGE = "Страница с ошибкой HTTP 404: Page not found" +SETTINGS_PAGE_DEFAULT = "(по умолчанию Id:2)" +SETTINGS_TEXT_PERM = "Текст сообщения, если пользователь не имеет прав:" +SETTINGS_HIDDEN_TEXT = "Текст сообщения при отсутствии прав для просмотра информации скрытой тегом [tag:hide:X,X]...[/tag:hide]" + +SETTINGS_NAVI_BOX = "Контейнер постраничной навигации:
Пример: <ul>%s</ul>" +SETTINGS_LINK_BOX = "Контейнер для элементов постраничной навигации:
Пример: <li>%s</li>" +SETTINGS_TOTAL_BOX = "Контейнер для текста перед номерами страниц:
Пример: <span>%s</span>" +SETTINGS_ACTIVE_LINK_BOX= "Контейнер для активного элемента:
Пример: <span class="active">%s</span>" +SETTINGS_PAGE_SEPAR = "Контейнер для метки о наличии страниц:
Пример: <li>%s</li>" +SETTINGS_PAGE_BEFORE = "Текст перед номерами страниц:
Пример: Страница %d из %d" +SETTINGS_PAGE_START = "Текст ссылки "Первая":" +SETTINGS_PAGE_END = "Текст ссылки "Последняя":" +SETTINGS_PAGE_SEPARATOR = "Текст метки о наличии страниц кроме видимых:" +SETTINGS_PAGE_NEXT = "Текст ссылки "Следующая":" +SETTINGS_PAGE_PREV = "Текст ссылки "Предыдущая":" + +SETTINGS_MAIN_BREADCRUMBS = "Настройка вывода «хлебных крошек»" +SETTINGS_BREAD_BOX = "Контейнер «хлебных крошек»:
Пример: <ul class="breadcrumb">%s</ul>" +SETTINGS_BREAD_MAIN = "Показывать первый элемент: Главная страница:
Да/Нет" +SETTINGS_BREAD_HOST = "Добавлять адрес хоста в url:
Да/Нет" +SETTINGS_BREAD_SEPPARATOR = "Разделитель между ссылками:
Пример: <li> → </li>" +SETTINGS_BREAD_SEPP_USE = "Показывать:
Да/Нет" +SETTINGS_BREAD_BOX_LINK = "Контейнер для ссылки:
Пример: <li>%s</li>" +SETTINGS_BREAD_LINK_TPL = "Шаблон ссылки
Используются теги: [name], [link], [count]" +SETTINGS_BREAD_BOX_LASTLINK = "Показывать последний элемент:
Да/Нет" +SETTINGS_BREAD_SELF_BOX = "Контейнер для последнего элемента:
Пример: <li class="active">%s</li>" + + +SETTINGS_DATE_FORMAT = "Формат даты:" +SETTINGS_TIME_FORMAT = "Формат даты и времени:" +SETTINGS_CLEAR_CACHE = "Очистить кэш" +SETTINGS_USE_DOCTIME = "Использовать дату публикации документов" +SETTINGS_INFO = "Дополнительно" +SETTINGS_MAIN_SETTINGS = "Общие настройки системы" +SETTINGS_MAIN_MAIL = "Настройки почты" +SETTINGS_MAIN_PAGENAVI = "Настройки вывода постраничной навигации" +SETTINGS_NAME = "Параметр" +SETTINGS_VALUE = "Значение" +SETTINGS_USE_EDITOR = "Редактор по умолчанию" +SETTINGS_EDITOR_ELFINDER = "Elrte и Elfinder" +SETTINGS_EDITOR_CKEDITOR = "CKEditor" + +SETTINGS_ERROR = "Ошибка" +SETTINGS_SUCCESS = "Выполнено" + +SETTINGS_SAVE_DOP = "Изменил дополнительные настройки системы" +SETTINGS_SAVE_MAIN = "Изменил общие настройки системы" +SETTINGS_SAVE_COUNTRY = "Изменил настройки стран" + +SETTINGS_LANG_EDIT = "Управление языками" +SETTINGS_LANG_TITLE = "Внимание! Настройка языков должна происходить, строго перед наполнение сайта!" +SETTINGS_LANG_AEDIT = "Редактировать" +SETTINGS_LANG_AON = "Включить" +SETTINGS_LANG_AOFF = "Выключить" +SETTINGS_LANG_ADEFAULT = "Сделать по умолчанию" +SETTINGS_LANG_ADEFAULT_HINT = "" +SETTINGS_LANG_ID = "Id" +SETTINGS_LANG_FLAG = "Флаг" +SETTINGS_LANG_SYSTEM = "Системное" +SETTINGS_LANG_PREFIX = "Префикс" +SETTINGS_LANG_NAME = "Наименование" +SETTINGS_LANG_DEFAULT = "По умолчанию" +SETTINGS_LANG_ACTION = "Действия" +SETTINGS_LANG_ADD = "Добавить язык" +SETTINGS_LANG_SAVE = "Сохранить изменения" + +SETTINGS_REV_DELETED = "Ревизии документов успешно удалены" +SETTINGS_REV_DELETED_ERR = "Не удалось удалить ревизии документов.
Попробуйте еще раз." +SETTINGS_REV_UPDATE = "Удалил ревизии документов" +SETTINGS_COUNT_DELETED = "Подневный счетчик документов
успешно обнулён." +SETTINGS_COUNT_DELETED_ERR = "Не удалось обнулить подневный
счетчик документов.
Попробуйте еще раз." +SETTINGS_COUNT_UPDATE = "Обнулили подневный счетчик документов" +SETTINGS_CACHE_LIFETIME = "Внимание!!! Включено кеширование запроса к настройкам системы. Изменения вступят в силу, только после окончания времени жизни кеша или отключения кеширования" + +// v3.2 +SETTINGS_PAGINATION = "Настройка пагинации" +PAGINATION_ADD = "Создать шаблон пагинации" +PAGINATION_NAME = "Наименование" +PAGINATION_ACTIONS = "Действия" +PAGINATION_EDIT_HINT = "Редактирвать" +PAGINATION_DELETE_HINT = "Удалить пагинацию" +PAGINATION_DEL_HINT = "Вы уверены, что хотите удалить данный шаблон пагинацию?" +PAGINATION_SAVED = "Шаблон пагинации успешно сохранен" +PAGINATION_SAVED_ERR = "Не удалось сохранить шаблон пагинации.
Попробуйте еще раз." +PAGINATION_ERROR = "Ошибка" +PAGINATION_SUCCESS = "Выполнено" + +pagination_name = "Наименование" +pagination_navigation_box = "Контейнер постраничной навигации
Пример: <ul class="pagination pagination-sm">%s</ul>" +pagination_link_box = "Контейнер для элемента
Пример: <li>%s</li>" +pagination_active_link_box = "Контейнер для активного элемента
Пример: <li class="active">%s</li>" +pagination_link_template = "Шаблон ссылки элемента
[link] - ссылка на страницу
[page] - Номер страницы для ссылки
[name] - Номер страницы
" +pagination_link_active_template = "Шаблон активной ссылки элемента
[link] - ссылка на страницу
[page] - Номер страницы для ссылки
[name] - Номер страницы
" +pagination_separator_box = "Контейнер для метки о наличии страниц
Пример: <li>%s</li>" +pagination_separator_label = "Текст для метки о наличии страниц" +pagination_start_label = "Текст ссылки "Первая"" +pagination_end_label = "Текст ссылки "Последняя"" +pagination_next_label = "Текст ссылки "Следующая"" +pagination_prev_label = "Текст ссылки "Предыдущая"" diff --git a/admin/lang/ru/sysblocks.txt b/admin/lang/ru/sysblocks.txt new file mode 100644 index 0000000..8d2b540 --- /dev/null +++ b/admin/lang/ru/sysblocks.txt @@ -0,0 +1,76 @@ +SYSBLOCK_HEAD = "Системные блоки" +SYSBLOCK_EDIT = "Управление системными блоками" +SYSBLOCK_EDIT_TIP = "В данном разделе предоставлены все системные блоки." +SYSBLOCK_ID = "Id" +SYSBLOCK_NAME = "Наименование системного блока" +SYSBLOCK_HTML = "Код системного блока" +SYSBLOCK_TAGS = "Тэг" +SYSBLOCK_TAGS_2 = "HTML Tags" +SYSBLOCK_EXTERNAL = "Разрешить внешнее обращение по ссылке" +SYSBLOCK_EXTERNAL_H = "Внешнее обращение по ссылке" +SYSBLOCK_EXTERNAL_GO = "Перейти" +SYSBLOCK_AJAX = "Разрешать выполняться только по Ajax" +SYSBLOCK_AJAX_H = "Выполняться только по Ajax" + +SYSBLOCK_VISUAL = "Визуальный редактор" +SYSBLOCK_VISUAL_H = "Визуальный редактор" + +SYSBLOCK_MEDIAPATH = "Системный тег, путь к папке дизайна" +SYSBLOCK_BREADCRUMB = "Системный тег Хлебных крошек" +SYSBLOCK_DOCID_INFO = "Системный тег, идентификатор документа" +SYSBLOCK_PATH = "Корневой путь установки" +SYSBLOCK_HOME = "Ссылка на главную страницу сайта" + +SYSBLOCK_AUTHOR = "Автор" +SYSBLOCK_DATE = "Дата создания" +SYSBLOCK_TAG = "Системный тег" +SYSBLOCK_ACTIONS = "Действия" +SYSBLOCK_NO_ITEMS = "Сообщение:
В настоящий момент нет сохраненных системных блоков." +SYSBLOCK_BUTTON_SAVE = "Сохранить изменения" +SYSBLOCK_BUTTON_ADD = "Добавить системный блок" +SYSBLOCK_BUTTON_COPY = "Копировать" +SYSBLOCK_INSERT_H = "Добавление системного блока" +SYSBLOCK_EDIT_H = "Редактирование системного блока" +SYSBLOCK_INNAME = "Введите наименование системного блока" +SYSBLOCK_ENTER_NAME = "Пожалуйста, укажите наименование системного блока" +SYSBLOCK_INSERT = "Здесь вы можите добавить или изменить выбранный вами системный блок" + +SYSBLOCK_LINK = "Системный блок доступен по ссылке:" + +SYSBLOCK_SAVE = "Добавить" +SYSBLOCK_SAVEDIT = "Сохранить изменения" +SYSBLOCK_SAVE_NEXT = "Добавить и продолжить редактирование" +SYSBLOCK_SAVEDIT_NEXT = "Применить (CTRL+S)" + +SYSBLOCK_INTEXT = "Системный блок" +SYSBLOCK_ADD = "Добавить новый системный блок" +SYSBLOCK_ADD_BUTTON = "Добавить" +SYSBLOCK_EDIT_HINT = "Редактировать системный блок" +SYSBLOCK_DELETE_HINT = "Удалить системный блок" +SYSBLOCK_DEL_HINT = "Вы уверены, что хотите удалить системный блок?" +SYSBLOCK_LIST_LINK = "Список системных блоков" +SYSBLOCK_FILE = "Файл шаблона" +SYSBLOCK_SAVED = "Системный блок успешно сохранен." +SYSBLOCK_COPY_TITLE = "Копирование системного блока" +SYSBLOCK_COPY = "Копировать системный блок" +SYSBLOCK_COPY_TIP = "Пожалуйста, укажите наименование системного блока" +SYSBLOCK_COPY_TIP2 = "Пожалуйста, укажите наименование для копируемого системного блока" +SYSBLOCK_EXIST = "Извините, но системный блок с таким наименованием уже существует" +SYSBLOCK_SQLUPDATE = "Изменил системный блок" +SYSBLOCK_SQLNEW = "Создал новый системный блок" +SYSBLOCK_SQLDEL = "Удалил системный блок" +SYSBLOCK_OR = " или " + +SYSBLOCK_SAVED = "Системный блок успешно сохранен" +SYSBLOCK_SAVED_ERR = "Не удалось сохранить системный блок.
Попробуйте еще раз." +SYSBLOCK_ERROR = "Ошибка" +SYSBLOCK_SUCCESS = "Выполнено" + + +// v 3.2 +SYSBLOCK_DESCRIPTION = "Краткое описание" +SYSBLOCK_ALIAS = "Алиас" +SYSBLOCK_I = "Опционально. Алиас позволяет использовать легко запоминающийся тег [tag:sysblock:alias] вместо [tag:sysblock:id]. Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание, иметь длину не более 20 символов и быть уникальным в пределах модуля" +SYSBLOCK_ACCEPT = "Этот алиас можно использовать" +SYSBLOCK_ER_SYN = "Неверный алиас!
Алиас не должен являться числом, может содержать только цифры, латинские буквы, дефис, подчёркивание и иметь длину не более 20 символов" +SYSBLOCK_ER_EXISTS = "Неверный алиас!
Данный алиас уже привязан к другоому системному блоку" \ No newline at end of file diff --git a/admin/lang/ru/templates.txt b/admin/lang/ru/templates.txt new file mode 100644 index 0000000..b811b50 --- /dev/null +++ b/admin/lang/ru/templates.txt @@ -0,0 +1,120 @@ +TEMPLATES_SUB_TITLE = "Управление шаблонами" +TEMPLATES_TIP1 = "В данном разделе приведен список всех шаблонов используемых в системе. Здесь вы можете удалить, отредактировать или скопировать шаблон, чтобы создать на его основе новый." +TEMPLATES_ID = "ID" +TEMPLATES_NAME = "Наименование шаблона" +TEMPLATES_NAME2 = "Наименование шаблона:" +TEMPLATES_NAME3 = "Укажите название шаблона:" +TEMPLATES_AUTHOR = "Автор" +TEMPLATES_DATE = "Дата создания" +TEMPLATES_ACTION = "Действия" +TEMPLATES_DATE_FORMAT = "%d.%m.%y г." +TEMPLATES_DATE_FORMAT2 = "%H:%M" +TEMPLATES_IN = "в" +TEMPLATES_EDIT = "Редактировать шаблон" +TEMPLATES_NO_CHANGE = "Извините, но у вас недостаточно прав для редактирования шаблона" +TEMPLATES_DELETE = "Удалить шаблон" +TEMPLATES_DELETE_CONF = "Вы уверены, что хотите удалить данный шаблон?" +TEMPLATES_NO_DELETE2 = "Извините, но вы не можете удалить данный шаблон, т.к. он используется рубриками или модулями" +TEMPLATES_NO_DELETE3 = "Извините, но у вас недостаточно прав для удаления шаблона" +TEMPLATES_COPY = "Копировать шаблон" +TEMPLATES_NO_COPY = "Извините, но у вас недостаточно прав для копирования шаблона" +TEMPLATES_LEGEND = "Значения пиктограмм" +TEMPLATES_COPY_TITLE = "Копирование шаблона" +TEMPLATES_TIP2 = "Пожалуйста, укажите название для копируемого шаблона" +TEMPLATES_TIP3 = "Пожалуйста, укажите название для шаблона" +TEMPLATES_BUTTON_COPY = "Копировать" +TEMPLATES_TAG_INSERT = "Нажмите на название системного тега, чтобы добавить его в поле шаблона" +TEMPLATES_TITLE_NEW = "Создание нового шаблона" +TEMPLATES_TITLE_EDIT = "Редактирование шаблона" +TEMPLATES_WARNING1 = "Пожалуйста, будьте предельно внимательны при редактировании шаблона и помните, что неверно указанный код может испортить внешнее оформление сайта" +TEMPLATES_WARNING2 = "В данном разделе вы можете создать новый шаблон в ручную, а также загрузить готовую структуру шаблона из существующего файла. Помните, что файлы с готовой структурой должны быть расположены в директории /inc/data/prefabs/templates/" +TEMPLATES_HTML = "HTML код шаблона" +TEMPLATES_USE_PHP = "Извините, но у вас недостаточно прав для редактирования шаблона, т.к. он использует PHP код" +TEMPLATES_BUTTON_SAVE = "Сохранить изменения" +TEMPLATES_BUTTON_SAVE_NEXT = "Применить (CTRL+S)" +TEMPLATES_FILE_SAVED = "Файл успешно сохранен" +TEMPLATES_BUTTON_ADD = "Добавить шаблон" +TEMPLATES_BUTTON_ADD_NEXT = "Добавить и продолжить редактирование" +TEMPLATES_BUTTON_LOAD = "Загрузить" +TEMPLATES_LOAD_INFO = "Пожалуйста, выберите из списка файл с готовой структурой шаблона" +TEMPLATES_EXIST = "Извините, но шаблон с таким названием уже существует" +TEMPLATES_NO_NAME = "Пожалуйста, укажите название шаблона" +TEMPLATES_ALL = "Список шаблонов" +TEMPLATES_OR = " или " + +TEMPLATES_FILE_NAME = "Наименование файла" +TEMPLATES_CSS_FILES = "Список css файлов" +TEMPLATES_JS_FILES = "Список js файлов" +TEMPLATES_FILES = "Файловый менеджер" +TEMPLATES_EDIT_FILE = "Редактировать файл" +TEMPLATES_DEL_FILE = "Удалить файл" + +TEMPLATES_TAGS = "Тег" +TEMPLATES_TAG_DESC = "Описание тега" +TEMPLATES_THEME_FOLDER = "Наименование шаблона (Имя папки с файлами для данного шаблона)" +TEMPLATES_FOLDER = "Папка:" +TEMPLATES_PAGENAME = "Наименование сайта" +TEMPLATES_FILENAME = "Наименование файла" +TEMPLATES_TITLE = "Наименование страницы" +TEMPLATES_KEYWORDS = "Ключевые слова (Meta - Keywords)" +TEMPLATES_DESCRIPTION = "Описание страницы (Meta - Description)" +TEMPLATES_INDEXFOLLOW = "Тип индексирования" +TEMPLATES_CANONICAL = "Каноническая страница – это рекомендуемый экземпляр из набора страниц с очень похожим содержанием." +TEMPLATES_PATH = "Корневой путь установки" +TEMPLATES_MEDIAPATH = "Путь до папки с шаблоном (Пример: [tag:mediapath]images/logo.gif)" + +TEMPLATES_CSS = "Сжимает несколько css-файлов в один. Возвращает путь.
FFF - имена файлов через запятую
P - путь к папке с файлами, не обязательно. По умолчанию - [tag:mediapath]css/

Пример: href="[tag:css:reset.css,style.css]"" + +TEMPLATES_JS = "Сжимает несколько js-файлов в один. Возвращает путь.
FFF - имена файлов через запятую
P - путь к папке с файлами, не обязательно. По умолчанию - [tag:mediapath]js/

Пример: href="[tag:js:common.js,main.js]"" + +TEMPLATES_MEDIAPATH = "Путь до папки с шаблоном (Пример: [tag:mediapath]images/logo.gif)" +TEMPLATES_MAINCONTENT = "Тег для главного содержания" +TEMPLATES_ALIAS = "Ссылка на текущий документ (Alias)" +TEMPLATES_SYSBLOCK = "Систменый тег Системных блоков" +TEMPLATES_TEASER = "Систменый тег Тизеров" +TEMPLATES_PRINTLINK = "Ссылка на "Версия для печати"" +TEMPLATES_HOME = "Ссылка на главную страницу сайта" +TEMPLATES_BREADCRUMB = "Систменый тег Хлебных крошек" +TEMPLATES_VERSION = "Показ информации о защите информации" +TEMPLATES_NAVIGATION = "Меню навигации (ххх - номер меню)" +TEMPLATES_IF_PRINT = "Содержимое будет показано при печати." +TEMPLATES_DONOT_PRINT = "Содержание не будет показано при печати" +TEMPLATES_RUBHEADER = "Настраивается в шаблоне рубрики
(Шаблон оформления HEADER)" +TEMPLATES_NO_ITEMS = "В настоящий момент нет файлов" +TEMPLATES_DOMAIN = "Системный тег вывода доменного имени" +TEMPLATES_DOCDB = "Системный тег вывода поля документа из БД" +TEMPLATES_LANGFILE = "Системный тег для вывода языковой переменной из файла" +TEMPLATES_LANGUAGE = "Тег включает подгрузку языковых файлов. Желательно указывать данный тег, до основного шаблона" +TEMPLATES_LANG = "Содержимое будет показано если язык документа совпадает с указанным" + +TEMPLATES_CACHE_SUCCESS = "Кеш успешно очищен." +TEMPLATES_CACHE_SUCCESS_LOG = "Очистил кэш" + +TEMPLATES_CSS_TITLE = "Пожалуйста, будьте предельно внимательны при редактировании файлов и помните, что неверно указанный код может испортить внешнее оформление сайта" +TEMPLATES_CSS_EDITOR = "Редактор файлов CSS" + +TEMPLATES_JS_TITLE = "Пожалуйста, будьте предельно внимательны при редактировании файлов и помните, что неверно указанный код может испортить внешнее оформление сайта" +TEMPLATES_JS_EDITOR = "Редактор файлов CSS" + +TEMPLATES_REPORT_NEW = "Создал шаблон" +TEMPLATES_REPORT_CHANGE = "Изменил шаблон" +TEMPLATES_REPORT_PHP = "Попытка использования PHP кода в шаблоне" +TEMPLATES_REPORT_PHP_CSS = "Попытка использования PHP кода в css файле" +TEMPLATES_REPORT_PHP_JS = "Попытка использования PHP кода в js файле" +TEMPLATES_REPORT_PHP_ERR = "Запрещено использовать PHP код" +TEMPLATES_REPORT_ID_ERR = "Попытка удаления основного шаблона" +TEMPLATES_REPORT_DELETE = "Удалил шаблон" +TEMPLATES_REPORT_FILE = "Отредактировал файл" +TEMPLATES_REPORT_COPY = "Создал копию шаблона" +TEMPLATES_REPORT_DEL_OK = "Файл успешно удален" +TEMPLATES_REPORT_DEL_ER = "Не удалось удалить файл" + +TEMPLATES_REPORT_ERROR_TEXT = "HTML код шаблона пустой" +TEMPLATES_REPORT_ERROR_TITLE = "Не заполнено - Наименование щаблона" + +TEMPLATES_SAVED = "Шаблон успешно сохранен" +TEMPLATES_SAVED_FILE = "Файл успешно сохранен" +TEMPLATES_SAVED_ERR = "Не удалось сохранить шаблон.
Попробуйте еще раз." +TEMPLATES_SAVED_ERR_FILE = "Не удалось сохранить файл.
Попробуйте еще раз." +TEMPLATES_ERROR = "Ошибка" +TEMPLATES_SUCCESS = "Выполнено" \ No newline at end of file diff --git a/admin/lang/ru/user.txt b/admin/lang/ru/user.txt new file mode 100644 index 0000000..081e579 --- /dev/null +++ b/admin/lang/ru/user.txt @@ -0,0 +1,90 @@ +[user] +USER_SUB_TITLE = "Управление пользователями" +USER_TIP1 = "В данном разделе приведен список всех пользователей в системе. Здесь вы можете отредактировать параметры пользователя, удалить пользователя, а также перенести пользователя в другую группу." +USER_ID = "ID" +USER_NAME = "Имя и фамилия пользователя" +USER_NAME2 = "Имя пользователя" +USER_GROUP = "Состоит в группе" +USER_STATUS_WAIT = "Ожидает активации" +USER_LAST_VISIT = "Последний вход" +USER_REGISTER_DATE = "Дата регистрации" +USER_ACTION = "Действия" +USER_DELETE = "Удалить пользователя" +USER_EDIT = "Редактировать пользователя" +USER_DATE_FORMAT = "%d.%m.%Y %H:%M" +USER_NO_CHANGE = "Извините, но у вас недостаточно прав для редактирования пользователей" +USER_DELETE_CONFIRM = "Вы уверены, что хотите удалить данного пользователя?" +USER_LEGEND = "Значения пиктограмм" +USER_BUTTON_SAVE = "Сохранить изменения" +USER_ORDERS = "История заказов" +USER_DOWNLOADS = "История заказов ПО" +USER_MARK_DELETE = "Отметить для удаления" +USER_NEW_TITLE = "Создание нового пользователя" +USER_NEW_TIP = "Чтобы добавить нового пользователя, заполните поля соответствующими данными. Пожалуйста, будьте предельно внимательны при выборе группы для данного пользователя. Неверно указанная группа может ограничить доступ пользователя к определенным разделам сайта или наоборот, разрешить доступ к закрытым разделам." +USER_EDIT_TITLE = "Редактирование пользователя" +USER_EDIT_TIP = "В данном разделе вы можете отредактировать параметры пользователя, а также изменить пароль и группу пользователя." +USER_ERRORS = "Ошибка:" +USER_FIRSTNAME = "Имя:" +USER_FIRSTNAME_ADD = "Введите имя пользователя:" +USER_LASTNAME = "Фамилия:" +USER_EMAIL = "E-mail адрес:" +USER_NICK = "Ник на форуме:" +USER_SIGNATURE = "Подпись на форуме:" +USER_AVATAR = "Аватар:" +USER_TAX = "Облагать налогом:" +USER_COMPANY = "Компания:" +USER_HOUSE_STREET = "Улица / Номер дома:" +USER_ZIP_CODE = "Почтовый индекс:" +USER_CITY = "Город проживания:" +USER_PASSWORD = "Пароль:" +USER_PASSWORD_CHANGE = "изменить" +USER_PASSWORD_SHOW = "Показать пароль" +USER_YES = "Да" +USER_NO = "Нет" +USER_COUNTRY = "Страна:" +USER_PHONE = "Контактный телефон:" +USER_FAX = "Факс:" +USER_BIRTHDAY = "Дата рождения:" +USER_BIRTHDAY_FORMAT = " в формате (ДД.ММ.ГГГГ)" +USER_NOTICE = "Дополнительная информация:" +USER_MAIN_GROUP = "Основная группа:" +USER_SECOND_GROUP = "Дополнительная группа:" +USER_SECOND_INFO = "Выбор нескольких групп" +USER_STATUS = "Статус пользователя:" +USER_ACTIVE = "Активный" +USER_INACTIVE = "Неактивный" +USER_BUTTON_ADD = "Добавить пользователя" +USER_SEND_INFO = "Проинформировать пользователя по почте" +USER_MESSAGE_SUBJECT = "Тема сообщения:" +USER_MESSAGE_TEXT = "Текст сообщения:" +USER_EMAIL_EXIST = "Извините. но указанный E-mail адрес уже используется в системе." +USER_ERROR_DATEFORMAT = "Дата рождения указана в неверном формате." +USER_PASSWORD_SHORT = "Указанный пароль слишком короткий. Пожалуйста, используйте минимум 5 символов." +USER_PASSWORD_ERROR = "Поле Пароль содержит недопустимые символы." +USER_NO_EMAIL = "Поле E-mail не заполнено. Пожалуйста, укажите E-Mail адрес." +USER_NO_PASSWORD = "Поле Пароль не заполнено. Пожалуйста, укажите пароль." +USER_EMAIL_ERROR = "Поле E-mail адрес содержит недопустимые символы, Пожалуйста, проверьте указанный E-mail адрес." +USER_NO_FIRSTNAME = "Поле Имя пользователя не заполнено. Пожалуйста, укажите Имя пользователя." +USER_NO_USERNAME = "Поле Логин не заполнено. Пожалуйста, укажите Логин пользователя." +USER_ERROR_FIRSTNAME = "Поле Имя пользователя содержит недопустимые символы." +USER_ERROR_USERNAME = "Поле Логин содержит недопустимые символы." +USER_NO_LASTNAME = "Поле Фамилия пользователя не заполнено. Пожалуйста, укажите Фамилию пользователя," +USER_ERROR_LASTNAME = "Поле Фамилия пользователя содержит недопустимые символы." +USER_MAIL_BODY1 = "Здравствуйте %USER%,%N%%N%" +USER_MAIL_BODY2 = "Ваш аккаунт успешно активирован. Пожалуйста, используйте Ваши регистрационные данные для входа на сайт %HOST%." +USER_MAIL_FOOTER = "%N%%N%С уважением, %HOMEPAGENAME%%N%%N%%HOST%" +USER_MAIL_SUBJECT = "Ваш аккаунт активирован" +USER_MAIL_PASSWORD = "Информация о смене пароля" +USER_MAIL_PASSWORD2 = "Сообщаем Вам о смене пароля.%N%%N%Ваш новый пароль: %NEWPASS%" +USER_NEW_ADD = "Создание нового пользователя" +USER_ALL = "Список пользователей" +USER_LOGIN = "Логин в системе:" +SETTINGS_NAME = "Параметр" +SETTINGS_VALUE = "Значение" +USER_LIST_EMPTY = "Нет пользователей соответствующих заданным условиям поиска.
Попробуйте изменить условия поиска." +USER_REPORT_ADD = "Добавил пользователя" +USER_REPORT_EDIT = "Отредактировал параметры пользователя" +USER_REPORT_DEL = "Удалил пользователя" +USER_REPORT_GROUP = "Изменил группу для пользователя" +USER_YOUR_NOT_CHANGE = "Ошибка! Извините, но Вы не имеете прав для редактирования данного пользователя." +USER_WARNING_TIP = "Внимание! Будьте предельно внимательны, при редактировании данного пользователя." \ No newline at end of file diff --git a/admin/lang/ua/blocks.txt b/admin/lang/ua/blocks.txt new file mode 100644 index 0000000..eb919b9 --- /dev/null +++ b/admin/lang/ua/blocks.txt @@ -0,0 +1,68 @@ +BLOCK_HEAD = "Візуальні блоки" +BLOCK_EDIT = "Керування візуальними блоками" +BLOCK_EDIT_TIP = "У цьому розділі надані усі візуальні блоки." +BLOCK_ID = "Id" +BLOCK_NAME = "Назва візуального блока" +BLOCK_HTML = "Код візуального блока" +BLOCK_TAGS = "Тег" +BLOCK_TAGS_2 = "HTML Tags" + + +BLOCK_VISUAL = "Візуальний редактор" +BLOCK_VISUAL_H = "Візуальний редактор" + +BLOCK_MEDIAPATH = "Системний тег, шлях до папки дизайна" +BLOCK_BREADCRUMB = "Системний тег хлібних крихт" +BLOCK_DOCID_INFO = "Системний тег, ідентифікатор документа" +BLOCK_PATH = "Кореневий шлях установки" +BLOCK_HOME = "Посилання на головну сторінку сайта" + +BLOCK_AUTHOR = "Автор" +BLOCK_DATE = "Дата створення" +BLOCK_TAG = "Системний тег" +BLOCK_ACTIONS = "Дія" +BLOCK_NO_ITEMS = "Повідомлення:
На даний час немає збережених візуальних блоків." +BLOCK_BUTTON_SAVE = "Зберегти зміни" +BLOCK_BUTTON_ADD = "Додати візуальний блок" +BLOCK_BUTTON_COPY = "Копіювати" +BLOCK_INSERT_H = "Додавання візуального блока" +BLOCK_EDIT_H = "Редагування візуального блока" +BLOCK_INNAME = "Введіть назву візуального блока" +BLOCK_ENTER_NAME = "Будь ласка, вкажіть назву візуального блока" +BLOCK_INSERT = "Тут Ви можете додати або змінити обраний Вами візуальний блок" + +BLOCK_SAVE = "Додати" +BLOCK_SAVEDIT = "Зберегти зміни" +BLOCK_SAVE_NEXT = "Додати та продовжити редагування" +BLOCK_SAVEDIT_NEXT = "Примінити (CTRL+S)" + +BLOCK_INTEXT = "Візуальний блок" +BLOCK_ADD = "Додати новый візуальний блок" +BLOCK_ADD_BUTTON = "Додати" +BLOCK_EDIT_HINT = "Редагувати візуальний блок" +BLOCK_DELETE_HINT = "Видалити блок" +BLOCK_DEL_HINT = "Ви впевнені, що бажаєте видалити візуальний блок?" +BLOCK_LIST_LINK = "Список візуальних блоків" +BLOCK_FILE = "Файл шаблона" +BLOCK_SAVED = "Блок успішно збережено." +BLOCK_COPY_TITLE = "Копіювання візуального блока" +BLOCK_COPY = "Копіювати візуальний блок" +BLOCK_COPY_TIP = "Будь ласка, вкажіть назву візуального блока" +BLOCK_COPY_TIP2 = "Будь ласка, вкажіть назву для зкопійованого візуального блока" +BLOCK_EXIST = "Даруйте, але візуальний блок з такою назвою уже існує" +BLOCK_SQLUPDATE = "Змінив блок" +BLOCK_SQLNEW = "Створив новий візуальний блок" +BLOCK_SQLDEL = "Видалив візуальний блок" +BLOCK_OR = " або " + +BLOCK_SAVED = "Візуальний блок успіщно збережено" +BLOCK_SAVED_ERR = "Не вдалося зберегти візуальний блок.
Спробуйте ще раз." +BLOCK_ERROR = "Помилка" +BLOCK_SUCCESS = "Виконано" + +BLOCK_DESCRIPTION = "Короткий опис" +BLOCK_ALIAS = "Аліас" +BLOCK_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:BLOCK:alias] замість [tag:BLOCK:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах цих блоків" +BLOCK_ACCEPT = "Цей аліас можна використовувати" +BLOCK_ER_SYN = "Неправильний аліас!
Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +BLOCK_ER_EXISTS = "Неправильний аліас!
Такий аліас уже прив’язаний до іншого візкального блока" \ No newline at end of file diff --git a/admin/lang/ua/dbactions.txt b/admin/lang/ua/dbactions.txt new file mode 100644 index 0000000..b94a265 --- /dev/null +++ b/admin/lang/ua/dbactions.txt @@ -0,0 +1,49 @@ +# солов’їна))) 01,2017 duncan + +DB_SUB_TITLE = "Керування базою даних" +DB_ACTION_WARNING = "Увага!\nУсі дії по роботі з базою даних Ви чините на свій страх та ризик.\n\nПам’ятайте, що будь-які дії, які виконуються з базою даних, можуть пошкодити існуючу інформацію.\n\nВи впевнені, що бажаєте продовжити?\n\n" +DB_ACTION_RESET = "Увага!\nВи намагаєтеся відновити базу даних з резервної копії. Вся існуюча інформація буде видалена та перезаписана.\nБудь ласка, зверніть увагу, що після відновлення бази даних, Вам необхідно буде виконати авторизацію знову.\n\nВи впевнені, що бажаєте продовжити?\n\n" +DB_OPTION_LIST = "Структура бази даних" +DB_BUTTON_ACTION = "Виконати дію" +DB_OPTIMIZE_DATABASE = "Оптимізація бази даних" +DB_OPTIMIZE_INFO = "Ця можливість дозволяє збільшити продуктивність та зменшити розмір Вашої бази даних. Рекомендований інтервал між оптимізаціями має бути не менше 1 раза на тиждень." +DB_REPAIR_DATABASE = "Відновлення пошкоджених таблиць" +DB_REPAIR_INFO = "Ця можливість дозволяє виконати спробу відновлення пошкоджених таблиць у базі даних, у випадку, некоректного виводу інформації на сторінках cайту." +DB_BACKUP_DATABASE = "Створення резервної копії" +DB_BACKUP_INFO = "Ця можливість дозволяє створити резервну копію як усієї бази даних, так і окремих таблиць. Будь ласка, оберіть у списку зліва таблиці, для яких Ви бажаєте виконати резервне копіювання. Для вибору декількох таблиць затисніть кнопку CTRL." +DB_RESTORE_TITLE = "Відновлення бази даних з резервної копії" +DB_RESTORE_FILE = "Відновлення бази даних з файла" +DB_BUTTON_RESTORE = "Відновити" +DB_ACTION = "Оберіть дію" +DB_TIPS = "Увага! Усі дії по роботі з базою даних Ви чините на свій страх та ризик. Пам’ятайте, що будь-які дії, які виконуються з базою даних, можуть пошкодити існуючу інформацію." +DB_BACKUP_SERVER = "Зберегти резервну копію на сервері" +DB_SC = "Операцію з базою даних успішно виконано" + +DB_OPTIMIZE_DATABASE_SC = "Оптимізацію бази даних успішно виконано" +DB_REPAIR_DATABASE_SC = "Відновлення пошкоджених таблиць успішно виконано" + +DB_REPORT_DUMP = "Виконав резервне копіювання бази даних" +DB_REPORT_DUMP_RECOVER = "Виконав відновлення бази даних з резервної копії" +DB_REPORT_DUMP_OPTIM = "Виконав оптимізацію бази даних" +DB_REPORT_DUMP_TABLE = "Виконав відновлення таблиць бази даних" + +DB_FILE_DATA = "Дата створення" +DB_FILE_SIZE = "Розмір" +DB_FILE_NAME = "Назва файла" +DB_ACTIONS = "Дія" +DB_ACTIONS_EDIT = "Редагувати" +DB_ACTIONS_DEL = "Видалити" +DB_ACTIONS_RESTORE = "Відновити" +DB_ACTIONS_SAVE = "Зберегти на комп’ютер" + +DB_REPORT_DUMP_DEL_OK = "Видалив файл резервної копії бази даних" +DB_REPORT_DUMP_DEL_ER = "Не вдалося видалити файл резервної копії бази даних" +DB_REPORT_DUMP_ER = "Помилка: Імпорт бази даних не виконано, оскільки відсутній файл дампа або він пошкоджений." + +DB_ACTIONS_RESTORE_H = "Відновити резервну копію" +DB_ACTIONS_RESTORE_T = "Ви впевнені що бажаєте відновити резервну копію бази даних?" + +DB_ACTIONS_DELETE_H = "Видалити файл" +DB_ACTIONS_DELETE_T = "Ви впевнені, що бажаєте видалити файл резервної копії бази даних?" + +DB_NO_FILES_MESS = "На даний час, немає файлів резервних копій бази даних" diff --git a/admin/lang/ua/docs.txt b/admin/lang/ua/docs.txt new file mode 100644 index 0000000..b6a33c8 --- /dev/null +++ b/admin/lang/ua/docs.txt @@ -0,0 +1,298 @@ +# солов’їна))) 01,2017 duncan + +[docs] +DOC_SUB_TITLE = "Керування документами" +DOC_TIPS = "У цьому розділі наведено список усіх документів у системі. Тут Ви можете виконати основні операції з документами, такі як: перегляд, редагування, видалення документа, а також залишити примітку для якого-небудь документа." +DOC_DATE_FORMAT = "%d.%m.%Y %H:%M" +DOC_LEGEND = "Значення піктограм" +DOC_LEGEND_EDIT = "Редагувати документ" +DOC_LEGEND_SHOW = "перегляд сторінки у новому вікні" +DOC_LEGEND_ENABLE = "зробити документ активним" +DOC_LEGEND_DISABLE = "зробити документ неактивним" +DOC_LEGEND_TEMP_DELETE = "Тимчасово видалити документ (у кошик)" +DOC_LEGEND_RESTORE = "Відновити документ (з кошика)" +DOC_LEGEND_FINAL_DELETE = "Остаточно видалити документ" +DOC_CHOSE_RUB = "Оберіть рубрику" +DOC_ID = "ID" +DOC_URL_RUB = "URL" +DOC_TITLE = "Назва документа" +DOC_URL_TITLE = "Посилання на документ" +DOC_IN_RUBRIK = "Рубрика" +DOC_IN_NEW = "Новий документ" +DOC_CREATED = "Опубліковано" +DOC_EDIT = "Відредаговано" +DOC_PRINTED = "Роздруковано" +DOC_CLICKS = "переглядів" +DOC_AUTHOR = "Автор" +DOC_ACTIONS = "Дії" +DOC_EDIT_TITLE = "Редагувати цей документ" +DOC_CHANGE_RUBRIC = "Перенести цей документ в іншу рубрику" +DOC_CHANGE_AUTOR = "Поміняти автора документа" +DOC_SHOW_TITLE = "перегляд документа (Посилання без ЧПУ)" +DOC_SHOW2_TITLE = "перегляд документа (Посилання з ЧПУ)" +DOC_SHOW3_TITLE = "Документ без назви" +DOC_CREATE_NOTICE_TITLE = "залишити примітку" +DOC_REPLY_NOTICE_TITLE = "Подивитися/відповісти на примітку" +DOC_ENABLE_TITLE = "Опублікувати документ" +DOC_DISABLE_TITLE = "Зняти документ з публікації" +DOC_TEMPORARY_DELETE = "Покласти документ у кошик" +DOC_RESTORE_DELETE = "Відновити документ з кошика" +DOC_FINAL_DELETE = "видалити документ" +DOC_ICON_COMMENT = "Є Примітки" +DOC_ICON_PUBLIC = "Документ знято з публікації" +DOC_ICON_RECYCLE = "Документ переміщено у кошик" +DOC_SORT_TEXT = "Сортувати документи за:" +DOC_TEMPORARY_CONFIRM = "Ви впевнені, що бажаєте покласти у кошик цей документ?" +DOC_FINAL_CONFIRM = "Ви впевнені, що бажаєте видалити цей документ?" +DOC_INSERT_LINK_TIP = "Для вибору потрібного документа, натисніть на кнопку "Вибрати"" +DOC_BUTTON_INSERT_LINK = "Вибрати" +DOC_BUTTON_LINK_POPUP = "Вибрати у новому вікні" +DOC_BUTTON_ADD_DOCUMENT = "Додати документ" +DOC_BUTTON_ADD_DOCUMENT_NEXT = "Додати та продовжити редагування (Ctrl+S)" +DOC_BUTTON_EDIT_DOCUMENT = "Зберегти зміни" +DOC_BUTTON_EDIT_DOCUMENT_NEXT = "Примінити (Ctrl+S)" +DOC_ADD_DOCUMENT = "Додавання нового документа" +DOC_EDIT_DOCUMENT = "редагування документа" +DOC_OPTIONS = "Параметри документа" +DOC_NAME = "Назва документа:
(HTML <title>)" +DOC_URL = "Псевдонім документа:
(SEO alias)" +DOC_URL_LINK = "Підстановка аліасів" +DOC_URL_INFO = "Щоби посилання на документ виглядало, наприклад, так:
http://www.domain.tld/phone/samsung/
напишіть у це поле: phone/samsung

Суфікс посилання автоматично додається при виводі
відповідно до налаштувань, що вказані у файлі inc/config.php

У назві дозволено використовувати:
a-z — латинські символи;
а-я — символи кирилиці (якщо дозволено);
/ — слеш;
- — знак тире;
_ — знак підкреслення.

Назва посилання не повинна містити:
print/ або /print/ або /print;
page-XX/ або /page-XX/ або /page-XX;
apage-XX/ або /apage-XX/ або /apage-XX;
artpage-XX/ або /artpage-XX/ або /artpage-XX;
где XX - цифри" +DOC_URL_LOG = "Використовувати історію аліасів, для редиректа" +DOC_URL_LOG_T = "Зберігати або не зберігати історію аліасів документа, для наступного редиректа" +DOC_URL_LOG_RUBRIC = "Використовувати налаштування рубрики" +DOC_URL_LOG_USE = "Використовувати завжди" +DOC_FIELD_G_UNKNOW = "Без групи" +DOC_PROPERTY = "Параметри документа" +DOC_URL_LOG_NOTUSE = "Не використовувати" +DOC_QUERIES = "доступні запити:" +DOC_META_TITLE = "TITLE - це рядок, який буде виведений у заголовку вікна браузера, цей тег важливий для пошукової оптимизації, тому система дозволяє керувати ним, як і деякими іншими тегами." +DOC_META_KEYWORDS = "Ключові слова:
(meta keywords)" +DOC_META_KEYWORDS_INFO = "Описують вміст сторінки, можуть враховуватися пошуковими системами.

Частина перелічених ключових слів має бути присутня в тексті сторінки." +DOC_META_DESCRIPTION = "Опис сторінки:
(meta description)" +DOC_META_DESCRIPTION_INFO= "Невеликий текст, який описує вміст сторінки, також може враховуватися пошуковими системами, виводиться в якості пояснення в результатах пошука або інтернет-каталогах." +DOC_CAN_SEARCH = "Дозволити пошук по документу:
(для модуля пошук)" +DOC_INDEX_TYPE = "Тип індексування сторінки:
(meta robots)" +DOC_INDEX_FOLLOW = "Індексувати та переходити за посиланнями" +DOC_INDEX_NOFOLLOW = "Індексувати, але не переходити за посиланнями" +DOC_NOINDEX_NOFOLLOW = "Не індексувати та не переходити за посиланнями" +DOC_SITEMAP_FREQ = "Частота оновлення
sitemap.xml" +DOC_SITEMAP_FREQ_DOC = "Частота оновлення сторінки" +DOC_SITEMAP_ALWAYS = "Завжди" +DOC_SITEMAP_HOURLY = "Щогодини" +DOC_SITEMAP_DAILY = "Щоденно" +DOC_SITEMAP_WEEKLY = "Щотижня" +DOC_SITEMAP_MONTHLY = "Щомісяця" +DOC_SITEMAP_YEARLY = "Щорічно" +DOC_SITEMAP_NEVER = "Ніколи" +DOC_SITEMAP_PRIORITY = "Пріоритет
sitemap.xml" +DOC_SITEMAP_PRIORITY_DOC = "Пріоритет цієї сторінки щодо інших сторінок" +DOC_SITEMAP_PRIORITY_LOW = "Найнижчий пріоритет" +DOC_SITEMAP_PRIORITY_MID = "Середній пріоритет" +DOC_SITEMAP_PRIORITY_HIG = "Найвищий пріоритет" +DOC_START_PUBLICATION = "Початок публікації:" +DOC_END_PUBLICATION = "Кінець публікації:" +DOC_STATUS = "Статус документа:" +DOC_STATUS_ACTIVE = "Активний" +DOC_STATUS_INACTIVE = "Не активний" +DOC_ADD_IN_NAVIGATION = "Додати підпункт меню:" +DOC_USE_NAVIGATION = "Зв’язати з пунктом меню:" +DOC_USE_RUB_ALIAS = "Підстановки аліасів батьківських документів, призначення батьківського документа для хлібних крихт." +DOC_USE_BREADCRUMB = "Зв’язати з документом
(можна використовувати для хлібних крихт)" +DOC_USE_LANG_PACK = "Зв’язати з документом з мовної групи" +DOC_NAVIGATION_INFO = "Для того, щоб зв’язати цей документ з пунктом меню, оберіть зі списку існуючий пункт меню, якщо Ви тимчасово не бажаєте зв’язувати цей документ з пунктом меню, залиште поле порожнім." +DOC_MAIN_CONTENT = "Основний вміст документа" +DOC_MAIN_NOCONTENT = "Відсутні поля для документа" +DOC_AFTER_CREATE_TITLE = "Подальші дії" +DOC_AFTER_CREATE_INFO = "Будь ласка, оберіть Ваші подальші дії зі списку нижче:" +DOC_EDIT_THIS_DOCUMENT = "Повернутися до редагування цього документа" +DOC_INCLUDE_NAVIGATION = "Додати створений документ в меню навигації" +DOC_ADD_NEW_DOCUMENT = "Додати новий документ в цю рубрику" +DOC_ADD_COPY_DOCUMENT = "Додати копію документа в цю рубрику" +DOC_DISPLAY_NEW_WINDOW = "переглянути у новому вікні (Ctrl+O)" +DOC_CLOSE_WINDOW = "Перейти до списку документів" +DOC_CLOSE_WINDOW_RUBRIC = "Перейти до списку документів цієї рубрики" +DOC_TO_NAVI_TITLE = "Додавання документа в меню навигації" +DOC_NAVIGATION_POSITION = "Позиція у списку:" +DOC_NAVIGATION_TITLE = "Назва пунтка меню:" +DOC_TARGET = "Відкривати:" +DOC_TARGET_SELF = "у тому ж вікні" +DOC_TARGET_BLANK = "у новому вікні" +DOC_BUTTON_ADD_MENU = "Додати в меню" +DOC_TOP_MENU_ITEM = "Новий пункт 1-го рівня" +DOC_NOTICE = "Примітки до документа" +DOC_NOTICE_NEW_LINK = "Додати нову примітку" +DOC_NOTICE_AUTHOR = "Додати: " +DOC_NOTICE_DELETE_LINK = "видалити примітку" +DOC_ALLOW_NOTICE = "Дозволити коментар приміток" +DOC_BUTTON_NOTICE = "Виконати" +DOC_NOTICE_TITLE = "Заголовок:" +DOC_NOTICE_TEXT = "Примітка:" +DOC_BUTTON_ADD_NOTICE = "Додати примітку" +DOC_SEND_NOTICE_INFO = "Для того, щоб додати нову примітку до документу, будь ласка, заповніть поля в формі нижче." +DOC_NEW_NOTICE_TITLE = "Додати нову примітку" +DOC_MAIL_BODY_CHECK = "Користувач %USER% додав новий документ з назвою '%TITLE%'.%N%Будь ласка, перевірте цей документ перед публікацією." +DOC_MAIL_SUBJECT_CHECK = "Додано новий документ" +DOC_MAIL_BODY_USER = "Вітання %USER%.%N%Створений Вами документ успішно додано, Адміністратору надіслано сповіщення, про проверку, після перевірки документа його буде опубліковано." +DOC_MAIL_SUBJECT_USER = "Ваш документ додано, очікує на перевірку" +DOC_MAIL_BODY_NOTICE = "Користувач %USER% додав нову примітку до документу.%N%Авторизуйтеся у Панелі керування та перейдіть за посиланням нижче, щоб подивитися примітку:%N%%LINK%" +DOC_MAIL_SUBJECT_NOTICE = "Додано нову примітку до документа" +DOC_NEW_PAGE = "Додати нову сторінку" +DOC_CLOSE_HELP_WINDOW = "

" +DOC_HELP = "Допомога" +DOC_VIDEO_TYPE_HELP = "Вставка відео файла
При додаванні відео файла, Ви можете вказати ширину та висоту вікна для перегляду ролика. Перше значення визначає ширину вікна, друге висоту.

наприклад:

video.avi|300|300
або
video.avi|100%|300" +DOC_FLASH_TYPE_HELP = "Вставка флеш ролика
При додаванні флеш ролика, Ви можете вказати ширину та висоту вікна при перегляді. Перше значення визначає ширину, друге висоту.

наприклад:

flash.swf|300|300
або
flash.swf|100%|300" +DOC_FILE_TYPE_HELP = "Вставка Файла
При додаванні файла, Ви можете задати ім’я посилання. Для цього необхідно після назви файла вказати розподілюючий знак | та після нього ввести назву посилання.

наприклад:

file.zip|Завантажити файл" +DOC_NO_PERMISSION = "Даруйте, але Ви не маєте прав для редагування цього документа." +DOC_NO_PERMISSION_RUB = "Даруйте, але Ви не маєте прав для створення документа у цій рубриці." +DOC_NO_DEL_REVISION = "Даруйте, але Ви не маєте прав для видалення ревізії." +DOC_NO_RES_REVISION = "Даруйте, але Ви не маєте прав для відновлення ревізії." +DOC_EDIT_RUB = "Перенести в іншу рубрику" +DOC_RUBRIC = "Рубрика" +DOC_SORT_RUB = "Сортувати за рубриками" +DOC_IMAGE = "Зображення у списку новин" +DOC_IMAGE_MAX_W = "Максимальна ширина" +DOC_IMAGE_MAX_H = "Максимальна висота" +DOC_INTRO = "Тизер
(текст у списку новин)" +DOC_ALIAS_CREATE = "Сформувати" +DOC_ENTER_NAME = "Будь ласка, оберіть рубрику, в яку Ви бажаєте додати новий документ." +DOC_SORT_NAME = "Будь ласка, оберіть рубрику." +DOC_OR = " або " +DOC_NO_DOCS = "Документи, які відповідають цим критеріям пошука, відсутні." + +DOC_COPY = "Копіювати документ" +DOC_COPY_DOCUMENT = "копіювання документа" +DOC_COPY_TIP = "Будь ласка, вкажіть назву для документа" + +DOC_ADD_NEW_LIGHT_TIP = "Для додавання нового документа, будь ласка, оберіть рубрику." +DOC_ADD_NEW_LIGHT_ADD = "Додавання документа" +DOC_ADD_NEW_LIGHT_BTN = "Додати документ" + +DOC_CHANGE_TITLE = "Перенесення документа в іншу рубрику" +DOC_CHANGE_INFO = "Увага! При зміні рубрики поля, які не були перенесені, буде втрачено!" +DOC_CHANGE_OLD_FIELD = "Поле документа" +DOC_CHANGE_NEW_FIELD = "Перенести в нове" +DOC_CHANGE_DROP_FIELD = "-- не переносити --" +DOC_CHANGE_CREATE_FIELD = "-- створити нове --" +DOC_CHANGE_BUTTON = "змінити" + +DOC_CHANGE_AU_TITLE = "Зміна автора документа" +DOC_CHANGE_AU_INFO = "Увага! При зміні автора, попереднього автора може бути позбавлено прав на редагування цього документа." +DOC_CHANGE_BUTTON = "Зберегти" + +DOC_IN_MENU = "в меню" + +DOC_REVISSION = "Історія змін" +DOC_REVISSION_DATA = "Дата та час зміни" +DOC_REVISSION_USER = "Автор" +DOC_REVISSION_VIEW = "Подивитися версію" +DOC_REVISSION_RECOVER = "Відновити версію" +DOC_REVISSION_RECOVER_T = "Ви впевнені, що бажаєте відновити цю версію?" +DOC_REVISSION_DELETE = "видалити версію" +DOC_REVISSION_DELETE_T = "Ви впевнені, що бажаєте видалити цю версію?" +DOC_REVISSION_NO_ITEMS = "На цей час немає даних" + +DOC_URL_ERROR_SYMBOL = "Недопустимі символи" +DOC_URL_ERROR_START = "починається з /" +DOC_URL_ERROR_END = "закінчується на / (при цьому суфікс URL починається на /)" +DOC_URL_ERROR_SEGMENT = "Недопустимі сегменти:" +DOC_URL_ERROR_EMTY = "Немає що перевіряти" +DOC_URL_ERROR_DUPLICATES = "Псевдонім уже використовується" +DOC_URL_H_ERROR_DUPLICATES = "Псевдонім уже використовується в історії аліасів" +DOC_URL_CHECK_OK = "Цей URL можна використовувати" +DOC_URL_CHECK_ER = "URL містить помилки:
" + +DOC_REQUEST_NOT_INFO = "Для цього запиту опису немає." + +DOC_REVISION_DELETE = "Видалив версію документа" +DOC_REVISION_RECOVER = "Відновив версію документа" + +DOC_BREADCRUMB_BTN = "Вибрати" +DOC_BREADCRUMB_TITLE = "Назва посилання для хлібних крихт" +DOC_BREADCRUMB_WITH = "Пов’язаний з" + +DOC_DOCUMENT_OPEN = "Документ опубліковано" +DOC_DOCUMENT_CLOSE = "Документ знято з публікації" + +DOC_DOCUMENT_DOC = "Документ" +DOC_DOCUMENT_ACT = "Опублікував" +DOC_DOCUMENT_DISACT = "Зняв з публікації" + +DOC_DOCUMENT_OPEN_ERR = "Цей документ не можна зробити неактивним!" +DOC_DOCUMENT_OPEN_PRIVE = "У вас недостатньо для цього прав!" + +DOC_ACTION_SELECT = "Дії з обраними" +DOC_ACTION_SELECT_ACT = "Активний" +DOC_ACTION_SELECT_NACT = "Не активний" +DOC_ACTION_SELECT_TRASH = "Тимчасово видалити" +DOC_ACTION_SELECT_OUTTRASH = "Відновити" +DOC_ACTION_SELECT_DEL = "Видалити" +DOC_ACTION_BUTTON = "Зберегти зміни" + +DOC_CHOOSE_LANG = "Вибір мови документа" +DOC_LANG_VERSION = "Версія документа іншими мовами" +DOC_LINK_CHOOSE = "Оберіть документ" +DOCUMENT_SAVED = "Документ успішно збережено" + +DOC_REV_DELETED = "Ревізії документів успішно видалено" +DOC_REV_DELETED_ERR = "Не вдалося видалити ревізії документів.
Спробуйте ще раз." +DOC_REV_ERROR = "Помилка" +DOC_REV_SUCCESS = "Виконано" +DOC_REV_UPDATE = "Видалив ревізії документів" + +DOC_ALIASES = "Керування редиректами документів" +DOC_ALIASES_LIST_NM = "Назва документа" +DOC_ALIASES_LIST_RB = "Рубрика" +DOC_ALIASES_LIST_CH = "Змінено" +DOC_ALIASES_LIST_CR = "Кіль-ть" +DOC_ALIASES_LIST_AT = "Дії" +DOC_ALIASES_TITLE = "У цьому розділі наведено список усіх документів, в яких присутні внутрішні редиректи.
Тут Ви можете виконати основні операції з документами, такі як: перегляд, редагування, видалення редиректа." +DOC_ALIASES_BREAD_RUB = "Рубрика:" +DOC_ALIASES_BREAD_DOC = "Документ:" +DOC_ALIASES_BREAD_URL = "Основний URL:" +DOC_ALIASES_DOC_LIST = "Список документів з редиректами" +DOC_ALIASES_ADD = "Додати новий редирект" +DOC_ALIASES_ADD_VAL = "Значення редиректа" +DOC_ALIASES_LIST = "Список редиректів" +DOC_ALIASES_LIST_EMPT = "Список порожній" +DOC_ALIASES_TABL_H_URL = "Аліас редиректа" +DOC_ALIASES_TABL_H_ADD = "Додано" +DOC_ALIASES_TABL_H_AUT = "Автор" +DOC_ALIASES_TABL_CHECK = "Відмітити цей пункт для видалення" +DOC_ALIASES_GO = "Перейти за посиланням" +DOC_ALIASES_DEL_T = "Видалити аліас" +DOC_ALIASES_DEL_C = "Ви впевнені, що бажаєте видалити аліас?" +DOC_ALIASES_BUTT_DEL = "Видалити" +DOC_ALIASES_BUTT_CLO = "Закрити вікно" +DOC_ALIASES_BUTT_APP = "Примінити" +DOC_ALIASES_BUTT_CNL = "Відмінити" +DOC_ALIASES_BUTT_SAV = "Зберегти" +DOC_ALIASES_BUTT_ADD = "Додати" +DOC_ALIASES_REP_OK = "Виконано" +DOC_ALIASES_REP_OK_T = "Редирект успішно додано" +DOC_ALIASES_REP_OK_T_E = "Редирект успішно обновлено" +DOC_ALIASES_REP_ER = "Помилка" +DOC_ALIASES_REP_ER_T = "Не вдалося додати редирект. Спробуйте ще раз." +DOC_ALIASES_REP_ER_T_E = "Не вдалося оновити редирект. Спробуйте ще раз." + +DOC_RUBRIC_TMPLS = "Вибрати шаблон рубрики" +DOC_RUBRIC_TMPLS_HINT = "Ви можете задати документу, для виводу, будь-який шаблон з цієї рубрики" + + +DOC_SEARCH_FIELD = "Оберіть поле" +DOC_SEARCH_FIELD_LIKE = "Містить" +DOC_SEARCH_FIELD_EQ = "Дорівнює" +DOC_SEARCH_FIELD_TEXT = "Значення" +DOC_TEMPLATE_DEFAULT = "Використовувати по замовчуванню" +DOC_SHOW_LANG = "Показати" + +// 3.2 +DOC_TABS_META = "Meta дані" +DOC_TABS_URL = "URL документа" +DOC_TABS_DATE = "Дата публікації" +DOC_TABS_OTHER = "Інші параметри" + +DOC_WITHOUT_TITLE = "Документ без назви" +DOC_SAVE_ADD = "Додав" +DOC_SAVE_EDIT = "Відредагував" +DOC_SAVE_LOG_DOC = " документ" \ No newline at end of file diff --git a/admin/lang/ua/groups.txt b/admin/lang/ua/groups.txt new file mode 100644 index 0000000..84a1597 --- /dev/null +++ b/admin/lang/ua/groups.txt @@ -0,0 +1,125 @@ +# солов’їна))) 01,2017 duncan + +[groups] +UGROUP_TITLE = "Керування групами користувачів" +UGROUP_TITLE2 = "Керування групою користувачів" +UGROUP_TITLE_MENU = "Групи користувачів" +UGROUP_INFO = "У цьому розділі наведено cписок усіх груп користувачів у системі. Для кожної групи Ви можете назначити персональні права, які дозволять або обмежать дії користувачів як в Панелі керування, так і в Публічній частині cайту." +UGROUP_ID = "ID" +UGROUP_NAME = "Назва групи" +UGROUP_COUNT = "Користувачів в групі" +UGROUP_ACTIONS = "Дії" +UGROUP_IN_GROUP = "Перегляд списку користувачів, які відносяться до цієї групи" +UGROUP_EDIT = "Редагувати назву та права групи" +UGROUP_NO_PERMISSION = "Даруйте, але у Вас недостатньо прав для редагування" +UGROUP_DELETE = "Видалити цю групу" +UGROUP_USERS_IN_GROUP = "На цей час Ви не можете видалити цю групу, оскільки є користувачі, які перебувають у цій групі." +UGROUP_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити цю групу?" +UGROUP_NO_DELETABLE = "Ви не можете видалити цю групу, оскільки вона є системною." +UGROUP_NO_PERM_DELETE = "Даруйте, але у Вас недостатньо прав для видалення цієї групи." +UGROUP_NEW_GROUP = "Додати нову групу" +UGROUP_NEW_NAME = "Назва групи:" +UGROUP_BUTTON_ADD = "Додати" +UGROUP_LEGEND_LINK = "Значення піктограм" +UGROUP_LEGEND_EDIT = "Редагувати групу користувачів" +UGROUP_LEGEND_DELETE = "Видалити групу користувачів" +UGROUP_ENTER_NAME = "Будь ласка, вкажіть назву групи користувачів" +UGROUP_WARNING_TIP = "Увага! Будьте уважні при призначені тих або інших прав для цієї групи користувачів. Пам’ятайте, що даючи доступ до певних розділів, Ви можете зробити систему вразливою." +UGROUP_YOUR_NOT_CHANGE = "Помилка! Даруйте, але Ви не маєте прав для редагування цієї групи користувачів." +UGROUP_NOT_EXIST = "Помилка! Даруйте, але групи користувачів, яку Ви шукаєте, не існує." +UGROUP_NO_MODULES = "Немає встановлених модулів" +UGROUP_MODULES_RIGHT = "Будь ласка, вкажіть модулі, до яких буде дозволено доступ для цієї групи користувачів." +UGROUP_CONTROL_RIGHT = "Будь ласка, вкажіть розділи Панелі керування, до яких буде дозволено або обмежено доступ для цієї групи користувачів." +UGROUP_BUTTON_SAVE = "Зберегти зміни" +UGROUP_BUTTON_SAVE_AJAX = "Примінити (CTRL+S)" +UGROUP_SAVE_CONFIRM = "Ви впевнені, що бажаєте зберегти права для цієї групи користувачів?" +UGROUP_NAME_EDIT = "Редагувати назву групи" +UGROUP_OR = "або" +UGROUP_SAVED = "Права для групи успішно збережено" +UGROUP_SAVED_ERR = "Не вдалося зберегти права для групи.
Спробуйте ще раз." +UGROUP_ERROR = "Помилка" +UGROUP_SUCCESS = "Виконано" +UGROUP_SAVE_MAIN = "Змінив права доступу для групи" + +UGROUP_REPORT_ADD = "Створив групу користувачів" +UGROUP_REPORT_DEL = "Видалив групу користувачів" + +alles = "Дозволити усі права (Будьте уважні!)" +adminpanel = "Доступ до Панелі керування" + +gen_settings = "Доступ до керування загальними налаштуваннями системи" +gen_settings_more = "Доступ до керування додатковими налаштуваннями системи" +gen_settings_countries = "Доступ до керування списком країн" +gen_settings_languages = "Доступ до керування мовами" + +logs_view = "Доступ до перегляду системних повід." +logs_clear = "Доступ до видалення системних повідомлень" + +db_actions = "Доступ до керування базою даних (Резервне копіювання, відновлення, оптимізація)" + +modules_view = "Доступ до списку модулів" +modules_admin = "Доступ до модулів (Налаштування, керування, використання)" +modules_system = "Доступ до керування модулями (видалення, установка)" + +navigation_view = "Доступ до списку меню навигацій" +navigation_edit = "Доступ до керування меню навигацій (Створення, редагування, видалення)" + +remark_view = "Доступ до списку приміток" +remark_edit = "Доступ до керування примітками у документів (Створення, редагування, видалення)" + +document_php = "Доступ до використання PHP коду в документах (Будьте уважні!)" +document_view = "Доступ до списку документів (права доступу до документів залежать від налаштувань рубрики)" +document_revisions = "Доступ до видалення усіх ревізій документів" + +rubric_view = "Доступ до перегляду списку рубрик" +rubric_edit = "Доступ до керування рубриками (Створення, редагування, видалення)" +rubric_php = "Доступ до використання PHP коду в шаблонах рубрик (Будьте уважні!)" +rubric_perms = "Доступ до керування правами доступу для документів рубрики" +rubric_code = "Доступ до виконуваного коду для рубрик (Будьте уважні!)" + +template_view = "Доступ до списку шаблонів" +template_edit = "Доступ до керування шаблонами (Створення, редагування, видалення)" +template_php = "Доступ до використання PHP коду в шаблонах (Будьте уважні!)" + +request_view = "Доступ до списку запитів" +request_edit = "Доступ до керування запитами (Створення, редагування, видалення)" +request_php = "Доступ до використання PHP коду в шаблонах запиту (Будьте уважні!)" + +blocks_view = "Доступ до перегляду списку візуальних блоків" +blocks_edit = "Доступ до керування візуальними блоками (Створення, редагування, видалення)" + +sysblocks_view = "Доступ до перегляду списку системних блоків" +sysblocks_edit = "Доступ до керування системними блоками (Створення, редагування, видалення)" + +user_view = "Доступ до списку користувачів" +user_edit = "Доступ до редагування параметрів користувачів" +user_perms = "Доступ до керування правами користувачів" + +group_view = "Доступ до списку груп користувачів" +group_edit = "Доступ до керування правами груп користувачів (Створення, редагування, видалення)" + +mediapool_int = "Доступ до менеджеру файлів" +mediapool_add = "Доступ до додавання нових файлів на сервер (у менеджері файлів)" +mediapool_del = "Доступ до видалення файлів зі сервера (у менеджері файлів)" +mediapool_finder = "Доступ до файлового менеджера (elFinder)" + +cache_clear = "Доступ до видалення кеша" +cache_thumb = "Доступ до видалення прев’ю зображень (thumbnail)" + +logs = "Системні повідомлення" +cache = "Керування кешем" +gen = "Системні налаштування" +db = "База даних" +blocks = "Візуальні блоки" +sysblocks = "Системні блоки" +rubric = "Рубрики" +document = "Документи" +modules = "Модулі" +mediapool = "Файлові менеджери" +navigation = "Навігація" +request = "Запити" +template = "Шаблони" +remark = "Примітки у документів" +document = "Документи" +user = "Користувачі" +group = "Групи користувачів" \ No newline at end of file diff --git a/admin/lang/ua/logs.txt b/admin/lang/ua/logs.txt new file mode 100644 index 0000000..dfd5504 --- /dev/null +++ b/admin/lang/ua/logs.txt @@ -0,0 +1,55 @@ +# солов’їна))) 01,2017 duncan + +[logs] +LOGS_SUB_TITLE = "Керування системними повідомленнями" +LOGS_TITLE = "Журнал системних подій" +LOGS_TIP = "У цьому розділі наведено список усіх дій, які здійснюються в Панелі керування." +LOGS_ID = "№" +LOGS_IP = "Ip-адреса" +LOGS_DATE = "Дата" +LOGS_USER = "Користувач" +LOGS_ACTION = "Дії" +LOGS_BUTTON_DELETE = "Очистити журнал" +LOGS_DELETE_CONFIRM = "Ви впевнені, що бажаєте очистити журнал системних повідомлень?" +LOGS_BUTTON_EXPORT = "Експорт журналу системних повідомлень" +LOGS_BUTTON_EXPORT_404 = "Експорт журналу помилок 404" +LOGS_DATE_FORMAT = "%d.%m.%y г." +LOGS_DATE_FORMAT2 = "%H:%M" +LOGS_IN = "в" +LOGS_CLEAR = "Системні повідомлення успішно видалено." +LOGS_CLEAN = "Очистив журнал подій" +LOGS_EXPORT = "Експортував журнал подій" + +LOGS_404_SUB_TITLE = "Журнал помилок 404" +LOGS_404_TITLE = "Журнал помилок 404" +LOGS_404_TIP = "У цьому розділі наведено список усіх помилок 404." +LOGS_404_ID = "№" +LOGS_404_IP = "Ip-адреса" +LOGS_404_DATE = "Дата" +LOGS_404_ACTION = "Дії" +LOGS_404_BUTTON_DELETE = "Очистити журнал" +LOGS_404_DELETE_CONFIRM = "Ви впевнені, що бажаєте очистити журнал помилок 404?" +LOGS_404_BUTTON_EXPORT = "Експорт журналу помилок" +LOGS_404_DATE_FORMAT = "%d.%m.%y г." +LOGS_404_DATE_FORMAT2 = "%H:%M" +LOGS_404_IN = "в" +LOGS_404_CLEAR = "Системні повідомлення успішно видалено." +LOGS_404_CLEAN = "Очистив журнал помилок 404" +LOGS_404_EXPORT = "Експортував журнал помилок 404" + +LOGS_SQL_SUB_TITLE = "Журнал MySQL помилок" +LOGS_SQL_TITLE = "Журнал MySQL помилок" +LOGS_SQL_TIP = "У цьому розділі наведено список усіх помилок MySQL." +LOGS_SQL_ID = "№" +LOGS_SQL_IP = "Ip-адреса" +LOGS_SQL_DATE = "Дата" +LOGS_SQL_ACTION = "Дії" +LOGS_SQL_BUTTON_DELETE = "Очистити журнал MySQL помилок" +LOGS_SQL_DELETE_CONFIRM = "Ви впевнені, що бажаєте очистити журнал MySQL помилок?" +LOGS_SQL_BUTTON_EXPORT = "Експорт журналу MySQL помилок" +LOGS_SQL_DATE_FORMAT = "%d.%m.%y г." +LOGS_SQL_DATE_FORMAT2 = "%H:%M" +LOGS_SQL_IN = "в" +LOGS_SQL_CLEAR = "Журнал помилок MySQL успішно видалено." +LOGS_SQL_CLEAN = "Очистив журнал MySQL помилок" +LOGS_SQL_EXPORT = "Експортував журнал MySQL помилок" \ No newline at end of file diff --git a/admin/lang/ua/main.txt b/admin/lang/ua/main.txt new file mode 100644 index 0000000..a6967fb --- /dev/null +++ b/admin/lang/ua/main.txt @@ -0,0 +1,305 @@ +# солов’їна))) 01,2017 duncan + +MAIN_WELCOME = "Ласкаво просимо в Панель керування!" +MAIN_WELCOME_INFO = "На головній сторінці Ви можете вибрати одну з найбільш часто виконуваних дій." + +MAIN_PAGE = "Головна сторінка" + +MAIN_LOGIN_INTRO = "Авторизація" +MAIN_LOGIN_BACK_SITE = "Повернутися на сайт" +MAIN_LOGIN_NAME = "Логін:" +MAIN_LOGIN_PASSWORD = "Пароль:" +MAIN_LOGIN_BUTTON = "Увійти" +MAIN_LOGIN_REGISTER = "Реєстрація" +MAIN_LOGIN_LOST = "Забули пароль?" +MAIN_LOGIN_HELP = "Допомога" +MAIN_LOGIN_REMEMBER = "Запам’ятати мене" +MAIN_LOGIN_CAP_CODE = "Код:" +MAIN_LOGIN_CAP_CODE_REF = "Оновити код:" +MAIN_LOGIN_CAP_CODE_REFR = "Оновити код" + +MAIN_LINK_HOME = "Головне меню" +MAIN_LINK_AUTHOR = "Сайт підтримки" +MAIN_LINK_DATABASE = "Керування базою даних" +MAIN_LINK_NAVIGATION = "Керування меню навігації" +MAIN_LINK_MODULES = "Керування модулями" +MAIN_LINK_MODULES_H = "Модулі" +MAIN_LINK_SETTINGS = "Керування налаштуваннями" +MAIN_LINK_SETTINGS_H = "Налаштування" +MAIN_LINK_USERS = "Керування користувачами" +MAIN_LINK_TEMPLATES = "Керування шаблонами" +MAIN_LINK_RUBRICS = "Керування рубриками" +MAIN_LINK_DOCUMENT = "Керування документами" +MAIN_LINK_QUERYES = "Керування запитами" +MAIN_LINK_GROUPS = "Керування групами" +MAIN_LINK_LANG = "Керування мовами" + +MAIN_BUTTON_LOGIN = "Увійти" +MAIN_BUTTON_ADD = "Додати" +MAIN_BUTTON_LOGOUT = "Вихід" + +MAIN_SETTINGS_EDIT_1 = "Загальні налаштування" +MAIN_SETTINGS_EDIT_2 = "Додаткові налаштування" +MAIN_SETTINGS_EDIT_3 = "Керування країнами" +MAIN_SETTINGS_EDIT_4 = "Створити резервну копію БД" + +MAIN_LINK_DOC_TIPS = "У цьому розділі наведено список усіх документів у системі." +MAIN_LINK_RUBRIK_TIP = "У цьому розділі наведено список усіх рубрик у системі." +MAIN_LINK_REQUEST_TIP = "У цьому розділі наведено список усіх існуючих запитів у системі." +MAIN_LINK_NAVI_TIP = "У цьому розділі наведено список усіх меню навігацій у системі." +MAIN_LINK_TEMPLATES_TIP = "У цьому розділі наведено список усіх шаблонів, які використовуються у системі." +MAIN_LINK_MODULES_TIP = "У цьому розділі наведено список усіх доступних модулів у системі." +MAIN_LINK_SETTINGS_TIP = "У цьому розділі наведено усі глобальні параметри системи." +MAIN_LINK_DB_TIP = "У цьому розділі Ви можете працювати з базою даних системи." +MAIN_LINK_USER_TIP = "У цьому розділі наведено список усіх користувачів у системі." +MAIN_LINK_UGROUP_TIP = "У цьому розділі наведено cписок усіх груп користувачів у системі." + +MAIN_PAGE_TITLE = "Панель керування" +MAIN_LOGIN_TEXT = "Авторизація" +MAIN_LOGIN_TEXT2 = "Будь ласка, вкажіть Ваші дані:" +MAIN_LOGIN_CAPTCHA = "Введіть код:" +MAIN_SELECT_LANGUAGE = "Мову:" +MAIN_SELECT_THEME = "Тема оформлення:" +MAIN_YOUR_EMAIL = "E-mail:" +MAIN_YOUR_LOGIN = "Логін або E-mail:" +MAIN_YOUR_PASSWORD = "Пароль:" + +MAIN_LINK_SITE = "Подивитися сайт" +MAIN_LINK_HOME = "На головну" +MAIN_LINK_LOGOUT = "Вихід з Панелі керування" +MAIN_LINK_LOGOUT_QUEST = "Ви впевнені, що бажаєте вийти?" +MAIN_LINK_CACHE_CLEAR = "Очистка кеша" +MAIN_LINK_CACHE_CLEAR_QUEST = "Ви впевнені, що бажаєте очистити кеш?" + +MAIN_LINK_SITE_ON = "Увімкнути редактор" +MAIN_LINK_SITE_OFF = "Вимкнути редактор" + +MAIN_LINK_EDIT = "Редагувати на сайті" +MAIN_ADD_IN_RUB = "Додати новий документ:" +MAIN_DOCUMENTS_ALL = "Список документів:" +MAIN_SEARCH_DOCUMENTS = "Пошук документів:" +MAIN_SORT_DOCUMENTS = "Швидкий відбір:" +MAIN_TIME_PERIOD = "Період публікації" +MAIN_TIME_START = "Початок" +MAIN_TIME_END = "Кінець" +MAIN_BUTTON_SEARCH = "Пошук" +MAIN_TITLE_SEARCH = "Назва документа:" +MAIN_TITLE_DOC_NAME = "Назва документа" +MAIN_TITLE_DOC_ID = "ID документа" +MAIN_SEARCH_HELP = Використання пошука

Використовуйте знак "+" для чіткого включения слова в пошук.
Використовуйте знак "-" для виключення слова з пошука.

Обов’язково використовуйте пробіл перед знаками "+" та "-"." +MAIN_ID_SEARCH = "ID документа:" +MAIN_SELECT_RUBRIK = "В рубриці:" +MAIN_ALL_RUBRUKS = "Усі рубрики" +MAIN_ALL_DOCUMENTS = "Будь-який статус" +MAIN_DOCUMENT_STATUS = "Статус документа" +MAIN_DOCUMENT_ACTIVE = "Тільки активний" +MAIN_DOCUMENT_INACTIVE = "Тільки неактивний" +MAIN_TEMP_DELETE_DOCS = "Тимчасово видалений" +MAIN_RESULTS_ON_PAGE = "Результатів на сторінці:" +MAIN_OPEN_MEDIAPATH = "Подивитися на сервері" +MAIN_NAVI_UGROUPS = "Групи користувачів" +MAIN_UGROUP_EDIT = "Редагувати права групи" +MAIN_UGROUP_DELETE = "Видалити цю групу" +MAIN_LOGS = "Системні події" +MAIN_NAVI_MODULES = "Керування модулями" +MAIN_NAVIGATION = "Меню навігацій" +MAIN_NAVIGATION_NEW = "Додати нове меню" +MAIN_QUERIES = "Запити" +MAIN_REQUEST_NEW = "Додати новий запит" +MAIN_RUBRIKS = "Рубрики" +MAIN_RUBRIK_NEW = "Додати нову рубрику" +MAIN_RUBRIK_EDIT_FIELDS = "Редагувати поля рубрики" +MAIN_RUBRIK_EDIT_TEMPL = "Редагувати шаблон рубрики" +MAIN_SETTINGS = "Системні налаштування" +MAIN_COUNTRY_EDIT = "Керування країнами" +MAIN_SYSBLOCKS = "Системні блоки" +MAIN_TEMPLATES = "Шаблони" +MAIN_TEMPLATES_NEW = "Додати новий шаблон" +MAIN_USERS = "Користувачі" +MAIN_DATABASE_INFO = "База даних" +MAIN_NAVI_DOCUMENTS = "Документи" +MAIN_BROWSE_DOCUMENTS = "Подивитися в документах" +MAIN_USERS_LIST = "Список користувачів" +MAIN_USER_ADD = "Додати нового користувача" +MAIN_SEARCH_USERS = "Пошук користувачів за:" +MAIN_USER_PARAMS = "Іменем, Id, E-mail, E-mail домену" +MAIN_USER_STATUS = "Зі статусом:" +MAIN_USER_STATUS_ALL = "Будь-який статус" +MAIN_USER_STATUS_ACTIVE = "Активний" +MAIN_USER_STATUS_INACTIVE = "Очікує активації" +MAIN_USER_GROUP = "Перебуває в групі:" +MAIN_USER_ONLINE = "Ласкаво просимо," +MAIN_USER_PERM = "Статус:" +MAIN_ALL_USER_GROUP = "У будь-який" +MAIN_BUTTON_SEARCH_USER = "Найти користувачів по параметрах" +MAIN_NO_PERMISSION = "Даруйте, але Ви не маєте прав доступу до такого розділу" +MAIN_LOGOUT_CONFIRM = "Ви впевнені, що бажаєте вийти?" + +MAIN_START_DOC_TITLE = "Останні документи" +MAIN_START_DOC_ID = "id" +MAIN_START_DOC_NAME = "Назва" +MAIN_START_DOC_RUBRIC = "Рубрика" +MAIN_START_DOC_DATE = "Опубліковано" +MAIN_START_DOC_AUTOR = "Автор" + +MAIN_START_SEARCH = "Пошук:" +MAIN_START_SEARCH_T = "Шукати документ" + +MAIN_START_LOGS_LOG = "Журнал операцій" +MAIN_START_LOGS_404 = "Помилки 404" +MAIN_START_LOGS_SQL = "Помилки MySQL" + +MAIN_TABLE_SUCC = "Кількість успішно завантажених таблиць: " +MAIN_TABLE_ERROR = "Кількість таблиць з помилками: " +MAIN_SQL_FILE_ERROR = "SQL-файл має неправильний формат або містить помилки в структурі запитів." +MAIN_RESTORE_OK = "Базу даних успішно відновлено" + +MAIN_NO_PERM_MODULES = "Даруйте, але у вас недостатньо прав для керування таким модулем" +MAIN_MP_FILE_DELETE = "Видалити файл" +MAIN_MP_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити файл: " +MAIN_MP_DOC_FOLDER = "Список папок / файлів" +MAIN_MP_FILE_SIZE = "Розмір файла" +MAIN_MP_FILE_DATE = "Дата створення" +MAIN_MP_ACTIONS = "Дії" +MAIN_MP_FILE_INFO = "Щоби додати файл, натисніть на його назву, а потом на кнопку вставити файл" +MAIN_MP_UP_LEVEL = "Повернутися на рівень вище" +MAIN_MP_CREATE_FOLDER = "Створити папку" +MAIN_MP_UPLOAD_FILE = "Завантажити файл" +MAIN_MP_FILE_INSERT = "Вставити файл" +MAIN_MP_DIR_INSERT = "Вибрати папку" +MAIN_MP_SELECT_FILES = "Оберіть файли для завантаження" +MAIN_MP_IMAGE_RESIZE = "Змінити розмір завантажених зображень" +MAIN_MP_IMAGE_WIDTH = "Ширина" +MAIN_MP_IMAGE_HEIGHT = "Висота" +MAIN_BUTTON_UPLOAD = "Завантажити" +MAIN_BUTTON_WAIT = "Будь ласка, зачекайте..." +MAIN_MP_PLEASE_SELECT = "Будь ласка, оберіть файл" +MAIN_ADD_IN = "Оберіть рубрику:" +MAIN_GROUP_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити цю групу?" +MAIN_RUBRIKS_LIST = "Список рубрик" +MAIN_USER = "Користувач:" +ButtonSave = "Зберегти" +MAIN_NEW_PAGE = "Додати нову сторінку" +MAIN_BUTTON_SORT = "Відібрати" +MAIN_QUICK_MODULE = "Керування модулями" +MAIN_STAT = "Статистика" +MAIN_STAT_SYSTEM_INFO = "Системна інформація" +MAIN_STAT_DOCUMENTS = "Усього документів:" +MAIN_STAT_RUBRICS = "Усього рубрик:" +MAIN_STAT_QUERIES = "Усього запитів:" +MAIN_STAT_TEMPLATES = "Усього шаблонів:" +MAIN_STAT_MYSQL = "Розмір бази даних:" +MAIN_STAT_CACHE = "Загальний розмір кеша:" +MAIN_STAT_CACHE_SHOW = "Показати" +MAIN_STAT_MODULES = "Встановлено модулів:" +MAIN_STAT_MODULES_OFF = "Вимкнено модулів:" +MAIN_STAT_USERS = "Усього користувачів:" +MAIN_STAT_USERS_WAIT = "Очікують активацію:" +MAIN_STAT_AVE = "AVE.cms" +MAIN_STAT_DOMEN = "Домен" +MAIN_STAT_PHP = "PHP Версія:" +MAIN_STAT_MYSQL_VERSION = "MySQL Версія:" +MAIN_STAT_CLEAR_CACHE = "Очистити кеш" +MAIN_STAT_CLEAR_CACHE_FULL= "Очистити кеш та сесії" +MAIN_STAT_CLEAR_THUMB = "Видалити мініатюри" +MAIN_STAT_CLEAR_REV = "Видалити ревізії" +MAIN_STAT_CLEAR_COUNT = "Обнулити поденний лічильник" +MAIN_ADD_FOLDER = "Будь ласка, введіть ім’я для нової папки:" +MAIN_NO_ADD_FOLDER = "Не вказано ім’я папки або дію відмінено!" +MAIN_NO_ADD_TEMPL = "Не вказано назву шаблона або дію відмінено!" +MAIN_NO_ADD_GROUP = "Не вказано назву групи або дію відмінено!" +MAIN_NO_ADD_RUB = "Не вказано назву рубрики або дію відмінено!" +MAIN_NO_ADD_QUERY = "Не вказано назву запиту або дію відмінено!" +MAIN_NO_ADD_NAV = "Не вказано назву навигації або дію відмінено!" +MAIN_NO_ADD_BLOCK = "Не вказано назву системного блока або дію відмінено!" +MAIN_NO_ADD_USER = "Не вказано ім’я користувача або дію відмінено!" +MAIN_NO_ADD_DOCS = "Не вказано назву документа або дію відмінено!" +MAIN_CLEAR_CACHE_OK = "Кеш очищено" +MAIN_FILE_MANAGER_TITLE = "Файловий менеджер" +MAIN_FILE_MANAGER_TIP = "Оберіть потрібний файл та натисніть на кнопку "вставити файл"" + +MAIN_SVN_NEW = "Вийшла новая версія" +MAIN_SVN_SAIT = "Перейти на сайт" +MAIN_SVN_REPOS = "Перейти на сайт репозиторія" +MAIN_SVN_MAILTO = "Написати лист" +MAIN_SVN_LOOK = "Подивитися ревізію на сайті репозиторія" +MAIN_SVN_RECOM = "Рекомендовано оновитися!" + +MAIN_FINDER = "Файловий менеджер" + +MAIN_ADD_NEW_GROUP = "Додати нову групу" +MAIN_ADD_NEW_GROUP_NAME = "Назва групи:" + +MAIN_ADD_NEW_USER = "Додати нового користувача" +MAIN_ADD_NEW_USER_NAME = "Ім’я користувача:" + +MAIN_ADD_NEW_NAV = "Додати нову навігацію" +MAIN_ADD_NEW_NAV_NAME = "Назва навигації:" + +MAIN_ADD_NEW_TEMPL = "Додати новий шаблон" +MAIN_ADD_NEW_TEMPL_NAME = "Назва шаблона:" + +MAIN_ADD_NEW_REQUEST = "Додати новий запит" +MAIN_ADD_NEW_REQUEST_NAME = "Назва запиту:" + +MAIN_ADD_NEW_RUB = "Додати нову рубрику" +MAIN_ADD_NEW_RUB_NAME = "Назва рубрики:" + +MAIN_ADD_NEW_BLOCK = "Додати новий системний блок" +MAIN_ADD_NEW_BLOCK_NAME = "Назва системного блока:" + +MAIN_USERS_LAST_TIME = "За останній час було:" + +MAIN_LOGS_ID = "№" +MAIN_LOGS_IP = "Ip-адреса" +MAIN_LOGS_DATE = "Дата" +MAIN_LOGS_USER = "Користувач" +MAIN_LOGS_ACTION = "Дії" + +MAIN_DOC_SHOW3_TITLE = "Документ без назви" +MAIN_DOC_EDIT_TITLE = "Редагувати цей документ" +MAIN_DOC_SHOW_TITLE = "Перегляд документа (Посилання без ЧПУ)" +MAIN_DOC_SHOW2_TITLE = "Перегляд документа (Посилання з ЧПУ)" + +MAIN_ADD_DOC = "Документ" +MAIN_ADD_RUB = "Рубрику" +MAIN_ADD_REQ = "Запит" +MAIN_ADD_SYS = "Системний блок" +MAIN_ADD_TEM = "Шаблон" +MAIN_ADD_NAV = "Навігацію" +MAIN_ADD_USR = "Користувача" +MAIN_ADD_GRP = "Групу" + +MAIN_BRANCHES = "Розділи" +MAIN_SHOWHIDE = "Показати/приховати меню" + +MAIN_CODEMIRROR_HELP = "Ctrl-F/Cmd-F (Шукати) | Ctrl-G/Cmd-G (Шукати далі) | Shift-Ctrl-G/Shift-Cmd-G (Найти попереднє) | Shift-Ctrl-F/Cmd-Option-F (Замінити) | Shift-Ctrl-R / Shift-Cmd-Option-F (Замінити усі) | F11 (На повний екран)" + +TEMPLATES_MESSAGE = "Повідомлення:" +TEMPLATES_CACHE_SUCCESS = "Кеш успішно очищено." +TEMPLATES_CACHE_SUCCESS_LOG = "Очистив кеш" +TEMPLATES_CACHE_DB_SUCCESS = "Таблиця _sessions успішно очищена." +TEMPLATES_CACHE_DB_SUCCESS_LOG = "Очистив таблицьу _sessions." +TEMPLATES_CACHE_CT_SUCCESS = "Видалено скомпільовані шаблони." +TEMPLATES_CACHE_CT_SUCCESS_LOG = "Видалив скомпільовані шаблони" +TEMPLATES_CACHE_MC_SUCCESS = "Видалено скомпільовані шаблони модулів." +TEMPLATES_CACHE_MC_SUCCESS_LOG = "Видалив скомпільовані шаблони модулів" +TEMPLATES_CACHE_SU_SUCCESS = "Видалено сесії користувачів." +TEMPLATES_CACHE_SU_SUCCESS_LOG = "Видалив сесії користувачів" +TEMPLATES_CACHE_SC_SUCCESS = "Видалено кеш sql запитів." +TEMPLATES_CACHE_SC_SUCCESS_LOG = "Видалив кеш sql запитів" +TEMPLATES_THUMBNAILS_SUCCESS = "Мініатюри успішно видалено." +TEMPLATES_THUMBNAILS_SUCCESS_LOG = "Видалив мініатюри" + +EXIT_ADMIN = "Закінчив сеанс у Панелі керування" +LOGIN_ADMIN = "ПОчав сеанс у Панелі керування" +ERROR_ADMIN = "Помилка при вході до Панелі керування" + +WRONG_PASS = "Помилка:
Ім’я користувача або пароль неправильні!" +WRONG_CAPTCHA = "Помилка:
Неправильний захисний код" + +oficial_site = "Офіційний сайт" +support = "Служба технічної підтримки" + +// 3.1.9 +MAIN_BLOCKS = "Візуальні блоки" \ No newline at end of file diff --git a/admin/lang/ua/modules.txt b/admin/lang/ua/modules.txt new file mode 100644 index 0000000..ffd650b --- /dev/null +++ b/admin/lang/ua/modules.txt @@ -0,0 +1,38 @@ +# солов’їна))) 01,2017 duncan + +[modules] +MODULES_SUB_TITLE = "Керування модулями" +MODULES_TIP = "У цьому розділі наведено список усіх доступних модулів у системі. Тут Ви можете встановити, відключити, оновити будь-який з модулів, а також виконати додаткові персональні налаштування для будь-якого з модулів." +MODULES_NAME = "Назва модуля" +MODULES_INFO = "Інформація" +MODULES_TEMPLATE = "Шаблон виводу" +MODULES_SYSTEM_TAG = "Системний тег" +MODULES_VERSION = "Версія" +MODULES_ACTIONS = "Дії" +MODULES_SETTINGS = "Параметри" +MODULES_SETTINGS_INFO = "Інформація" +MODULES_DELETE = "Видалити модуль" +MODULES_DELETE_CONFIRM = "Пам’ятайте, що видаляючи модуль з системи, Ви видаляєте його тільки на програмному рівні. Таким чином, в майбутньому, Ви завжди можете його встановити заново.
Ви впевнені, що бажаєте видалити цей модуль?" +MODULES_INSTALL = "Встановити модуль" +MODULES_REMOVE = "Видалити модуль з сервера" +MODULES_REINSTALL = "Перевстановити модуль" +MODULES_REINSTALL_CONF = "Ви впевнені, що бажаєте перевстановити цей модуль?" +MODULES_UPDATE = "Оновити модуль" +MODULES_STOP = "Відключити модуль" +MODULES_START = "Увімкнути модуль" +MODULES_BUTTON_SAVE = "Зберегти зміни" +MODULES_LEGEND = "Значення піктограм" +MODULES_AUTHOR = "Автор модуля" +MODULES_ERROR = "Возникла помилка при завантаженні модуля: " +MODULES_INSTALLED = "Встановлені модулі:" +MODULES_NOT_INSTALLED = "Невстановлені модулі:" +MODULES_SETUP = "Перейти до керування модулем" +MODULES_NO_INSTALL = "Повідомлення:
Немає встановлених модулів." +MODULES_NOT_INSTALL = "Повідомлення:
Немає невстановлених модулів." +MODULES_ACTION_INSTALL = "Встановив модуль" +MODULES_ACTION_ONLINE = "Включив модуль" +MODULES_ACTION_OFFLINE = "Відключив модуль" +MODULES_ACTION_REINSTALL = "Перевстановив модуль" +MODULES_ACTION_UPDATE = "Оновив модуль" +MODULES_ACTION_DELETE = "Видалив модуль зі системи" +MODULES_ACTION_REMOVE = "Видалив модуль зі сервера" \ No newline at end of file diff --git a/admin/lang/ua/navigation.txt b/admin/lang/ua/navigation.txt new file mode 100644 index 0000000..3a11e08 --- /dev/null +++ b/admin/lang/ua/navigation.txt @@ -0,0 +1,131 @@ +# солов’їна))) 01,2017 duncan + +[navi] +NAVI_ID = "ID" +NAVI_SUB_TITLE = "Керування меню навігації" +NAVI_SUB_TITLE2 = "Керування пунктами меню" +NAVI_SUB_TITLE3 = "Редагування шаблона меню" +NAVI_SUB_TITLE4 = "Створення нового шаблона меню" +NAVI_TIP_TEMPLATE = "У цьому розділі наведено список усіх меню навігацій у системі. Тут Ви можете змінити шаблон виводу будь-якого з доступних меню, а також додати або видалити пункти меню." +NAVI_TIP_TEMPLATE2 = "У цьому розділі, використовуючи мову розмітки HTML, Ви можете створити шаблон оформлення для цього меню навігації. також, Ви можете вибрати групи користувачів, для яких буде доступне це меню навігації. Для вибору декількох груп затисніть кнопку CTRL." +NAVI_ITEMS_TIP = "Створення нового пункта меню" +NAVI_NEW_MENU = "Створення нового меню" +NAVI_LIST_TIP = "Cписок нижче містить усі пункти, які стосуються цього меню. Пам’ятайте, що максимальний рівень вкладень не може бути більше 2." +NAVI_LIST = "Список пунктів меню" +NAVI_EDIT_TEMPLATE = "Редагування шаблона меню" +NAVI_EDIT_ITEMS = "Редагування пунктів меню" +NAVI_OPEN_IN_THIS = "У поточному вікні" +NAVI_OPEN_IN_NEW = "у новому вікні" +NAVI_TARGET_WINDOW = "Відкривати" +NAVI_POSITION = "Позиція" +NAVI_LINK_TO_DOCUMENT = "Посилання на документ/файл" +NAVI_ENTRIES_NO_ITEMS = "Повідомлення:
На цей час немає пунктів меню." + +NAVI_LINK_TITLE = "Назва пункта меню" +NAVI_LINK_SOLUT = "Опис для пункта меню:" +NAVI_LINK_IMGID = "Id зображення:" +NAVI_LINK_IMGTL = "Вибрати зображення:" +NAVI_LINK_IMAGE = "Зображення для пункта меню" +NAVI_TITLE = "Назва меню навігації:" +NAVI_TITLE2 = "Введіть назву меню навігації:" +NAVI_BROWSE_DOCUMENTS = "Зв’язати з існуючим документом" +NAVI_ADD_SUBITEM = "Додати новий підпункт" +NAVI_BUTTON_CHANGE = "Вибрати" +NAVI_BUTTON_OPTION = "Опції" +NAVI_BUTTON_SUBITEM = "+" +NAVI_BROWSE_MEDIAPOOL = "Зв’язати з файлом на сервері" +NAVI_SYSTEM_TAG = "Системний тег" +NAVI_NAME = "Назва меню" +NAVI_LINK_TARGET = "Тег, який визначає тип відкриття документа (у новому або поточному вікні)" +NAVI_LINK_URL = "Тег, який визначає адресу для переходу" +NAVI_LINK_NAME = "Тег, який визначає назву посилання, яке буде відображене в меню" +NAVI_LINK_ID = "Тег, який визначає унікальний ідентифікатор посилання" +NAVI_LINK_INACTIVE = "Оформлення неактивного посилання:" +NAVI_LINK_ACTIVE = "Оформлення активного посилання:" +NAVI_HEADER_START = "Верхня частина оформлення:" +NAVI_FOOTER_END = "Нижня частина оформлення:" +NAVI_HEADER_TIP = "Наприклад, заголовок
"Каталог товарів"
(не обов’язкове)" +NAVI_COPY_TEMPLATE = "Копіювати шаблон меню" +NAVI_FOOTER_TIP = "Нижня частина оформлення меню
(не обов’язкове)" +NAVI_DELETE = "Видалити це меню" +NAVI_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити це меню навігації?" +NAVI_HTML_START = "Початковий HTML код:" +NAVI_HTML_END = "Кінцевий HTML код:" +NAVI_LEVEL1 = "Шаблон оформлення для головного (першого) рівня пунктів меню" +NAVI_LEVEL2 = "Шаблон оформлення для першого рівня вкладених пунктів меню" +NAVI_LEVEL3 = "Шаблон оформлення для другого рівня вкладених пунктів" +NAVI_MARK_DELETE = "Відмітити цей пункт для видалення" +NAVI_MARK_ACTIVE = "Для того, щоб тимчасово відключити цей пункт меню, зніміть виділення та натисніть "Зберегти зміни"" +NAVI_GROUPS = "Групи користувачів, яких буде доступно меню:" +NAVI_ACTIONS = "Дії" +NAVI_OR_BUTTON = " або " +NAVI_BUTTON_SAVE = "Зберегти зміни" +NAVI_BUTTON_SAVE_NEXT = "Примінити (CTRL+S)" +NAVI_BUTTON_ADD = "Додати пункт" +NAVI_BUTTON_ADD_MENU = "Створити меню" +NAVI_LEGEND = "Значення піктограм" +NAVI_ENTER_NAME = "Будь ласка, вкажіть назву меню навігації." +NAVI_ALL = "Список меню навігацій" +NAVI_PRINT_TYPE = "Тип виводу" +NAVI_EXPAND_ALL = "Повністю (розкривати усі рівні)" +NAVI_EXPAND_WAY = "поточний та батьківський рівні" +NAVI_EXPAND_LEVEL = "Тільки поточний рівень" +NAVI_MENU_NOT_FOUND = "Відсутнє меню id=" +NAVI_SAVE = "Шаблон навігації успішно збережено" +NAVI_SORTED = "Порядок успішно збережено" + +NAVI_REPORT_NEW = "Створив меню навігації" +NAVI_REPORT_COPY = "Створив копію меню навігації" +NAVI_REPORT_EDIT = "Змінив шаблон меню навігації" +NAVI_REPORT_DEL = "Видалив меню навігації" +NAVI_REPORT_ADDIT = "Додати пункт меню навігації" +NAVI_REPORT_DELIT = "Видалив пункт меню навігації" +NAVI_REPORT_FLEV = "На перший рівень" +NAVI_REPORT_SLEV = "На другий рівень" +NAVI_REPORT_TLEV = "На третій рівень" +NAVI_REPORT_DEACT = "Деактивував пункт меню навігації" +NAVI_REPORT_ACT = "Активував пункт меню навігації" +NAVI_REPORT_SAVED = "Шаблон навігації успішно збережено" +NAVI_REPORT_SAVED_ERR = "Не вдалося зберегти шаблон навігації.
Спробуйте ще раз." +NAVI_REPORT_ERROR = "Помилка" +NAVI_REPORT_SUCCESS = "Виконано" + +NAVI_ITEM_ON_OFF = "Вкл/Викл пункт меню" +NAVI_ITEM_EDIT = "Редагувати пункт меню" +NAVI_ITEM_DELETE = "Видалити цей пункт меню" +NAVI_ITEM_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити цей пукт меню навігації?" + + +// v 3.2 +NAVI_ALIAS = "Аліас" +NAVI_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" +NAVI_ACCEPT = "Цей аліас можна використовувати" +NAVI_ER_SYN = "Неправильний аліас!
Аліас не може бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +NAVI_ER_EXISTS = "Неправильний аліас!
Цей аліас уже прив’язаний до іншого меню" + +//from templates +NAVI_NOLINK_DOC = "Немає зв’язаного документа" +NAVI_EDIT_ITEM = "Редагування пункта меню" +NAVI_LINK_FILEDOC = "Зв’язати з документом/файлом" +NAVI_LINKED_DOC = "Зв’язаний документ" +NAVI_DEL_LINKED_DOC = "Вилучити зв’язок з документом" +NAVI_LINK_DOC = "Зв’язати з документом" +NAVI_LINK_FILE = "Зв’язати з файлом" +NAVI_NO_LINK = "Немає зв’язаного документа" +NAVI_STRUCTURE = "Структура" +NAVI_RETURN_TO_LIST = "Повернутися до списку" +NAVI_EDIT_TEMPLATE = "Редагувати шаблон" +NAVI_ITEM_ADD = "Додати пункт меню" +NAVI_OPEN_ALL = "Розкрити усе" +NAVI_CLOSE_ALL = "Згоргути усе" +NAVI_ITEM_DESCR = "Опис пункта меню" +NAVI_ITEM_IMAGE = "Зображення" +NAVI_ITEM_IMAGE_DESCR = "Зображення активне, у кінці назви зображення має бути _act" +NAVI_ITEM_IMAGE_ID = "Id зображення" +NAVI_PLACE_INSERT = "Місце вставки підрівня" +NAVI_EXAMPLE = "Приклад" +NAVI_ITEM_EVEN = "парний" +NAVI_ITEM_ODD = "непарний" +NAVI_TAG = "Тег для вставки пунктів" +NAVI_LAVEL_TEMPL = "Шаблон рівня" +NAVI_CONDITIONS = "Умови" \ No newline at end of file diff --git a/admin/lang/ua/request.txt b/admin/lang/ua/request.txt new file mode 100644 index 0000000..da89090 --- /dev/null +++ b/admin/lang/ua/request.txt @@ -0,0 +1,197 @@ +# солов’їна))) 01,2017 duncan + +[request] +REQUEST_ID = "ID" +REQUEST_DELETE = "Видалити запит" +REQUEST_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити цей запит?" +REQUEST_TITLE = "Керування запитами" +REQUEST_NAME = "Назва запиту" +REQUEST_NAME2 = "Назва запиту:" +REQUEST_NAME3 = "Введіть назву запиту:" +REQUEST_CACHE = "Кешувати:" +REQUEST_CACHE_ELEMENTS = "Кешувати елементи запиту" +REQUEST_SETTINGS = "Параметри запиту" +REQUEST_TIP = "У цьому розділі наведено список усіх існуючих запитів у системі. Для використання запиту розмістіть "Системний тег" у потрібному місці Вашого шаблона або документа." +REQUEST_EDIT_TIP = "У цьому розділі Ви можете відредагувати запит, змінивши рубрику для отримання даних, шаблон виводу, а також умови вибірки даних." +REQUEST_NEW = "Створення нового запиту" +REQUEST_EDIT = "Редагувати запит" +REQUEST_EDIT2 = "Редагування запиту" +REQUEST_SYSTEM_TAG = "Системний тег" +REQUEST_AUTHOR = "Автор" +REQUEST_DATE_CREATE = "Дата створення" +REQUEST_ACTIONS = "Дії" +REQUEST_NO_DESCRIPTION = "Запит без опису" +REQUEST_NO_REQUST = "Запити відсутні." +REQUEST_DATE_FORMAT = "%d.%m.%y г." +REQUEST_DATE_FORMAT2 = "%d.%m.%y г. в %H:%M" +REQUEST_IN = "в" +REQUEST_COPY = "Копіювати запит" +REQUEST_COPY_FAILED = "Не вдалося виконати копіювання запиту" +REQUEST_PLEASE_NAME = "Будь ласка, вкажіть назву для скопійованого запиту" +REQUEST_CONDITION_EDIT = "Умови для запиту" +REQUEST_CONDITION_IF = "Умови" +REQUEST_PLEASE_SELECT = "Будь ласка, оберіть рубрику" +REQUEST_SELECT_RUBRIK = "Оберіть рубрику:" +REQUEST_SELECT_INFO = "Ви впевнені, що бажаєте змінити рубрику" +REQUEST_NEW_TIP = "Увага! Перед тим, як створити новий запит, Ви повинні обрати рубрику, з якої будуть виводитися документи." +REQUEST_DESCRIPTION = "Опис запиту:" +REQUEST_INTERNAL_INFO = "(використовується всередині системи)" +REQUEST_BUTTON_COND = "Додати / змінити" +REQUEST_CONDITION = "Умови запиту:" +REQUEST_ACTION_AFTER = "Повернутися до редагування запиту після створення, щоб додати умови запиту." +REQUEST_SORT_BY = "Сортувати по параметру документа:" +REQUEST_SORT_BY_NAT = "Сортувати за полем документа:" +REQUEST_ASC_DESC = "В порядку:" +REQUEST_DESC = "спадання" +REQUEST_ASC = "зростання" +REQUEST_BY_DATE = "Даті створення (публікації)" +REQUEST_BY_DATECHANGE = "Даті зміни (документа)" +REQUEST_BY_NAME = "Назві документів" +REQUEST_BY_EDIT = "Імені автора" +REQUEST_BY_PRINTED = "Кількості роздруківок" +REQUEST_BY_VIEWS = "Кількості переглядів" +REQUEST_BY_RAND = "У випадковому порядку (високе навантаження)" +REQUEST_DOC_PER_PAGE = "Кількість на сторінці:" +REQUEST_DOC_PER_PAGE_ALL = "виводити усі" +REQUEST_SHOW_NAVI = "Показувати навігацію:" +REQUEST_USE_LANG = "Тільки мовою користувача:" +REQUEST_USE_QUERY = "Використовувати GET запити в посторінковій навігації" +REQUEST_TEMPLATE_QUERY = "Основний шаблон оформлення запиту" +REQUEST_MAIN_CONTENT = "Системний тег, що відповідає за вивід елементів запиту, вказаних в полі "елементи запиту"" +REQUEST_DOC_COUNT = "Системний тег, що відповідає за вивід кількості елементів запиту" +REQUEST_DOCITEMNUM_INFO= "Системний тег, що відповідає за вивід порядкового номера елемента запиту" +REQUEST_MAIN_NAVI = "Системний тег, що відповідає за вивід посторінкової навігації для запиту (< 1 2 3 >)" +REQUEST_MEDIAPATH = "Системний тег, який визначає шляхи до папки з шаблоном (наприклад: [tag:mediapath]images/logo.gif)" +REQUEST_PATH = "Системний тег, який визначає корінь установки" +REQUEST_TEMPLATE_ITEMS = "Шаблон оформлення для елементів запиту" +REQUEST_TEMPLATE_INFO = "У цьому полі, використовуючи HTML-код, Ви можете вказати оформлення для внутрішніх елементів запиту (наприклад, оформлення списку новин). Усі елементи, оформлені згідно такого шаблону, будуть циклічно відображатися в "Основному шаблоні" запиту, допоки кількість елементів, буде відповідати умовам запиту." +REQUEST_TEMPLATE_SAVED = "Запит успішно збережено" +REQUEST_SELECT_IN_LIST = "Будь ласка, оберіть поле рубрики зі списка, наведеного нижче" +REQUEST_RUB_INFO = "Системний тег, що відповідає за вивід вмісту поля рубрики. ID-номер поля. ХХХ-кількість символів для відображення." +REQUEST_LINK_INFO = "Системний тег, який визначає посилання на документ. Наприклад, < a href="[tag:link]">посилання < /a >" +REQUEST_RUBRIK_FIELD = "Системний тег поля" +REQUEST_THUMBNAIL = "Тег відповідає за створення мініатюрки (За умови що у шаблоні поля рубрики (шаблон для виводу в запиті) обрано вивід: [tag:parametr:0])" +REQUEST_FIELD_NAME = "Назва поля" +REQUEST_FIELD_TYPE = "Тип поля" +REQUEST_FIELD_G_UNKNOW = "Без групи" + +REQUEST_BUTTON_ADD = "Створити запит" +REQUEST_BUTTON_ADD_NEXT = "Створити та продовжити" +REQUEST_BUTTON_SAVE = "Зберегти зміни" +REQUEST_BUTTON_SAVE_NEXT = "Примінити (CTRL+S)" +REQUEST_BUTTON_CLOSE = "Закрити вікно" + +REQUEST_INSERT_INFO = "Натисніть на системний тег, щоб додати його в шаблон" +REQUEST_CONDITIONS = "Керування умовими запиту" +REQUEST_CONDITION_TIP = "У цьому розділі Ви можете створити спеціальні умови вибірки даних для запиту. Умови запиту дозволяють найбільш точно визначити вивід даних за тими або іншими параметрами." +REQUEST_NEW_CONDITION = "Додати нову умову" +REQUEST_FROM_FILED = "Вибрати з поля" +REQUEST_OPERATOR = "Де значення" +REQUEST_VALUE = "Значення" +REQUEST_COND_SELF = "Дорівнює" +REQUEST_COND_NOSELF = "Не дорівнює" +REQUEST_COND_USE = "Містить значення" +REQUEST_COND_NOTUSE = "Не містить значення" +REQUEST_COND_START = "Починається з" +REQUEST_SMALL1 = "Менше або дорівнює" +REQUEST_BIG1 = "Більше або дорівнює" +REQUEST_SMALL2 = "Менше" +REQUEST_BIG2 = "Більше" +REQUEST_N_COND_SELF = "Число дорівнює" +REQUEST_N_SMALL1 = "Число менше або дорівнює" +REQUEST_N_BIG1 = "Число більше або дорівнює" +REQUEST_N_SMALL2 = "Число менше" +REQUEST_N_BIG2 = "Число більше" +REQUEST_SEGMENT = "Належить відрізку (через ,)" +REQUEST_INTERVAL = "Належить інтервалу (через ,)" +REQUEST_IN = "у списку (через ,)" +REQUEST_NOTIN = "Не у списку (через ,)" +REQUEST_ANY_NUM = "НЕБЕЗПЕКА!!! Число в запиті" +REQUEST_FREE = "НЕБЕЗПЕКА!!! Довільна умова [field]={Значення}" +REQUEST_MARK_DELETE = "Відмітити умову для видалення" +REQUEST_CONR_AND = "І" +REQUEST_CONR_OR = "Або" +REQUEST_OR = " або " + +REQUEST_VIEWS_INFO = "Системний тег, який показує кількість переглядів для документа" +REQUEST_COMMENTS_INFO = "Системний тег, який показує кількість коментарів для документа. Увага! працює тільки при встановленому модулі!" +REQUEST_CONTROL_FIELD = "Системний тег, що відповідає за вивід панелі керування запитом. Тільки для рубрик з полями типу випадаючий список" +REQUEST_CONTROL_SORT = "Системний тег, що відповідає за вивід панелі сортувань по даті публікації, назві та кількості переглядів результатів виводу запиту" +REQUEST_NO_DROPDOWN = "В вибраній рубриці немає полів типу випадаючий список" +REQUEST_ENTER_NAME = "Будь ласка, вкажіть назву запиту." +REQUEST_ALL = "Список запитів" +REQUEST_IF_EMPTY = "Парний системний тег, всередині якого можна вказати шаблон виводу за відсутності результатів работи запиту" +REQUEST_NOT_EMPTY = "Парний системний тег, всередині якого можна вказати шаблон виводу за наявності результатів работи запиту" +REQUEST_DOCID_INFO = "Системний тег, який відповідає ідентифікатору документа" +REQUEST_DOCTITLE_INFO = "Системний тег, який відповідає імені документа" +REQUEST_CDOCID_INFO = "Системний тег, який відповідає ідентифікатору поточного документа(в якому виводиться запит)" +REQUEST_DOCDATE_INFO = "Системний тег, який відповідає даті публікації документа" +REQUEST_CDOCDATE_INFO = "Системний тег, який відповідає даті публікації поточного документа(в якому виводиться запит)" +REQUEST_DOCTIME_INFO = "Системний тег, який відповідає даті та часу публікації документа" +REQUEST_CDOCTIME_INFO = "Системний тег, який відповідає даті та часу публікації поточного документа(в якому виводиться запит)" +REQUEST_DATE_INFO = "Системний тег, дата та час публікації документа - налаштовуваний вигляд.
Приклад: [tag:date:d.m.Y]
можна використовувати розподілювачі (space - . /)" +REQUEST_CDATE_INFO = "Системний тег, дата та час публікації документа - налаштовуваний вигляд.
Приклад: [tag:date:d.m.Y]
(в якому виводиться запит)
можна використовувати розподілювачі (space - . /)" +REQUEST_DOCAUTHOR_INFO = "Системний тег, який відповідає автору документа" +REQUEST_DOCAUTHOR_AVATAR = "Системний тег, який відповідає аватару автора документа" +REQUEST_CDOCAUTHOR_INFO = "Системний тег, який відповідає автору поточного документа(в якому виводиться запит)" +REQUEST_SAMPLE = "Приклад" +REQUEST_HIDE_CURRENT = "Не показувати в запиті поточний документ" +REQUEST_ONLY_OWNER = "Тільки свої (UserID) документи" +REQUEST_CONDITION_JOIN = "Оператор" +REQUEST_CONDITION_SAVE = "Зберегти умови" +REQUEST_CONDITION_ADD = "Додати умову" + +REQUEST_SUCCESS = "Виконано" +REQUEST_ERROR = "Помилка" +REQUEST_CANCEL = "Відмінити" + +REQUEST_SORTED = "Порядок успішно збережено" +REQUEST_COND_MESSAGE = "Умови запиту відсутні" +REQUEST_COND_VALUE_ERR = "Порожнє поле значення" +REQUEST_COND_NEW_ERR = "Не вдалося додати нову умову
Спробуйте ще раз" +REQUEST_COND_NEW_SUC = "Умову успішно додано" +REQUEST_COND_POST_OK = "Умови успішно збережено" +REQUEST_COND_POST_ERR = "Не вдалося зберегти умови запиту
Спробуйте ще раз" +REQUEST_COND_NO_POST = "Немає даних для збереження
Спробуйте ще раз" + +REQUEST_COND_ADD_SUC = "Додати умови запиту" +REQUEST_COND_CHA_SUC = "Змінив умови запиту" +REQUEST_COND_DEL_SUC = "Видалив умови запиту" +REQUEST_SAVE_CHA_SUC = "Відредагував запит" +REQUEST_ADD_NEW_SUC = "Додати новий запит" +REQUEST_DELETE_SUC = "Видалив запит" +REQUEST_COPY_SUC = "Створив копію запиту" + +REQUEST_HEADER_SELF = "Основні параметри запиту" +REQUEST_HEADER_NAME = "Значення" +REQUEST_HEADER_PARAMETR = "Параметр" + +REQUEST_REPORT_ERR_TITLE = "Відсутня назва запиту" +REQUEST_REPORT_ERR_TEXT = "Відсутній основний шаблон оформлення запиту" +REQUEST_REPORT_ERR_PHP = "Заборонено використовувати PHP код" +REQUEST_REPORT_ERR_PHP_N = "Спроба використання PHP коду у шаблоні запиту при створенні запиту" +REQUEST_REPORT_ERR_PHP_E = "Спроба використання PHP коду у шаблоні запиту" +REQUEST_REPORT_ERR_RUBRIC= "Не обрано рубрику" +REQUEST_BY_PARENT = "Батьківському документу" +REQUEST_SHOW_STAT = "Показати статистику" + + + +// v 3.1.9 +REQUEST_ALIAS = "Аліас" +REQUEST_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:request:alias] замість [tag:request:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах модуля" +REQUEST_ACCEPT = "Цей Аліас можна використовувати" +REQUEST_ER_SYN = "Неправильний Аліас!
Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +REQUEST_ER_EXISTS = "Неправильний Аліас!
Цей Аліас уже прив’язано до іншого запиту" +REQUEST_HEADER_EXTERNAL = "Зовнішнє звернення" +REQUEST_EXTERNAL = "Дозволити зовнішнє звернення" +REQUEST_ONLY_AJAX = "Виконувати тільки по Ajax" + +// v 3.2 +REQUEST_PAGINATION = "Посторінкова навігація" +REQUEST_NAVI_TPL = "Шаблон посторінкової навігації" +REQUEST_OTHER = "Інше" +REQUEST_SHOW_SQL = "Показати SQL запит" +REQUEST_DOC_ON_PAGE = "Число елементів запиту на сторінці" +REQUEST_PAGES_CURENT = "Номер сторінки пагінації" +REQUEST_PAGES_TOTAL = "Загальна кількість сторінок пагінації" \ No newline at end of file diff --git a/admin/lang/ua/rubs.txt b/admin/lang/ua/rubs.txt new file mode 100644 index 0000000..a95c15b --- /dev/null +++ b/admin/lang/ua/rubs.txt @@ -0,0 +1,280 @@ +# солов’їна))) 01,2017 duncan + +[rubs] +RUBRIK_SUB_TITLE = "Керування рубриками" +RUBRIK_TIP = "У цьому розділі наведено список усіх рубрик у системі. Тут Ви можете відредагувати шаблон рубрики, права доступу, видалити рубрику, а також скопіювати рубрику, щоб створити на її базі нову." +RUBRIK_ID = "ID" +RUBRIK_NAME = "Назва рубрики" +RUBRIK_NAME2 = "Назва рубрики:" +RUBRIK_TEMPLATE_OUT = "Використовувати у шаблоні" +RUBRIK_TEMPLATE_OUT2 = "Використовувати у шаблоні:" +RUBRIK_URL_PREFIX = "Префікс для посилань" +RUBRIK_URL_PREFIX2 = "Префікс для посилань:" +RUBRIK_DOCS_VI = "Відображати документи у списку" +RUBRIK_URL_PREFIX2 = "Префікс для посилань:" +RUBRIK_COUNT_DOCS = "Кіль-ть документів" +RUBRIK_COUNT_FIELDS = "Кіль-ть полів" +RUBRIK_AUTHOR = "Автор" +RUBRIK_ACTION = "Дії" +RUBRIK_FORMAT = "Використовуйте" +RUBRIK_FORMAT_TIME = "для посилань у форматі часу" +RUBRIK_FORMAT_ID = "для вставки id документа" +RUBRIK_EDIT = "Редагувати поля та права рубрики" +RUBRIK_EDIT_TMPLS = "Додаткові шаблони" +RUBRIK_NO_VIEW = "Даруйте, але Ви не маєте прав на перегляд списку рубрик." +RUBRIK_NO_CHANGE1 = "Даруйте, але Ви не маєте прав на редагування полів рубрики." +RUBRIK_NO_CHANGE2 = "Даруйте, але Ви не маєте прав на редагування шаблона цієї рубрики." +RUBRIK_NO_CHANGE3 = "Даруйте, але Ви не маєте прав на створення нових рубрик." +RUBRIK_EDIT_TEMPLATE = "Редагувати шаблон рубрики" +RUBRIK_EDIT_CODE = "Редагувати виконуваний код для рубрик" +RUBRIK_EDIT_CODE_T = "редагування виконуваного коду для рубрик" +RUBRIK_EDIT_CODE_NO = "Немає доступу для редагування виконуваного коду" +RUBRIK_DELETE = "Видалити цю рубрику" +RUBRIK_DELETE_LEGEND = "Видалити рубрику" +RUBRIK_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити цю рубрику?" +RUBRIK_NO_PERMISSION = "Даруйте, але Ви не маєте прав на видалення рубрик." +RUBRIK_USE_DOCUMENTS = "Даруйте, але Ви не можете видалити цю рубрику, оскільки в ній містяться документи." +RUBRIK_MULTIPLY = "Копіювати рубрику" +RUBRIK_NO_MULTIPLY = "Даруйте, але Ви не маєте прав на копіювання рубрик" +RUBRIK_BUTTON_SAVE = "Зберегти зміни" +RUBRIK_BUTTON_TEMPL = "Редагувати шаблон" +RUBRIK_BUTTON_FIELDS = "Редагувати поля" +RUBRIK_BUTTON_CODE = "Редагувати код рубрики" +RUBRIK_LEGEND = "Значення піктограм" +RUBRIK_NEW = "Створення нової рубрики" +RUBRIK_NEW_TIP = "У цьому розділі Ви можете створити нову рубрику. Будь ласка, вкажіть назву нової рубрики та оберіть шаблон для виводу." +RUBRIK_BUTTON_NEW = "Створити рубрику" +RUBRIK_EDIT_FIELDS = "Керування полями та правами доступу до рубрики" +RUBRIK_DESCRIPTION = "Опис рубрики" +RUBRIK_NO_FIELDS = "Увага! Ви не створено жодного поля. Будь ласка, додайте хоча би одне поле." +RUBRIK_FIELDS_INFO = "У цьому розділі Ви можете створити групу полів, які будути використані для документів у цій рубриці." +RUBRIK_MULTIPLY2 = "Копіювання рубрики" +RUBRIK_MULTIPLY_TIP = "Будь ласка, вкажіть назву та префікс для посилань нової рубрики" +RUBRIK_BUTTON_COPY = "Копіювати" +RUBRIK_TEMPLATE_EDIT = "Редагування шаблона рубрики" +RUBRIK_TEMPLATE_NEW = "Створення шаблона рубрики" +RUBRIK_TEMPLATE_SAVED = "Шаблон успішно збережено" +RUBRIK_NO_FIELD = "У цієї рубрики відсутні поля" +RUBRIK_FIELD_NAME = "Назва поля" +RUBRIK_FIELD_GROUP = "Група" +RUBRIK_FIELD_GROUP_SEL = "Оберіть групу" +RUBRIK_FIELD_ALIAS = "Аліас поля" +RUBRIK_FIELD_TYPE = "Тип поля" +RUBRIK_FIELD_UNKNOW = "Невідомо" +RUBRIK_FIELD_G_UNKNOW = "Без групи" +RUBRIK_POSITION = "Позиція" +RUBRIK_NEW_FIELD = "Створення нового поля для рубрики" +RUBRIK_BUTTON_ADD = "Додати поле" +RUBRIK_SET_PERMISSION = "Права доступу до документів для груп користувачів" +RUBRIK_USER_GROUP = "Група" +RUBRIK_DOC_READ = "Перегляд" +RUBRIK_ALL_PERMISSION = "Усі права" +RUBRIK_CREATE_DOC = "Створювати з перевіркою" +RUBRIK_CREATE_DOC_NOW = "Створювати без перевірки" +RUBRIK_EDIT_OWN = "Редагувати свої" +RUBRIK_EDIT_DELREV = "Керування ревізіями" +RUBRIK_EDIT_OTHER = "Редагувати усі" +RUBRIK_VIEW_TIP = "Встановіть прапорець, якщо Ви бажаєте дозволити цій групі користувачів перегляд документів" +RUBRIK_ALL_TIP = "Встановіть прапорець, якщо Ви бажаєте дозволити цій групі користувачів виконувати будь-які дії з документами в цій рубриці." +RUBRIK_DOC_TIP = "Встановіть прапорець, якщо Ви бажаєте дозволити цій групі користувачів створювати документи.
Увага!
Перед публікацією документа, його має бути перевірено Адміністратором" +RUBRIK_DOC_NOW_TIP = "Встановіть прапорець, якщо Ви бажаєте дозволити цій групі користувачів створювати документи.
Увага!
Публікацію документа буде виконано без перевірки Адміністратором." +RUBRIK_OWN_TIP = "Встановіть прапорець, якщо Ви бажаєте дозволити цій групі користувачів редагувати тільки свої документи" +RUBRIK_OTHER_TIP = "Встановіть прапорець, якщо Ви бажаєте дозволити цій групі користувачів редагувати свої та чужі документи" +RUBRIK_DELREV_TIP = "Встановіть прапорець, якщо Ви бажаєте дозволити цій групі користувачів працювати з ревізіями документів" +RUBRIK_BUTTON_PERM = "Зберегти права" +RUBRIK_FIELD_DEFAULT = "Значення по замовчуванню" +RUBRIK_TEMPLATE_TIP = "У цьому розділі, використовуючи мову розмітки HTML, Ви повинні створити шаблон оформлення для документів при повному перегляді," +RUBRIK_HTML = "Шаблон оформлення рубрики" +RUBRIK_HTML_2 = "Шаблон оформлення HEADER" +RUBRIK_HTML_3 = "Шаблон оформлення TEASER" +RUBRIK_HTML_4 = "Шаблон оформлення ADMIN TEASER" +RUBRIK_PHP_DENIDED = "Помилка!
Ви не маєте прав на редагування шаблона рубрики, оскільки тут використовується PHP код, а Ви не маєте прав на використання PHP коду." +RUBRIK_PHP_MESSAGE = "Заборонено використовувати PHP код." +RUBRIK_EMPTY_MESSAGE = "Не задано назву поля." +RUBRIK_INSERT_HELP = "Натисніть, щоб додати системний тег у шаблон" +RUBRIK_BUTTON_TPL = "Зберегти шаблон" +RUBRIK_BUTTON_TPL_NEXT = "Примінити (CTRL+S)" +RUBRIK_BUTTON_TPL_CLOSE = "Закрити" +RUBRIK_NO_RUBRIK = "Немає такої рубрики!" +RUBRIK_NO_NAME = "Будь ласка, вкажіть назву рубрики" +RUBRIK_NAME_EXIST = "Даруйте, але рубрика з такою назвою уже існує. Будь ласка, вкажіть іншу назву рубрики." +RUBRIK_PREFIX_EXIST = "Даруйте, але рубрика з таким URL-префіксом уже існує. Будь ласка, вкажіть інший URL-префікс рубрики." +RUBRIK_VIEWS_INFO = "Системний тег, який показує кількість переглядів для документа" +RUBRIK_HIDE_INFO = "Системний тег, який дозволяє приховати текст для певних груп користувачів, де Х - номер групи" +RUBRIK_THUMBNAIL = "Тег відповідає за створення мініатюрки (За умови що у шаблоні поля рубрики (шаблон для виводу в документі) обрано вивід: [tag:parametr:0])" +RUBRIK_LINK_HOME = "Посилання на головну сторінку cайту" +RUBRIK_MARK_DELETE = "Відмітити цей пункт для видалення" +RUBRIK_MARK_DEL_ALL = "Відмітити усі" +RUBRIK_CHECK_SEARCH = "Шукати по цьому полю" +RUBRIK_CHECK_NUMERIC = "Числове поле" +RUBRIK_SEARCH_TIP = "Відмітьте поле, якщо бажаєте, щоб по ньому здійснювався пошук (працює з модулем “пошук” версії 2.0.2 та вище)" +RUBRIK_NUMERIC_TIP = "Відмітьте поле, якщо його значення завжди числові. Використовується в запитах для сортування" +RUBRIK_ALL = "Список рубрик" +RUBRIK_EDIT_FIELDS_GROUPS = "Редагувати групи полів" +RUBRIK_FIELDS_GROUPS = "Групи полів" +RUBRIK_ENTER_NAME = "Будь ласка, вкажіть назву рубрики." +RUBRIK_TEMPLATE_HIDE = "Показати/згорнути шаблони усіх полів" +RUBRIK_FILED_TEMPLATE_H = "Редагувати шаблон та опис поля" +RUBRIK_FILED_TEMPLATE_DESCR = "Опис поля" +RUBRIK_FILED_TEMPLATE_F = "Шаблон поля" +RUBRIK_DOCID_INFO = "Системний тег, ідентифікатор документа" +RUBRIK_DOCDATE_INFO = "Системний тег, дата публікації документа" +RUBRIK_DOCTIME_INFO = "Системний тег, дата та час публікації документа" +RUBRIK_DATE_INFO = "Системний тег, дата та час публікації документа - налаштовуваний вигляд.
Приклад: [tag:date:Y]" +RUBRIK_DOCAUTHOR_INFO = "Системний тег, автор документа" +RUBRIK_TITLE_INFO = "Системний тег, заголовок документа" +RUBRIK_PATH_INFO = "Системний тег, шляхи до кореня установки" +RUBRIK_MEDIAPATH_INFO = "Системний тег, шляхи до папки дизайна" +RUBRIK_PREFIX_BAD_CHAR= "Недопустимі символи у префіксі" +RUBRIK_FIELDS_TITLE = "Поля рубрики" +RUBRIK_FIELDS_TPL = "Шаблон виводу поля в документі" +RUBRIK_RUBRIK_TPL = "Шаблон виводу поля в запиті" +RUBRIK_SORTED = "Порядок успішно збережено" +RUBRIK_F_SORT_TIP = "Для впорядкування полів натисніть на хрестик та, утримуючи його, перетягніть поле" +RUBRIK_R_SORT_TIP = "Для впорядкування рубрик натисніть на хрестик и, утримуючи його, перетягніть поле" +RUBRIK_META_GEN_TIP = "Автоматично генерувати keywords, description для документа, на базі його контенту" +RUBRIK_ALIAS_HISTORY_TIP = "Зберігати історію аліасів у документів" +RUBRIK_MOVE = "Перемістити" +RUBRIK_REQUEST_TPL = "Шаблон виводу поля в запиті" +RUBRIK_BREADCRUMB = "Систмений тег хлібних крихт" +RUBRIK_CODE = "Виконуваний код для рубрик" +RUBRIK_START_CODE = "Код, який виконується перед завантаженням документа" +RUBRIK_CODE_START = "Код, який виконується перед збереженням документа" +RUBRIK_CODE_END = "Код, який виконується після збереження документа" +RUBRIK_TAGS = "Тег" +RUBRIK_TAGS_ID = "Тег ID" +RUBRIK_TAGS_ALIAS = "Тег Аліас" +RUBRIK_HTML_T = "HTML код шаблона" +RUBRIK_TAG_DESC = "Опис тега" +RUBRIK_NEW_FIEL_TITLE = "Для полів Випадаючий список та Мульти список, значення по замовчуванню пишуться через кому" +RUBRIK_LINK = "Зв’язати рубрику" +RUBRIK_LINK_DESC = "Задаючи зв’язок між рубриками, при додаванні документів можна автоматично підставляти аліаси." +RUBRIK_NOLINK = "Не вибрано" +RUBRIK_OR = " або " + +RUBRIC_F_GROUP_TITLE = "Назва групи" +RUBRIC_F_GROUP_DELETE = "Видалити групу" +RUBRIC_F_GROUP_DELETE_H = "Ви впевнені, що бажаєте видалити групу?" +RUBRIC_NO_GROUPS = "На даний час, для цієї рубрики, немає груп полів" +RUBRIC_GROUP_ADD = "Додати групу" +RUBRIK_NEW_GROUP = "Додати нову групу" +RUBRIK_HEADER_GROUP = "Керування групами полів" + +RUBRIK_TEMPLATES_TAGS = "Тег" +RUBRIK_TEMPLATES_TAG_DESC = "Опис тега" +RUBRIK_TEMPLATES_THEME_FOLDER = "Назва шаблона (Ім’я папки з файлами для цього шаблона)" +RUBRIK_TEMPLATES_PAGENAME = "Назва cайту" +RUBRIK_TEMPLATES_TITLE = "Назва сторінки" +RUBRIK_TEMPLATES_KEYWORDS = "Ключові слова (Meta - Keywords)" +RUBRIK_TEMPLATES_DESCRIPTION = "Опис сторінки (Meta - Description)" +RUBRIK_TEMPLATES_INDEXFOLLOW = "Тип індексування" +RUBRIK_TEMPLATES_PATH = "Кореневий шляхи установки" +RUBRIK_TEMPLATES_MEDIAPATH = "Шляхи до папки з шаблоном (Приклад: [tag:mediapath]images/logo.gif)" +RUBRIK_TEMPLATES_CSS = "Стискає декілька css-файлів в один. Повертає шлях.
FFF - імена файлів через кому
P - шляхи до папки з файлами, не обов’язково. По замовчуванню - [tag:mediapath]css/

Приклад: href="[tag:css:reset.css,style.css]"" +RUBRIK_TEMPLATES_JS = "Стискає декілька js-файлів в один. Повертає шлях.
FFF - імена файлів через кому
P - шляхи до папки з файлами, не обов’язково. По замовчуванню - [tag:mediapath]js/

Приклад: href="[tag:js:common.js,main.js]"" + +RUBRIK_RUB_INFO = "Системний тег що відповідає за вивід вмісту поля рубрики. ID-номер поля. ХХХ-кількість символів для відображення." +RUBRIK_SELECT_IN_LIST = "Будь ласка, оберіть поле рубрики зі списку, наведеного нижче" +RUBRIK_TEMPLATE_ITEMS = "Шаблон оформлення для елементів запиту" +RUBRIK_DOCID_INFO = "Системний тег, який відповідає ідентифікатору документа" +RUBRIK_DOCTITLE_INFO = "Системний тег, який відповідає імені документа" +RUBRIK_CDOCID_INFO = "Системний тег, який відповідає ідентифікатору поточного документа(в якому виводиться запит)" +RUBRIK_DOCDATE_INFO = "Системний тег, який відповідає даті публікації документа" +RUBRIK_CDOCDATE_INFO = "Системний тег, який відповідає даті публікації поточного документа(в якому виводиться запит)" +RUBRIK_DOCTIME_INFO = "Системний тег, який відповідає даті та часу публікації документа" +RUBRIK_CDOCTIME_INFO = "Системний тег, який відповідає даті та часу публікації поточного документа(в якому виводиться запит)" +RUBRIK_DATE_INFO = "Системний тег, дата та час публікації документа - налаштовуваний вигляд.
Приклад: [tag:date:d.m.Y]
можна використовувати розподілювачі (space - . /)" +RUBRIK_CDATE_INFO = "Системний тег, дата та час публікації документа - налаштовуваний вигляд.
Приклад: [tag:date:d.m.Y]
(в якому виводиться запит)
можна використовувати розподілювачі (space - . /)" +RUBRIK_DOCAUTHOR_INFO = "Системний тег, який відповідає автору документа" +RUBRIK_DOCAUTHOR_AVATAR = "Системний тег, який відповідає аватару автора документа" +RUBRIK_CDOCAUTHOR_INFO = "Системний тег, який відповідає автору поточного документа(в якому виводиться запит)" +RUBRIK_VIEWS_INFO = "Системний тег, який показує кількість переглядів для документа" +RUBRIK_COMMENTS_INFO = "Системний тег, який показує кількість коментарів для документа. Увага! працює тільки при встановленому модулі!" +RUBRIK_PATH = "Системний тег, який визначає корінь установки" +RUBRIK_MEDIAPATH = "Системний тег, який визначає шляхи до папки з шаблоном (Приклад: [tag:mediapath]images/logo.gif)" +RUBRIK_THUMBNAIL = "Тег відповідає за створення мініатюрки (За умови що у шаблоні поля рубрики (шаблон для виводу в запиті) обрано вивід: [tag:parametr:0])" + +RUBRIK_ALIAS_HEAD = "Призначення аліаса для поля" +RUBRIK_ALIAS_HEAD_T = "Можна використовувати тільки латинські символи та цифри!
Приклад: header" +RUBRIK_ALIAS_HEAD_R = "Рубрика:" +RUBRIK_ALIAS_HEAD_F = "Поле:" +RUBRIK_ALIAS_ALIAS = "Аліас поля" +RUBRIK_ALIAS_NAME = "Назва аліаса" +RUBRIK_ALIAS_BUTT = "Зберегти" + +RUBRIK_ALIAS_ERROR = "Помилка:" +RUBRIK_ALIAS_RUBID = "Неправильно вказано рубрику" +RUBRIK_ALIAS_FIELDID = "Неправильно вказане поле" +RUBRIK_ALIAS_MATCH = "Неправильно вказано значення" +RUBRIK_ALIAS_USED = "Це значення вже використовується" + +RUBRIK_REPORT_QUICKSAVE = "Виконав швидке збереження налаштувань рубрик" +RUBRIK_REPORT_SORTE = "Виконав сортування рубрик" +RUBRIK_REPORT_SORTE_FIELDS = "Виконав сортування полів рубрики" +RUBRIK_REPORT_PERMISION = "Змінив права доступу до документів рубрики" +RUBRIK_REPORT_COPY = "Створив копію рубрики" +RUBRIK_REPORT_TEMPL_RUB = "Відредагував шаблон рубрики" +RUBRIK_REPORT_FIELD_EDIT = "Відредагував поле" +RUBRIK_REPORT_FIELD_DEL = "Видалив поле" +RUBRIK_REPORT_RUB = "Рубрики" + +RUBRIK_REP_QUICKSAVE_H = "Виконано" +RUBRIK_REP_QUICKSAVE_T = "Налаштування рубрик успішно збережено" + +RUBRIK_REPORT_ADD = "Додав рубрику" +RUBRIK_REPORT_SAVE_TPL = "Зберіг шаблон оформлення рубрики" + +RUBRIK_CODE_SAVED = "Виконуваний код для рубрики успішно збережено" +RUBRIK_CODE_SAVED_ERR = "Не вдалося зберегти виконуваний код для рубрики.
Спробуйте ще раз." +RUBRIK_CODE_ERROR = "Помилка" +RUBRIK_CODE_SUCCESS = "Виконано" +RUBRIK_CODE_UPDATE = "Змінив виконуваний код для рубрики" + +RUBRIK_LOG_NEW_FIELD = "Додав поле рубрики" +RUBRIK_LOG_DEL_RUBRIC = "Видалив рубрику" +RUBRIK_LOG_NEW_RUBRIC = "Створив рубрику" + +RUBRIK_FILDS_SAVED = "Успішно збережено" +RUBRIK_FILD_SAVED = "Поле успішно додано" +RUBRIK_FILDS_REPORT = "Зберіг поля рубирки" +RUBRIK_FILDS_ERROR = "Помилка" +RUBRIK_FILDS_SUCCESS = "Виконано" + +RUBRIC_ERROR = "Помилка" +RUBRIC_SUCCESS = "Виконано" +RUBRIC_SAVED_PHP_ERR = "Заборонено використовувати в шаблонах PHP код" +RUBRIC_SAVED_TPL_ERR = "Не вдалося зберегти шаблон рубрики.
Спробуйте ще раз." +RUBRIC_SAVED_TPL = "Шаблон рубрики успішно збережено." +RUBRIC_SAVED_FLDTPL = "Шаблон поля успішно збережено." +RUBRIK_TAG_SYSBLOCK = "Системний тег виводу системного блока" +RUBRIK_TAG_TEASER = "Системний тег виводу тизера" +RUBRIK_TAG_ALIAS = "Системний тег виводу аліаса документа" +RUBRIK_TAG_REQUEST = "Системний тег виводу запиту" +RUBRIC_SAVED_PERMS = "Права доступу до документів успішно збережено " +RUBRIK_IFELSE = "Умови" +RUBRIK_IFELSE_1 = "Виводимо якщо поле не порожнє" +RUBRIK_IFELSE_2 = "Інакше виводимо якщо поле порожнє" +RUBRIK_SAMPLE = "Приклад" + +RUBRIC_TMPLS_BUTTON = "Додаткові шаблони рубрики" +RUBRIC_TMPLS_HEAD = "Список додаткових шаблонів рубрики" +RUBRIC_TMPLS_ADD = "Додати новий шаблон" +RUBRIC_TMPLS_ID = "id" +RUBRIC_TMPLS_NAME = "Назва" +RUBRIC_TMPLS_NAME_FULL = "Назва шаблона оформлення рубрики" +RUBRIC_TMPLS_AUTHOR = "Автор" +RUBRIC_TMPLS_DATE = "Дата" +RUBRIC_TMPLS_COUNT_DOCS = "Кіль-ть документів" +RUBRIC_TMPLS_ACTIONS = "Дії" +RUBRIC_TMPLS_COPY = "Копіювати шаблон" +RUBRIC_TMPLS_COPY_TIP = "Будь ласка, вкажіть назву шаблона" +RUBRIC_TMPLS_COPY_TIP2 = "Будь ласка, вкажіть назву для шаблона, який копіюється" +RUBRIC_TMPLS_EDIT = "Редагувати" +RUBRIC_TMPLS_DELETE = "Видалити" +RUBRIC_TMPLS_DELETE_C = "Ви впевнені, що бажаєте видалити шаблон?" +RUBRIC_TMPLS_TIP = "Ви можете створювати необмежену кіль-ть шаблонів для однієї рубрики" +RUBRIC_TMPLS_NO_ITEMS = "Повідомлення:
На даний час немає додаткових шаблонів." +RUBRIC_TMPLS_FROM = "Створити копію основного шаблона" +RUBRIC_TMPLS_INNAME = "Введіть назву шаблона" +RUBRIC_TEMPL_REPORT = "Відредагував додатковий шаблон рубрики" +RUBRIC_TMPLS_LOG_DEL = "Видалив додатковий шаблон рубрики" \ No newline at end of file diff --git a/admin/lang/ua/scripts.js b/admin/lang/ua/scripts.js new file mode 100644 index 0000000..98c7979 --- /dev/null +++ b/admin/lang/ua/scripts.js @@ -0,0 +1,64 @@ +// солов’їна))) 01,2017 duncan + +var logoutTitle = "Вихід з панелі керування"; +var logoutConfirm = "Ви впевнені, що бажаєте вийти?"; +var clearCacheTitle = "Очистка кеша"; +var clearCacheConfirm = "Ви впевнені, що бажаєте очистити кеш?"; +var clearCacheSessTitle = "Очистка кеша та сесій"; +var clearCacheSessConfirm = "Ви впевнені, що бажаєте очистити кеш та сесії?"; +var clearThumbTitle = "Видалення мініатюр"; +var clearThumbConfirm = "Ви впевнені, що бажаєте видалити всі мініатюри зображень
з директорії для збереження файлів (UPLOAD_DIR)?"; +var clearRevTitle = "Видалення ревізій документів"; +var clearRevConfirm = "Ви впевнені, що бажаєте видалити все ревізії документів?"; +var clearCountTitle = "Обнулити щоденний лічильник документів"; +var clearCountConfirm = "Ви впевнені, що бажаєте обнулити щоденний лічильник документів?"; +var cacheShowTitle = "Показати розмір кеша"; +var cacheShowConfirm = "Ви впевнені, що бажаєте подивитися розмір кеша?
це може зайняти якийсь час."; +var ajaxErrorStatus = "Немає з’єднання.
Перевірте своє підключення."; +var ajaxErrorStatus404 = "Сторінку, яку шукаєте, не знайдено. [404]"; +var ajaxErrorStatus401 = "Запит не може бути виконано.
Помилка авторизації для виконання цього запиту. [401]"; +var ajaxErrorStatus500 = "Сталася внутрішня помилка.
Спробуйте повторити свій запит пізніше. [500]"; +var ajaxErrorStatusJSON = "Некоректна відповідь сервера
Дані не в форматі JSON."; +var ajaxErrorStatusTimeOut = "Час запиту вийшов."; +var ajaxErrorStatusAbort = "Ajax запит перервано."; +var ajaxErrorStatusMess = "Помилка:
"; +var delCascadTitle = "видалити зображення"; +var delCascadConfirm = "Ви впевнені, що бажаєте видалити?"; +var saveMessageOk = "Дані збережено"; + +//===== Date & Time Pickers =====// +$.datepicker.regional['ua'] = { + closeText: 'Закрити', + prevText: '<Назад', + nextText: 'Вперед>', + currentText: 'Нині', + monthNames: ['Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', + 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень' + ], + monthNamesShort: ['Січ', 'Лют', 'Бер', 'Кві', 'Тра', 'Чер', + 'Лип', 'Сер', 'Вер', 'Жов', 'Лис', 'Гру' + ], + dayNames: ['Неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'п’ятница', 'субота'], + dayNamesShort: ['нед', 'пон', 'вів', 'сер', 'чет', 'пят', 'суб'], + dayNamesMin: ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'], + weekHeader: 'Не', + dateFormat: 'dd.mm.yy', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' +}; +$.datepicker.setDefaults($.datepicker.regional['ua']); + +$.timepicker.regional['ua'] = { + timeOnlyTitle: 'Оберіть час', + timeText: 'Час', + hourText: 'Години', + minuteText: 'Хвилини', + secondText: 'Секунди', + millisecText: 'мілісекунди', + currentText: 'Зараз', + closeText: 'Закрити', + ampm: false +}; +$.timepicker.setDefaults($.timepicker.regional['ua']); \ No newline at end of file diff --git a/admin/lang/ua/settings.txt b/admin/lang/ua/settings.txt new file mode 100644 index 0000000..c858f40 --- /dev/null +++ b/admin/lang/ua/settings.txt @@ -0,0 +1,139 @@ +# солов’їна))) 01,2017 duncan + +[settings] +SETTINGS_COUNTRIES = "Керування країнами" +SETTINGS_COUNTRIES_ALL = "Список країн" +SETTINGS_COUNTRY_TIP = "Будь ласка, оберіть країни, які будуть доступні для вибору при реєстрації нових користувачів у системі. Пам’ятайте, що обраноний Вами список країн може бути використаний іншими модулями у системі." +SETTINGS_ACTIVE = "Активна?" +SETTINGS_COUNTRY_NAME = "Назва країни" +SETTINGS_IN_EC = "Відноситься до ЄС?" +SETTINGS_YES = "Так" +SETTINGS_NO = "Ні" +SETTINGS_BUTTON_SAVE = "Зберегти зміни" +SETTINGS_BUTTON_SAVE_AJAX = "Примінити (CTRL+S)" +SETTINGS_OR = "або" +SETTINGS_MAIN_TITLE = "Керування загальними налаштуваннями системи" +SETTINGS_CASE_TITLE = "Додаткові налаштування" +SETTINGS_MAIN = "Загальні налаштування системи" +SETTINGS_SAVED = "Налаштування системи успішно збережені" +SETTINGS_SAVED_ERR = "Не вдалося зберегти налаштування.
Спробуйте ще раз." +SETTINGS_SAVE_INFO = "У цьому розділі Ви можете відредагувати глобальні параметри системи. Будь ласка, будьте максимально уважні та пам’ятайте, що неправильні параметри можуть зробити систему неробочою." +SETTINGS_SAVE_CONFIRM = "Ви впевнені, що бажаєте зберегти параметри системи?" +SETTINGS_SITE_NAME = "Назва cайту:" +SETTINGS_SITE_COUNTRY = "Країна сайту:" +SETTINGS_EMAIL_SENDER = "E-mail відправника:" +SETTINGS_EMAIL_NAME = "Ім’я відправника E-mail:" +SETTINGS_MAIL_TRANSPORT = "Метод надсилання пошти:" +SETTINGS_MAIL = "mail" +SETTINGS_SENDMAIL = "sendmail" +SETTINGS_SMTP = "smtp" +SETTINGS_SMTP_SERVER = "Сервер SMTP:" +SETTINGS_MAIL_PORT = "Порт SMTP:" +SETTINGS_SMTP_NAME = "Користувач:" +SETTINGS_SMTP_PASS = "Пароль:" +SETTINGS_SMTP_ENCRYPT = "Шифрування" +SETTINGS_SMTP_NOENCRYPT = "Ні" +SETTINGS_MAIL_PATH = "Шляхи до папки sendmail:" +SETTINGS_SYMBOL_BREAK = "Примусовий перенос після (знаків):" +SETTINGS_SYMBOL_BREAK_INFO = "Не більше 1000 згідно RFC 2822" +SETTINGS_SYMBOLS = "символів" +SETTINGS_TEXT_EMAIL = "Повідомлення користувачеві після створення аккаунта, де:" +SETTINGS_TEXT_INFO = "%NAME% - Ім’я користувача
%HOST% - Посилання на сайт
%PASSWORD% - Пароль
%EMAIL% - E-mail користувача
%EMAILSIGNATURE% - Підпис повідомлення" +SETTINGS_EMAIL_FOOTER = "Текст підпису:" +SETTINGS_ERROR_PAGE = "Сторінка з помилкою HTTP 404: Page not found" +SETTINGS_PAGE_DEFAULT = "(по замовчуванню Id:2)" +SETTINGS_TEXT_PERM = "Текст повідомлення, якщо користувач не має прав:" +SETTINGS_HIDDEN_TEXT = "Текст повідомлення при відсутності прав для перегляду інформації прихованої тегом [tag:hide:X,X]...[/tag:hide]" + +SETTINGS_NAVI_BOX = "Контейнер посторінкової навигації:
Приклад: <ul>%s</ul>" +SETTINGS_LINK_BOX = "Контейнер для елементів посторінкової навигації:
Приклад: <li>%s</li>" +SETTINGS_TOTAL_BOX = "Контейнер для текста перед номерами сторінок:
Приклад: <span>%s</span>" +SETTINGS_ACTIVE_LINK_BOX= "Контейнер для активного елемента:
Приклад: <span class="active">%s</span>" +SETTINGS_PAGE_SEPAR = "Контейнер для мітки про наявність сторінок:
Приклад: <li>%s</li>" +SETTINGS_PAGE_BEFORE = "Текст перед номерами сторінок:
Приклад: сторінка %d з %d" +SETTINGS_PAGE_START = "Текст посилання "Перша":" +SETTINGS_PAGE_END = "Текст посилання "Остання":" +SETTINGS_PAGE_SEPARATOR = "Текст мітки про наявність сторінок за винятком видимих:" +SETTINGS_PAGE_NEXT = "Текст посилання "Натсупна":" +SETTINGS_PAGE_PREV = "Текст посилання "Попередня":" + +SETTINGS_MAIN_BREADCRUMBS = "Налаштування виводу “хлібних крихт”" +SETTINGS_BREAD_BOX = "Контейнер “хлібних крихт”:" +SETTINGS_BREAD_SEPPARATOR = "Розподілювач між посиланнями:" +SETTINGS_BREAD_BOX_LINK = "Контейнер для посилання:" +SETTINGS_BREAD_BOX_LASTLINK = "Показувати останній елемент:" +SETTINGS_BREAD_SELF_BOX = "Контейнер для останнього елемента:" + +SETTINGS_DATE_FORMAT = "Формат дати:" +SETTINGS_TIME_FORMAT = "Формат дати та часу:" +SETTINGS_CLEAR_CACHE = "Очистити кеш" +SETTINGS_USE_DOCTIME = "Використовувати дату публікації документів" +SETTINGS_INFO = "Додатково" +SETTINGS_MAIN_SETTINGS = "Загальні налаштування системи" +SETTINGS_MAIN_MAIL = "Налаштування пошти" +SETTINGS_MAIN_PAGENAVI = "Налаштування виводу посторінкової навигації" +SETTINGS_NAME = "Параметр" +SETTINGS_VALUE = "Значення" +SETTINGS_USE_EDITOR = "Редактор по замовчуванню" +SETTINGS_EDITOR_ELFINDER = "Elrte та Elfinder" +SETTINGS_EDITOR_CKEDITOR = "CKEditor" + +SETTINGS_ERROR = "Помилка" +SETTINGS_SUCCESS = "Виконано" + +SETTINGS_SAVE_DOP = "Змінив додаткові налаштування системи" +SETTINGS_SAVE_MAIN = "Змінив загальні налаштування системи" +SETTINGS_SAVE_COUNTRY = "Змінив налаштування країн" + +SETTINGS_LANG_EDIT = "Керування мовами" +SETTINGS_LANG_TITLE = "Увага! Налаштування мов має відбуватися, чітко перед наповненням cайту!" +SETTINGS_LANG_AEDIT = "Редагувати" +SETTINGS_LANG_AON = "Увімкнути" +SETTINGS_LANG_AOFF = "Вимкнути" +SETTINGS_LANG_ADEFAULT = "Зробити по замовчуванню" +SETTINGS_LANG_ADEFAULT_HINT = "" +SETTINGS_LANG_ID = "Id" +SETTINGS_LANG_FLAG = "Прапорець" +SETTINGS_LANG_SYSTEM = "Системне" +SETTINGS_LANG_PREFIX = "Префікс" +SETTINGS_LANG_NAME = "Назва" +SETTINGS_LANG_DEFAULT = "По замовчуванню" +SETTINGS_LANG_ACTION = "Дії" +SETTINGS_LANG_ADD = "Додати мову" +SETTINGS_LANG_SAVE = "Зберегти зміни" + +SETTINGS_REV_DELETED = "Ревізії документів успішно видалено" +SETTINGS_REV_DELETED_ERR = "Не вдалося видалити ревізії документів.
Спробуйте ще раз." +SETTINGS_REV_UPDATE = "Видалив ревізії документів" +SETTINGS_COUNT_DELETED = "Поденний лічильник документів
успішно обнулений." +SETTINGS_COUNT_DELETED_ERR = "Не вдалося обнулити поденний
лічильник документів.
Спробуйте ще раз." +SETTINGS_COUNT_UPDATE = "Обнулено поденний лічильник документів" +SETTINGS_CACHE_LIFETIME = "Увага!!! Увімкнено кешування запиту до налаштувань системи. Зміни набудуть чинності, тільки після закінчення часу життя кеша або відключення кешування" + + + +// v3.2 +SETTINGS_PAGINATION = "Налаштування пагінації" +PAGINATION_ADD = "Створити шаблон пагінації" +PAGINATION_NAME = "Найменування" +PAGINATION_ACTIONS = "Дії" +PAGINATION_EDIT_HINT = "Редагувати" +PAGINATION_DELETE_HINT = "Видалити пагінацію" +PAGINATION_DEL_HINT = "Ви впевнені, що бажаєте видалити цей шаблон пагінації?" +PAGINATION_SAVED = "Шаблон пагінації успішно збережено" +PAGINATION_SAVED_ERR = "Не вдалося зберегти шаблон пагінації.
Спробуйте ще раз." +PAGINATION_ERROR = "Помилка" +PAGINATION_SUCCESS = "Виконано" + +pagination_name = "Найменування" +pagination_navigation_box = "Контейнер посторінкової навігації
Приклад: <ul class="pagination pagination-sm">%s</ul>" +pagination_link_box = "Контейнер для елемента
Приклад: <li>%s</li>" +pagination_active_link_box = "Контейнер для активного елемента
Приклад: <li class="active">%s</li>" +pagination_link_template = "Шаблон посилання елемента
[link] - посилання на сторінку
[page] - Номер сторінки для посилання
[name] - Номер сторінки
" +pagination_link_active_template = "Шаблон активного посилання елемента
[link] - посилання на сторінку
[page] - Номер сторінки для посилання
[name] - Номер сторінки
" +pagination_separator_box = "Контейнер для мітки про наявність сторінок
Приклад: <li>%s</li>" +pagination_separator_label = "Текст для мітки про наявність сторінок" +pagination_start_label = "Текст посилання “Перша”" +pagination_end_label = "Текст посилання “Остання”" +pagination_next_label = "Текст посилання “Наступна”" +pagination_prev_label = "Текст посилання “Попередня”" \ No newline at end of file diff --git a/admin/lang/ua/sysblocks.txt b/admin/lang/ua/sysblocks.txt new file mode 100644 index 0000000..9655e1a --- /dev/null +++ b/admin/lang/ua/sysblocks.txt @@ -0,0 +1,80 @@ +# солов’їна))) 01,2017 duncan + +SYSBLOCK_HEAD = "Системні блоки" +SYSBLOCK_EDIT = "Керування системними блоками" +SYSBLOCK_EDIT_TIP = "У цьому розділі представлені усі системні блоки." +SYSBLOCK_ID = "Id" +SYSBLOCK_NAME = "Назва системного блока" +SYSBLOCK_HTML = "Код системного блока" +SYSBLOCK_TAGS = "Тег" +SYSBLOCK_TAGS_2 = "HTML Tags" +SYSBLOCK_EXTERNAL = "Дозволити зовнішнє звертання за посиланням" +SYSBLOCK_EXTERNAL_H = "зовнішнє звертання за посиланням" +SYSBLOCK_EXTERNAL_GO = "Перейти" +SYSBLOCK_AJAX = "Дозволяти виконуватися тільки по Ajax" +SYSBLOCK_AJAX_H = "виконуватися тільки по Ajax" + +SYSBLOCK_VISUAL = "Візуальний редактор" +SYSBLOCK_VISUAL_H = "Візуальний редактор" + +SYSBLOCK_MEDIAPATH = "Системний тег, шляхи до папки дизайна" +SYSBLOCK_BREADCRUMB = "Системний тег хлібних крихт" +SYSBLOCK_DOCID_INFO = "Системний тег, ідентифікатор документа" +SYSBLOCK_PATH = "Кореневий шлях установки" +SYSBLOCK_HOME = "Посилання на головну сторінку cайту" + +SYSBLOCK_AUTHOR = "Автор" +SYSBLOCK_DATE = "Дата створення" +SYSBLOCK_TAG = "Системний тег" +SYSBLOCK_ACTIONS = "Дії" +SYSBLOCK_NO_ITEMS = "Повідомлення:
На цей час немає збереженоних системних блоків." +SYSBLOCK_BUTTON_SAVE = "Зберегти зміни" +SYSBLOCK_BUTTON_ADD = "Додати системний блок" +SYSBLOCK_BUTTON_COPY = "Копіювати" +SYSBLOCK_INSERT_H = "Додавання системного блока" +SYSBLOCK_EDIT_H = "редагування системного блока" +SYSBLOCK_INNAME = "Введіть назву системного блока" +SYSBLOCK_ENTER_NAME = "Будь ласка, вкажіть назву системного блока" +SYSBLOCK_INSERT = "Тут Ви можете додати або змінити обраний Вами системний блок" + +SYSBLOCK_LINK = "Системний блок є доступний за посиланням:" + +SYSBLOCK_SAVE = "Додати" +SYSBLOCK_SAVEDIT = "Зберегти зміни" +SYSBLOCK_SAVE_NEXT = "Додати та продовжити редагування" +SYSBLOCK_SAVEDIT_NEXT = "Примінити (CTRL+S)" + +SYSBLOCK_INTEXT = "Системний блок" +SYSBLOCK_ADD = "Додати новий системний блок" +SYSBLOCK_ADD_BUTTON = "Додати" +SYSBLOCK_EDIT_HINT = "Редагувати системний блок" +SYSBLOCK_DELETE_HINT = "видалити системний блок" +SYSBLOCK_DEL_HINT = "Ви впевнені, що бажаєте видалити системний блок?" +SYSBLOCK_LIST_LINK = "Список системних блоків" +SYSBLOCK_FILE = "Файл шаблона" +SYSBLOCK_SAVED = "Системний блок успішно збережено." +SYSBLOCK_COPY_TITLE = "копіювання системного блока" +SYSBLOCK_COPY = "Копіювати системний блок" +SYSBLOCK_COPY_TIP = "Будь ласка, вкажіть назву системного блока" +SYSBLOCK_COPY_TIP2 = "Будь ласка, вкажіть назву для системного блока, що копіюється" +SYSBLOCK_EXIST = "Даруйте, але системний блок з такою назвою уже існує" +SYSBLOCK_SQLUPDATE = "Змінив системний блок" +SYSBLOCK_SQLNEW = "Створив новий системний блок" +SYSBLOCK_SQLDEL = "Видалив системний блок" +SYSBLOCK_OR = " або " + +SYSBLOCK_SAVED = "Системний блок успішно збережено" +SYSBLOCK_SAVED_ERR = "Не вдалося зберегти системний блок.
Спробуйте ще раз." +SYSBLOCK_ERROR = "Помилка" +SYSBLOCK_SUCCESS = "Виконано" + + +// v 3.2 +SYSBLOCK_DESCRIPTION = "Короткий опис" +SYSBLOCK_ALIAS = "Аліас" +SYSBLOCK_I = "Опціонально. Аліас дозволяє використовувати легкий для запам’ятовування тег [tag:sysblock:alias] замість [tag:sysblock:id]. Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення, мати довжину не більше 20 символів та бути унікальним у межах цих блоків" +SYSBLOCK_ACCEPT = "Цей аліас можна використовувати" +SYSBLOCK_ER_SYN = "Неправильний аліас!
Аліас не повинен бути числом, може містити тільки цифри, латинські літери, дефіс, підкреслення та мати довжину не більше 20 символів" +SYSBLOCK_ER_EXISTS = "Неправильний аліас!
Такий аліас уже прив’язаний до іншого системного блока" + + diff --git a/admin/lang/ua/templates.txt b/admin/lang/ua/templates.txt new file mode 100644 index 0000000..6a55306 --- /dev/null +++ b/admin/lang/ua/templates.txt @@ -0,0 +1,119 @@ +# солов’їна))) 01,2017 duncan + +TEMPLATES_SUB_TITLE = "Керування шаблонами" +TEMPLATES_TIP1 = "У цьому розділі наведено список усіх шаблонів, які використовуються у системі. Тут Ви можете видалити, відредагувати або скопіювати шаблон, щоб створити на його базі новий." +TEMPLATES_ID = "ID" +TEMPLATES_NAME = "Назва шаблона" +TEMPLATES_NAME2 = "Назва шаблона:" +TEMPLATES_NAME3 = "вкажіть назву шаблона:" +TEMPLATES_AUTHOR = "Автор" +TEMPLATES_DATE = "Дата створення" +TEMPLATES_ACTION = "Дії" +TEMPLATES_DATE_FORMAT = "%d.%m.%y г." +TEMPLATES_DATE_FORMAT2 = "%H:%M" +TEMPLATES_IN = "в" +TEMPLATES_EDIT = "Редагувати шаблон" +TEMPLATES_NO_CHANGE = "Даруйте, але у Вас недостатньо прав для редагування шаблона" +TEMPLATES_DELETE = "видалити шаблон" +TEMPLATES_DELETE_CONF = "Ви впевнені, що бажаєте видалити цей шаблон?" +TEMPLATES_NO_DELETE2 = "Даруйте, але Ви не можете видалити цей шаблон, оскільки він використовується рубриками або модулями" +TEMPLATES_NO_DELETE3 = "Даруйте, але у вас недостатньо прав для видалення шаблона" +TEMPLATES_COPY = "Копіювати шаблон" +TEMPLATES_NO_COPY = "Даруйте, але у вас недостатньо прав для копіювання шаблона" +TEMPLATES_LEGEND = "Значення піктограм" +TEMPLATES_COPY_TITLE = "копіювання шаблона" +TEMPLATES_TIP2 = "Будь ласка, вкажіть назву для скопійованого шаблона" +TEMPLATES_TIP3 = "Будь ласка, вкажіть назву для шаблона" +TEMPLATES_BUTTON_COPY = "Копіювати" +TEMPLATES_TAG_INSERT = "Натисніть на назву системного тега, щоб додати його в поле шаблона" +TEMPLATES_TITLE_NEW = "Створення нового шаблона" +TEMPLATES_TITLE_EDIT = "редагування шаблона" +TEMPLATES_WARNING1 = "Будь ласка, будьте уважні при редагуванні шаблона та пам’ятайте, що неправильно указанний код може зіпсувати зовнішнє оформлення cайту" +TEMPLATES_WARNING2 = "У цьому розділі Ви можете створити новий шаблон вручну, а також завантажити готову структуру шаблона з існуючого файла. Пам’ятайте, що файли з готовою структурою повинні бути розміщені в директорії /inc/data/prefabs/templates/" +TEMPLATES_HTML = "HTML код шаблона" +TEMPLATES_USE_PHP = "Даруйте, але у Вас недостатньо прав для редагування шаблона, оскільки він використовує PHP код" +TEMPLATES_BUTTON_SAVE = "Зберегти зміни" +TEMPLATES_BUTTON_SAVE_NEXT = "Примінити (CTRL+S)" +TEMPLATES_FILE_SAVED = "Файл успішно збережено" +TEMPLATES_BUTTON_ADD = "Додати шаблон" +TEMPLATES_BUTTON_ADD_NEXT = "Додати та продовжити редагування" +TEMPLATES_BUTTON_LOAD = "завантажити" +TEMPLATES_LOAD_INFO = "Будь ласка, оберіть зі списку файл з готовою структурою шаблона" +TEMPLATES_EXIST = "Даруйте, але шаблон з такою назвою уже існує" +TEMPLATES_NO_NAME = "Будь ласка, вкажіть назву шаблона" +TEMPLATES_ALL = "Список шаблонів" +TEMPLATES_OR = " або " + +TEMPLATES_FILE_NAME = "Назва файла" +TEMPLATES_CSS_FILES = "Список css файлів" +TEMPLATES_JS_FILES = "Список js файлів" +TEMPLATES_FILES = "Файловий менеджер" +TEMPLATES_EDIT_FILE = "Редагувати файл" +TEMPLATES_DEL_FILE = "видалити файл" + +TEMPLATES_TAGS = "Тег" +TEMPLATES_TAG_DESC = "Опис тега" +TEMPLATES_THEME_FOLDER = "Назва шаблона (Ім’я папки з файлами для цього шаблона)" +TEMPLATES_FOLDER = "Папка:" +TEMPLATES_PAGENAME = "Назва cайту" +TEMPLATES_FILENAME = "Назва файла" +TEMPLATES_TITLE = "Назва сторінки" +TEMPLATES_KEYWORDS = "Ключові слова (Meta - Keywords)" +TEMPLATES_DESCRIPTION = "Опис сторінки (Meta - Description)" +TEMPLATES_INDEXFOLLOW = "Тип індексування" +TEMPLATES_CANONICAL = "Канонічна сторінка – це рекомендований екземпляр з набора сторінок з дуже схожим вмістом." +TEMPLATES_PATH = "Кореневий шляхи установки" +TEMPLATES_MEDIAPATH = "Шляхи до папки з шаблоном (Приклад: [tag:mediapath]images/logo.gif)" + +TEMPLATES_CSS = "Стискає декілька css-файлів в один. Повертає шлях.
FFF - імена файлів через кому
P - шляхи до папки з файлами, не обов’язково. По замовчуванню - [tag:mediapath]css/

Приклад: href="[tag:css:reset.css,style.css]"" + +TEMPLATES_JS = "Стискає декілька js-файлів в один. Повертає шлях.
FFF - імена файлів через кому
P - шляхи до папки з файлами, не обов’язково. По замовчуванню - [tag:mediapath]js/

Приклад: href="[tag:js:common.js,main.js]"" + +TEMPLATES_MEDIAPATH = "Шляхи до папки з шаблоном (Приклад: [tag:mediapath]images/logo.gif)" +TEMPLATES_MAINCONTENT = "Тег для головного вмісту" +TEMPLATES_QUICKFINDER = "Випадаюче меню швидкої навигації" +TEMPLATES_DOCUMENT = "Посилання на поточний документ" +TEMPLATES_ALIAS = "Посилання на поточний документ (Alias)" +TEMPLATES_SYSBLOCK = "Системний тег системних блоків" +TEMPLATES_TEASER = "Системний тег тизерів" +TEMPLATES_PRINTLINK = "Посилання на "Версія для друку"" +TEMPLATES_HOME = "Посилання на головну сторінку cайту" +TEMPLATES_BREADCRUMB = "Системний тег хлібних крихт" +TEMPLATES_VERSION = "Показ інформації про захист інформації" +TEMPLATES_NAVIGATION = "Меню навигації (ххх - номер меню)" +TEMPLATES_IF_PRINT = "Вміст буде показано при друці." +TEMPLATES_DONOT_PRINT = "Вміст не буде показано при друці" +TEMPLATES_RUBHEADER = "Налаштовується у шаблоні рубрики
(Шаблон оформлення HEADER)" +TEMPLATES_NO_ITEMS = "На цей час немає файлів" + +TEMPLATES_CACHE_SUCCESS = "Кеш успішно очищено." +TEMPLATES_CACHE_SUCCESS_LOG = "Очистив кеш" + +TEMPLATES_CSS_TITLE = "Будь ласка, будьте уважні при редагуванні файлів та пам’ятайте, що неправильно указанний код може зіпсувати зовнішнє оформлення cайту" +TEMPLATES_CSS_EDITOR = "Редактор файлів CSS" + +TEMPLATES_JS_TITLE = "Будь ласка, будьте уважні при редагуванні файлів та пам’ятайте, що неправильно указанний код може зіпсувати зовнішнє оформлення cайту" +TEMPLATES_JS_EDITOR = "Редактор файлів CSS" + +TEMPLATES_REPORT_NEW = "Створив шаблон" +TEMPLATES_REPORT_CHANGE = "Змінив шаблон" +TEMPLATES_REPORT_PHP = "Спроба використання PHP коду у шаблоні" +TEMPLATES_REPORT_PHP_CSS = "Спроба використання PHP коду в css файлі" +TEMPLATES_REPORT_PHP_JS = "Спроба використання PHP коду в js файлі" +TEMPLATES_REPORT_PHP_ERR = "Заборонено використовувати PHP код" +TEMPLATES_REPORT_ID_ERR = "Спроба видалення основного шаблона" +TEMPLATES_REPORT_DELETE = "Видалив шаблон" +TEMPLATES_REPORT_FILE = "Відредагував файл" +TEMPLATES_REPORT_COPY = "Створив копію шаблона" +TEMPLATES_REPORT_DEL_OK = "Файл успішно видалено" +TEMPLATES_REPORT_DEL_ER = "Не вдалося видалити файл" + +TEMPLATES_REPORT_ERROR_TEXT = "HTML код шаблона пустий" +TEMPLATES_REPORT_ERROR_TITLE = "Не заповнено - назва щаблона" + +TEMPLATES_SAVED = "Шаблон успішно збережено" +TEMPLATES_SAVED_FILE = "Файл успішно збережено" +TEMPLATES_SAVED_ERR = "Не вдалося зберегти шаблон.
Спробуйте ще раз." +TEMPLATES_SAVED_ERR_FILE = "Не вдалося зберегти файл.
Спробуйте ще раз." +TEMPLATES_ERROR = "Помилка" +TEMPLATES_SUCCESS = "Виконано" \ No newline at end of file diff --git a/admin/lang/ua/user.txt b/admin/lang/ua/user.txt new file mode 100644 index 0000000..701331b --- /dev/null +++ b/admin/lang/ua/user.txt @@ -0,0 +1,92 @@ +# солов’їна))) 01,2017 duncan + +[user] +USER_SUB_TITLE = "Керування користувачами" +USER_TIP1 = "У цьому розділі наведено список усіх користувачів у системі. Тут Ви можете відредагувати параметри користувача, видалити користувача, а також перенести користувача в іншу групу." +USER_ID = "ID" +USER_NAME = "Ім’я та прізвище користувача" +USER_NAME2 = "Ім’я користувача" +USER_GROUP = "Перебуває в групі" +USER_STATUS_WAIT = "Очікує активацію" +USER_LAST_VISIT = "Останній вхід" +USER_REGISTER_DATE = "Дата реєстрації" +USER_ACTION = "Дії" +USER_DELETE = "Видалити користувача" +USER_EDIT = "Редагувати користувача" +USER_DATE_FORMAT = "%d.%m.%Y %H:%M" +USER_NO_CHANGE = "Даруйте, але у вас недостатньо прав для редагування користувачів" +USER_DELETE_CONFIRM = "Ви впевнені, що бажаєте видалити цього користувача?" +USER_LEGEND = "Значення піктограм" +USER_BUTTON_SAVE = "Зберегти зміни" +USER_ORDERS = "Історія замовлень" +USER_DOWNLOADS = "Історія замовлень ПО" +USER_MARK_DELETE = "Відмітити для видалення" +USER_NEW_TITLE = "Створення нового користувача" +USER_NEW_TIP = "Щоби додати нового користувача, заповніть поля з відповідними даними. Будь ласка, будьте уважні при виборі групи для цього користувача. Неправильно вказана група може обмежити доступ користувача до відповідних розділів cайту або навпаки, дозволити доступ до закритих розділів." +USER_EDIT_TITLE = "Редагування користувача" +USER_EDIT_TIP = "У цьому розділі Ви можете відредагувати параметри користувача, а також змінити пароль та групу користувача." +USER_ERRORS = "Помилка:" +USER_FIRSTNAME = "Ім’я:" +USER_FIRSTNAME_ADD = "Введіть ім’я користувача:" +USER_LASTNAME = "Прізвище:" +USER_EMAIL = "E-mail адреса:" +USER_NICK = "Нікнейм на форумі:" +USER_SIGNATURE = "Підпис на форумі:" +USER_AVATAR = "Аватар:" +USER_TAX = "Обкладати податком:" +USER_COMPANY = "Компанія:" +USER_HOUSE_STREET = "Вулиця / Номер будинку:" +USER_ZIP_CODE = "Поштовий індекс:" +USER_CITY = "Місто проживання:" +USER_PASSWORD = "Пароль:" +USER_PASSWORD_CHANGE = "Змінити" +USER_PASSWORD_SHOW = "Показати пароль" +USER_YES = "Так" +USER_NO = "Ні" +USER_COUNTRY = "Країна:" +USER_PHONE = "Контактний телефон:" +USER_FAX = "Факс:" +USER_BIRTHDAY = "Дата народження:" +USER_BIRTHDAY_FORMAT = " у форматі (ДД.ММ.ГГГГ)" +USER_NOTICE = "Додаткова інформація:" +USER_MAIN_GROUP = "Основна група:" +USER_SECOND_GROUP = "Додаткова група:" +USER_SECOND_INFO = "Вибір декількох груп" +USER_STATUS = "Статус користувача:" +USER_ACTIVE = "Активний" +USER_INACTIVE = "Неактивний" +USER_BUTTON_ADD = "Додати користувача" +USER_SEND_INFO = "Проінформувати користувача поштою" +USER_MESSAGE_SUBJECT = "Тема повідомлення:" +USER_MESSAGE_TEXT = "Текст повідомлення:" +USER_EMAIL_EXIST = "Даруйте, але указана E-mail адреса уже використовується у системі." +USER_ERROR_DATEFORMAT = "Дата народження указана в неправильному форматі." +USER_PASSWORD_SHORT = "Указанний пароль надто короткий. Будь ласка, використовуйте мінімум 5 символів." +USER_PASSWORD_ERROR = "Поле пароль містить недопустимі символи." +USER_NO_EMAIL = "Поле E-mail не заповнено. Будь ласка, вкажіть E-Mail адресу." +USER_NO_PASSWORD = "Поле пароль не заповнено. Будь ласка, вкажіть пароль." +USER_EMAIL_ERROR = "Поле E-mail адрес містить недопустимі символи, Будь ласка, перевірте указану E-mail адресу." +USER_NO_FIRSTNAME = "Поле ім’я користувача не заповнено. Будь ласка, вкажіть ім’я користувача." +USER_NO_USERNAME = "Поле логін не заповнено. Будь ласка, вкажіть логін користувача." +USER_ERROR_FIRSTNAME = "Поле ім’я користувача містить недопустимі символи." +USER_ERROR_USERNAME = "Поле логін містить недопустимі символи." +USER_NO_LASTNAME = "Поле прізвище користувача не заповнено. Будь ласка, вкажіть прізвище користувача," +USER_ERROR_LASTNAME = "Поле прізвище користувача містить недопустимі символи." +USER_MAIL_BODY1 = "Вітання %USER%,%N%%N%" +USER_MAIL_BODY2 = "Ваш аккаунт успішно активовано. Будь ласка, використовуйте Ваші реєстраційні дані для входу на сайт %HOST%." +USER_MAIL_FOOTER = "%N%%N%З повагою, %HOMEPAGENAME%%N%%N%%HOST%" +USER_MAIL_SUBJECT = "Ваш аккаунт активовано" +USER_MAIL_PASSWORD = "інформація про зміну пароля" +USER_MAIL_PASSWORD2 = "Повідомляємо Вас про зміну пароля.%N%%N%Ваш новий пароль: %NEWPASS%" +USER_NEW_ADD = "Створення нового користувача" +USER_ALL = "Список користувачів" +USER_LOGIN = "Логін у системі:" +SETTINGS_NAME = "Параметр" +SETTINGS_VALUE = "Значення" +USER_LIST_EMPTY = "Немає користувачів, які відповідають таким умовам пошука.
Спробуйте змінити умови пошука." +USER_REPORT_ADD = "Додав користувача" +USER_REPORT_EDIT = "Відредагував параметри користувача" +USER_REPORT_DEL = "Видалив користувача" +USER_REPORT_GROUP = "Змінив групу для користувача" +USER_YOUR_NOT_CHANGE = "Помилка! Даруйте, але Ви не маєте прав для редагування цього користувача." +USER_WARNING_TIP = "Увага! Будьте уважні, при редагуванні цього користувача." \ No newline at end of file diff --git a/admin/logs.php b/admin/logs.php new file mode 100644 index 0000000..7be9432 --- /dev/null +++ b/admin/logs.php @@ -0,0 +1,92 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/logs.txt', 'logs'); + +switch ($_REQUEST['action']) +{ + case '': + if (check_permission_acp('logs_view')) + { + $AVE_Logs->logList(); + } + break; + + case 'log404': + if (check_permission_acp('logs_view')) + { + $AVE_Logs->List404(); + } + break; + + case 'logsql': + if (check_permission_acp('logs_view')) + { + $AVE_Logs->ListSql(); + } + break; + + case 'delete': + if (check_permission_acp('logs_clear')) + { + $AVE_Logs->logDelete(); + } + break; + + case 'deletesql': + if (check_permission_acp('logs_clear')) + { + $AVE_Logs->DeleteSql(); + } + break; + + case 'delete404': + if (check_permission_acp('logs_clear')) + { + $AVE_Logs->Delete404(); + } + break; + + case 'export': + if (check_permission_acp('logs_view')) + { + $AVE_Logs->logExport(); + } + break; + + case 'export404': + if (check_permission_acp('logs_view')) + { + $AVE_Logs->Export404(); + } + break; + + case 'exportsql': + if (check_permission_acp('logs_view')) + { + $AVE_Logs->ExportSql(); + } + break; +} + +?> \ No newline at end of file diff --git a/admin/modules.php b/admin/modules.php new file mode 100644 index 0000000..df79a1b --- /dev/null +++ b/admin/modules.php @@ -0,0 +1,99 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/modules.txt', 'modules'); + +if (!empty($_REQUEST['moduleaction'])) +{ + if (!check_permission('mod_' . $_REQUEST['mod'])) + { + echo $AVE_Template->get_config_vars('MAIN_NO_PERM_MODULES'); + exit; + } +} + +if (!empty($_REQUEST['module'])) +{ + $module_path = preg_replace('/[^\w]/', '', $_REQUEST['module']); + if (!empty($module_path)) define('MODULE_PATH', $module_path); +} + +switch($_REQUEST['action']) +{ + case '': + if (check_permission_acp('modules_view')) + { + $AVE_Module->moduleList(); + } + break; + + case 'quicksave': + if (check_permission_acp('modules_system')) + { + $AVE_Module->moduleOptionsSave(); + } + break; + + case 'install': + case 'reinstall': + if (check_permission_acp('modules_system')) + { + $AVE_Module->moduleInstall(); + } + break; + + case 'update': + if (check_permission_acp('modules_system')) + { + $AVE_Module->moduleUpdate(); + } + break; + + case 'delete': + if (check_permission_acp('modules_system')) + { + $AVE_Module->moduleDelete(); + } + break; + + case 'onoff': + if (check_permission_acp('modules_system')) + { + $AVE_Module->moduleStatusChange(); + } + break; + + case 'modedit': + if (check_permission_acp('modules_admin')) + { + $mod_path = preg_replace('/[^\w]/', '', $_REQUEST['mod']); + $mod_path = BASE_DIR . '/modules/' . $mod_path . '/module.php'; + if (is_file($mod_path)) include($mod_path); + } + break; + + case 'remove': + if (check_permission_acp('modules_system')) + { + $AVE_Module->moduleRemove($_REQUEST['module']); + } + break; +} + +?> \ No newline at end of file diff --git a/admin/navigation.php b/admin/navigation.php new file mode 100644 index 0000000..83d77f7 --- /dev/null +++ b/admin/navigation.php @@ -0,0 +1,136 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/navigation.txt', 'navi'); + + switch ($_REQUEST['action']) + { + case '': + if (check_permission_acp('navigation_view')) + { + $AVE_Navigation->navigationList(); + } + break; + + case 'new': + if (check_permission_acp('navigation_edit')) + { + require(BASE_DIR . '/class/class.user.php'); + $AVE_User = new AVE_User; + $AVE_Navigation->navigationNew(); + } + break; + + case 'copy': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationCopy((int)$_REQUEST['navigation_id']); + } + break; + + case 'delete': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationDelete((int)$_REQUEST['navigation_id']); + } + break; + + case 'templates': + if (check_permission_acp('navigation_edit')) + { + require(BASE_DIR . '/class/class.user.php'); + $AVE_User = new AVE_User; + $AVE_Navigation->navigationEdit((int)$_REQUEST['navigation_id']); + } + break; + + case 'entries': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationItemList((int)$_REQUEST['navigation_id']); + } + break; + + case 'sorting': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationSort((int)$_REQUEST['navigation_id']); + } + break; + + case 'itemedit': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationItemEdit((int)$_REQUEST['navigation_item_id']); + } + break; + + case 'itemeditid': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->getDocumentById((int)$_REQUEST['doc_id']); + } + break; + + case 'saveitem': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationItemSave((int)$_REQUEST['navigation_item_id']); + } + break; + + case 'itemnew': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationItemNew((int)$_REQUEST['navigation_id']); + } + break; + + case 'itemestatus': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationItemStatus((int)$_REQUEST['navigation_item_id'], $_REQUEST['status']); + } + break; + + case 'getitem': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationItemGet((int)$_REQUEST['navigation_item_id']); + } + break; + + case 'itemdelete': + if (check_permission_acp('navigation_edit')) + { + $AVE_Navigation->navigationItemDelete((int)$_REQUEST['navigation_item_id']); + } + break; + + case 'alias': + if (check_permission_acp('navigation_edit')) + { + echo $AVE_Navigation->navigationValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + } + exit; + } +?> diff --git a/admin/request.php b/admin/request.php new file mode 100644 index 0000000..17f3c71 --- /dev/null +++ b/admin/request.php @@ -0,0 +1,105 @@ +rubricPermissionFetch(); + + $AVE_Template->config_load(BASE_DIR . "/admin/lang/" . $_SESSION['admin_language'] . "/request.txt", 'request'); + + switch ($_REQUEST['action']) + { + case '': + if(check_permission_acp('request_view')) + { + $AVE_Rubric->rubricTemplateShow(0, 1); + $AVE_Request->requestListShow(); + } + break; + + case 'edit': + if(check_permission_acp('request_edit')) + { + $AVE_Rubric->rubricTemplateShow(0, 1); + $AVE_Request->requestEdit((int)$_REQUEST['Id']); + } + break; + + case 'copy': + if(check_permission_acp('request_edit')) + { + $AVE_Request->requestCopy((int)$_REQUEST['Id']); + } + break; + + case 'new': + if(check_permission_acp('request_edit')) + { + $AVE_Rubric->rubricTemplateShow(0, 1); + $AVE_Request->requestNew(); + } + break; + + case 'delete_query': + if(check_permission_acp('request_edit')) + { + $AVE_Request->requestDelete((int)$_REQUEST['Id']); + } + break; + + case 'conditions': + if(check_permission_acp('request_edit')) + { + $AVE_Rubric->rubricTemplateShow(0, 1); + $AVE_Request->requestConditionEdit((int)$_REQUEST['Id']); + } + break; + + case 'change': + if(check_permission_acp('request_edit')) + { + switch($_REQUEST['sub']) + { + case '': + $AVE_Rubric->rubricTemplateShow(0, 1); + $AVE_Request->conditionFieldChange((int)$_REQUEST['field_id'], (int)$_REQUEST['cond_id']); + break; + + case 'save': + $AVE_Rubric->rubricTemplateShow(0, 1); + $AVE_Request->conditionFieldChangeSave((int)$_REQUEST['field_id'], (int)$_REQUEST['cond_id']); + break; + } + } + break; + + case 'alias': + if (check_permission_acp('request_edit')) + { + echo $AVE_Request->requestValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + } + exit; + } +?> \ No newline at end of file diff --git a/admin/rubs.php b/admin/rubs.php new file mode 100755 index 0000000..b81f68a --- /dev/null +++ b/admin/rubs.php @@ -0,0 +1,561 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/rubs.txt', 'rubs'); + +switch($_REQUEST['action']) +{ + case '' : + if(check_permission('rubric_view')) + { + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case 'quicksave': + $AVE_Rubric->quickSave(); + break; + } + } + $AVE_Rubric->rubricList(); + $AVE_Template->assign('templates', get_all_templates()); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/list.tpl')); + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_VIEW')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'new': + if(check_permission('rubric_edit')) + { + $AVE_Template->assign('templates', get_all_templates()); + $AVE_Rubric->rubricNew(); + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_CHANGE3')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'template': + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case '': + $AVE_Rubric->rubricTemplateShow(); + break; + + case 'save': + + $Rtemplate = $_POST['rubric_template']; + $Htemplate = $_POST['rubric_header_template']; + $Ttemplate = $_POST['rubric_teaser_template']; + $Atemplate = $_POST['rubric_admin_teaser_template']; + + $check_code = strtolower($Rtemplate.$Htemplate.$Ttemplate.$Atemplate); + + $ok = true; + + if((is_php_code($check_code)) && !check_permission('rubric_php') ) + { + $AVE_Template->assign('php_forbidden', 1); + + $ok = false; + } + + if(! $ok) + { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_PHP_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIC_ERROR'); + $theme = 'error'; + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + else + { + $AVE_Rubric->rubricTemplateShow(1); + } + + } + else + { + $AVE_Rubric->rubricTemplateSave($Rtemplate, $Htemplate, $Ttemplate, $Atemplate); + } + break; + } + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_CHANGE2')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'delete': + if(check_permission('rubric_edit')) + { + $AVE_Rubric->rubricDelete(); + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_PERMISSION')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'multi': + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case 'save': + $AVE_Rubric->rubricCopy(); + break; + } + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/multi.tpl')); + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_MULTIPLY')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'edit': + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case '': + switch($_REQUEST['submit']) + { + case 'saveperms': + if (check_permission('rubric_perms')){ + $AVE_Rubric->rubricPermissionSave((int)$_REQUEST['Id']); + } + break; + + case 'save': + $AVE_Rubric->rubricFieldSave((int)$_REQUEST['Id']); + break; + + case 'linked_rubric': + $AVE_Rubric->rubricShow(1); + break; + + case 'code': + if (check_permission('rubric_code')){ + $AVE_Rubric->rubricCode((int)$_REQUEST['Id']); + } + break; + + case 'description': + $AVE_Rubric->rubricDesc((int)$_REQUEST['Id']); + break; + } + } + $AVE_Rubric->rubricFieldShow((int)$_REQUEST['Id'], null); + break; + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_CHANGE1')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'alias_add': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricAliasAdd(); + } + break; + + case 'code': + if (check_permission('rubric_code')) + { + $AVE_Rubric->rubricCodeEdit($_REQUEST['Id']); + } + break; + + case 'field_template': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldTemplate(); + } + break; + + case 'field_template_save': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldTemplateSave((int)$_REQUEST['field_id'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'fieldssort': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldsSort((array)$_REQUEST['sort']); + } + exit; + + case 'rubssort': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricsSort((array)$_REQUEST['sort']); + } + exit; + + case 'alias_check': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricAliasCheck((int)$_REQUEST['rubric_id'],(int)$_REQUEST['field_id'], $_REQUEST['rubric_field_alias']); + } + break; + + case 'newfield': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldNew((int)$_REQUEST['Id'], $_REQUEST['ajax']); + } + break; + + case 'fields': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldShow((int)$_REQUEST['Id'], $_REQUEST['ajax']); + } + break; + + case 'change': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldChange((int)$_REQUEST['field_id'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'changesave': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldChangeSave((int)$_REQUEST['field_id'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'changegroup': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldGroupChange((int)$_REQUEST['field_id'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'changegroupsave': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldGroupChangeSave((int)$_REQUEST['field_id'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'fieldsgroups': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldsGroups((int)$_REQUEST['Id']); + } + break; + + case 'newfieldsgroup': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricNewGroupFields((int)$_REQUEST['Id']); + } + break; + + case 'savefieldsgroup': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricEditGroupFields((int)$_REQUEST['Id']); + } + break; + + case 'delfieldsgroup': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricDelGroupFields((int)$_REQUEST['Id'], (int)$_REQUEST['rubric_id']); + } + break; + + case 'fieldsgroupssort': + if(check_permission_acp('rubric_edit')) + { + $AVE_Rubric->rubricFieldsGroupsSort((array)$_REQUEST['sort']); + } + exit; + + case 'tmpls': + if (check_permission_acp('rubric_edit')) + { + $AVE_Rubric->tmplsList(); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/tmpls.tpl')); + } + break; + + case 'tmpls_edit': + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case '': + $AVE_Rubric->tmplsEdit(); + break; + + case 'save': + + $title = $_POST['template_title']; + $template = $_POST['rubric_template']; + + $check_code = strtolower($template); + + $ok = true; + + if((is_php_code($check_code)) && !check_permission('rubric_php') ) + { + $AVE_Template->assign('php_forbidden', 1); + + $ok = false; + } + + if(! $ok) + { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_PHP_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIC_ERROR'); + $theme = 'error'; + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + else + { + $AVE_Rubric->tmplsEdit(); + } + } + else + { + $AVE_Rubric->tmplsSave($template, $title); + } + break; + } + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_CHANGE2')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'tmpls_new': + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case '': + $AVE_Rubric->tmplsEdit(); + break; + + case 'save': + + $title = $_POST['template_title']; + $template = $_POST['rubric_template']; + + $check_code = strtolower($template); + + $ok = true; + + if((is_php_code($check_code)) && !check_permission('rubric_php') ) + { + $AVE_Template->assign('php_forbidden', 1); + + $ok = false; + } + + if(! $ok) + { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_PHP_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIC_ERROR'); + $theme = 'error'; + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + else + { + $AVE_Rubric->tmplsEdit(); + } + } + else + { + $AVE_Rubric->tmplsSave($template, $title); + } + break; + } + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_CHANGE2')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'tmpls_from': + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case '': + $AVE_Rubric->tmplsEdit(); + break; + + case 'save': + + $title = $_POST['template_title']; + $template = $_POST['rubric_template']; + + $check_code = strtolower($template); + + $ok = true; + + if((is_php_code($check_code)) && !check_permission('rubric_php') ) + { + $AVE_Template->assign('php_forbidden', 1); + + $ok = false; + } + + if(! $ok) + { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_PHP_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIC_ERROR'); + $theme = 'error'; + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + else + { + $AVE_Rubric->tmplsEdit(); + } + } + else + { + $AVE_Rubric->tmplsSave($template, $title); + } + break; + } + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_CHANGE2')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'tmpls_copy': + if(check_permission('rubric_edit')) + { + switch($_REQUEST['sub']) + { + case '': + $AVE_Rubric->tmplsEdit(); + break; + + case 'save': + + $title = $_POST['template_title']; + $template = $_POST['rubric_template']; + + $check_code = strtolower($template); + + $ok = true; + + if((is_php_code($check_code)) && !check_permission('rubric_php') ) + { + $AVE_Template->assign('php_forbidden', 1); + + $ok = false; + } + + if(! $ok) + { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_PHP_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIC_ERROR'); + $theme = 'error'; + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + else + { + $AVE_Rubric->tmplsEdit(); + } + } + else + { + $AVE_Rubric->tmplsSave($template, $title); + } + break; + } + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_CHANGE2')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + + case 'tmpls_del': + if(check_permission('rubric_edit')) + { + $AVE_Rubric->tmplsDelete(); + } + else + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('RUBRIK_NO_PERMISSION')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; +} + +?> diff --git a/admin/settings.php b/admin/settings.php new file mode 100644 index 0000000..cb734ff --- /dev/null +++ b/admin/settings.php @@ -0,0 +1,177 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/settings.txt','settings'); + +switch($_REQUEST['action']) +{ + case '': + switch ($_REQUEST['sub']) + { + case '': + if(check_permission_acp('gen_settings')) + { + $AVE_Settings->settingsShow(); + break; + } + + case 'case': + if(check_permission_acp('gen_settings_more')) + { + $AVE_Settings->settingsCase(); + break; + } + + case 'save': + if (isset($_REQUEST['more'])) { + if(check_permission_acp('gen_settings_more')) $AVE_Settings->settingsCase(); + } else { + if(check_permission_acp('gen_settings')) $AVE_Settings->settingsSave(); + } + break; + + case 'countries': + if(check_permission_acp('gen_settings_countries')) + { + if (isset($_REQUEST['save']) && $_REQUEST['save'] == 1) + { + $AVE_Settings->settingsCountriesSave(); + + header('Location:index.php?do=settings&sub=countries&cp=' . SESSION); + exit; + } + $AVE_Settings->settingsCountriesList(); + break; + } + + case 'language': + if(check_permission_acp('gen_settings_languages')) + { + if(isset($_REQUEST['func'])){ + switch($_REQUEST['func']) + { + case 'default': + if(isset($_REQUEST['Id'])){ + $exists=$AVE_DB->Query("SELECT Id FROM ".PREFIX."_settings_lang WHERE Id=".(int)$_REQUEST['Id'])->GetCell(); + if($exists){ + $AVE_DB->Query("UPDATE ".PREFIX."_settings_lang SET lang_default=0"); + $AVE_DB->Query("UPDATE ".PREFIX."_settings_lang SET lang_default=1 WHERE Id=".(int)$_REQUEST['Id']." LIMIT 1"); + } + } + header('Location:index.php?do=settings&sub=language&cp=' . SESSION); + exit; + + case 'on': + if(isset($_REQUEST['Id'])){ + $AVE_DB->Query("UPDATE ".PREFIX."_settings_lang SET lang_status=1 WHERE Id=".(int)$_REQUEST['Id']); + } + header('Location:index.php?do=settings&sub=language&cp=' . SESSION); + exit; + + case 'off': + if(isset($_REQUEST['Id'])){ + $AVE_DB->Query("UPDATE ".PREFIX."_settings_lang SET lang_status=0 WHERE Id=".(int)$_REQUEST['Id']); + } + header('Location:index.php?do=settings&sub=language&cp=' . SESSION); + exit; + + case 'save': + $AVE_Settings->settingsLanguageEditSave(); + exit; + } + } + else + { + $AVE_Settings->settingsLanguageList(); + break; + } + } + + case 'editlang': + if(check_permission_acp('gen_settings_languages')) + { + $AVE_Settings->settingsLanguageEdit(); + break; + } + + case 'clearcache': + if(check_permission_acp('cache_clear')) + { + $AVE_Template->CacheClear(); + exit; + } + + case 'clearthumb': + if(check_permission_acp('cache_thumb')) + { + $AVE_Template->ThumbnailsClear(); + exit; + } + + case 'clearrevision': + if(check_permission_acp('document_revisions')) + { + $AVE_Document->documentsRevisionsClear(); + exit; + } + + case 'clearcounter': + if(check_permission_acp('gen_settings')) + { + $AVE_Document->documentCounterClear(); + exit; + } + + case 'showcache': + cacheShow(); + exit; + } + break; + + //-- v3.2 + case 'paginations': + $AVE_Settings->settingsPaginationsList(); + break; + + case 'new_paginations': + $AVE_Settings->settingsPaginationsNew(); + break; + + case 'edit_paginations': + $AVE_Settings->settingsPaginationsEdit(); + break; + + case 'save_paginations': + $AVE_Settings->settingsPaginationsSave(); + break; + + case 'del_paginations': + $AVE_Settings->settingsPaginationsDel(); + break; + //-- v3.2 +} + +?> \ No newline at end of file diff --git a/admin/start.php b/admin/start.php new file mode 100644 index 0000000..0388513 --- /dev/null +++ b/admin/start.php @@ -0,0 +1,35 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/main.txt', 'index'); +$AVE_Template->assign('php_version', (@PHP_VERSION != '') ? @PHP_VERSION : 'unknow'); +$AVE_Template->assign('domain', $_SERVER["HTTP_HOST"]); +$AVE_Template->assign('mysql_version', $GLOBALS['AVE_DB']->mysql_version()); +$AVE_Template->assign('mysql_size', get_mysql_size()); +$AVE_Template->assign('navi', $AVE_Template->fetch('navi/navi.tpl')); +$AVE_Template->assign('navi_top', $AVE_Template->fetch('navi/navi_top.tpl')); +$AVE_Template->assign('content', $AVE_Template->fetch('start.tpl')); + +?> \ No newline at end of file diff --git a/admin/sysblocks.php b/admin/sysblocks.php new file mode 100644 index 0000000..92a7d81 --- /dev/null +++ b/admin/sysblocks.php @@ -0,0 +1,130 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/sysblocks.txt', 'sysblocks'); + + switch ($_REQUEST['action']) + { + case '': + if (check_permission_acp('sysblocks_view')) + { + $AVE_SysBlock->sys_blockList(); + } + break; + + case 'new': + if (check_permission_acp('sysblocks_edit')) + { + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_SysBlock->sys_blockNew(); + } + break; + + case 'edit': + if (check_permission_acp('sysblocks_edit')) + { + $_SESSION['use_editor'] = get_settings('use_editor'); + $AVE_SysBlock->sys_blockEdit(isset($_REQUEST['id']) ? $_REQUEST['id'] : null); + } + break; + + case 'save': + if (check_permission_acp('sysblocks_edit')) + { + $AVE_SysBlock->sys_blockSave(isset($_REQUEST['id']) ? $_REQUEST['id'] : null); + } + break; + + case 'del': + if (check_permission_acp('sysblocks_edit')) + { + $AVE_SysBlock->sys_blockDelete($_REQUEST['id']); + } + break; + + case 'alias': + if (check_permission_acp('sysblocks_edit')) + { + echo $AVE_SysBlock->sys_blockValidate($_REQUEST['alias'], (int)$_REQUEST['id']); + } + exit; + + case 'multi': + if (check_permission_acp('sysblocks_edit')) + { + $_REQUEST['sub'] = (!isset($_REQUEST['sub'])) ? '' : $_REQUEST['sub']; + $errors = array(); + switch ($_REQUEST['sub']) + { + case 'save': + $ok = true; + $row = $AVE_DB->Query(" + SELECT sysblock_name + FROM " . PREFIX . "_sysblocks + WHERE sysblock_name = '" . $_REQUEST['sysblock_name'] . "' + ")->FetchRow(); + + if (@$row->sysblock_name != '') + { + array_push($errors, $AVE_Template->get_config_vars('SYSBLOCK_EXIST')); + $AVE_Template->assign('errors', $errors); + $ok = false; + } + + if ($_REQUEST['sysblock_name'] == '') + { + array_push($errors, $AVE_Template->get_config_vars('SYSBLOCK_COPY_TIP')); + $AVE_Template->assign('errors', $errors); + $ok = false; + } + + if ($ok) + { + $row = $AVE_DB->Query(" + SELECT sysblock_text + FROM " . PREFIX . "_sysblocks + WHERE id = '" . (int)$_REQUEST['id'] . "' + ")->FetchRow(); + + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_sysblocks + SET + Id = '', + sysblock_name = '" . $_REQUEST['sysblock_name'] . "', + sysblock_text = '" . addslashes($row->sysblock_text) . "', + sysblock_author_id = '" . $_SESSION['user_id'] . "', + sysblock_created = '" . time() . "' + "); + + reportLog($_SESSION['user_name'] . ' - создал копию системного блока (' . (int)$_REQUEST['id'] . ')', 2, 2); + + header('Location:index.php?do=sysblocks'.'&cp=' . SESSION); + } + $AVE_Template->assign('content', $AVE_Template->fetch('sysblocks/multi.tpl')); + break; + } + } + } +?> \ No newline at end of file diff --git a/admin/templates.php b/admin/templates.php new file mode 100644 index 0000000..0c47bf6 --- /dev/null +++ b/admin/templates.php @@ -0,0 +1,91 @@ +config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/templates.txt'); + + switch ($_REQUEST['action']) + { + case '': + if (check_permission_acp('template_view')) + { + AVE_Templates::templatesList(); + } + break; + + + case 'new': + if (check_permission_acp('template_edit')) + { + AVE_Templates::templatesNew(); + } + break; + + + case 'edit': + if (check_permission_acp('template_edit')) + { + AVE_Templates::templatesEdit(); + } + break; + + + case 'save': + if (check_permission_acp('template_edit')) + { + AVE_Templates::templatesSave(); + } + break; + + + case 'delete': + if (check_permission_acp('template_edit')) + { + AVE_Templates::templatesDelete(); + } + break; + + + case 'multi': + if (check_permission_acp('template_edit')) + { + AVE_Templates::templatesMulti(); + } + break; + + + case 'edit_css': + if (check_permission_acp('template_edit')) + { + AVE_Templates::templatesEditCss(); + } + break; + + case 'edit_js': + if (check_permission_acp('template_edit')) + { + AVE_Templates::templatesEditJs(); + } + break; + } +?> \ No newline at end of file diff --git a/admin/templates/blocks/form.tpl b/admin/templates/blocks/form.tpl new file mode 100644 index 0000000..d230148 --- /dev/null +++ b/admin/templates/blocks/form.tpl @@ -0,0 +1,229 @@ + + +{if $smarty.session.use_editor == 0} + +{/if} + +{if $smarty.session.use_editor == 1} + + + + + + + + + + + + + + +{/if} + +
+
{#BLOCK_INSERT_H#}
+
+ +
+
{#BLOCK_INSERT#}
+
+ + + +
+
+
+
{if $smarty.request.id != ''}{#BLOCK_EDIT_H#}{else}{#BLOCK_INSERT_H#}{/if}
+
+ + + + + + + + + + + + + + + + + +
{#BLOCK_NAME#} +
+ +
+
{#BLOCK_DESCRIPTION#} + +
+
+ [?] {#BLOCK_ALIAS#}: +
+
+
+   + + + + +
+
+
+
+
+
{#BLOCK_HTML#}
+
+ + + + + + +
+ {if $smarty.session.use_editor == 0} + {$block_text} + {elseif $smarty.session.use_editor == 1} + + {/if} +
+ +
+
+ {if $smarty.request.id != ''} + + + {else} + + {/if} + + {if $smarty.request.action == 'edit'} + + {/if} +
+
+ +
+
+{literal} + +{/literal} + +{if $smarty.request.action != 'new'} + +{/if} \ No newline at end of file diff --git a/admin/templates/blocks/list.tpl b/admin/templates/blocks/list.tpl new file mode 100644 index 0000000..b4a9a11 --- /dev/null +++ b/admin/templates/blocks/list.tpl @@ -0,0 +1,231 @@ + + +
+
{#BLOCK_EDIT#}
+
+ +
+
+ {#BLOCK_EDIT_TIP#} +
+
+ + + + +
+ + +
+
+ + + + + + + + + + + + + {if $vis_blocks} + + + + + + + + {if check_permission('blocks_edit')}{/if} + + + + + {foreach from=$vis_blocks item=block} + + + + + + + + + + + + {if check_permission('blocks_edit')} + + + + + + {/if} + + {/foreach} + {else} + + + + {/if} + +
{#BLOCK_ID#}{#BLOCK_NAME#}{#BLOCK_AUTHOR#}{#BLOCK_DATE#}{#BLOCK_TAG#}{#BLOCK_ACTIONS#}
{$block->id} + {if check_permission('blocks_edit')} + + {$block->block_name|escape} + + {if $block->block_description} +
{$block->block_description|escape} + {/if} + {else} + {$block->block_name|escape} + {/if} +
{$block->block_author_id|escape} + {$block->block_created|date_format:$TIME_FORMAT|pretty_date} + +
+ + + + +
+
+ + + + + +
+
    +
  • {#BLOCK_NO_ITEMS#}
  • +
+
+
+ {if check_permission('blocks_edit')} + + {/if} +
+
+
+ +{literal} + +{/literal} \ No newline at end of file diff --git a/admin/templates/blocks/multi.tpl b/admin/templates/blocks/multi.tpl new file mode 100644 index 0000000..01755ff --- /dev/null +++ b/admin/templates/blocks/multi.tpl @@ -0,0 +1,37 @@ +
{#BLOCK_COPY_TITLE#}
+ +
+
+ {#BLOCK_COPY_TIP2#} +
+
+ + + + {foreach from=$errors item=e} + {assign var=message value=$e} +
    +
  • Ошибка: {$message}
  • +
+ {/foreach} + +
+
{#BLOCK_COPY_TITLE#}
+
+
+ + +
 
+
+ +
+
+
diff --git a/admin/templates/blocks/nav.tpl b/admin/templates/blocks/nav.tpl new file mode 100644 index 0000000..3461178 --- /dev/null +++ b/admin/templates/blocks/nav.tpl @@ -0,0 +1 @@ +
  • {#MAIN_BLOCKS#}
  • \ No newline at end of file diff --git a/admin/templates/browser/browser.tpl b/admin/templates/browser/browser.tpl new file mode 100644 index 0000000..ceeedb6 --- /dev/null +++ b/admin/templates/browser/browser.tpl @@ -0,0 +1,184 @@ + + + + + + + + {#MAIN_PAGE_TITLE#} - {*#SUB_TITLE#*} ({$smarty.session.user_name|escape}) + + + + + + + + + + + + + + + {include file="../scripts.tpl"} + + + + + + + + + + +
    + +{if $dir != '/'} +
    +
    +
    + +
    +
    +{/if} + +{foreach from=$dirs item=dir_link key=dir_name} +
    +
    +
    +
    {$dir_name}
    +
    +
    +{/foreach} + +{if $smarty.request.type != 'directory'}{/if} +{foreach from=$files item=file key=file_name} +
    +
    +
    + {if !$recycled} + {if check_permission('mediapool_del')} +
    + +
    + {/if} + {/if} + +
    {$file_name|truncate:20}
    + +
    + {if $recycled} + + {else} +
    + {/if} +
    + +
    {$file.filesize} Кб
    + +
    {$file.moddate}
    + +
    +
    +{/foreach} + +
    + + + + + + + + \ No newline at end of file diff --git a/admin/templates/browser/browser_2frames.tpl b/admin/templates/browser/browser_2frames.tpl new file mode 100644 index 0000000..219d039 --- /dev/null +++ b/admin/templates/browser/browser_2frames.tpl @@ -0,0 +1,325 @@ + + + + + + + + {#MAIN_PAGE_TITLE#} - {*#SUB_TITLE#*} ({$smarty.session.user_name|escape}) + + + + + + + + + + + + + + + {include file="../scripts.tpl"} + + + + + + + + + + + + + + + +
    + +
    + +
    +
    {#MAIN_FILE_MANAGER_TITLE#}
    +
    +
    + {#MAIN_FILE_MANAGER_TIP#} +
    +
    + +
    +
    + + + + + {if check_permission('mediapool_add')} + + {/if} + + + + +
    + +
    + +
    + + {if $smarty.request.type!=''} + + +
    + +
    + + {/if} +
    +
    +
    +   + + {#MAIN_MP_UPLOAD_FILE#} +
    + +
    +
    +
    + +
    +
    +
    + +{if $smarty.session.use_editor == 0} + + + +{else} + + +{/if} + + + + + + \ No newline at end of file diff --git a/admin/templates/browser/browser_upload.tpl b/admin/templates/browser/browser_upload.tpl new file mode 100644 index 0000000..6ec1f1f --- /dev/null +++ b/admin/templates/browser/browser_upload.tpl @@ -0,0 +1,69 @@ + + + +
    +
    +
    + + +
    +
    +
    {#MAIN_MP_SELECT_FILES#}
    +
    +
    +

    You browser doesn't have Flash, Silverlight, Gears, BrowserPlus or HTML5 support.

    +
    +
    + +
    + +
    +
    +
    +
    + + \ No newline at end of file diff --git a/admin/templates/browser/onlycontent.tpl b/admin/templates/browser/onlycontent.tpl new file mode 100644 index 0000000..ce0fc1b --- /dev/null +++ b/admin/templates/browser/onlycontent.tpl @@ -0,0 +1 @@ +{$content} \ No newline at end of file diff --git a/admin/templates/css/browser.css b/admin/templates/css/browser.css new file mode 100644 index 0000000..60839f2 --- /dev/null +++ b/admin/templates/css/browser.css @@ -0,0 +1,99 @@ +/*-------------------- FileManager -------------------------*/ +#files {} + +.imageBlock0 { + float:left; + padding:0; + margin:5px; + width:200px; + height:200px; + margin:3px; + background-color:#fcfcfc; + border: solid 1px #eaeaea; + -moz-border-radius:5px; + -webkit-border-radius:5px; + position:relative; + cursor: pointer; +} +.imageBlock1 { + font-size: 11px; +} +.imageBlock { + margin:36px auto 0 auto; + width: 128px; + height: 128px; + vertical-align: middle; +} +.imageBlock div { + text-align:center; /* horizontal in all browsers */ + display:table-cell; vertical-align:middle; /* ~= valign=center in CSS2 browsers */ + height: 128px; + width: 128px; +} + +.imageBlock img { + vertical-align: middle; +} + +.imageName { + padding:2px; + font-weight:bold; + font-family:Tahoma, Verdana, Arial, Geneva; + font-size: 10px; + line-height: 14px; +} + +.imageBlockHover { + background-color:#eff8fd; + border: solid 1px #d8f0fa; + -moz-border-radius:5px; -webkit-border-radius:5px; +} + +.imageBlockAct { + background-color:#def1fb; + border: solid 1px #b3e4f9; + -moz-border-radius:5px; -webkit-border-radius:5px; +} + +.imageBlockActHover { + background-color:#d5effc; + border: solid 1px #a7e0f8; + -moz-border-radius:5px; -webkit-border-radius:5px; +} + +.mb_name { + position:absolute; + color:#516E48; + top: 5px; + left: 25px; + font-weight:bold; + display:inline; + font-size: 10px; + line-height: 14px; +} +.mb_icon_file { + position:absolute; + top: 5px; + left: 5px; + display:inline; +} +.mb_icon_delete { + position:absolute; + top: 5px; + right: 5px; + display:inline; +} + +a img { + border:0; +} + +.mb_time { + color:#7e7e7e; + font-style:italic; + text-align:center; + font-size: 10px; + line-height: 14px; +} + +.tipsy-inner { padding: 8px 14px 8px 14px; background-color: black; color: white; max-width: 150px; line-height: 14px; } \ No newline at end of file diff --git a/admin/templates/css/color_default.css b/admin/templates/css/color_default.css new file mode 100644 index 0000000..fcf888b --- /dev/null +++ b/admin/templates/css/color_default.css @@ -0,0 +1,1158 @@ +/* ========== General styles ========== */ +body { + background:#f2f4f8; +} + +.wrapper { + margin:0 35px; + clear:both; +} + +.img { + border:1px solid #d5d5d5; +} + +a { + color:#177bbb; +} + +a:hover { + color:#245269; +} + +/* ===== Top navigation ===== */ +.fixed { + background:#12131a; + color:#fff; +} + +/* ===== Top navigation ===== */ +.userNav .lastNav { + width:2px; + height:36px; + background:#12131a; + position:absolute; + top:0; + right:0; +} + +.userNav ul li ul { + border:none; +} + +.userNav ul li span { + padding:10px 12px 8px 8px; +} + +.userNav ul li ul li:hover,.userNav ul li ul li a.active { + background:#177bbb; + color:#fff; +} + +.userNav ul li.dropdown > a { + height:35px; +} + +/* ===== Left navigation ===== */ +.leftNav { + width:180px; + max-width:36%; + margin-top:-1px; + float:left; + margin-bottom:80px; + margin-right:21px; +} + +.leftNav ul li a { + color:#fafafa; + font-size:13px; + display:block; + background:#373840; + margin-top:1px; + text-decoration:none; + border:0; + transition:all 100ms ease-in-out; + -webkit-transition:all 100ms ease-in-out; + -moz-transition:all 100ms ease-in-out; + -o-transition:all 100ms ease-in-out; +} + +.leftNav ul li a:hover { + background:#12131a; + border:0; +} + +.leftNav ul li a.active { + background:#177bbb; + border:0; +} + +#leftNav_show { + position:fixed; + left:0; + top:55px; + width:30px; + height:33px; + background:url(theme_color_default/left-menu-show.png) right top no-repeat; +} + +#leftNav_show #toggle-LeftMenu span { + background-image:url(theme_color_default/left-menu-show.png); +} + +/* ===== navigation subnav ===== */ +ul.sub { + border:none; +} + +ul.sub li { + padding:1px; + margin:1px 0 0; + background:#fff url(../images/leftNavSub.png) repeat; +} + +ul.sub li.active { + border:1px solid #d9dee9; + background:#f1f4f8; +} + +ul.sub li.active a { + color:#484848; +} + +ul.sub li a { + background:url(../images/arrow.gif) no-repeat 7px 11px; + border:none; + color:#ccc; + font-size:11px; +} + +ul.sub li a:hover,.sub li a:active { + font-style:normal; + border:none; + color:#484848; + background:url(../images/arrow.gif) no-repeat 7px 11px; +} + +/* ========== Left navigation subnav + docs ========== */ +ul.sub li a.numberRight { + margin:0; + position:absolute; + top:7px; + right:10px; + float:none; + background:#177bbb; + padding:3px!important; + z-index:100; +} + +ul.sub li a.numberRight:hover { + background-position:0 -42px; +} + +/* ===== Right side content ===== */ +.widget { + margin-top:20px; + border:1px solid #cbd5dd; + display:block; + background:#fff; + clear:both; + -webkit-box-shadow:0 1px 1px rgba(0,0,0,.05); + box-shadow:0 1px 1px rgba(0,0,0,.05); + border-radius:3px; +} + +.widgetS { + margin-top:20px; + border:1px solid #cbd5dd; + display:block; + background:#fff; + border-top:none; + min-width:25%; + float:left; + margin-right:40px; + -webkit-box-shadow:0 1px 1px rgba(0,0,0,.05); + box-shadow:0 1px 1px rgba(0,0,0,.05); +} + +.widgets .left { + float:left; + width:49%; + margin-right:2%; +} + +.widgets .right { + float:right; + width:49%; +} + +.title .num a.basicNum { + background:#177bbb; + border:1px solid #177bbb; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.title .num a.basicNum:hover { + background:#146ca4; + border:1px solid #146ca4; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.widget .num a.basicNum { + background:#177bbb; + border:1px solid #177bbb; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.widget .num a.basicNum:hover { + background:#146ca4; + border:1px solid #146ca4; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.widget .num a.basicNum:active { + background:#146ca4; + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.widget .num a.greenNum { + background:#1aae88; + border:1px solid #1aae88; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.widget .num a.greenNum:hover { + background:#179877; + border:1px solid #179877; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.widget .num a.greenNum:active { + background:#179877; + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.widget .num a.redNum { + background:#e33244; + border:1px solid #e33244; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.widget .num a.redNum:hover { + background:#dd1e32; + border:1px solid #dd1e32; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.widget .num a.redNum:active { + background:#dd1e32; + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.widget .num { + margin:8px 12px 0 0; +} + +.head { + background:#373840; + height:32px; + border-top:1px solid #373840; + border-bottom:1px solid #373840; + position:relative; + color:#fff; + border-top:none; + border-radius:3px; +} + +/* ========== buttons ========== */ +a.button,span.button { + padding:4px 7px; +} + +.basicBtn { + background:#177bbb; + border:1px solid #177bbb; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.basicBtn:hover { + background:#146ca4; + border:1px solid #146ca4; + color:#fff; +} + +.basicBtn:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.blackBtn { + background:#242E42; + border:1px solid #242E42; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.blackBtn:hover { + background:#07090d; + border:1px solid #07090d; + color:#fff; +} + +.blackBtn:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.greenBtn { + background:#1aae88; + border:1px solid #1aae88; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.greenBtn:hover { + background:#179877; + border:1px solid #179877; + color:#fff; +} + +.greenBtn:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.redBtn { + background:#e33244; + border:1px solid #e33244; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.redBtn:hover { + background:#dd1e32; + border:1px solid #dd1e32; + color:#fff; +} + +.redBtn:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.blueBtn { + background:#177bbb; + border:1px solid #177bbb; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.blueBtn:hover { + background:#146ca4; + border:1px solid #146ca4; + color:#fff; +} + +.blueBtn:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.whiteBtn { + background:#fcfcfd; + border:1px solid #d2dae1; + color:#8c91b7; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.whiteBtn:hover { + background:#ebeef4; + border:1px solid #8c91b7; + color:#8c91b7; +} + +.whiteBtn:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#8c91b7; +} + +.greyishBtn { + background:#6F7883; + border:1px solid #6F7883; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.greyishBtn:hover { + background:#5F6A76; + border:1px solid #5F6A76; + color:#fff; +} + +.greyishBtn:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#8c91b7; +} + +/* ===== Table ===== */ +.tableStatic thead td { + padding:3px 0; + text-align:center; + border-left:1px solid #C7D6E6; + border-top:1px solid #C7D6E6; + background:#D5E0EC; + border-bottom:none; + font-size:11px; + font-weight:100; + color:#373840; + vertical-align:middle; + line-height:16px; +} + +.tableStatic thead td:first-child { + border-left:none; +} + +.tableStatic thead td a { + color:#6086AB; +} + +.tableStatic thead td img { + vertical-align:middle; + margin:0 5px; +} + +.tableStatic tbody tr { + border-top:1px solid #d9dee9; + background:#fff; +} + +.tableStatic tbody tr:nth-child(even) { + background:#EDF2F7; +} + +.tableStatic tbody tr:hover { + background:#E3EBF2; +} + +.tableStatic tbody td { + border-left:1px solid #d9dee9; + padding:6px 10px; + vertical-align:middle; +} + +.tableStatic tbody td.actions a { + border:1px solid #d9dee9; + background:#fff; + padding:0; +} + +.tableStatic tbody td.actions a:hover { + border:1px solid #d9dee9; + background:#f9fafc; + padding:0; +} + +.tableStatic tbody tr.header,.tableStatic tbody tr.header:hover { + font-weight:700!important; + background:#373840!important; + color:#fff!important; +} + +/* ========== Pagination ========== */ +.pagination { + margin:auto; + width:auto; + text-align:center; + margin-top:40px; +} + +.pages { +} + +.pages li.prev { + margin-right:15px; +} + +.pages li.next { + margin-left:15px; +} + +.pages li { + display:inline; + margin:0 2px; +} + +.pages li a { + height:25px; + padding:4px 8px; + text-decoration:none; + color:#898fb3; + font-weight:700; + background:#fcfcfd; + border:1px solid #d2dae1; + font-size:11px; +} + +.pages li a:hover { + background:#ebeef4; +} + +.pages li span.active { + background:#ebeef4; + font-size:11px; + color:#898fb3; + border:1px solid #d2dae1; +} + +.pages li .active { + background:#ebeef4; + color:#898fb3; + border-color:#d2dae1; + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); +} + +.pages li .active:hover { + background:#d2dae1; +} + +/* ========== Numbers notifications ========== */ +.numberTop,.numberMiddle,.numberLeft,a.numberLeft { + text-align:center; + display:inline-block; + padding:1px 5px; + color:#fff; + float:right; + margin:10px 15px 10px -5px; + font-size:11px; + line-height:14px; + -moz-border-radius:3px; + -webkit-border-radius:3px; + -khtml-border-radius:3px; + border-radius:3px; +} + +.content .title { + background:#373840; + height:36px; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; +} + +.content .title h5 { + float:left; + color:#fafafa; + font-weight:400; + display:block; + padding:0 0 0 15px; + line-height:36px; +} + +/* ===== PopUp ===== */ +#popup_container { + min-width:300px; + max-width:600px; + background:url(theme_color_default/alert-opacity-overlay.png) repeat; + -moz-border-radius:5px; + -webkit-border-radius:5px; + border-radius:5px; + -moz-box-shadow:0 0 5px #000; + -webkit-box-shadow:0 0 5px #000; + box-shadow:0 0 5px #000; +} + +#popup_title { + text-align:center; + background:#373840; + border-bottom:1px solid #d5d5d5; + cursor:default; + height:32px; + line-height:32px; + color:#fff; +} + +#popup_content { + background:#fafafa; + padding:1em 1.75em; + margin:0; +} + +#popup_message { + text-align:center; +} + +#popup_panel { + text-align:center; + margin:1em 0 0; +} + +#popup_message input[type=text] { + background:#fcfcfc; + border:1px solid #e1e6ef; + padding:5px; + width:258px; +} + +#popup_prompt { + margin:.5em 0; +} + +.breadCrumbHolder.module { + border:solid 1px #e1e6ef; + background:#fff; + margin-top:20px; + -webkit-box-shadow:0 1px 1px rgba(0,0,0,.05); + box-shadow:0 1px 1px rgba(0,0,0,.05); +} + +/* Selects */ +.jqTransformSelectWrapper ul a.selected { + background:#177bbb; + color:#fff; +} + +/* ===== Growl notifications ===== */ +div.jGrowl div.jGrowl-notification,div.jGrowl div.jGrowl-closer { + background-color:#177bbb; +} + +/* ===== Tabs ===== */ +ul.tabs { + background:#373840; + height:32px; + border-bottom:none; + border-top:none; +} + +ul.tabs li { + float:left; + height:32px; + line-height:32px; + border-left:none; + overflow:hidden; + position:relative; + background:none; + font-size:15px; +} + +ul.tabs li a { + text-decoration:none; + display:block; + padding:0 12px; + outline:none; + color:#797979; +} + +ul.tabs li a:hover { + color:#fff; +} + +html ul.tabs li.activeTab { + height:32px; +} + +.tabsRight { + position:relative; +} + +.tabsRight ul.tabs { + float:right; + background:#373840; + height:38px; + border-bottom:1px solid #595959; + position:absolute; + top:0; + right:0; +} + +ul.inact_tabs { + background:#373840; + height:32px; + border-bottom:none; + border-top:none; +} + +ul.inact_tabs li { + float:left; + height:32px; + line-height:32px; + border-left:none; + overflow:hidden; + position:relative; + background:none; + font-size:15px; +} + +ul.inact_tabs li a { + text-decoration:none; + display:block; + padding:0 12px; + outline:none; + color:#797979; +} + +ul.inact_tabs li a:hover { + color:#fff; +} + +html ul.inact_tabs li.activeTab { + background-color:#fafafa; + height:32px; +} + +html ul.inact_tabs li.activeTab a { + color:#373840; +} + +.rowElem:hover { + background:url(../images/backgrounds/grey.png) repeat scroll 0 0 #e9edf4; +} + +.formRight { + margin:12px 12px 12px 2%; +} + +.docaction .actions a { + background:#177bbb; +} + +.mainForm input[type=text],.mainForm input[type=password],.mainForm textarea { + font-size:11px; + background:#FFF; + border:1px solid #d9dee9; + color:#656565; + width:100%; + box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + padding:4px 6px; + display:table-cell; +} + +.mainForm input[type=text]:hover,.mainForm input[type=password]:hover,.mainForm textarea:hover { + border-color:#afbcd4; +} + +.mainForm input[type=text]:focus,.mainForm input[type=password]:focus,.mainForm textarea:focus { + background:#fff; + border-color:#afbcd4; +} + +.mainForm input[readonly],.mainForm input[disabled] { + background:#f5f5f5; + border:1px solid #dadada; + color:#aaa; +} + +.mainForm input[readonly]:hover,.mainForm input[disabled]:hover { + background:#f5f5f5; + border:1px solid #aaa; + color:#656565; +} + +.mainForm input[readonly]:focus,.mainForm input[disabled]:focus { + background:#f5f5f5; + border:1px solid #aaa; + color:#656565; +} + +.mainForm .select, .mainForm select { + font-size:11px; + background:#fff; + border:1px solid #d9dee9; + width:100%; + font-family: Arial,Helvetica,sans-serif; + color:#656565; + padding: 3px 5px; +} + +.mainForm .select:hover, .mainForm select:hover { + border:1px solid #afbcd4; +} + +.mainForm .select option, .mainForm select option { + font-size:11px; + padding: 3px 5px; +} + + +div.jGrowl div.error { + background-color:red; +} + +div.jGrowl div.accept { + background-color:#0c0; +} + +/* ===== Page scrolling ===== */ +#toTop { + background:#177bbb url(theme_color_default/ui-to-top.png) no-repeat left top; + border-radius:3px; +} + +#toTopHover { + background:#177bbb url(theme_color_default/ui-to-top.png) no-repeat left -22px; +} + +/* ========== CMS Stats ========== */ +.cmsStats { + color:#177bbb; + border:1px solid #c9f7f8; + background:#edfcfd; +} + +.cmsStatsAlert { + color:red; + border:1px solid red; + background:#ffb9b9; +} + +/* ===== Messages page ===== */ +.messagesOne .by_user .messageArea { + background:#f7fdfd; + border-color:#c9f7f8; + margin-left:60px; +} + +.by_user .name > strong { + color:#177bbb; +} + +.messagesOne .by_user .aro { + background:url(theme_color_default/message-arrow-left.png) no-repeat; + left:-8px; +} + +.code { + background-color:#e0e6f0; + box-sizing:border-box; + border:1px solid #d9dee9; + color:#177bbb!important; + padding:0 5px; + border-radius:3px; + -moz-border-radius:3px; + -webkit-border-radius:3px; +} + +.code > a { + color:#177bbb!important; +} + +.docaction .code { + background-color:#f2f4f8; + color:#7f88b4!important; + padding:0 5px; + border-radius:3px; + -moz-border-radius:3px; + -webkit-border-radius:3px; +} + +.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active { + background:#177bbb; + font-weight:400; + color:#fff; +} + +.ui-datepicker .ui-datepicker-header { + position:relative; + padding:.2em 0; + background:#177bbb; +} + +.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus { + background:#177bbb; + font-weight:400; + color:#fff; +} + +.ui-state-hover a,.ui-state-hover a:hover { + color:#797979; + text-decoration:none; +} + +.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active { + background:#177bbb; + font-weight:400; + color:#fff; +} + +.ac_results { + padding:0; + border:none; + background-color:#fff; + overflow:hidden; + z-index:99999; +} + +.ac_odd { + background-color:#edfcfd; +} + +.ac_over { + background-color:#e1e6ef; + color:#484848; +} + +.ac_results li { + border:1px solid #e1e6ef; + border-top:none; +} + +.ac_results li strong { + border-bottom:1px dotted; + background-color:#e1e6ef; +} + +.jq-selectbox__select { + overflow:hidden; + height:20px; + border-radius:0; + background-color:#fff; + background-clip:padding-box; + border:1px solid #d9dee9; + -webkit-box-shadow:none; + -moz-box-shadow:none; + box-shadow:none; + color:#444; + text-decoration:none; + white-space:nowrap; + font-size:11px; + line-height:20px; + padding:0 20px 0 10px; +} + +.jq-selectbox__select:hover { + border:1px solid #afbcd4; +} + +.jq-selectbox li:hover { + background:#177bbb; + color:#fff; +} + +/* ===== UI ===== */ +.ui-dialog .ui-dialog-titlebar { + position:relative; + background:#12131a; + border:none; + border-bottom:0; + height:32px; + color:#fafafa; +} + +.ui-widget .title { + background:#373840; + height:32px; + -moz-box-shadow:0 1px 0 #fff; + -webkit-box-shadow:0 1px 0 #fff; + box-shadow:0 1px 0 #fff; +} + +.ui-widget .title h5 { + float:left; + color:#fafafa; + font-weight:400; + display:block; + line-height:32px; + padding:0 0 0 15px; +} + +.ui-widget-header .ui-icon { + background-image:url(../images/jquery_ui/ui-icons_ffffff_256x240.png); +} + +.ui-state-hover .ui-icon,.ui-state-focus .ui-icon { + background-image:url(../images/jquery_ui/ui-icons_888888_256x240.png); +} + +.ui-datepicker .ui-datepicker-title { + margin:0 2.3em; + line-height:1.8em; + text-align:center; + color:#fff; +} + +/* ===== PLUPLOAD ===== */ +.plupload_button { + font-size:10px; + font-weight:700; + text-transform:uppercase; + color:#fff; + line-height:10px; + margin-top:3px; +} + +.plupload_add { + margin-right:10px; + float:left; + background:#177bbb; + border:1px solid #177bbb; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.plupload_add:hover { + background:#146ca4; + border:1px solid #146ca4; + color:#fff; +} + +.plupload_add:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.plupload_disabled,a.plupload_disabled:hover { + background:#f5f5f5!important; + border:1px solid #dadada!important; + color:#aaa!important; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.plupload_start { + background:#1aae88; + border:1px solid #1aae88; + color:#fff; + -moz-box-shadow:none; + -webkit-box-shadow:none; + box-shadow:none; + border-radius:3px; +} + +.plupload_start:hover { + background:#179877; + border:1px solid #179877; + color:#fff; +} + +.plupload_start:active { + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + color:#fff; +} + +.CodeMirror { + font-family:'Consolas','Inconsolas',monospace,Arial!important; + font-size:12px!important; +} + +a.jqTransformCheckbox { + background:transparent url(theme_color_default/checkbox.png) no-repeat 0 0; +} + +a.jqTransformChecked { + background-position:0 bottom; +} + +a.jqTransformCheckedDisable { + background:transparent url(theme_color_default/checkbox2.png) no-repeat 0 0; +} + +a.jqTransformCheckedDisableCheck { + background:transparent url(theme_color_default/checkbox2.png) no-repeat; + background-position:center bottom; +} + +.jqTransformRadio { + background:transparent url(theme_color_default/radio.png) no-repeat 0 1px; + vertical-align:middle; + height:16px; + width:16px; + display:block; +} + +.input-error { + border-color:red!important; +} + +.input-accept { + border-color:#0c0!important; +} + +.ajax-dialog { + background:#f2f4f8!important; +} + +#popup_alert_overlay,.ui-widget-overlay { + background:url(../images/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png)!important; +} + +#footer { + background:#12131a; +} + +#fancybox-content { + background:url(theme_color_default/fancy.png); +} + +.cascad_item .image { + background:transparent url(theme_color_default/field.png); +} diff --git a/admin/templates/css/data_table.css b/admin/templates/css/data_table.css new file mode 100644 index 0000000..88dcf61 --- /dev/null +++ b/admin/templates/css/data_table.css @@ -0,0 +1,155 @@ +/* ===== Dynamic tables ===== */ + +.paging_two_button .ui-button { float: left; cursor: pointer; * cursor: hand; } +.paging_full_numbers .ui-button { padding: 2px 6px; /*margin: 0;*/ cursor: pointer; * cursor: hand; } +.dataTables_paginate .ui-button { margin-right: -0.1em !important; } +.dataTables_wrapper .ui-toolbar { padding: 5px; } + +.dataTables_paginate { width: auto; } +.dataTables_info { padding: 7px 0 0 80px; color: #878787; } + +table.display thead th { padding: 4px 0px 3px 10px; cursor: pointer; * cursor: hand; font-size: 11px; background: #efefef url(../images/NavBg.png) repeat-x; } + +div.dataTables_wrapper .ui-widget-header { font-weight: normal; background: #efefef url(../images/NavBg.png) repeat-x; border-top: 1px solid #D5D5D5; margin-top: -1px; border-right: none; } + + +table.display thead th div.DataTables_sort_wrapper { position: relative; padding-right: 20px; color: #878787; } +table.display thead th div.DataTables_sort_wrapper span { position: absolute; top: 50%; margin-top: -8px; right: 5px; } + + +/* ===== Datatable styles ===== */ + +.dataTables_wrapper { position: relative; _height: 302px; clear: both; } +.dataTables_processing { position: absolute; top: 0px; left: 50%; width: 250px; margin-left: -125px; border: 1px solid #ddd; text-align: center; color: #999; font-size: 11px; padding: 2px 0; } +.dataTables_length { float: left; color: #878787; margin: 7px 5px 0 5px; } +.dataTables_length label { padding-top: 10px; font-size: 11px; } +.dataTables_length select { font-size: 11px; margin: 0 5px; } +.dataTables_filter { text-align: left; margin: 6px 8px 2px 10px; position: absolute; right: 0; top: -34px; color: #878787; font-size: 11px; } +.dataTables_filter input[type="text"] { padding: 3px 5px; border: 1px solid #D5D5D5; width: 200px; position: relative; margin-left: 6px; -moz-border-radius: 2px; -webkit-border-radius: 2px; -khtml-border-radius: 2px; border-radius: 2px; color: #878787; } +.dataTables_filter .srch { position: absolute; right: 6px; top: 7px; background: url(../images/searchSmall.png) no-repeat 0 0; border: none; width: 9px; height: 9px; } +.dataTables_info { float: left; } +.dataTables_paginate { text-align: right; margin: 6px; } + + +/* Pagination nested */ +.paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { height: 19px; width: 19px; margin-left: 3px; float: left; } +.paginate_disabled_previous { background-image: url(../images/back_disabled.jpg); } +.paginate_enabled_previous { background-image: url(../images/back_enabled.jpg); } +.paginate_disabled_next { background-image: url(../images/forward_disabled.jpg); } +.paginate_enabled_next { background-image: url(../images/forward_enabled.jpg); } + + +/* DataTables display */ +table.display { margin: 0 auto; width: 100%; clear: both; border-collapse: collapse; } +table.display tfoot th { padding: 3px 0px 3px 10px; font-weight: bold; font-weight: normal; } +table.display tr.heading2 td { border-bottom: 1px solid #aaa; } +table.display td { padding: 8px 10px; } +table.display td.center { text-align: center; } + + +/* DataTables sorting */ +.sorting_asc { background: url(../images/sort_asc.png) no-repeat center right; } +.sorting_desc { background: url(../images/sort_desc.png) no-repeat center right; } +.sorting { background: url(../images/sort_both.png) no-repeat center right; } +.sorting_asc_disabled { background: url(../images/sort_asc_disabled.png) no-repeat center right; } +.sorting_desc_disabled { background: url(../images/sort_desc_disabled.png) no-repeat center right; } + + +/* DataTables row classes*/ +table.display tr.odd.gradeA { background-color: #ddffdd; } +table.display tr.even.gradeA { background-color: #eeffee; } +table.display tr { border-bottom: 1px solid #D5D5D5; } +table.display td { border-left: 1px solid #D5D5D5; vertical-align: middle; } +table.display td:first-child { border-left: none; } +table.display tr.odd.gradeA { background-color: #fafafa; } +table.display tr.even.gradeA { background-color: #f5f5f5; } +table.display tr.odd.gradeC { background-color: #ddddff; } +table.display tr.even.gradeC { background-color: #eeeeff; } +table.display tr.odd.gradeX { background-color: #ffdddd; } +table.display tr.even.gradeX { background-color: #ffeeee; } +table.display tr.odd.gradeU { background-color: #ddd; } +table.display tr.even.gradeU { background-color: #eee; } + +tr.odd { background-color: #E2E4FF; } +tr.even { background-color: white; } + + +/* Misc */ +.dataTables_scroll { clear: both; } +.top, .bottom { padding: 15px; background-color: #F5F5F5; border: 1px solid #CCCCCC; } +.top .dataTables_info { float: none; } +.clear { clear: both; } +.dataTables_empty { text-align: center; } + +tfoot input { margin: 0.5em 0; width: 100%; color: #444; } +tfoot input.search_init { color: #999; } + +td.group { background-color: #d1cfd0; border-bottom: 2px solid #A19B9E; border-top: 2px solid #A19B9E; } +td.details { background-color: #d1cfd0; border: 2px solid #A19B9E; } + +.example_alt_pagination div.dataTables_info { width: 40%; } +.paging_full_numbers span.paginate_button, .paging_full_numbers span.paginate_active { border: 1px solid #aaa; -webkit-border-radius: 5px; -moz-border-radius: 5px; padding: 2px 5px; margin: 0 3px; cursor: pointer; *cursor: hand; } +.paging_full_numbers span.paginate_button { background-color: #ddd; } +.paging_full_numbers span.paginate_button:hover { background-color: #ccc; } +.paging_full_numbers span.paginate_active { background-color: #99B3FF; } + +table.display tr.even.row_selected td { background-color: #B0BED9; } +table.display tr.odd.row_selected td { background-color: #9FAFD1; } + + +/* Sorting classes for columns. For the standard odd/even */ +tr.odd td.sorting_1 { background-color: #D3D6FF; } +tr.odd td.sorting_2 { background-color: #DADCFF; } +tr.odd td.sorting_3 { background-color: #E0E2FF; } + +tr.even td.sorting_1 { background-color: #EAEBFF; } +tr.even td.sorting_2 { background-color: #F2F3FF; } +tr.even td.sorting_3 { background-color: #F9F9FF; } + + +/* For the Conditional-CSS grading rows */ +/* + Colour calculations (based off the main row colours) + Level 1: + dd > c4 + ee > d5 + Level 2: + dd > d1 + ee > e2 + */ +tr.odd.gradeA td.sorting_1 { background-color: #f4f4f4; } +tr.odd.gradeA td.sorting_2 { background-color: #d1ffd1; } +tr.odd.gradeA td.sorting_3 { background-color: #d1ffd1; } + +tr.even.gradeA td.sorting_1 { background-color: #efefef; } +tr.even.gradeA td.sorting_2 { background-color: #e2ffe2; } +tr.even.gradeA td.sorting_3 { background-color: #e2ffe2; } + +tr.odd.gradeC td.sorting_1 { background-color: #c4c4ff; } +tr.odd.gradeC td.sorting_2 { background-color: #d1d1ff; } +tr.odd.gradeC td.sorting_3 { background-color: #d1d1ff; } + +tr.even.gradeC td.sorting_1 { background-color: #d5d5ff; } +tr.even.gradeC td.sorting_2 { background-color: #e2e2ff; } +tr.even.gradeC td.sorting_3 { background-color: #e2e2ff; } + +tr.odd.gradeX td.sorting_1 { background-color: #ffc4c4; } +tr.odd.gradeX td.sorting_2 { background-color: #ffd1d1; } +tr.odd.gradeX td.sorting_3 { background-color: #ffd1d1; } + +tr.even.gradeX td.sorting_1 { background-color: #ffd5d5; } +tr.even.gradeX td.sorting_2 { background-color: #ffe2e2; } +tr.even.gradeX td.sorting_3 { background-color: #ffe2e2; } + +tr.odd.gradeU td.sorting_1 { background-color: #c4c4c4; } +tr.odd.gradeU td.sorting_2 { background-color: #d1d1d1; } +tr.odd.gradeU td.sorting_3 { background-color: #d1d1d1; } + +tr.even.gradeU td.sorting_1 { background-color: #d5d5d5; } +tr.even.gradeU td.sorting_2 { background-color: #e2e2e2; } +tr.even.gradeU td.sorting_3 { background-color: #e2e2e2; } + + +/* Row highlighting example */ +.ex_highlight #example tbody tr.even:hover, #example tbody tr.even td.highlighted { background-color: #ECFFB3; } +.ex_highlight #example tbody tr.odd:hover, #example tbody tr.odd td.highlighted { background-color: #E6FF99; } \ No newline at end of file diff --git a/admin/templates/css/jquery-ui.css b/admin/templates/css/jquery-ui.css new file mode 100644 index 0000000..f9c9ce0 --- /dev/null +++ b/admin/templates/css/jquery-ui.css @@ -0,0 +1,566 @@ +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } +/* + * jQuery UI Accordion 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Accordion#theming + */ +/* IE/Win - Fix animation bug - #4615 */ +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +/* + * jQuery UI Autocomplete 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Autocomplete#theming + */ +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +/* + * jQuery UI Menu 1.8.16 + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Menu#theming + */ +.ui-menu { + list-style:none; + padding: 2px; + margin: 0; + display:block; + float: left; +} +.ui-menu .ui-menu { + margin-top: -3px; +} +.ui-menu .ui-menu-item { + margin:0; + padding: 0; + zoom: 1; + float: left; + clear: left; + width: 100%; +} +.ui-menu .ui-menu-item a { + text-decoration:none; + display:block; + padding:.2em .4em; + line-height:1.5; + zoom:1; +} +.ui-menu .ui-menu-item a.ui-state-hover, +.ui-menu .ui-menu-item a.ui-state-active { + font-weight: normal; + margin: -1px; +} +/* + * jQuery UI Button 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Button#theming + */ +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-text-only .ui-button-text { padding: .4em 1em; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 7px; } +.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ +/* + * jQuery UI Datepicker 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +}/* + * jQuery UI Dialog 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Dialog#theming + */ +.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } +.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } +.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } +.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } +.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } +.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } +/* + * jQuery UI Progressbar 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Progressbar#theming + */ +.ui-progressbar { height:2em; text-align: left; } +.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }/* + * jQuery UI Resizable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Resizable#theming + */ +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block; } +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* + * jQuery UI Selectable 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Selectable#theming + */ +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } +/* + * jQuery UI Slider 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Slider#theming + */ +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; } +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; } + +.ui-slider-horizontal { height: .8em; } +.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: .8em; height: 100px; } +.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; }/* + * jQuery UI Tabs 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Tabs#theming + */ +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } +/* + * jQuery UI CSS Framework 1.8.16 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/ + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } +.ui-widget-content a { color: #222222/*{fcContent}*/; } +.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } +.ui-widget-header a { color: #222222/*{fcHeader}*/; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url('../images/jquery_ui/ui-bg_glass_75_e6e6e6_1x400.png')/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } +.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } +.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } +.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } +.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff --git a/admin/templates/css/jquery-ui_custom.css b/admin/templates/css/jquery-ui_custom.css new file mode 100644 index 0000000..0edb3e8 --- /dev/null +++ b/admin/templates/css/jquery-ui_custom.css @@ -0,0 +1,531 @@ +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + */ + +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { display: none; } +.ui-helper-hidden-accessible { position: absolute; left: -99999999px; } +.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } +.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } +.ui-helper-clearfix { display: inline-block; } +/* required comment for clearfix to work in Opera \*/ +* html .ui-helper-clearfix { height:1%; } +.ui-helper-clearfix { display:block; } +/* end clearfix */ +.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { cursor: default !important; } + + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } + + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } + +.ui-widget .title { + background: url(../images/titleBg.png) repeat-x; + height: 36px; + -moz-box-shadow: 0 1px 0 #fff; + -webkit-box-shadow: 0 1px 0 #fff; + box-shadow: 0 1px 0 #fff; +} + +.ui-widget .title h5 { + float: left; + color: #fafafa; + font-weight: normal; + display: block; + padding: 0 0 0 15px; + line-height: 36px; +} + +#ajax-dialog { + background: #FFF8F2 url('../images/backgrounds/blueprint.png') !important; +} + +/* + * jQuery UI CSS Framework @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + */ + + +/* Component containers +----------------------------------*/ +.ui-widget .ui-widget { font-size: 1em; } +/*.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }*/ +.ui-widget-content { } +.ui-widget-content a { /*color: #d5d5d5;*/ } +.ui-widget-header { font-weight: bold; } +.ui-widget-header a { color: #222222; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border-left: 1px solid #d5d5d5; font-weight: normal; border-bottom: 1px solid #D5D5D5; } +th.ui-state-default:first-child { border-left: none; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } +/*.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { background: url(../images/titleBg.png) repeat-x 0 -39px; font-weight: normal; color: #d5d5d5; }*/ +.ui-state-hover a, .ui-state-hover a:hover { color: #797979; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { background: url(../images/titleBg.png) repeat-x 0 -39px; font-weight: normal; color: #fff; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #797979; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(../images/jquery_ui/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +/*.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }*/ +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); } +.ui-widget-content .ui-icon {background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); } +.ui-widget-header .ui-icon {background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); } +.ui-state-default .ui-icon { background-image: url(../images/jquery_ui/ui-icons_888888_256x240.png); } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(../images/jquery_ui/ui-icons_222222_256x240.png); } +.ui-state-active .ui-icon {background-image: url(../images/jquery_ui/ui-icons_454545_256x240.png); } +.ui-state-highlight .ui-icon {background-image: url(../images/jquery_ui/ui-icons_2e83ff_256x240.png); } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../images/jquery_ui/ui-icons_cd0a0a_256x240.png); } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +.ui-corner-tl { -moz-border-radius-topleft: 2px; -webkit-border-top-left-radius: 2px; border-top-left-radius: 2px; } +.ui-corner-tr { -moz-border-radius-topright: 2px; -webkit-border-top-right-radius: 2px; border-top-right-radius: 2px; } +.ui-corner-bl { -moz-border-radius-bottomleft: 2px; -webkit-border-bottom-left-radius: 2px; border-bottom-left-radius: 2px; } +.ui-corner-br { -moz-border-radius-bottomright: 2px; -webkit-border-bottom-right-radius: 2px; border-bottom-right-radius: 2px; } +.ui-corner-top { -moz-border-radius-topleft: 2px; -webkit-border-top-left-radius: 2px; border-top-left-radius: 2px; -moz-border-radius-topright: 2px; -webkit-border-top-right-radius: 2px; border-top-right-radius: 2px; } +.ui-corner-bottom { -moz-border-radius-bottomleft: 2px; -webkit-border-bottom-left-radius: 2px; border-bottom-left-radius: 2px; -moz-border-radius-bottomright: 2px; -webkit-border-bottom-right-radius: 2px; border-bottom-right-radius: 2px; } +.ui-corner-right { -moz-border-radius-topright: 2px; -webkit-border-top-right-radius: 2px; border-top-right-radius: 2px; -moz-border-radius-bottomright: 2px; -webkit-border-bottom-right-radius: 2px; border-bottom-right-radius: 2px; } +.ui-corner-left { -moz-border-radius-topleft: 2px; -webkit-border-top-left-radius: 2px; border-top-left-radius: 2px; -moz-border-radius-bottomleft: 2px; -webkit-border-bottom-left-radius: 2px; border-bottom-left-radius: 2px; } +.ui-corner-all { -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; } + +/* Overlays */ +.ui-widget-overlay { background: #000; opacity: 0.4; filter:Alpha(Opacity=40); } +.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(../images/jquery_ui/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; } + + +/* ===== UI resizable ===== */ + +.ui-resizable { position: relative;} +.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;} +.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; } +.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; } +.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; } +.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; } +.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; } +.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; } +.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; } +.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; } +.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;} + +.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; } + +.ui-accordion { width: 100%; } +.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; } +.ui-accordion .ui-accordion-li-fix { display: inline; } +.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; } +.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; } +.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; } +.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; } +.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; } +.ui-accordion .ui-accordion-content-active { display: block; } +.ui-autocomplete { position: absolute; cursor: default; } + +/* workarounds */ +* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ + +.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; float: left; } +.ui-menu .ui-menu { margin-top: -3px; } +.ui-menu .ui-menu-item { margin:0; padding: 0; zoom: 1; float: left; clear: left; width: 100%; } +.ui-menu .ui-menu-item a { text-decoration:none; display:block; padding:.2em .4em; line-height:1.5; zoom:1; } +.ui-menu .ui-menu-item a.ui-state-hover, .ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; +} + + + +.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ +.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ +button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ +.ui-button-icons-only { width: 3.4em; } +button.ui-button-icons-only { width: 3.7em; } + +/*button text element */ +.ui-button .ui-button-text { display: block; line-height: 1.4; } +.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } +.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } +.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } +.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } +/* no icon support for input elements, provide padding by default */ +input.ui-button { padding: .4em 1em; } + +/*button icon element(s) */ +.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } +.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } +.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } +.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } +.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } + +/*button sets*/ +.ui-buttonset { margin-right: 5px; } +.ui-buttonset .ui-button { margin: 0 3px; background: #FAFAFA; border: 1px solid #D5D5D5; line-height: 14px; font-size: 11px; } + +/* workarounds */ +button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ + + + +/* ===== UI Dialog ===== */ + +.ui-dialog { position: absolute; padding: 5px; width: auto; background: url(../images/alertOpacityOverlay.png) repeat; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; -moz-box-shadow: 0 0 5px #000; -webkit-box-shadow: 0 0 5px #000; box-shadow: 0 0 5px #000; } +.ui-dialog input[type=text] { /*width: 96%!important;*/ margin: 12px 0 10px 0; } +/*.ui-dialog form { text-align: center; }*/ +.ui-dialog .icon { padding: 1px 6px 0 0; float: left; } +.ui-dialog p { padding: 0!important; } +.ui-dialog .ui-dialog-titlebar { position: relative; background: url(../images/titleBg.png) repeat-x; border: 1px solid #24272B; border-bottom: 0; height: 32px; color: #FAFAFA; } +.ui-dialog .ui-dialog-title { float: left; height: 32px; font-size: 16px; padding: 0 12px 0 12px; line-height: 32px; } +.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: 6px; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } +.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; opacity: 0.6; } +.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 1px; background: transparent; } +.ui-dialog .ui-dialog-content { position: relative; overflow: auto; zoom: 1; padding: 10px 12px; background: url(../images/widgetBg.png) repeat; border: 1px solid #121212; border-top: none; } +.ui-dialog .ui-dialog-buttonpane { padding: 0 12px; font-size: .9em; background: url(../images/titleBg.png) repeat-x; border: 1px solid #24272B; border-top: none; height: 36px; } +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { /*float: right;*/ text-align: center; margin: 0 2px; } +.ui-dialog .ui-dialog-buttonpane button { font-size: 10px; font-weight: bold; text-transform: uppercase; padding: 3px 12px 4px 12px; cursor: pointer; font-family: Arial, Helvetica, sans-serif; border: 1px solid #292D2F; color: #fafafa; margin: 7px 0 5px 0; background: url(../images/ui/basicBtn.png) repeat-x 0 0; } +.ui-dialog .ui-dialog-buttonpane button:hover { background-position: 0 -27px; } +.ui-dialog .ui-dialog-buttonpane button:active { background-position: 0 -54px; } +.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 5px; bottom: 5px; opacity: 0.3; } +.ui-draggable .ui-dialog-titlebar { cursor: move; } + + + +/* ===== UI Slider ===== */ + +.ui-slider { position: relative; text-align: left; } +.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 16px; height: 16px; cursor: default; background: url(../images/ui/handle.png) no-repeat !important; border: none; cursor: pointer; } +.ui-slider .ui-slider-handle:hover { background: url(../images/ui/handle_hover.png) no-repeat !important;} +.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background: url(../images/ui/sliderOverlay.png) repeat-x !important; -moz-border-radius: 4px; -webkit-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; } + +.ui-slider-horizontal { height: 6px; background: url(../images/ui/sliderBg.png) repeat-x; clear: both; margin-top: 10px; -moz-box-shadow: 0 1px 0 #363B3E; -webkit-box-shadow: 0 1px 0 #363B3E; box-shadow: 0 1px 0 #363B3E; } +.ui-slider-horizontal .ui-slider-handle { top: -5px; margin-left: -.6em; } +.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; } +.ui-slider-horizontal .ui-slider-range-min { left: 0; } +.ui-slider-horizontal .ui-slider-range-max { right: 0; } + +.ui-slider-vertical { width: 6px; height: 100px; background: url(../images/ui/sliderBgVert.png) repeat-y; -moz-box-shadow: 0 0 1px #363B3E; -webkit-box-shadow: 0 0 1px #363B3E; box-shadow: 0 0 1px #363B3E; } +.ui-slider-vertical .ui-slider-handle { left: -5px; margin-left: 0; margin-bottom: -.6em; } +.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; background: url(../images/ui/sliderOverlayVert.png) repeat-y; } +.ui-slider-vertical .ui-slider-range-min { bottom: 0; } +.ui-slider-vertical .ui-slider-range-max { top: 0; } + + + +/* ===== UI Tabs ===== */ + +.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ +.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; } +.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; } +.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; } +.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; } +.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */ +.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; } +.ui-tabs .ui-tabs-hide { display: none !important; } + + + + +/* ===== UI Datepicker ===== */ + +.datepicker { width: 58px!important; } +.ui-datepicker { width: 17em; padding: .2em .2em 0; border: 1px solid #1E2226; background: url(../images/darkBg.png) repeat; margin-top: 1px; z-index: 9999 !important; display: none; } +.ui-datepicker-append { margin-left: 10px; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; background: url(../images/titleBg.png) repeat-x 0 -39px; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 2px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; background: none!important; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; background: none!important; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker table .ui-state-default { border: none; -moz-border-radius: 2px; -webkit-border-radius: 2px; -khtml-border-radius: 2px; border-radius: 2px;} +.ui-datepicker table tbody { font-size: 11px; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; color: #fff; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: 2px 6px 2px 0; text-align: right; text-decoration: none; background: url(../images/widgetBg.png) repeat-x; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; width:auto; overflow:visible; border: 0; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; } + + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + + + +/* ===== UI Progress bar ===== */ + +.ui-progressbar { position:relative; height: 16px; text-align: left; margin-top: 5px; background: url(../images/ui/progress.png) repeat-x;} +.ui-progressbar .ui-progressbar-value { margin: -1px 0 0 -1px; height:100%; overflow: hidden; display: block; background: url(../images/ui/progressOverlay.png) repeat-x; border-right: 1px solid #3c95d8; } + +.ui-progressbar .text { position:absolute; top:0; right:0; bottom:0; left:0; color:#424242; text-align:center; text-shadow: 1px 1px 2px #fff; z-index:10; font-weight:bold } + +.pbar .ui-progressbar-value {display:block !important} +.pbar { overflow: hidden; background: url(../images/ui/progress.png) repeat-x;} +.percent { position: relative; text-align: right; margin-bottom: 5px; font-size: 11px; } +.elapsed { position: relative; text-align: right; margin-top: 5px; font-size: 11px;} + +.ui-timepicker-div { color: #D5D5D5; } +.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } +.ui-timepicker-div dl { text-align: left; } +.ui-timepicker-div dl dt { height: 25px; margin-bottom: -25px; } +.ui-timepicker-div dl dd { margin: 0 10px 10px 65px; } +.ui-timepicker-div td { font-size: 90%; } +.ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } + +.ui-draggable-dragging {opacity: 0.5; box-shadow: none !important} +/*.ui-draggable-dragging .ui-dialog-content {display: none !important}*/ + +.fixed-dialog{ + position: fixed; +} + +.ui-datepicker-calendar a { + color: #fff; +} +.ajax-dialog input[type=text] { + margin: 0 !important; +} \ No newline at end of file diff --git a/admin/templates/css/jquery.fancybox.css b/admin/templates/css/jquery.fancybox.css new file mode 100644 index 0000000..e8fa2cd --- /dev/null +++ b/admin/templates/css/jquery.fancybox.css @@ -0,0 +1,359 @@ +/* + * FancyBox - jQuery Plugin + * Simple and fancy lightbox alternative + * + * Examples and documentation at: http://fancybox.net + * + * Copyright (c) 2008 - 2010 Janis Skarnelis + * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated. + * + * Version: 1.3.4 (11/11/2010) + * Requires: jQuery v1.3+ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +#fancybox-loading { + position: fixed; + top: 50%; + left: 50%; + width: 40px; + height: 40px; + margin-top: -20px; + margin-left: -20px; + cursor: pointer; + overflow: hidden; + z-index: 1104; + display: none; +} + +#fancybox-loading div { + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 480px; + background-image: url('../images/fancybox/fancybox.png'); +} + +#fancybox-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 1100; + display: none; +} + +#fancybox-tmp { + padding: 0; + margin: 0; + border: 0; + overflow: auto; + display: none; +} + +#fancybox-wrap { + position: absolute; + top: 0; + left: 0; + padding: 20px; + z-index: 1101; + outline: none; + display: none; +} + +#fancybox-outer { + position: relative; + width: 100%; + height: 100%; + background: #fff; +} + +#fancybox-content { + width: 0; + height: 0; + padding: 0; + outline: none; + position: relative; + overflow: hidden; + z-index: 1102; + border: 0px solid #fff; +} + +#fancybox-hide-sel-frame { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: transparent; + z-index: 1101; +} + +#fancybox-close { + position: absolute; + top: -15px; + right: -15px; + width: 30px; + height: 30px; + background: transparent url('../images/fancybox/fancybox.png') -40px 0px; + cursor: pointer; + z-index: 1103; + display: none; +} + +#fancybox-error { + color: #444; + font: normal 12px/20px Arial; + padding: 14px; + margin: 0; +} + +#fancybox-img { + width: 100%; + height: 100%; + padding: 0; + margin: 0; + border: none; + outline: none; + line-height: 0; + vertical-align: top; +} + +#fancybox-frame { + width: 100%; + height: 100%; + border: none; + display: block; +} + +#fancybox-left, #fancybox-right { + position: absolute; + bottom: 0px; + height: 100%; + width: 35%; + cursor: pointer; + outline: none; + background: transparent url('../images/fancybox/blank.gif'); + z-index: 1102; + display: none; +} + +#fancybox-left { + left: 0px; +} + +#fancybox-right { + right: 0px; +} + +#fancybox-left-ico, #fancybox-right-ico { + position: absolute; + top: 50%; + left: -9999px; + width: 30px; + height: 30px; + margin-top: -15px; + cursor: pointer; + z-index: 1102; + display: block; +} + +#fancybox-left-ico { + background-image: url('../images/fancybox/fancybox.png'); + background-position: -40px -30px; +} + +#fancybox-right-ico { + background-image: url('../images/fancybox/fancybox.png'); + background-position: -40px -60px; +} + +#fancybox-left:hover, #fancybox-right:hover { + visibility: visible; /* IE6 */ +} + +#fancybox-left:hover span { + left: 20px; +} + +#fancybox-right:hover span { + left: auto; + right: 20px; +} + +.fancybox-bg { + position: absolute; + padding: 0; + margin: 0; + border: 0; + width: 20px; + height: 20px; + z-index: 1001; +} + +#fancybox-bg-n { + top: -20px; + left: 0; + width: 100%; + background-image: url('../images/fancybox/fancybox-x.png'); +} + +#fancybox-bg-ne { + top: -20px; + right: -20px; + background-image: url('../images/fancybox/fancybox.png'); + background-position: -40px -162px; +} + +#fancybox-bg-e { + top: 0; + right: -20px; + height: 100%; + background-image: url('../images/fancybox/fancybox-y.png'); + background-position: -20px 0px; +} + +#fancybox-bg-se { + bottom: -20px; + right: -20px; + background-image: url('../images/fancybox/fancybox.png'); + background-position: -40px -182px; +} + +#fancybox-bg-s { + bottom: -20px; + left: 0; + width: 100%; + background-image: url('../images/fancybox/fancybox-x.png'); + background-position: 0px -20px; +} + +#fancybox-bg-sw { + bottom: -20px; + left: -20px; + background-image: url('../images/fancybox/fancybox.png'); + background-position: -40px -142px; +} + +#fancybox-bg-w { + top: 0; + left: -20px; + height: 100%; + background-image: url('../images/fancybox/fancybox-y.png'); +} + +#fancybox-bg-nw { + top: -20px; + left: -20px; + background-image: url('../images/fancybox/fancybox.png'); + background-position: -40px -122px; +} + +#fancybox-title { + font-family: Helvetica; + font-size: 12px; + z-index: 1102; +} + +.fancybox-title-inside { + padding-bottom: 10px; + text-align: center; + color: #333; + background: #fff; + position: relative; +} + +.fancybox-title-outside { + padding-top: 10px; + color: #fff; +} + +.fancybox-title-over { + position: absolute; + bottom: 0; + left: 0; + color: #FFF; + text-align: left; +} + +#fancybox-title-over { + padding: 10px; + background-image: url('../images/fancybox/fancy_title_over.png'); + display: block; +} + +.fancybox-title-float { + position: absolute; + left: 0; + bottom: -20px; + height: 32px; +} + +#fancybox-title-float-wrap { + border: none; + border-collapse: collapse; + width: auto; +} + +#fancybox-title-float-wrap td { + border: none; + white-space: nowrap; +} + +#fancybox-title-float-left { + padding: 0 0 0 15px; + background: url('../images/fancybox/fancybox.png') -40px -90px no-repeat; +} + +#fancybox-title-float-main { + color: #FFF; + line-height: 29px; + font-weight: bold; + padding: 0 0 3px 0; + background: url('../images/fancybox/fancybox-x.png') 0px -40px; +} + +#fancybox-title-float-right { + padding: 0 0 0 15px; + background: url('../images/fancybox/fancybox.png') -55px -90px no-repeat; +} + +/* IE6 */ + +.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_close.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_nav_left.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_nav_right.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; } +.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_title_left.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_title_main.png', sizingMethod='scale'); } +.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_title_right.png', sizingMethod='scale'); } + +.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame { + height: expression(this.parentNode.clientHeight + "px"); +} + +#fancybox-loading.fancybox-ie6 { + position: absolute; margin-top: 0; + top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px'); +} + +#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_loading.png', sizingMethod='scale'); } + +/* IE6, IE7, IE8 */ + +.fancybox-ie .fancybox-bg { background: transparent !important; } + +.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_n.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_ne.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_e.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_se.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_s.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_sw.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_w.png', sizingMethod='scale'); } +.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='../images/fancybox/fancy_shadow_nw.png', sizingMethod='scale'); } \ No newline at end of file diff --git a/admin/templates/css/login.css b/admin/templates/css/login.css new file mode 100644 index 0000000..31c6db1 --- /dev/null +++ b/admin/templates/css/login.css @@ -0,0 +1,203 @@ +/* For IE */ +@font-face { + font-family: "Cuprum"; + src: url('../fonts/cuprum.eot'); +} +/* For SAFARI */ +@font-face { + font-family: 'Cuprum'; + font-style: normal; + font-weight: normal; + src: local('Cuprum'), url('../fonts/cuprum.ttf') format('truetype'); +} +/* Other browsers */ +@font-face { + font-family: 'Cuprum'; + font-style: normal; + font-weight: normal; + src: local('Cuprum'), url('../fonts/cuprum.woff') format('woff'); +} + +html { height: 100%; } +* html body { height: 100%; } +body { margin: 0; padding: 0; font-size: 11px; color: #424242; font-family: Arial, Helvetica, sans-serif; line-height: 18px; min-height: 100%; position: relative; } + +/* ========== General styles ========== */ + +.wrapper { margin: 0 5%; clear: both; } +.img { border: 1px solid #d5d5d5; } + +/* ========== Typo ========== */ + +h1, h2, h3, h4, h5, h6, ul.tabs li a, .leftNav ul li a, .stats ul li span, .userLink, .errorPage p, .ui-dialog .ui-dialog-title { font-family: 'Cuprum', sans-serif; font-weight: normal; } +h1 { font-size: 24px; } +h2 { font-size: 22px; } +h3 { font-size: 20px; } +h4 { font-size: 18px; } +h5 { font-size: 16px; } +h6 { font-size: 14px; } + +blockquote { border : 1px solid #d5d5d5; margin-top: 40px; padding: 15px 10px; quotes: "\201C" "\201D"; background: #fafafa; text-align: center; font-style: italic; font-size: 12px; border-left: 4px solid #d5d5d5; } +blockquote:before { content: open-quote; font-weight: bold; } +blockquote:after { content: close-quote; font-weight: bold; } + +.red { color: #B55D5C; } +.green { color: #2a8827; } + +p { padding: 12px 0 0 0; } +.p12 { padding: 12px; } +.pt12 { padding-top: 12px; } + +.legendLabel span { display: block; margin: 0 5px; } +.legendColorBox { padding-left: 10px; } + + +/* ========== Additional reset classes ========== */ + +.mt40 { margin-top: 40px; } +.nomargin { margin: 0!important; } +.nopadding { padding: 0!important; } +.noborder { border: none!important; } +.nobg { background: none!important; } +.floatleft { display: block; float: left; } +.floatright { display: block; float: right; } +.aligncenter { text-align: center; } +.fix { clear: both; } +.first { margin-top: 22px!important; } +.inactive { margin-top: 0px; color: #2B6893; } + +.ml122 { margin-left: 122px; } +.w40 { width: 40%; } + +/* ===== Top navigation ===== */ + +#topNav { height: 36px; display: block; } +.fixed { position: fixed; background: url(../images/topNav.jpg) repeat; width: 100%; color: #eeeeee; border-bottom: 1px solid #4a4f51; z-index: 999; } + +.welcome { float: left; } +.welcome img { float: left; margin: 8px 8px 8px 0 } +.welcome span { padding: 8px 5px; display: block; white-space: nowrap; float: left; font-size: 11px; } + +.userNav { float: right; z-index: 6000; position: relative; font-size: 11px; } +.userNav .lastNav { width: 2px; height: 36px; background: url(../images/navSep.png) repeat-y; position: absolute; top: 0; right: 0; } +.userNav ul { margin-right: 2px; } +.userNav ul li { display: inline; float: left; position: relative; cursor: pointer; border-right: 1px solid #3F3F3F; } +.userNav ul li:first-child { border-left: 1px solid #3F3F3F; } +.userNav ul li a { color: #eeeeee; text-decoration: none; display: block; float: left; } +.userNav ul li:hover, .selected { background: #212121; } +.userNav ul li span { display: block; padding: 8px 12px 8px 8px; float: left; } +.userNav ul li img { float: left; display: block; margin: 13px 2px 11px 14px; } + +/* ===== Widgets ===== */ +.twoOne { width: 50%; } +.widget, .content .title, .count, .widget .num a, a.count1, .table, .breadCrumb, .earnings, .leftNav ul li a, .listData .cNote, .pages li a, .errorPage, .btn14, .btn55, .loginPanel, .customfile { -moz-border-radius: 2px; -webkit-border-radius: 2px; -khtml-border-radius: 2px; border-radius: 2px; } + +.widgets { clear: both; } +.widgets .left { float: left; /*width: 344px;*/ width: 48%; margin-right: 4%; } +.widgets .right { float: right; /*width: 344px;*/ width: 48%; } + +.content { padding-bottom: 80px; overflow: hidden; } +.content .title { background: url(../images/darkBg.jpg) repeat-x; height: 36px; -moz-box-shadow: 0 1px 0 #fff; -webkit-box-shadow: 0 1px 0 #fff; box-shadow: 0 1px 0 #fff; } +.content .title h5 { float: left; color: #fafafa; font-weight: normal; display: block; padding: 7px 15px; } + +/* ===== Right side content ===== */ +.widget { /*width: 342px;*/ /*width: 100%;*/ margin-top: 40px; border: 1px solid #d5d5d5; display: block; background: #fafafa; clear: both; border-top: none; } +.widgetS { /*width: 342px;*/ /*width: 100%;*/ margin-top: 40px; border: 1px solid #d5d5d5; display: block; background: #fafafa; border-top: none; min-width: 25%; float: left; margin-right: 40px; } + +.widget .body { padding: 12px 14px; } + +.userLink { font-size: 16px; padding-top: 3px; display: block; margin-left: 25px; white-space: nowrap; } +.userWidget { padding: 6px 12px 0 12px; display: block; float: left; } + +/* ===== Forms ===== */ + +.mainForm label { /*margin-right: 15px;*/ display: block; float:left; padding: 4px 10px; } +.rowElem { clear: both; border-top: 1px solid #e7e7e7; padding: 10px 14px; position: relative; } +.rowElem:first-child { border-top: none; } +.rowElem > label { padding: 15px 0; width: 14%; } +.rowElem .topLabel { padding: 5px 12px 12px 0; width: 100%; } + +#valid input { position: relative; } + +/* Inputs */ +.jqTransformInputWrapper { float: left; } +.jqTransformInputWrapper > div { width: 550px; } + +.mainForm input[type=text], .mainForm textarea, .mainForm input[type=password] { background: #fff; width: 100%; border: 1px solid #d5d5d5; padding: 5px; font-size: 11px; font-family: Arial, Helvetica, sans-serif; } +.mainForm input[type=text]:hover, .mainForm input[type=password]:hover, .mainForm textarea:hover { background: #fcfcfc; border: 1px solid #d1d1d1; } +.mainForm input[type=text]:focus, .mainForm input[type=password]:focus, .mainForm textarea:focus { border: 1px solid #bbc1c9; background: #fff; } + +.submitForm { float: right; margin: 1px 14px 22px 14px; } + +.jqTransformInputWrapper_hover input{ background: #f6f6f6; } +.jqTransformInputWrapper_focus input { background: #f6f6f6; border: 1px solid #cad1d4; } + +.jqTransformSafari .jqTransformInputInner div { position: relative; overflow: hidden; margin:0px 8px; } +.jqTransformSafari .jqTransformInputInner div input { background: none; position: absolute; top: -10px; left: -2px; height: 42px; padding-left: 4px; } + +/* Checkboxes */ +span.jqTransformCheckboxWrapper{ display:block;float:left; margin-top:6px; } +a.jqTransformCheckbox { background: transparent url(../images/forms/checkbox.png) no-repeat 0 0px ; vertical-align: middle; height: 15px; width: 15px; display:block;/*display: -moz-inline-block;*/ } + +a.jqTransformChecked { background-position: center bottom;} /* Checked - Used for both Radio and Checkbox */ + +.jqTransformHidden {display: none;} /* used to hide the original form elements */ + + + +/* ========== Buttons ========== */ +input[type=submit], input[type=reset], input[type=button], button, .button { + font-size: 10px; + font-weight: bold; + text-transform: uppercase; + padding: 4px 12px 4px 12px; + cursor: pointer; + font-family: Arial, Helvetica, sans-serif; + line-height: 12px; +} +.mainForm input[type="text"], .mainForm input[type="password"] { + padding: 0px 27px 0px 5px; +} + +.mainForm .loginEmail { background: #fff url(../images/icons/loginEmail.png) no-repeat 180px 3px !important; } +.mainForm .loginPassword { background: #fff url(../images/icons/loginLock.png) no-repeat 180px 3px !important; } + +.basicBtn { background: url(../images/ui/blueBtn.png) repeat-x 0 0; border: 1px solid #336699; color: #fff; -moz-box-shadow: 0 0 2px #336699; -webkit-box-shadow: 0 0 2px #336699; box-shadow: 0 0 2px #336699; } +.basicBtn:hover { background-position: 0 -25px; } +.basicBtn:active { background-position: 0 -50px; } + + +/* ========== Login page ========== */ +.loginPanel { width: 342px; background: #fafafa; border: 1px solid #d5d5d5; border-top: 0; display: block;} +.loginWrapper { margin: -156px 0 0 -160px; position: absolute; top: 50%; left: 50%; } +.loginLogo { position: absolute; width: 190px; height: 44px; display: block; top: -80px; left: 50%; margin-left: -95px; } +.loginPanel h5 { font-weight: normal; padding: 7px 12px 7px 12px; float: left; } + + + +.loginPanel label { width: 80px; } +.rememberMe { margin-left: 12px; } +.rememberMe label { padding: 4px 12px!important; width: auto; } +.loginInput { width: 200px; float: left; margin-left: 14px; } +.loginRow { border-top: 1px solid #e7e7e7; padding: 15px 0; position: relative; } +.loginRow:first-child { border-top: none; } +.loginRowError{ border-top: none; position: relative; padding-top:5px } + +.backTo a:hover { background: #212121; } +.backTo span { padding: 8px 14px 8px 8px; display: block; float: left; } +.backTo img { margin: 13px 2px 11px 14px; float: left; display: block; } +.backTo a { float: left; color: #eeeeee; font-size: 11px; border-right: 1px solid #3F3F3F; border-left: 1px solid #3F3F3F; } + +/* ===== Error messages ===== */ +.messages{list-style:none;font:11px/11px Verdana, Arial, Tahoma; padding:0;} +.messages li{-moz-box-shadow:0 1px 1px rgba(0,0,0,.05);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05);position:relative;margin:0;} +.highlight{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:8px;} +.highlight.grey{background:#fff url(../images/backgrounds/grey.png);border:1px solid #a8adb5;color:#a8adb5;} +.highlight.green{background:#d3f3c0 url(../images/backgrounds/grey.png);border:1px solid #a5d985;color:#557143;} +.highlight.yellow{background:#fff3c5 url(../images/backgrounds/grey.png);border:1px solid #ffe075;color:#937f38;} +.highlight.red{background:#ffe3e2 url(../images/backgrounds/grey.png);border:1px solid #efb1af;color:#c00;} + +/* ===== Footer ===== */ +#footer { clear: both; /*height: 36px;*/ background: url(../images/topNav.jpg) repeat; width: 100%; color: #eeeeee; margin-top: 42px; position: absolute; bottom: 0; } +#footer span { color: #696969; padding: 9px 5px; display: block; font-size: 11px; } +#footer span a { color: #eeeeee; } \ No newline at end of file diff --git a/admin/templates/css/main.css b/admin/templates/css/main.css new file mode 100644 index 0000000..cfde4d6 --- /dev/null +++ b/admin/templates/css/main.css @@ -0,0 +1,1304 @@ +/* For IE */ +@font-face { + font-family: "Cuprum"; + src: url('../fonts/cuprum.eot'); +} +/* For SAFARI */ +@font-face { + font-family: 'Cuprum'; + font-style: normal; + font-weight: normal; + src: local('Cuprum'), url('../fonts/cuprum.ttf') format('truetype'); +} +/* Other browsers */ +@font-face { + font-family: 'Cuprum'; + font-style: normal; + font-weight: normal; + src: local('Cuprum'), url('../fonts/cuprum.woff') format('woff'); +} +::before, ::after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { height: 100%; } +* html body { height: 100%; } +body { margin: 0; padding: 0; background: url(../images/backgrounds/blueprint.png) repeat; font-size: 11px!important; color: #424242; font-family: Arial, Helvetica, sans-serif; line-height: 16px; min-height: 100%; position: relative; } + +/* ========== General styles ========== */ +.wrapper { margin: 0 3%; clear: both; } +.wrapper_fixed { width: 980px; margin: auto; } +.img { border: 1px solid #d5d5d5; } +.help { cursor:help; } +.pointer { cursor:pointer; } + +/* ========== CodeMirror ========== */ +.CodeMirror-fullscreen { position: fixed !important; top: 0; right: 0; bottom: 0; left: 0; width: 100% !important; height: 100% !important; z-index: 9999; } +.CodeMirror {font-size: 12px;} + +/* ========== Typo ========== */ +h1, h2, h3, h4, h5, h6, ul.tabs li a, ul.inact_tabs li a, .leftNav ul li a, .middleNav ul li a, .stats ul li span, .userLink, .errorPage p, .ui-dialog .ui-dialog-title { font-family: 'Cuprum', sans-serif; font-weight: normal; } + +h1 { font-size: 24px; } +h2 { font-size: 22px; } +h3 { font-size: 20px; } +h4 { font-size: 18px; } +h5 { font-size: 15px; } +h6 { font-size: 14px; } + +blockquote { border : 1px solid #272C30; margin-top: 40px; padding: 15px 10px; quotes: "\201C" "\201D"; background: url(../images/widgetBg.png) repeat; text-align: center; font-style: italic; font-size: 12px; border-left: 4px solid #272C30; } +blockquote:before { content: open-quote; font-weight: bold; } +blockquote:after { content: close-quote; font-weight: bold; } + +.red { color: #e0a5a5; } +.green { color: #72c66f; } +.dgrey, .dgrey a { color: #687282; } +.white {color: #fff;} + +.docname:hover { border-bottom: 1px dotted} +.doclink {font-size: 11px; font-style: italic; border-bottom: 1px dotted} +.doclink:hover { border: none;} + +.link {border-bottom: 1px dotted;} +.link:hover { border: none;} + +.dotted {border-bottom: 1px dotted;} + +a { color: #336699; } + +.date_text { font-size: 10px; font-style: italic;} + +p { padding: 12px 0 0 0; } + +.legendLabel span { display: block; margin: 0 5px; } +.legendColorBox { padding-left: 10px; } +/* +#contentPage a:hover { text-decoration: underline; } +*/ +.zindex1 {z-index: 1500;} +.zindex2 {z-index: 1000;} +.zindex3 {z-index: 500;} + + +/* ========== Additional reset classes ========== */ +.mt5 { margin-top: 5px; } +.mt40 { margin-top: 40px; } +.ml10 { margin-left: 10px; } +.ml20 { margin-left: 20px; } +.minmarg {margin: 2px 0;} +.mrl5 {margin: 0px 10px;} +.p12 { padding: 12px; } +.pt12 { padding-top: 12px; } +.pr12 { +/*padding-right: 12px;*/ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + position: relative; + display: table; + border-collapse: separate; + width: 100%; +} +.span-form { + display: table-cell; + width: 1%; + vertical-align: middle; + white-space: nowrap; + text-align: left; +} +.pl12 { padding-left: 12px; } +.arrow {font-size: 13px;} +.nomargin { margin: 0!important; } +.nopadding { padding: 0!important; } +.noborder { border: none!important; } +.nobg { background: none!important; } +.floatleft { display: block; float: left; } +.floatright { display: block; float: right; } +.aligncenter { text-align: center; } +.fix { clear: both; } +.first { margin-top: 22px!important; } +.inactive { margin-top: 0px; color: #656565; } +.btext { font-weight: bold; } +.hidden { display: none;} +.rounded { -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px;} +select { overflow: auto; } +.bordLeft { border-top-left-radius: 3px; -moz-border-radius-topleft: 3px; -webkit-border-top-left-radius: 3px; } +.bordRight { border-top-right-radius: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 3px; } + + +/* ===== Header ===== */ +#header { height: 20px; clear: both; } +.logo .box{ width: 180px; height: 64px; display: block; background: url(../images/loginLogo.png) no-repeat; margin: 0 0 12px 0;} + +.middleNav { float: right; margin-right: 1px; margin-top: 20px;} +.middleNav ul { margin-top: 20px; } +.middleNav ul li { height: 55px; text-align: center; display: block; float: left; margin-left: 5px; position: relative; } +.middleNav ul li:first-child { margin: 0; } +.middleNav ul li a { font-size: 12px; display: block; background: url(../images/titleBg.png) repeat-x 0 0; border: 1px solid #464A55; margin-top: 1px; position: relative; color: #fafafa; text-shadow: 0 1px 0 #687282;-moz-border-radius: 2px;-webkit-border-radius: 2px;-khtml-border-radius: 2px;border-radius: 2px; } +.middleNav ul li a span { display: block; padding: 5px 15px} +.middleNav ul li a:hover { background-position: 0 -78px; border: 1px solid #353E47; } +.middleNav ul li a.active { background-position: 0 -39px; border: 1px solid #336699; text-shadow: 0 1px 0 #336699; } + + +/* ===== Top navigation ===== */ +#topNav { height: 36px; display: block; } +.fixed { position: fixed; background: url(../images/topNav.jpg) repeat; width: 100%; color: #fff; z-index: 999; } + +.welcome { float: left; } +.welcome img { float: left; margin: 9px 8px 0 0; -moz-border-radius: 2px;-webkit-border-radius: 2px;-khtml-border-radius: 2px;border-radius: 2px; } +.welcome img.avatar { float: left; margin: 6px 8px 0 0; -moz-border-radius: 2px;-webkit-border-radius: 2px;-khtml-border-radius: 2px;border-radius: 2px; } +.welcome span { padding: 0px 5px; display: block; white-space: nowrap; float: left; line-height: 36px; } + +.userNav { float: right; z-index: 10000; position: relative; font-size: 11px; } +.userNav .lastNav { width: 2px; height: 30px; position: absolute; top: 0; right: 0; } +.userNav ul { margin-right: 2px; } +.userNav ul li { display: inline; float: left; position: relative; cursor: pointer; border-right: 1px solid #3F3F3F; } +.userNav ul li:first-child { border-left: 1px solid #3F3F3F; } +.userNav ul li a { color: #eeeeee; text-decoration: none; display: block; float: left; } +.userNav ul li:hover, .selected { background: #212121; } +.userNav ul li span { display: block; padding: 8px 12px 8px 8px; float: left; } +.userNav ul li img { float: left; display: block; margin: 13px 2px 11px 14px; } + +.userNav ul li ul { position: absolute; left: -1px; display: none; top: 35px; margin-top: 0px; background: #2f2f2f; padding: 0 1px 1px 1px; border: 1px solid #1d1d1d; z-index: 100; } +.userNav ul li ul li { display: block; float: none; border-top: 1px solid #2f2f2f; background: #212121; border-right: none; } +.userNav ul li ul li:first-child { border-left: none!important; } +.userNav ul li ul li a { width: 162px; padding: 6px 10px 6px 15px; font-size: 11px; text-transform: none; color: #a4a4a4; font-weight: normal; background: none; float: none; } +.userNav ul li ul li a:hover { background: none; font-weight: normal; color: #fff; } +.userNav ul li ul li:hover { background: url(../images/titleBg.png) repeat-x; background-position: 0 -39px; } +.userNav ul li ul li span { display: block; padding: 0; float: none; } +.userNav ul li ul li a.active {background: url(../images/titleBg.png) repeat-x; background-position: 0 -39px; color: #fff;} + +#menu {width: 180px;} +/* ===== Left navigation ===== */ +.leftNav { width: 180px; max-width: 36%; margin-top: -1px; float: left; margin-bottom: 80px; margin-right: 41px; } + +/*.leftNav { width: 212px; max-width: 36%; margin-top: -1px; float: left; margin-bottom: 80px; margin-right: 41px; }*/ +.leftNav .last { border-bottom: none; } + +.leftNav ul li { position: relative; } +.leftNav ul li a { color: #fafafa; font-size: 13px; display: block; background: url(../images/titleBg.png) repeat-x 0 0; border: 1px solid #464A55; margin-top: 1px; } +.leftNav ul li a:hover { background-position: 0 -78px; border: 1px solid #353E47; } +.leftNav ul li a.active { background-position: 0 -39px; border: 1px solid #336699; } + +.leftNav ul li a span { padding: 7px 0 7px 15px; display: block; } + +#leftNav_show {position: fixed; left: 0px;top: 57px; width: 30px; height: 33px; background: url(../images/left_menu_show.png) right top no-repeat;} +#leftNav_show #toggle-LeftMenu * { cursor: pointer;} +#leftNav_show #toggle-LeftMenu span{ display:block; width:17px; height:17px; overflow: hidden; margin:7px 0 0 4px; background:url(../images/left_menu_show.png) 0px -20px no-repeat;} +#leftNav_show #toggle-LeftMenu span.close{ background-position: -17px -20px;} + +/* Left navigation subnav */ +ul.sub { border: none; } +ul.sub li { border: 1px solid #d5d5d5; padding: 1px; margin: 1px 0 0 0; background: #fff url(../images/leftNavSub.png) repeat; } +ul.sub li a { background: url(../images/arrow.gif) no-repeat 8px 15px; border: none; font-family: Arial, Helvetica, sans-serif; color: #494949; font-size: 11px; padding: 5px 10px 5px 18px;} +ul.sub li a:hover, .sub li a:active { font-style: normal; border: none; color: #676767; background: url(../images/arrow.gif) no-repeat 8px 15px; } + +/* ========== Left navigation subnav + docs ========== */ +ul.sub li a.numberRight { margin: 0; position: absolute; top: 11px; right: 10px; float: none; background: url(../images/ui/numDataBg.png) repeat-x; padding: 3px 3px!important; z-index: 100;} +ul.sub li a.numberRight:hover { background-position: 0px -42px; } + +/* ===== Right side content ===== */ +.widget { /*width: 342px;*/ /*width: 100%;*/ margin-top: 40px; border: 1px solid #d5d5d5; display: block; background: #fafafa; clear: both; border-top: none; } +.widgetS { /*width: 342px;*/ /*width: 100%;*/ margin-top: 40px; border: 1px solid #d5d5d5; display: block; background: #fafafa; border-top: none; min-width: 25%; float: left; margin-right: 40px; } + +.head { background: #efefef url(../images/NavBg.png) repeat-x; height: 32px; border-top: 1px solid #d5d5d5; border-bottom: 1px solid #d5d5d5; position: relative; color: #464A55 } +.widget .head h5, .table h5, .title h5 { font-weight: normal; padding: 0px 15px; float: left; line-height: 32px; } + +.widget .body { padding: 12px 14px; } +.widget .normal h5, .accordion-close h5 { background: url(../images/accordion_on.png) no-repeat 15px 12px; padding: 0px 15px 0px 32px!important } +.widget .inactive h5, .accordion-open h5 { background: url(../images/accordion_off.png) no-repeat 12px 14px; padding: 0px 15px 0px 32px!important; } + +.widget .num { float: right; display: inline-block; text-align: center; margin: 7px 12px 0 0; font-size: 11px; } +.title .num { float: right; display: inline-block; text-align: center; margin: 10px 10px 0 0; font-size: 11px; } +.widget .num span, .title .num .span { margin-right: 10px; } +.widget .num a, .title .num a { background: url(../images/ui/numDataBg.png) repeat-x; height: 19px; padding: 3px 10px; color: #fefefe; } + +.widget .num a.basicNum { background-position: 0 0; border: 1px solid #336699; color: #fff; -moz-box-shadow: 0 0 2px #336699; -webkit-box-shadow: 0 0 2px #336699; box-shadow: 0 0 2px #336699;} +.widget .num a.basicNum:hover { background-position: 0 -21px; } +.widget .num a.basicNum:active { background-position: 0 -42px; } + +.widget .num a.blueNum { background: url(../images/ui/redBtn.png) repeat-x; border: 1px solid #4f5a68; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454;} +.widget .num a.blueNum:hover { background-position: 0 -21px; } +.widget .num a.blueNum:active { background-position: 0 -42px; } + +.widget .num a.redNum { background-position: 0 -63px; border: 1px solid #8F0000; color: #fff; -moz-box-shadow: 0 0 2px #660000; -webkit-box-shadow: 0 0 2px #660000; box-shadow: 0 0 2px #660000;} +.widget .num a.redNum:hover { background-position: 0 -84px; } +.widget .num a.redNum:active { background-position: 0 -105px; } + +.widget .num a.greenNum { background-position: 0 -126px; border: 1px solid #557639; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.widget .num a.greenNum:hover { background-position: 0 -147px; } +.widget .num a.greenNum:active { background-position: 0 -168px; } + +.title .num a.basicNum { background-position: 0 0; border: 1px solid #336699; color: #fff; -moz-box-shadow: 0 0 2px #336699; -webkit-box-shadow: 0 0 2px #336699; box-shadow: 0 0 2px #336699;} +.title .num a.basicNum:hover { background-position: 0 -21px; } +.title .num a.basicNum:active { background-position: 0 -42px; } + +.widget .loader { float: right; margin: 14px 12px 0 0; } + +.title { position: relative; } +.title .lang { float: right; display: inline-block; text-align: center; margin: 10px 12px 0 0; font-size: 11px; } +.title .lang .icon_off { opacity: 0.5; } +.title .lang .icon_off:hover { opacity: 0.9; } + +.oneTwo { width: 49%; display: inline; float: right; } +.oneTwo:first-child { float: left; } +.oneThree { width: 32%; display: inline; float: left; margin-left: 2%; } +.oneThree:first-child { margin-left: 0; float: left; } + +.twoOne { width: 66%; float: right; margin-left: 2%; } +.twoOne:first-child { margin-left: 0; float: left; } + +.oneFour { width: 23.5%; float: left; margin-left: 2%; } +.oneFour:first-child { margin-left: 0; } + + +.userLink { font-size: 16px; padding-top: 3px; display: block; margin-left: 25px; white-space: nowrap; } +.userWidget { padding: 6px 12px 0 12px; display: block; float: left; } + +.questions { background: url(../images/ui/orangeBtn.png) repeat-x 0 0; border: 1px solid #CE5300; color: #fff; -moz-box-shadow: 0 0 2px #9B3E00; -webkit-box-shadow: 0 0 2px #9B3E00; box-shadow: 0 0 2px #9B3E00; padding: 2px 6px;} +.questions:hover { background-position: 0 -25px; } +.questions:active { background-position: 0 -50px; } + + +ul#doclinks {margin:0; padding: 25px 0pt 0px 0px;} +ul#doclinks li {line-height:16px; padding:0 0 0 18px; list-style:none; margin-top:5px; text-align:left;} +ul#doclinks a:link, ul#doclinks a:visited {text-decoration:none;} +ul#doclinks a:hover {color: #777; border-bottom: 1px dotted #777;} + + +/* ===== Table ===== */ +.tableStatic thead td { padding: 3px 0; text-align: center; border-left: 1px solid #ddd; background: #efefef url(../images/leftNavBg.png) repeat-x; border-bottom: 1px solid #ddd; font-size: 11px; color: #878787; vertical-align: middle; line-height: 16px; } +.tableStatic thead td:first-child { border-left: none; } +.tableStatic thead td a {color: #424242;} + +.tableStatic thead td img {vertical-align: middle; margin: 0 5px;} + +.tableStatic tbody tr { border-top: 1px solid #ddd; } +.tableStatic tbody tr:nth-child(even) { background-color: #eee; } + +.tableStatic tbody tr:hover { background-color: #e8f2ff; } + +.tableStatic tbody tr.header, .tableStatic tbody tr.header:hover { font-weight: bold!important; background: #efefef url(../images/leftNavBg.png) repeat-x!important; } + +.tableStatic tbody td { border-left: 1px solid #ddd; padding: 6px 10px; vertical-align: middle; } +.tableStatic tbody td:first-child { border-left: none; } +.tableStatic tbody td small { font-size: 11px; color: #777777; } +.tableStatic tbody td small ul { padding: 0; margin-left:15px; list-style: square outside; } +.tableStatic tbody td small ul li { padding: 0; margin: 0; } + +.tableStatic tbody td .level1 {background:transparent url(../images/nav_level_2.gif) 10px 0px no-repeat; padding-left:35px;} +.tableStatic tbody td .level2 {background:transparent url(../images/nav_level_2.gif) 30px 0px no-repeat; padding-left:55px;} +.tableStatic tbody td .level3 {background:transparent url(../images/nav_level_2.gif) 50px 0px no-repeat; padding-left:75px;} +.tableStatic tbody td .level4 {background:transparent url(../images/nav_level_2.gif) 70px 0px no-repeat; padding-left:95px;} +.tableStatic tbody td .level5 {background:transparent url(../images/nav_level_2.gif) 90px 0px no-repeat; padding-left:115px;} +.tableStatic tbody td .level6 {background:transparent url(../images/nav_level_2.gif) 110px 0px no-repeat; padding-left:135px;} +.tableStatic tbody td .level7 {background:transparent url(../images/nav_level_2.gif) 130px 0px no-repeat; padding-left:155px;} +.tableStatic tbody td .level8 {background:transparent url(../images/nav_level_2.gif) 150px 0px no-repeat; padding-left:175px;} +.tableStatic tbody td .level9 {background:transparent url(../images/nav_level_2.gif) 170px 0px no-repeat; padding-left:195px;} +.tableStatic tbody td .level10 {background:transparent url(../images/nav_level_2.gif) 190px 0px no-repeat; padding-left:215px;} + +.tableStatic hr { color:#ddd; background-color:#ddd; border:0px none; height:1px; clear:both; } + +.tableStatic tr.red+tr { border-top-color:#efb1af !important; } +.tableStatic tr.dred+tr { border-top-color:#efb1af !important; } +.tableStatic tr.green+tr { border-top-color:#a5d985 !important; } +.tableStatic tr.dgreen+tr { border-top-color:#a5d985 !important; } +.tableStatic tr.lgreen+tr { border-top-color:#a5d985 !important; } +.tableStatic tr.yellow+tr { border-top-color:#ffe075 !important; } +.tableStatic tr.dyellow+tr { border-top-color:#ffe075 !important; } +.tableStatic tr.grey+tr { border-top-color:#c4c4c4 !important; } +.tableStatic tr.dgrey+tr { border-top-color:#c4c4c4 !important; } +.tableStatic tr.lgrey+tr { border-top-color:#c4c4c4 !important; } + +.tableStatic tr.red { border-color:#efb1af !important; } +.tableStatic tr.red td { background:#ffe3e2 url(../images/backgrounds/grey.png) !important; border-color:#efb1af !important;color:#c00 !important; } + +.tableStatic tr.green { border-color:#a5d985 !important; } +.tableStatic tr.green td { background:#d3f3c0 url(../images/backgrounds/grey.png) !important; border-color:#a5d985 !important;color:#557143 !important; } + +.tableStatic tr.lgreen { border-color:#a5d985 !important; } +.tableStatic tr.lgreen td { background:#e0ffce url(../images/backgrounds/grey.png) !important; border-color:#a5d985 !important;color:#557143 !important; } + +.tableStatic tr.dgreen { border-color:#a5d985 !important; } +.tableStatic tr.dgreen td { background:#c9e5b9 url(../images/backgrounds/grey.png) !important; border-color:#a5d985 !important;color:#557143 !important; } + +.tableStatic tr.yellow { border-color:#ffe075 !important; } +.tableStatic tr.yellow td { background:#fff3c5 url(../images/backgrounds/grey.png) !important; border-color:#ffe075 !important;color:#937f38 !important; } + +.tableStatic tr.grey { border-color:#c4c4c4 !important; } +.tableStatic tr.grey td { background:#d5d8db url(../images/backgrounds/grey.png) !important; border-color:#c4c4c4 !important; color:#9198a0 !important; } + +.tableStatic tr.dgrey { border-color:#c4c4c4 !important; } +.tableStatic tr.dgrey td { background:#c9cbcb url(../images/backgrounds/grey.png) !important; border-color:#c4c4c4 !important; color:#9198a0 !important; } + +.tableStatic tr.lgrey { border-color:#c4c4c4 !important; } +.tableStatic tr.lgrey td { background:#f5f5f5 url(../images/backgrounds/grey.png) !important; border-color:#c4c4c4 !important; color:#9198a0 !important; } + +.tableStatic tr.blank td { background: url(../images/backgrounds/grey.png) !important; } + +.tableStatic tbody td.actions a { border: 1px; -moz-border-radius: 3px;-webkit-border-radius: 3px;-khtml-border-radius: 3px;border-radius: 3px;} + +.tableStatic td.green { background: #d3f3c0 url(../images/backgrounds/grey.png) !important; color:#557143 !important; } +.tableStatic td.yellow { background: #fff3c5 url(../images/backgrounds/grey.png) !important; color:#937f38 !important; } +.tableStatic td.red { background: #ffe3e2 url(../images/backgrounds/grey.png) !important; color:#c00 !important; } +.tableStatic td.grey { background: #d5d8db url(../images/backgrounds/grey.png) !important; color:#c4c4c4 !important; } +.tableStatic td.lgrey { background: #f5f5f5 url(../images/backgrounds/grey.png) !important; color:#c4c4c4 !important; } +.tableStatic td.blank { background: url(../images/backgrounds/grey.png) !important; } + +/* ========== Buttons ========== */ +input[type="submit"], input[type="reset"], input[type="button"], button, .button { + font-size: 10px; + font-weight: bold; + text-transform: uppercase; + padding: 0px 6px; + cursor: pointer; + font-family: Arial, Helvetica, sans-serif; + line-height: 20px; + height: 22px; +} +input, textarea { box-sizing:border-box; } + +.basicBtn { background: url(../images/ui/blueBtn.png) repeat-x 0 0; border: 1px solid #336699; color: #fff; -moz-box-shadow: 0 0 2px #336699; -webkit-box-shadow: 0 0 2px #336699; box-shadow: 0 0 2px #336699; } +.basicBtn:hover { background-position: 0 -25px; } +.basicBtn:active { background-position: 0 -50px; } + +.redBtn { background: url(../images/ui/redBtn.png) repeat-x 0 0; border: 1px solid #9d342a; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.redBtn:hover { background-position: 0 -25px; } +.redBtn:active { background-position: 0 -50px; } + +.seaBtn { background: url(../images/ui/seaBtn.png) repeat-x 0 0; border: 1px solid #306873; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.seaBtn:hover { background-position: 0 -25px; } +.seaBtn:active { background-position: 0 -50px; } + +.blackBtn { background: url(../images/ui/blackBtn.png) repeat-x 0 0; border: 1px solid #353535; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.blackBtn:hover { background-position: 0 -25px; } +.blackBtn:active { background-position: 0 -50px; } + +.greyishBtn { background: url(../images/ui/greyishBtn.png) repeat-x 0 0; border: 1px solid #4f5a68; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.greyishBtn:hover { background-position: 0 -25px; } +.greyishBtn:active { background-position: 0 -50px; } + +.greenBtn { background: url(../images/ui/greenBtn.png) repeat-x 0 0; border: 1px solid #418d4f; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.greenBtn:hover { background-position: 0 -25px; } +.greenBtn:active { background-position: 0 -50px; } + +.orangeBtn { background: url(../images/ui/orangeBtn.png) repeat-x 0 0; border: 1px solid #CE5300; color: #fff; -moz-box-shadow: 0 0 2px #9B3E00; -webkit-box-shadow: 0 0 2px #9B3E00; box-shadow: 0 0 2px #9B3E00;} +.orangeBtn:hover { background-position: 0 -25px; } +.orangeBtn:active { background-position: 0 -50px; } + +.whiteBtn { background: url(../images/ui/whiteBtn.png) repeat-x 0 0; border: 1px solid #B7B7B7; color: #525252; -moz-box-shadow: 0 0 2px #D5D5D5; -webkit-box-shadow: 0 0 2px #D5D5D5; box-shadow: 0 0 2px #D5D5D5;} +.whiteBtn:hover { background-position: 0 -25px; } +.whiteBtn:active { background-position: 0 -50px; } + +.dualBtn { padding: 7px 8px; cursor: pointer; line-height: 12px; background: url(../images/ui/blueBtn.png) repeat-x 0 0; border: 1px solid #3581c1; color: #fff; -moz-box-shadow: 0 0 2px #545454; -webkit-box-shadow: 0 0 2px #545454; box-shadow: 0 0 2px #545454; } +.dualBtn:hover { background-position: 0 -25px; } +.dualBtn:active { background-position: 0 -50px; } + +.btn14 { border: 1px solid #24272B; background: url(../images/titleBg.png) repeat-x 0 0; padding: 6px 8px; display: inline-block; -moz-box-shadow: 0 1px 0 #363B3E; -webkit-box-shadow: 0 1px 0 #363B3E; box-shadow: 0 1px 0 #363B3E; } +.btn14:hover { background-position: 0 -39px; } +.btn14:active { background: #557a8e; } + +.btn55 { background: #3b5867 url(../images/middlebg.png) repeat-x 0 0; border: 1px solid #292D2F; padding: 7px 6px 0px 6px; display: inline-block; -moz-box-shadow: 0 1px 0 #363B3E; -webkit-box-shadow: 0 1px 0 #363B3E; box-shadow: 0 1px 0 #363B3E; } +.btn55:hover { background-position: 0 -56px; } +.btn55:active { background-position: 0 -112px; } +.btn55 span { display: block; padding: 5px 5px 0 5px; color: #eaeaea; } + +.btnIconLeft { border: 1px solid #292D2F; background: url(../images/titleBg.png) repeat-x 0 0; display: inline-block; color: #fafafa; text-decoration: none; } +.btnIconLeft:hover { background-position: 0 -39px; border: 1px solid #292D2F; } +.btnIconLeft:active { background: #557a8e; } +.btnIconLeft .icon { float: left; border-right: 1px solid #292D2F; padding: 8px; } +.btnIconLeft span { display: block; float: left; padding: 5px 10px; font-weight: bold; } + +a.btn{font-size: 10px;font-weight: bold;text-transform: uppercase;padding: 4px 12px;cursor: pointer;font-family: Arial, Helvetica, sans-serif;line-height: 12px;} +a.button, span.button { padding: 4px 10px; } + +/* ========== Pagination ========== */ +.pagination { margin: auto; width: auto; text-align: center; margin-top: 40px; } + +.pages span.pages { float:left; font-family: 'Cuprum', sans-serif; font-weight: normal; letter-spacing: 1px; font-size: 12px; } +.pages li.prev { margin-right: 15px; } +.pages li.next { margin-left: 15px; } +.pages li { display: inline; margin: 0 2px; } +.pages li a { height: 25px; padding: 4px 8px; text-decoration: none; color: #666; font-weight: bold; background: url(../images/ui/pagination.png) repeat-x 0 0; border: 1px solid #d5d5d5; font-size: 11px; } +.pages li a:hover { background: #efefef; } +.pages li span.active { height: 25px; padding: 4px 8px; text-decoration: none; color: #666; font-weight: bold; background: url(../images/ui/pagination.png) repeat-x 0 -26px; font-size: 11px; color: #fff; border-color: #666; } + + +/* ========== Numbers notifications ========== */ +.numberTop, .numberMiddle, .numberLeft, a.numberLeft { text-align: center; display: inline-block; padding: 1px 5px; color: #fff; float: right; margin: 10px 15px 10px -5px; font-size: 11px; line-height: 14px;-moz-border-radius: 3px;-webkit-border-radius: 3px;-khtml-border-radius: 3px;border-radius: 3px;} +.numberTop, .numberMiddle { margin: 9px 15px 8px -5px; padding: 1px 5px!important; background: url(../images/ui/numDataBg.png) repeat-x; border: 1px solid #CC6600;} +.numberMiddle { margin: 0; position: absolute; top: -7px; right: -7px; font-size: 11px; background: url(../images/ui/numDataBg.png) repeat-x; } +.numberLeft { margin: 0; position: absolute; top: 10px; right: 0px; font-size: 11px; font-family: Arial, Helvetica, sans-serif; float: none; background: url(../images/ui/numDataBg.png) repeat-x!important; padding: 2px 6px!important;} + + +/* ===== Widgets ===== */ +.twoOne { width: 50%; } +.widget, .content .title, .count, .widget .num a, a.count1, .table, .breadCrumb, .earnings, .leftNav ul li a, ul.sub li, .listData .cNote, .pages li a, .pages li span.active, .errorPage, .btn14, .btn55, .loginPanel, .customfile, .title .num a { -moz-border-radius: 2px; -webkit-border-radius: 2px; -khtml-border-radius: 2px; border-radius: 2px; } + +.widgets { clear: both; } +.widgets .left { float: left; /*width: 344px;*/ width: 48%; margin-right: 4%; } +.widgets .right { float: right; /*width: 344px;*/ width: 48%; } + +.content { overflow: hidden; padding-bottom: 120px; } +.content .title { background: url(../images/titleBg.png) repeat-x; height: 36px; -moz-box-shadow: 0 1px 0 #fff; -webkit-box-shadow: 0 1px 0 #fff; box-shadow: 0 1px 0 #fff; } +.content .title h5 { float: left; color: #fafafa; font-weight: normal; display: block; padding: 7px 15px; } + +/* Search */ +.searchWidget { position: relative; margin-top: 40px; } +.searchWidget input[type=text] { background: #fafafa; border: 1px solid #d5d5d5; padding: 10px; width: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; } +.searchWidget input[type=submit] { background: url(../images/forms/searchBtn.png) no-repeat 0 0; position: absolute; top: 0; right: 0; border: none; width: 36px; height: 36px; } + +/* ===== PopUps ===== */ +#popup_container { min-width: 300px; max-width: 600px; background: url(../images/alertOpacityOverlay.png) repeat; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; } +#popup_title { text-align: center; background: url(../images/leftNavBg.png) repeat-x; border-bottom: 1px solid #d5d5d5; cursor: default; height: 32px; line-height: 32px; } +#popup_content { background: #fafafa; padding: 1em 1.75em; margin: 0em; } +#popup_message { text-align: center; } +#popup_panel { text-align: center; margin: 1em 0em 0em 0em; } +#popup_message input[type=text] { background: #FCFCFC; border: 1px solid #D1D1D1; padding: 5px; width: 258px; } +#popup_prompt { margin: .5em 0em; } + + +/* ===== Forms ===== */ +.mainForm label { /*margin-right: 15px; line-height: 22px; vertical-align: middle;*/ display: block; float:left; padding: 0px 10px; } +.mainForm label.inline { display: inline-block; padding: 0px 10px; } +.mainForm label small { font-size: 11px; color: #777777; } + +.datepicker { width: 58px!important; cursor: pointer; } + +.multiple { width: 100%; padding: 5px; border: 1px solid #d5d5d5; } + +.moreFields ul li { float: left; width: 8%; margin: 0 10px 0 0; } +.moreFields ul li input { width: 98%!important; } +.moreFields ul li.sep { padding: 3px 5px 3px 6px; display: block; margin: 0; width: auto; color: #d5d5d5; } +.moreFields ul li span { display: block; padding: 3px 12px; white-space: nowrap; } + +.itemDisabled { color: #b7b7b7; } + +.rowElem { clear: both; border-top: 1px solid #e7e7e7; padding: 8px 10px; position: relative; /*width: 100%;*/ white-space: nowrap;} +.rowElem:first-child { border-top: none; } +.tableStatic + .rowElem { border-top: 1px solid #ddd; } + +.rowElem:hover { background: none repeat scroll 0 0 #e8f2ff;} + +.formRight { float: right; width: 76%; margin: 12px 12px 12px 2%; display: block; position: relative; } +.formBottom { /*width: 688px;*/ margin: 12px 12px 12px 0; } +.rowElem > label { padding: 15px 0; width: 20%; } +.rowElem .topLabel { padding: 5px 12px 12px 0; width: 100%; } + +#valid input { position: relative; } + + +/* Inputs */ +.jqTransformInputWrapper { float: left; } +.jqTransformInputWrapper > div { width: 550px; } + +.mainForm input[type=text], .mainForm input[type=password], .mainForm textarea { font-size: 11px; padding: 4px 6px; background: white; border: 1px solid #DCE7EF; font-family: Arial, Helvetica, sans-serif; color: #656565; } +.mainForm input[type=text]:hover, .mainForm input[type=password]:hover, .mainForm textarea:hover { border-color: #DCE7EF; background: #fdfdfd; } +.mainForm input[type=text]:focus, .mainForm input[type=password]:focus, .mainForm textarea:focus { border-color: #DCE7EF; background: #fff; -webkit-box-shadow: 0 0 0 2px #F1F4FA; box-shadow: 0 0 0 2px #F1F4FA; -moz-box-shadow: 0 0 0 2px #F1F4FA; } + +.mainForm input[readonly], .mainForm input[disabled], .mainForm textarea[readonly], .mainForm textarea[disabled] { background: #f5f5f5; border: 1px solid #DADADA; color: #aaa; } +.mainForm input[readonly]:hover, .mainForm input[disabled]:hover, .mainForm textarea[readonly]:hover, .mainForm textarea[disabled]:hover { background: #f5f5f5; border: 1px solid #aaa; color: #aaa; } +.mainForm input[readonly]:focus, .mainForm input[disabled]:focus, .mainForm textarea[readonly]:focus, .mainForm textarea[disabled]:focus { background: #f5f5f5; border: 1px solid #aaa; color: #aaa; } + +.mainForm input[type=text], .mainForm input[type=password], .mainForm textarea {width: 100%; box-sizing: content-box;} + +.multiple { width: 100%; padding: 5px; } + +.mainForm .select { font-size: 11px; background: white; border: 1px solid #DDD; width: 100%; font-family: Arial, Helvetica, sans-serif; box-shadow: 0 0 0 2px #f4f4f4; -webkit-box-shadow: 0 0 0 2px #f4f4f4; -moz-box-shadow: 0 0 0 2px #f4f4f4; color: #656565; } + +.submitForm { float: right; margin: 1px 14px 22px 14px; } + +.catalog_field {display: block; height: 30px; margin: 3px 0;} + + +.jqTransformInputWrapper_hover input{ background: #f6f6f6; } +.jqTransformInputWrapper_focus input { background: #f6f6f6; border: 1px solid #cad1d4; } + +.jqTransformSafari .jqTransformInputInner div { position: relative; overflow: hidden; margin:0px 8px; } +.jqTransformSafari .jqTransformInputInner div input { background: none; position: absolute; top: -10px; left: -2px; height: 42px; padding-left: 4px; } + +/* Radios */ +.jqTransformRadioWrapper {display:block; /*margin-top:5px; */ float: left; } +.jqTransformRadioWrapperNoFloat{ display:block; /*margin-top:6px;*/} +.jqTransformRadio { background: transparent url(../images/forms/radio.png) no-repeat 0 1px; vertical-align: middle; height: 16px; width: 16px; display: block; } + +/* Checkboxes */ +span.jqTransformCheckboxWrapper{ display:block; /*margin-top:6px;*/ } +span.jqTransformCheckboxWrapperFloat{ display:block; /*margin-top:6px;*/ float: left; } +a.jqTransformCheckbox { background: transparent url(../images/forms/checkbox.png) no-repeat 0 0px ; vertical-align: middle; height: 15px; width: 15px; display:block;/*display: -moz-inline-block;*/ } +a.jqTransformChecked { background-position: 0 bottom;} /* Checked - Used for both Radio and Checkbox */ +a.jqTransformCheckedDisable { background: transparent url(../images/forms/checkbox2.png) no-repeat 0 0px ;} /* Checked - Used for both Radio and Checkbox */ +a.jqTransformCheckedDisableCheck { background: transparent url(../images/forms/checkbox2.png) no-repeat; background-position: center bottom;} /* Checked - Used for both Radio and Checkbox */ + +.jqTransformHidden {display: none;} /* used to hide the original form elements */ + + +/* ===== List styles ===== */ +.list { } +.list .legend { display: block; font-weight: bold; padding-bottom: 4px; } +.list ul li { padding: 0 0 0 15px; } +.arrow2Grey ul li { background: url(../images/ui/arrow2Grey.png) no-repeat 1px 6px; } + +/* ===== Document actions ===== */ +.docaction {position: relative;} +.docaction .actions { position: absolute; top: 0px; right: 0px; display: none; } +.docaction .actions a { color: #fff; font-size: 11px; display: block; margin: 1px 2px; padding: 1px 1px; float: left; opacity: 0.5; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px;} +.docaction .actions a:first-child { padding-right: 0; } + +.docaction .actions a.remarks { background: #ff0000; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; cursor: help; } +.docaction .actions a.public { background: #d90000; } +.docaction .actions a.recylce { background: #8c0000; } + +.doc_message { position: absolute; top: 0; left: 0;} +.doc_message .remarks { background: #ff0000; float: left; margin: 0 2px 0 0; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; cursor: help; } +.doc_message .public { background: #d90000; float: left; margin: 0 2px 0 0; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; cursor: help; } +.doc_message .recylce { background: #8c0000; float: left; margin: 0 2px 0 0; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; cursor: help; } + +/* ===== Tooltip ===== */ +.tipsy { padding: 4px; font-size: 11px; position: absolute; z-index: 100000; opacity: 0.99; filter: alpha(opacity=99); } +.tipsy-inner { padding: 8px 14px 8px 14px; background-color: black; color: white; max-width: 250px; line-height: 14px; } +.tipsy-inner { border-radius: 3px; -moz-border-radius:3px; -webkit-border-radius:3px; } +.tipsy-arrow { position: absolute; background: url('../images/tipsy.gif') no-repeat top left; width: 9px; height: 5px; } +.tipsy-n .tipsy-arrow { top: 0; left: 50%; margin-left: -4px; } +.tipsy-nw .tipsy-arrow { top: 0; left: 10px; } +.tipsy-ne .tipsy-arrow { top: 0; right: 10px; } +.tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -4px; background-position: bottom left; } +.tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; background-position: bottom left; } +.tipsy-se .tipsy-arrow { bottom: 0; right: 10px; background-position: bottom left; } +.tipsy-e .tipsy-arrow { top: 50%; margin-top: -4px; right: 0; width: 5px; height: 9px; background-position: top right; } +.tipsy-w .tipsy-arrow { top: 50%; margin-top: -4px; left: 0; width: 5px; height: 9px; } + +/* ===== Messages page ===== */ +.messagesOne li { position: relative; min-height: 36px; margin: 0 18px 20px 18px; } +.messagesOne li:first-child { margin-top: 20px; } +.messagesOne > li.divider { border-top: 1px solid #DFDFDF!important; margin: 20px 0 20px 0!important; min-height: 0; } +.messagesOne > li.divider > span { background-color: #f5f5f5!important; } +.messagesOne .messageRow a { display: block; width: 37px; height: 36px; } + +.messagesOne .by_user > a, .messagesOne .by_me > a { position: absolute; top: 0; display: block; } +.messagesOne .by_user > a { left: 0; } +.messagesOne .by_me > a { right: 0; } + +.messagesOne .by_user .aro, .messagesOne .by_me .aro { width: 8px; height: 9px; position: absolute; top: 12px; } +.messagesOne .by_user .aro { background: url(../images/ui/messageArrow_left.png) no-repeat; left: -8px; } +.messagesOne .by_me .aro { background: url(../images/ui/messageArrow_right.png) no-repeat; right: -8px; } + +.messagesOne .by_user .messageArea, .messagesOne .by_me .messageArea { box-sizing: border-box; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; padding: 8px 12px; position: relative; border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border: 1px solid; } +.messagesOne .by_user .messageArea { background: #fafeff; border-color: #b5cdd7; margin-left: 60px; } +.messagesOne .by_me .messageArea { background: #fefefe; border-color: #dcdcdc; margin-right: 60px; } + +.by_user .name > strong { color: #2c596d; } +.by_me .name > strong { color: #393939; } + +.infoRow { font-size: 11px; color: #949494; margin-bottom: 6px; margin-top: -2px; } +.infoRow > .time { float: right; } +.infoRow > .name { float: left; } + +/* ===== Dynamic table headers ===== */ +.table { margin-top: 40px; border: 1px solid #d5d5d5; border-top: none; } +.headTitle { background: #efefef url(../images/leftNavBg.png) repeat-x; height: 37px; border-bottom: 1px solid #d5d5d5; } + + +/* ===== Growl notifications ===== */ +div.jGrowl { z-index: 10; color: #fff; font-size: 11px; } + +div.ie6.top-right { + right: auto; + bottom: auto; + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.top-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-right { + left: expression( ( 0 - jGrowl.offsetWidth + ( document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth ) + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.bottom-left { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 - jGrowl.offsetHeight + ( document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); +} + +div.ie6.center { + left: expression( ( 0 + ( ignoreMe2 = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ) ) + 'px' ); + top: expression( ( 0 + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ) ) + 'px' ); + width: 100%; +} + +/** Normal Style Positions **/ +div.jGrowl { position: absolute; } +body > div.jGrowl { position: fixed; z-index: 10000;} +div.jGrowl.top-left { left: 0px; top: 0px; } +div.jGrowl.top-right { right: 0px; top: 50px; } +div.jGrowl.bottom-left { left: 0px; bottom: 0px; } +div.jGrowl.bottom-right { right: 0px; bottom: 0px; } +div.jGrowl.center { top: 0px; width: 50%; left: 25%; } + +/** Cross Browser Styling **/ +div.center div.jGrowl-notification, div.center div.jGrowl-closer { margin-left: auto; margin-right: auto; } +div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer { + background-color: #336699; + opacity: .95; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=85)"; + filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=85); + zoom: 1; + min-width: 235px; + /*width: 235px;*/ + max-width: 500px; + padding: 10px; + margin-top: 5px; + margin-bottom: 5px; + font-family: Tahoma,Arial,Helvetica,sans-serif; + font-size: 1em; + text-align: left; + display: none; +} + +div.jGrowl div.error { background: #FF0000 url(../images/backgrounds/grey.png) !important;} +div.jGrowl div.accept { background: #00CC00 url(../images/backgrounds/grey.png) !important;} + +div.jGrowl div.jGrowl-notification { min-height: 25px; } +div.jGrowl div.jGrowl-notification, div.jGrowl div.jGrowl-closer { margin: 10px; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; -khtml-border-radius: 5px; } +div.jGrowl div.jGrowl-notification div.jGrowl-header { font-weight: normal; font-size: 1.3em; font-family: 'Cuprum', Arial, sans-serif; } +div.jGrowl div.jGrowl-notification div.jGrowl-close { z-index: 999; float: right; font-weight: bold; font-size: 1em; cursor: pointer; } +div.jGrowl div.jGrowl-closer { padding-top: 4px; padding-bottom: 4px; cursor: pointer; font-size: .9em; font-weight: bold; text-align: center; color: #fff;} + + +/** Hide jGrowl when printing **/ +@media print { div.jGrowl { display: none; } } + + +/* ===== Page scrolling ===== */ +#toTop { display:none; text-decoration:none; position:fixed; bottom:10px; right:10px; overflow:hidden; width:21px; height:21px; border:none; text-indent:-999px; background:url(../images/ui.totop.png) no-repeat left top; } +#toTopHover { background:url(../images/ui.totop.png) no-repeat left -22px; width:21px; height:21px; display:block; overflow:hidden; float:left; opacity: 0; -moz-opacity: 0; filter:alpha(opacity=0); } +#toTop:active, #toTop:focus { outline:none; } + + +/* ===== Single file input ===== */ +.feat { background: url(../images/forms/addFiles.png) no-repeat 0 0; width: 22px; height: 26px; margin: -1px 0 0px 5px !important; } +.feat:hover { background-position: 0 -27px; } +.feat:active { background-position: 0 -54px; } +.fileInput { background: #fff; font-size: 11px; font-family: Arial, Helvetica, sans-serif; padding: 4px 6px; border: 1px solid #B9CFDF; color: #656565; box-sizing: content-box; +-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 0 2px #F1F4FA; +-moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 0 2px #F1F4FA; +box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 0 2px #F1F4FA; +} +.fileInput:hover { background: #fcfcfc; border: 1px solid #d1d1d1; } +.fileInput:focus { border: 1px solid #bbc1c9; background: #fff; } + + +/* ===== Error messages ===== */ +.messages{list-style:none;font:11px/11px Verdana, Arial, Tahoma;margin:0;padding:0;} +.messages li{-moz-box-shadow:0 1px 1px rgba(0,0,0,.05);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05);position:relative;} +.highlight{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:8px;} +.highlight.grey{background:#fff url(../images/backgrounds/grey.png);border:1px solid #a8adb5;color:#a8adb5;} +.highlight.green{background:#d3f3c0 url(../images/backgrounds/grey.png);border:1px solid #a5d985;color:#557143;} +.highlight.yellow{background:#fff3c5 url(../images/backgrounds/grey.png);border:1px solid #ffe075;color:#937f38;} +.highlight.red{background:#ffe3e2 url(../images/backgrounds/grey.png);border:1px solid #efb1af;color:#c00;} + + +/* ===== Tabs ===== */ +ul.tabs { background: url(../images/leftNavBg.png) repeat-x; height: 36px; border-bottom: 1px solid #d5d5d5; border-top: 1px solid #d5d5d5; } +ul.tabs li { float: left; height: 36px; line-height: 36px; border-left: none; overflow: hidden; position: relative; background: url(../images/tabsSep.png) repeat-y 100% 0; font-size: 15px; } +ul.tabs li a { text-decoration: none; display: block; padding: 0px 12px; outline: none; color: #424242; } +ul.tabs li a:hover { color: #797979; } +html ul.tabs li.activeTab { background-color: #fafafa; height: 37px; } +html ul.tabs li.activeTab a { color: #797979; } + +.tab_container { /*overflow: hidden;*/ clear: both; float: left; width: 100%; } +.tab_content { padding: 0px 0px; } + +.tabsRight { position: relative; } +.tabsRight ul.tabs { float: right; background: url(../images/leftNavBg.png) repeat-x; height: 38px; border-bottom: 1px solid #d5d5d5; position: absolute; top: 0; right: 0; } + +ul.inact_tabs { background: url(../images/leftNavBg.png) repeat-x; height: 36px; border-bottom: 1px solid #d5d5d5; border-top: 1px solid #d5d5d5; } +ul.inact_tabs li { float: left; height: 36px; line-height: 36px; border-left: none; overflow: hidden; position: relative; background: url(../images/tabsSep.png) repeat-y 100% 0; font-size: 15px; } +ul.inact_tabs li a { text-decoration: none; display: block; padding: 0px 12px; outline: none; color: #424242; } +ul.inact_tabs li a:hover { color: #797979; } +html ul.inact_tabs li.activeTab { background-color: #fafafa; height: 37px; } +html ul.inact_tabs li.activeTab a { color: #797979; } + + +/* ===== Breadcrumbs ===== */ +.module:after { clear: both; content: "."; display: block; height: 0; visibility: hidden; } +* html .module { height: 1%; overflow: visible; } +* + html .module { min-height: 1%; } + +.breadCrumbHolder.module { border: solid 1px #D5D5D5; background: #FAFAFA; margin-top: 20px; } +.breadCrumb { float: left; display: block; height: 21px; overflow: hidden; width: 100%; padding: 5px; } +.breadCrumb ul { margin: 0; padding: 0; height: 21px; display: block; } +.breadCrumb ul li { display: block; float: left; position: relative; height: 21px; overflow: hidden; line-height: 21px; margin: 0px 6px 0px 0; padding: 0px 12px 0px 2px; /*font-size: .9167em; */background: url(../images/chevron.gif) no-repeat 100% 0; } +.breadCrumb ul li div.chevronOverlay { position: absolute; right: 0; top: 0; z-index: 2; } +.breadCrumb ul li span { display: block; overflow: hidden; } +.breadCrumb ul li > a { display: block; position: relative; height: 21px; line-height: 21px; overflow: hidden; float: left; } +.breadCrumb ul li.firstB a { height: 16px !important; text-indent:-1000em; width:16px; padding: 0; margin-top: 2px; overflow: hidden; background:url(../images/IconHome.gif) no-repeat 0 0; } +.breadCrumb ul li.firstB a:hover { background-position: 0 -16px; } +.breadCrumb ul li.lastB { background: none; margin-right: 0; padding-right: 0; } + +.grey_bg {background: url(../images/backgrounds/grey.png)} + +/* ========== Classes for collapsing ========== */ +.normal, .inactive { cursor: pointer; } +.normal, .accordion-close { border-bottom: none; } + +.standalone { float: left; width: 300px; margin-left: 40px; } +.standalone:first-child { margin-left: 0; } + + +/* ========== CMS Stats ========== */ +.cmsStats { font-size: 11px; font-weight: bold; padding: 2px 5px; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -khtml-border-radius: 3px;} +.cmsStatsAlert { font-size: 11px; font-weight: bold; padding: 2px 5px; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -khtml-border-radius: 3px;} + +/* ===== File uploader ===== */ +.plupload_button { font-size: 10px; font-weight: bold; text-transform: uppercase; color: #fff; line-height: 12px; margin-top: 3px; } + +.plupload_start { float: left; background: url(../images/ui/greenBtn.png) repeat-x 0 0; border: 1px solid #418d4f; } +.plupload_start span { background: url(../images/upload.png) no-repeat 10px; padding: 5px 13px 6px 26px; display: block; } +.plupload_start:hover { background-position: 0 -25px; } +.plupload_start:active { background-position: 0 -50px; } + +.plupload_disabled, a.plupload_disabled:hover { color: #a6a6a6; border: 1px solid #e9e9e9; background: url(../images/ui/uploadDisabled.png) repeat-x; cursor: default; } +.plupload_disabled span { padding: 5px 13px 6px 13px; } + +.plupload_add { margin-right: 10px; background: url(../images/ui/greyishBtn.png) repeat-x 0 0; border: 1px solid #4F5A68; float: left; } +.plupload_add span { background: url(../images/add.png) no-repeat 10px; padding: 5px 13px 6px 26px; display: block; } +.plupload_add:hover { background-position: 0 -25px; } +.plupload_add:active { background-position: 0 -50px; } + +.plupload_wrapper { font-size: 11px;; width: 100%; } + +.plupload_container { } +.plupload_container input { border: 1px solid #DDD; font-size: 11px; width: 98%; } + +.plupload_filelist { margin: 0; padding: 0; list-style: none; } +.plupload_scroll .plupload_filelist { height: 185px; background: #fafafa; overflow-y: scroll; } +.plupload_filelist li { padding: 10px 12px; background: whiteSmoke; border-bottom: 1px solid #E7E7E7; } +.plupload_filelist li:hover { background: #fdfdfd; } + +.plupload_filelist_header, .plupload_filelist_footer { background: #EFEFEF url(../images/leftNavBg.png) repeat-x; padding: 3px 12px; color: #878787; } +.plupload_filelist_header { border-bottom: 1px solid #d5d5d5; } + +.plupload_filelist_footer { border-top: 1px solid #D5D5D5; height: 31px; line-height: 30px; vertical-align: middle; } +.plupload_file_name { float: left; overflow: hidden; } +.plupload_file_status { color: #777; } +.plupload_file_status span {} +.plupload_file_size, .plupload_file_status, .plupload_progress { float: right; width: 80px; } +.plupload_file_size, .plupload_file_status, .plupload_file_action { text-align: right; } +.plupload_filelist .plupload_file_name { width: 205px; } +.plupload_file_action { float: right; width: 14px; margin-top: 3px; height: 14px; margin-left: 15px; } +.plupload_file_action * { display: none; width: 14px; height: 14px; } + +li.plupload_uploading { } +li.plupload_done { color: #AAA; } +li.plupload_delete a { background: url(../images/uploader/deleteFile.png) no-repeat 0; } +li.plupload_failed a { background: url(../images/uploader/error.png) no-repeat 0; cursor: default; } +li.plupload_done a { background: url(../images/uploader/uploaded.png) no-repeat 0; cursor: default; } + +.plupload_progress, .plupload_upload_status { display: none; } +.plupload_progress_container { margin-top: 10px; border: 1px solid #CCC; background: #FFF; padding: 1px; } +.plupload_progress_bar { width: 0px; height: 7px; background: #CDEB8B; } +.plupload_scroll .plupload_filelist_header .plupload_file_action, .plupload_scroll .plupload_filelist_footer .plupload_file_action { margin-right: 17px; } + +/* Floats */ + +.plupload_clear,.plupload_clearer { clear: both; } +.plupload_clearer, .plupload_progress_bar { display: block; font-size: 0; line-height: 0; } + +li.plupload_droptext { background: transparent; text-align: center; vertical-align: middle; border: 0; line-height: 165px; } + +/* ========== Sprite Icons ========== */ +.icon_sprite {display: block; width: 14px; height: 14px; background: url(../images/sprites.gif) no-repeat; margin: 2px; padding: 0px;} + +.ico_blanc {background-position: 0px 0px; background-repeat:no-repeat;} + +.ico_add {background-position: -14px 0px; background-repeat:no-repeat;} +.ico_ok {background-position: 0px -14px; background-repeat:no-repeat;} + +.ico_ok_green {background-position: -42px 0px; background-repeat:no-repeat;} + +.ico_install {background-position: -28px -28px; background-repeat:no-repeat;} +.ico_globus {background-position: -28px 0px; background-repeat:no-repeat;} +.ico_globus_no {background-position: -42px -112px; background-repeat:no-repeat;} +.ico_look {background-position: -28px -168px; background-repeat:no-repeat;} +.ico_photo {background-position: -42px -98px; background-repeat:no-repeat;} +.ico_query {background-position: -28px -56px; background-repeat:no-repeat;} +.ico_query_no {background-position: -42px -70px; background-repeat:no-repeat;} +.ico_reinstall {background-position: -28px -70px; background-repeat:no-repeat;} +.ico_start {background-position: -28px -98px; background-repeat:no-repeat;} +.ico_stop {background-position: -28px -112px; background-repeat:no-repeat;} +.ico_list {background-position: -28px -140px; background-repeat:no-repeat;} +.ico_attach {background-position: -42px -140px; background-repeat:no-repeat;} +.ico_lines {background-position: -28px -154px; background-repeat:no-repeat;} + +.ico_copy {background-position: 0px -42px; background-repeat:no-repeat;} +.ico_copy_no {background-position: -14px -42px; background-repeat:no-repeat;} + +.ico_delete {background-position: 0px -56px; background-repeat:no-repeat;} +.ico_delete_no {background-position: -14px -56px; background-repeat:no-repeat;} + +.ico_edit {background-position: 0px -69px; background-repeat:no-repeat;} +.ico_edit_no {background-position: -14px -69px; background-repeat:no-repeat;} + +.ico_comment {background-position: 0px -28px; background-repeat:no-repeat;} +.ico_comment_no {background-position: -14px -28px; background-repeat:no-repeat;} + +.ico_info {background-position: 0px -84px; background-repeat:no-repeat;} +.ico_info_no {background-position: -14px -84px; background-repeat:no-repeat;} + +.ico_lock {background-position: 0px -98px; background-repeat:no-repeat;} +.ico_lock_no {background-position: -14px -98px; background-repeat:no-repeat;} + +.ico_navigation {background-position: 0px -112px; background-repeat:no-repeat;} +.ico_navigation_no {background-position: -14px -112px; background-repeat:no-repeat;} + +.ico_setting {background-position: 0px -126px; background-repeat:no-repeat;} +.ico_setting_no {background-position: -14px -126px; background-repeat:no-repeat;} + +.ico_shop {background-position: 0px -140px; background-repeat:no-repeat;} +.ico_shop_no {background-position: -14px -140px; background-repeat:no-repeat;} + +.ico_template {background-position: 0px -154px; background-repeat:no-repeat;} +.ico_template_no {background-position: -14px -154px; background-repeat:no-repeat;} + +.ico_log {background-position: -28px -154px; background-repeat:no-repeat;} + +.ico_unlock {background-position: 0px -168px; background-repeat:no-repeat;} +.ico_unlock_no {background-position: -14px -168px; background-repeat:no-repeat;} + +.ico_recylce {background-position: 0px -182px; background-repeat:no-repeat;} +.ico_recylce_on {background-position: -14px -182px; background-repeat:no-repeat;} +.ico_recylce_no {background-position: -28px -182px; background-repeat:no-repeat;} + +.ico_move {background-position: 0px -211px; background-repeat:no-repeat;} +.ico_move_no {background-position: -14px -211px; background-repeat:no-repeat;} + +.icon_sprite_doc {display: block; width: 16px; height: 16px; background: url(../images/sprites_doc.png) no-repeat; padding: 0px;} + +.icon_copy {background-position: 0px -48px; background-repeat:no-repeat;} +.icon_edit {background-position: 0px 0px; background-repeat:no-repeat;} +.icon_delete {background-position: -16px -32px; background-repeat:no-repeat;} +.icon_comment {background-position: -16px 0px; background-repeat:no-repeat;} +.icon_public {background-position: 0px -112px; background-repeat:no-repeat;} +.icon_public_on {background-position: -16px -112px; background-repeat:no-repeat;} +.icon_recylce {background-position: 0px -96px; background-repeat:no-repeat;} +.icon_recylce_on {background-position: -16px -96px; background-repeat:no-repeat;} + +.image_field {max-width: 128px; max-height: 128px; margin: 10px 0;} + +/* ===== Footer ===== */ +#footer { clear: both; /*height: 36px;*/ background: url(../images/topNav.jpg) repeat; width: 100%; color: #eeeeee; margin-top: 42px; position: absolute; bottom: 0; } +#footer span { color: #696969; padding: 9px 5px; display: block; font-size: 11px; } +#footer span a { color: #eeeeee; } + +/* ===== Form validation ===== */ +.inputContainer { position: relative; float: left; } +.formError { position: absolute; top: 300px; left: 280px; display: block; z-index: 5000; cursor: pointer; } +.ajaxSubmit { padding: 20px; background: #55ea55; border: 1px solid #999; display: none; } + +#customWidget { position: relative; height: 36px; } + +.code { background-color: #e8f2ff; color: rgba(0, 0, 0, 0.75); padding: 1px 3px; } +.code_red { background-color: #ff0000; color: rgba(255, 255, 255, 0.75); padding: 1px 5px; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px;} + +.ac_results { padding: 0px; border: 1px solid black; background-color: white; overflow: hidden; z-index: 99999; } +.ac_results ul { width: 100%; list-style-position: outside; list-style: none; padding: 0; margin: 0; } +.ac_results li { margin: 0px; padding: 2px 5px; cursor: default; display: block; overflow: hidden; line-height: 14px; } +.ac_loading { background: white url('../images/loading.gif') right center no-repeat!important; } +.ac_odd { background-color: #eee; } +.ac_over { background-color: #336699; color: white; } +.ac_results li span.name { display: block; } +.ac_results li span.login { display: block; } +.ac_results li span.email { display: block; } +.ac_results li strong { border-bottom: 1px dotted; } + +/* == Dialog == */ +#jboxOverlay{width:100%;height:100%;position:fixed;top:0;left:0;z-index:1000;background: -moz-linear-gradient(rgba(11,11,11,0.1), rgba(11,11,11,0.6)) repeat-x rgba(11,11,11,0.2);background:-webkit-gradient(linear, 0% 0%, 0% 100%, from(rgba(11,11,11,0.1)), to(rgba(11,11,11,0.6))) repeat-x rgba(11,11,11,0.2);filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#a6000000', endColorstr='#a6000000',GradientType=0 )} +#jboxInner{background:#fafafa;border-radius:5px;box-shadow:0 1px 3px rgba(0,0,0,.2);border:4px solid #444;position:fixed;min-width:200px;min-height:50px;max-width:95%;max-height:95%;color:#333;overflow:auto} +#jboxInner .title{background-color: #e5e5e5;background-image:-webkit-gradient(linear, left top, left bottom, from(rgb(235, 235, 235)), to(rgb(229, 229, 229)));background-image: -webkit-linear-gradient(top, rgb(235, 235, 235), rgb(229, 229, 229));background-image: -moz-linear-gradient(top, rgb(235, 235, 235), rgb(229, 229, 229)); background-image: -o-linear-gradient(top, rgb(235, 235, 235), rgb(229, 229, 229)); background-image: -ms-linear-gradient(top, rgb(235, 235, 235), rgb(229, 229, 229)); background-image: linear-gradient(top, rgb(235, 235, 235), rgb(229, 229, 229)); filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#ebebeb', EndColorStr='#e5e5e5');border-top: 1px solid #fafafa; border-top-left-radius: 1px; border-top-right-radius: 1px; padding:8px 10px;font-size:16px;text-shadow:0px 1px 0px #fff; cursor: move;font-family:MavenProRegular} +#jboxInner .body{color:#333;padding:10px} +#jboxInnerButtons{ text-align:center; padding-top: 10px; padding-right: 0; padding-bottom: 10px; padding-left: 0; } +#jboxInner .button{border-radius:3px; -moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.5); -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.5); box-shadow:inset 0 1px 0 rgba(255,255,255,0.5); cursor:pointer; display:inline-block; outline:none!important; text-align:center; text-decoration:none; -moz-box-sizing:border-box!important; line-height:16px; font-family:MavenProRegular, Arial, Helvetica, sans-serif; font-size:13px; text-shadow:1px -1px 0 rgba(000,000,000,0.3); box-shadow:inset 0px 1px 0px 0px #ffffff; background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #f9f9f9), color-stop(1, #e9e9e9) ); background:-moz-linear-gradient( center top, #f9f9f9 5%, #e9e9e9 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e9e9e9');background-color:#f9f9f9; border:1px solid #bbb; color:#666; text-shadow:1px 1px 0px #fff; margin-right: 5px; margin-left: 5px; padding-top: 5px; padding-right: 15px; padding-bottom: 5px; padding-left: 15px} +#jboxInner .button:hover{background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #e9e9e9), color-stop(1, #f9f9f9) );background:-moz-linear-gradient( center top, #e9e9e9 5%, #f9f9f9 100% );filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e9e9e9', endColorstr='#f9f9f9');background-color:#e9e9e9;text-decoration:none;} +#jboxInner .button.yes{color:#fef4e9;border:solid 1px #da7c0c;background-color:#f78d1d;background:-webkit-gradient(linear, left top, left bottom, from(#faa51a), to(#f47a20));background:-moz-linear-gradient(top, #faa51a, #f47a20);text-decoration:none;text-shadow:1px -1px 0 rgba(000,000,000,0.3); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#faa51a', endColorstr='#f47a20')} +#jboxInner .button.yes:hover,#jboxInner .button.yes:focus{background-color:#f47c20;background:-webkit-gradient(linear, left top, left bottom, from(#f88e11), to(#f06015));background:-moz-linear-gradient(top, #f88e11, #f06015);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f88e11', endColorstr='#f06015');text-decoration:none;color:#fff} +#jboxInner .button.yes.last{margin-left:55px} + +.fixedBtn { position:fixed; bottom: 0; background: #fff; -webkit-box-shadow: 0px -3px 5px 0px rgba(0, 0, 0, 0.2); box-shadow: 0px -3px 5px 0px rgba(0, 0, 0, 0.2); padding: 8px 9px; margin-left: -10px; z-index: 1000;} + +.jq-selectbox +{ + cursor:pointer; + vertical-align: top; +} + +.jq-selectbox__select +{ + behavior:url(/PIE.php); + padding: 0 20px 0 10px; + overflow: hidden; + height: 20px; + border-radius: 0px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #B9CFDF; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 0 2px #F1F4FA; + -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 0 2px #F1F4FA; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 0 2px #F1F4FA; + color: #444; + text-decoration: none; + white-space: nowrap; + font-size: 11px; + line-height: 20px; +} + +.jq-selectbox__select:hover +{ + background-color:#E6E6E6; + background-position:0 -10px; +} + +.jq-selectbox__select:active +{ + background:#F5F5F5; +} + +.jq-selectbox.focused .jq-selectbox__select +{ + border:1px solid #5794BF; +} + +.jq-selectbox.disabled .jq-selectbox__select +{ + border-color:#CCC; + background:#F5F5F5; + color:#888; +} + +.jq-selectbox__select-text +{ + display:block; + width:100%; + overflow:hidden; + text-overflow:ellipsis; + white-space:nowrap; + min-width: 30px; +} + +.jq-selectbox__trigger +{ + position:absolute; + top:0; + right:0; + width:24px; + height:100%; +} + +.jq-selectbox__trigger-arrow +{ + position:absolute; + top:10px; + right:12px; + width:0; + height:0; + overflow:hidden; + border-top:3px solid #000; + border-right:3px solid transparent; + border-left:3px solid transparent; + opacity:.3; + filter:alpha(opacity=30); +} + +.jq-selectbox:hover .jq-selectbox__trigger-arrow +{ + opacity:1; + filter:alpha(opacity=100); +} + +.jq-selectbox.disabled .jq-selectbox__trigger-arrow +{ + opacity:.3; + filter:alpha(opacity=30); +} + +.jq-selectbox__dropdown +{ + behavior:url(/PIE.php); + z-index:5000; + top:22px; + margin:0; + padding:0; + width: 100%; + /*border:1px solid #C6CBD0;*/ + background:#FFF; + font-size: 11px; + line-height: 20px; + box-shadow: 0 2px 10px rgba(0,0,0,0.2); + max-height: 120px !important; +} + +.jq-selectbox ul +{ + margin:0; + padding:0; +} + +.jq-selectbox li +{ + padding: 2px 8px; + text-decoration: none; + color: #333; + background-color: #fff; + font-size: 11px; + +} + +.jq-selectbox li.selected +{ + background:#666666; + color:#FFF; +} + +.jq-selectbox li:hover +{ + background:#336699; + color:#FFF; +} + +.jq-selectbox li.disabled +{ + color:#AAA; +} + +.jq-selectbox li.disabled:hover +{ + background:none; +} + +.jq-selectbox li.optgroup +{ + font-weight:700; +} + +.jq-selectbox li.optgroup:hover +{ + background:none; + color:#231F20; + cursor:default; +} + +.jq-selectbox li.option +{ + padding-left:25px; +} + + +.jq-select-multiple { + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 1px; + border: 1px solid #CCC; + border-bottom-color: #B3B3B3; + border-radius: 4px; + box-shadow: inset 1px 1px #F1F1F1, 0 1px 2px rgba(0,0,0,0.1); + background: #FFF; + color: #333; + font: 14px/18px Arial, sans-serif; + cursor: default; +} +.jq-select-multiple.focused { + border: 1px solid #5794BF; +} +.jq-select-multiple.disabled { + border-color: #CCC; + background: #F5F5F5; + box-shadow: none; + color: #888; +} +.jq-select-multiple ul { + margin: 0; + padding: 0; +} +.jq-select-multiple li { + padding: 3px 9px 4px; + list-style: none; +} +.jq-select-multiple li:first-child { + border-radius: 3px 3px 0 0; +} +.jq-select-multiple li:last-child { + border-radius: 0 0 3px 3px; +} +.jq-select-multiple li.selected { + background: #08C; + color: #FFF; +} +.jq-select-multiple li.disabled { + color: #AAA; +} +.jq-select-multiple.disabled li.selected, +.jq-select-multiple li.selected.disabled { + background: #CCC; + color: #FFF; +} +.jq-select-multiple li.optgroup { + font-weight: bold; +} +.jq-select-multiple li.option { + padding-left: 25px; +} +.jq-select-multiple li.first { + margin-top: 0px !important; +} + + +/* +.NFI-wrapper {} +.NFI-button {} +.NFI-button:hover {} +.NFI-filename {} +.NFI-current {} +*/ + +.nice { + font-family: arial; + font-size: 12px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; +} + +.nice .NFI-button { + -moz-border-radius-topleft: 3px; + -moz-border-radius-bottomleft: 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + + background-color: #0192DD; + + background-image: linear-gradient(bottom, #1774A3 0%, #0194DD 56%); + background-image: -o-linear-gradient(bottom, #1774A3 0%, #0194DD 56%); + background-image: -moz-linear-gradient(bottom, #1774A3 0%, #0194DD 56%); + background-image: -webkit-linear-gradient(bottom, #1774A3 0%, #0194DD 56%); + background-image: -ms-linear-gradient(bottom, #1774A3 0%, #0194DD 56%); + background-image: -webkit-gradient( + linear, + left bottom, + left top, + color-stop(0, #1774A3), + color-stop(0.56, #0194DD) + ); + text-shadow: 0px -1px 0px #0172bd; + border: solid #0172bd 1px; + border-bottom: solid #00428d 1px; + + -webkit-box-shadow: inset 0px 1px 0px rgba(255,255,255,.2); + -moz-box-shadow: inset 0px 1px 0px rgba(255,255,255,.2); + box-shadow: inset 0px 1px 0px rgba(255,255,255,.2); + + color: #fff; + width: 100px; + height: 24px; + line-height: 24px; +} + +.nice .NFI-button:hover { + background: #333; + text-shadow: 0px -1px 0px #111; + border: solid #000 1px; +} + +.nice .NFI-filename { + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; + -webkit-border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; + + width: 200px !important; + border: solid #777 1px; + border-left: none; + height: 24px; + line-height: 24px; + + background: #fff; + -webkit-box-shadow: inset 0px 2px 0px rgba(0,0,0,.05); + -moz-box-shadow: inset 0px 2px 0px rgba(0,0,0,.05); + box-shadow: inset 0px 2px 0px rgba(0,0,0,.05); + + color: #777; + text-shadow: 0px 1px 0px #fff; + box-sizing: none; +} + +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: #0194DD; + + position: fixed; + z-index: 1031; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px #0194DD, 0 0 5px #0194DD; + opacity: 1.0; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + top: 10px; + right: 10px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: #0194DD; + border-left-color: #0194DD; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +@-webkit-keyframes nprogress-spinner { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} +@keyframes nprogress-spinner { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} diff --git a/admin/templates/css/nestable.css b/admin/templates/css/nestable.css new file mode 100644 index 0000000..89a6088 --- /dev/null +++ b/admin/templates/css/nestable.css @@ -0,0 +1,228 @@ +/** + * Nestable + */ + +.dd { position: relative; display: block; margin: 0; padding: 0; max-width: 100%; list-style: none; line-height: 20px; } + +.dd-list { display: block; position: relative; margin: 0; padding: 0; list-style: none; } +.dd-list .dd-list { padding-left: 30px; } +.dd-collapsed .dd-list { display: none; } + +.dd-item, +.dd-empty, +.dd-placeholder { display: block; position: relative; margin: 0; padding: 0; min-height: 20px; line-height: 20px; } + +.dd-handle { display: block; height: 30px; margin: 5px 0; padding: 5px 10px; color: #333; text-decoration: none; border: 1px solid #ccc; + background: #fafafa; + background: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%); + background: -moz-linear-gradient(top, #fafafa 0%, #eee 100%); + background: linear-gradient(top, #fafafa 0%, #eee 100%); + -webkit-border-radius: 3px; + border-radius: 3px; + box-sizing: border-box; -moz-box-sizing: border-box; +} +.dd-handle:hover { color: #2ea8e5; background: #fff; } + +.dd-item > button { display: block; position: relative; cursor: pointer; float: left; width: 25px; height: 20px; margin: 5px 0; padding: 0; text-indent: 100%; white-space: nowrap; overflow: hidden; border: 0; background: transparent; font-size: 12px; line-height: 1; text-align: center; font-weight: bold; } +.dd-item > button:before { content: '+'; display: block; position: absolute; width: 100%; text-align: center; text-indent: 0; } +.dd-item > button[data-action="collapse"]:before { content: '-'; } + +.dd-placeholder, +.dd-empty { margin: 5px 0; padding: 0; min-height: 30px; background: #f2fbff; border: 1px dashed #b6bcbf; box-sizing: border-box; -moz-box-sizing: border-box; } +.dd-empty { border: 1px dashed #bbb; min-height: 100px; background-color: #e5e5e5; + background-image: -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), + -webkit-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-image: -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), + -moz-linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-image: linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff), + linear-gradient(45deg, #fff 25%, transparent 25%, transparent 75%, #fff 75%, #fff); + background-size: 60px 60px; + background-position: 0 0, 30px 30px; +} + +.dd-dragel { position: absolute; pointer-events: none; z-index: 9999; } +.dd-dragel > .dd-item .dd-handle { margin-top: 0; } +.dd-dragel .dd-handle { + -webkit-box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1); + box-shadow: 2px 4px 6px 0 rgba(0,0,0,.1); +} + +/** + * Nestable Extras + */ + +.nestable-lists { display: block; clear: both; padding: 30px 0; width: 100%; border: 0; border-top: 2px solid #ddd; border-bottom: 2px solid #ddd; } + +#nestable-menu { padding: 0; margin: 20px 0; } + +#nestable-output, +#nestable2-output { width: 100%; height: 7em; font-size: 0.75em; line-height: 1.333333em; font-family: Consolas, monospace; padding: 5px; box-sizing: border-box; -moz-box-sizing: border-box; } + +#nestable2 .dd-handle { + color: #fff; + border: 1px solid #999; + background: #edf2f7; + background: -webkit-linear-gradient(top, #edf2f7 0%, #999 100%); + background: -moz-linear-gradient(top, #edf2f7 0%, #999 100%); + background: linear-gradient(top, #edf2f7 0%, #999 100%); +} +#nestable2 .dd-handle:hover { background: #edf2f7; } +#nestable2 .dd-item > button:before { color: #fff; } + +@media only screen and (min-width: 700px) { + + .dd { float: left; width: 100%; } + .dd + .dd { margin-left: 2%; } + +} + +.dd-hover > .dd-handle { background: #edf2f7 !important; } + +/** + * Nestable Draggable Handles + */ + +.dd3-content { display: block; height: 30px; margin: 5px 0; padding: 4px 10px 5px 40px; color: #333; text-decoration: none; font-weight: normal; border: 1px solid #d9dee9; + background: #edf2f7; + -webkit-border-radius: 3px; + border-radius: 3px; + box-sizing: border-box; -moz-box-sizing: border-box; +} +.dd3-content:hover { color: #2ea8e5; background: #fff; } + +.dd3-content .action { + position: absolute; + width: 40px; + z-index: 100; + top: 6px; + right: 10px; + border-left: 1px solid #e3e3e3; + height: 18px; + overflow: hidden; + position: absolute; + padding-left: 10px; +} + +.dd3-content .status { + position: absolute; + width: 40px; + z-index: 100; + top: 6px; + right: 50px; + border-left: 1px solid #e3e3e3; + height: 18px; + overflow: hidden; + position: absolute; + padding-left: 10px; +} + +.dd3-content .url { + position: absolute; + width: 40px; + z-index: 100; + top: 6px; + right: 90px; + border-left: 1px solid #e3e3e3; + height: 18px; + overflow: hidden; + position: absolute; + padding-left: 10px; +} + + +.dd3-content .document { + position: absolute; + width: 350px; + z-index: 100; + top: 6px; + right: 150px; + border-left: 1px solid #e3e3e3; + height: 18px; + overflow: hidden; + position: absolute; + padding-left: 10px; +} + +.dd3-content .document_id { + position: absolute; + width: 50px; + z-index: 100; + top: 6px; + right: 700px; + border-left: 1px solid #e3e3e3; + height: 18px; + overflow: hidden; + position: absolute; + padding-left: 10px; +} + +.dd3-content .icon_sprite { + display: inline-block; +} + +.dd3-content.level-1 { + background: #e3ebf2 url(../images/backgrounds/grey.png) !important; + border-color: #d9dee9 !important; + color: #6086AB !important +} + +.dd3-content.level-3 { + background:#fff3c5 url(../images/backgrounds/grey.png) !important; + border-color:#ffe075 !important; + color:#937f38 !important; +} + +.dd3-content.level-2 { + background: #c9e5b9 url(../images/backgrounds/grey.png) !important; + border-color: #a5d985 !important; + color: #557143 !important +} + +.dd3-content.level-3 { + background:#fff3c5 url(../images/backgrounds/grey.png) !important; + border-color:#ffe075 !important; + color:#937f38 !important; +} + +.dd3-content.red { + background:#ffe3e2 url(../images/backgrounds/grey.png) !important; + border-color:#efb1af !important; + color:#c00 !important; +} + +.dd3-content.green { + background:#d3f3c0 url(../images/backgrounds/grey.png) !important; + border-color:#a5d985 !important; + color:#557143 !important; +} + +.dd3-content.yellow { + background:#ffe075 url(../images/backgrounds/grey.png) !important; + border-color:#ffe075 !important; + color:#937f38 !important; +} + +.dd3-content.grey { + background:#ffe3e2 url(../images/backgrounds/grey.png) !important; + border-color:#efb1af !important; + color:#c00 !important; +} + +.dd-dragel > .dd3-item > .dd3-content { margin: 0; } + +.dd3-item > button { margin-left: 30px; } + +.dd3-handle { position: absolute; margin: 0; left: 0; top: 0; cursor: pointer; width: 30px; text-indent: 100%; white-space: nowrap; overflow: hidden; + border: 1px solid #373840; + background: #373840; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + color: #696969; +} +.dd3-handle:before { content: '≡'; display: block; position: absolute; left: 0; top: 3px; width: 100%; text-align: center; text-indent: 0; font-size: 20px; font-weight: normal; } +.dd3-handle:hover { background: #373840; color: #fff;} + + +ol.dd-list li ol.dd-list { + background:transparent url(../images/level.png) 1px 0px repeat-y; +} diff --git a/admin/templates/css/reset.css b/admin/templates/css/reset.css new file mode 100644 index 0000000..936b784 --- /dev/null +++ b/admin/templates/css/reset.css @@ -0,0 +1,133 @@ + +/* ===== CSS reset ===== */ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; font-size: 100%; vertical-align: baseline; background: transparent; } +ol, ul { list-style: none; } +blockquote, q { quotes: none; } +blockquote:before, blockquote:after, +q:before, q:after { content: ''; content: none; } +/* remember to define focus styles! */ +:focus { outline: 0; } +/* remember to highlight inserts somehow! padding: 9px 17px 9px 17px; */ +ins { text-decoration: none; } +del { text-decoration: line-through; } +/* tables still need 'cellspacing="0"' in the markup */ +table { border-collapse: collapse; } +*, * focus { + outline: none; + margin: 0; + padding: 0; +} +textarea { overflow: auto; } +textarea, input[type=text], input[type=password] { font-family: Arial, Helvetica, sans-serif; font-size: 11px; } +button, input[type=submit] { font-family: Arial, Helvetica, sans-serif; } + +img { border: 0; } +ul { list-style: none; margin: 0; padding: 0; } +p { margin: 0; padding: 0; } +:focus { outline: 0; } +a { text-decoration: none; } + +.normal { font-style: normal; } +.normalFont { font-style: normal; font-weight: normal; } + + +/* ========== Correction classes ========== */ +.mt40 { margin-top: 40px; } + +.nomargin { margin: 0!important; } + +/* + Correction margins + */ +.m10 { margin: 10px 0; } +.m15 { margin: 15px 0; } +.m20 { margin: 20px 0; } + +.mr5 { margin-right: 5px; } +.mr10 { margin-right: 10px; } +.mr15 { margin-right: 15px; } +.mr20 { margin-right: 20px; } +.mr25 { margin-right: 25px; } +.mr30 { margin-right: 30px; } + +.mb0 { margin-bottom: 0; } +.mb5 { margin-bottom: 5px; } +.mb10 { margin-bottom: 10px; } +.mb15 { margin-bottom: 15px; } +.mb20 { margin-bottom: 20px; } +.mb22 { margin-bottom: 22px!important; } +.mb25 { margin-bottom: 25px; } +.mb30 { margin-bottom: 30px; } +.mb40 { margin-bottom: 40px; } + + +.mt0 { margin-top: 0; } +.mt5 { margin-top: 5px; } +.mt10 { margin-top: 10px; } +.mt12 { margin-top: 12px; } +.mt15 { margin-top: 15px; } +.mt20 { margin-top: 20px; } +.mt22 { margin-top: 22px!important; } +.mt25 { margin-top: 25px; } +.mt30 { margin-top: 30px; } + + +.ml5 { margin-left: 5px; } +.ml10 { margin-left: 10px; } +.ml15 { margin-left: 15px; } +.ml20 { margin-left: 20px; } +.ml25 { margin-left: 25px; } +.ml30 { margin-left: 30px; } + + +.mr5 { margin-right: 5px; } +.mr10 { margin-right: 10px; } +.mr15 { margin-right: 15px; } +.mr20 { margin-right: 20px; } +.mr25 { margin-right: 25px; } +.mr30 { margin-right: 30px; } + + + +/* + Correction paddings + */ +.pb0 { padding-bottom: 0!important; } +.pb5 { padding-bottom: 5px; } +.pb10 { padding-bottom: 10px; } +.pb15 { padding-bottom: 15px; } +.pb20 { padding-bottom: 20px; } +.pb25 { padding-bottom: 25px; } +.pb30 { padding-bottom: 30px; } + +.pt0 { padding-top: 0; } +.pt5 { padding-top: 5px; } +.pt10 { padding-top: 10px; } +.pt15 { padding-top: 15px; } +.pt20 { padding-top: 20px; } +.pt25 { padding-top: 25px; } +.pt30 { padding-top: 30px; } + + +input::-moz-focus-inner /*Remove button padding in FF*/ +{ + border: 0; + padding: 0; +} + +button::-moz-focus-inner /*Remove button padding in FF*/ +{ + border: 0; + padding: 0; +} + +a.button::-moz-focus-inner /*Remove button padding in FF*/ +{ + border: 0; + padding-top: 20px; +} \ No newline at end of file diff --git a/admin/templates/css/theme_color_default/alert-opacity-overlay.png b/admin/templates/css/theme_color_default/alert-opacity-overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..ffc7286d6a6240fc7e2f8da22aef2594e6e0d2ed GIT binary patch literal 999 zcmbVLJ#W)M7`9Y_P(>vcgkUs)lGv4BH$xca9+@RamyGl;PX^KDJhEf?@Hsdr9YK&1 zjzO88Wrb6^@{-pP`|4Vi!P11!U3ulyFgyhwWdt-8*ofdh1p7!qx?!5;GoV2PRj8>* zYar9nH3vd)^TfyTY2mtysrn1ary;l%CZca5|%$7BiXyuWx`5M@d$ltMaU(^$APfk~m;A1swLNIVnG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5vln|d^#IjP z^mK6yvFLq!*^%#%fP8&3-OyS6>AHzopr00KW{O#lD@ literal 0 HcmV?d00001 diff --git a/admin/templates/css/theme_color_default/checkbox2.png b/admin/templates/css/theme_color_default/checkbox2.png new file mode 100644 index 0000000000000000000000000000000000000000..053fb1643326e137c1e3241c4953a650005e50fe GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+v!3HEP7^YtYQY^(zo*^7SP{WbZ0pxQQctjR6 zFmN3PVMY^8mDNB&nG)BClHmNblJdl&R0hYC{G?O`x6Go{^8BLgVg=`5vln|d^#IjX zc)B=-SoFTVyqouc0uRdtlh29j@ vZfH9E>{|g_`wljtIZ3=C8`b82t6`qwpuf~%^X~6JH!yg*`njxgN@xNA<^)>7 literal 0 HcmV?d00001 diff --git a/admin/templates/css/theme_color_default/fancy.png b/admin/templates/css/theme_color_default/fancy.png new file mode 100644 index 0000000000000000000000000000000000000000..72fe62a20661506fa3c81443ee1d6185418b71f9 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_zr_Gl>P!cVSfns?hRuaSYLznC#>2{rh|a>m1u^vDpU9 u!eN0n2^JX%2Sufh9XobqW1>X{1H-Yq?3;eLU6cmuV(@hJb6Mw<&;$T*(maj; literal 0 HcmV?d00001 diff --git a/admin/templates/css/theme_color_default/field.png b/admin/templates/css/theme_color_default/field.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9dba429a03bb898cfbd74a754396efdcae7b5e GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmSQK*5Dp-y;YjHK@;M7UB8wRq z_zr_Gl>P!cVSfns?hRuaSYLznEdDe|Nr%DIuG95+jNr)}VU}Er$nJQz!Kk1*s zOK}NxwV!tL&(F7>d#+qch+z&>b6nS^pu2(-tIvOq6YD;zJL#a{0?A3Io-MnZXRlP4 zJn7%z(!16(mORc8#7ji9RwlOTY|32A9u3hQUs$X*( zW_dal`Ru;EE@q0!%bwj29^byZgP%cZ(!{f#Tt1VSCNFtV{^;E|Hg$i$gC$Bgzp4IO zp*+o#E2q?&;pEcC7XCNZ{od1Wr-{dy6h6DT-=Of_3HHmLJuV@EE~+-!e>jycY`D7i$%WtFC(qh2GsRUo kYqlqAua^1gB~qW67iC{i5?U7+4vbj_Pgg&ebxsLQ07kFsM*si- literal 0 HcmV?d00001 diff --git a/admin/templates/css/theme_color_default/message-arrow-left.png b/admin/templates/css/theme_color_default/message-arrow-left.png new file mode 100644 index 0000000000000000000000000000000000000000..45f5250b8027e79534cf968955b592cc9a3003f8 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^96-#;!3HGxgLCzO6icy_X9x!n)NrJ9fFuh%B8wRq zxL$)WV^cS86i`s6#5JNMI6tkVJh3R1!7(L2DOJHOvnaJZzbLy{!8zFM#hy()Ky^Dk zT^vIsrsf9h=3{ge+57!W-^>XUI#OI!7Y4nP&zNH8xcJ&nrloGrC$BlKuOU*`@a9d` z**M;fM?C$?<1BTQzI5MM>dUQT@_B;GlkVv0er0;Lvg^VN?{V)JPMYo}79sU)#ZuzS*Lw000W>0fLJSS^xk59CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o zcW-iQb09-gHt4*vi~s-w4@pEpR5*>DltE}CRTzN3yi{k>mLbp>q-i0ohnA&rW2|ZH zMQ=f5g-R|W3bL1O3C%%Io(e1URH%4Zss|5x5oIBzAg_>v2eA#=3bu@yLcEk55~`hK z)9g^zHy+wq(r)5r`=5sQ|KGg#zxluMxvtCh_BLH&3V7?{`8QzyYQaDkC=1-tb^V56 z7yz_dE!yq21>6I^>;->i7)Ew_dYWJ`cqw7q_LOB=>y1WZ3RnUV9r^W8D3nd5Qcr;Z z!C;WNxjDk&@Eu^i6OL<|mP;fO-Fm+i@pzoU!NDBxrT|b%Esc+lKNIvK5{aOcS`q+4 zh+C7BlYPSz6B7s_(%!LO?wh;_A;e1pz;)f`^TJB0GY|gt8gNMfIF7Tiv$NATxVyWH z<2YaAx-Nh}pU-btmgPPxDwT?x&*#4d{N9AAlarHm(==Z=J3ISiW@e`Aj;3i+tyXC^ zoA&_aUs+jUetw=zCiD03@bE7qBO^wwR(qq-XwYuAv2B~9qa(`YGSzBzV{dQoz2)WQ zLn)=}>$EDJPWym?)z#HkqS5HPx~{(l_#MajyfMr=9H5!dqfjC_D zxfBY85`Fl56L`=GzprW9>(AkH0=PW@pp?4X>2tH$q*yGnzkmMEi^XCjlS#Zgh(sb- zmi4*k^HitL#bS{{p+LP}r(Um9C=@6bi%;?wK1YR=(hvAMkLK<8e``VrA=2sezwR|A zMJa{n^FN)5SSZ_6hhN9PESu68X6*%N|8(^(KHP> z_u01X@4XkjxVgFcSHC`QZEd-;v$KQVcYfSzwZ1q!Jmlcupl6?^X;P_FXf~Ull}aVY z4rW#rsl9b;+u9IxT>}+S=MXqobp@1A)K| rKsb)`=kf9JciC+AKJZ9NsQ~^1ckrXQH4(T~00000NkvXXu0mjfZPu|M literal 0 HcmV?d00001 diff --git a/admin/templates/css/theme_color_default/ui-to-top.png b/admin/templates/css/theme_color_default/ui-to-top.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ce5771cd25f709ebe70993590d8bd9f18dd1ae GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^qCl+8!3HF!ryuqPQY^(zo*^7SP{WbZ0pxQQctjR6 zFmSyFVaBFz-YB4;Oo?kmNpOBzNqJ&XDuZK6ep0G}TV_#ed45rLv4V53*^51!dVuPR zJY5_^JUZWATgZ1nfyedYceR)Q>$5h_l}tN%ZQWsqD&8wHjvftZZ8v2vA9ecfa=2W- z>sIdHUMYsSYPSa*Ug>@d=ie4CJ#W<9roH8Y6L;;})#qw|ut~JWZdn~AtjJ&@=$0TZ n`{42%C*!rvoAy0#)oYkn@m5|hys~@(&~^q-S3j3^P6
    {#DB_SUB_TITLE#}
    + +
    +
    + {#DB_TIPS#} +
    +
    + + + +
    +
    +
    {#DB_OPTION_LIST#}
    + + + + + + + + + + + + + + + + + +
    + + + + +

    {#DB_OPTIMIZE_DATABASE#}

    +

    {#DB_OPTIMIZE_INFO#}

    +
    + + +

    {#DB_REPAIR_DATABASE#}

    +

    {#DB_REPAIR_INFO#}

    +
    + + +

    {#DB_BACKUP_DATABASE#}

    +
    +
    +
    + {#MAIN_STAT_MYSQL#} {$db_size} +
    +
    +
    + +
    +
    +
    + +
    +
    + +{if $msg} +
      + {$msg} +
    +{/if} + +
    + + + +
    +
    + +
    + + + + + + + +
    + +
    + + +
    +
    +
    + + +
    +
    +
    + + + \ No newline at end of file diff --git a/admin/templates/dbactions/nav.tpl b/admin/templates/dbactions/nav.tpl new file mode 100644 index 0000000..08b3872 --- /dev/null +++ b/admin/templates/dbactions/nav.tpl @@ -0,0 +1 @@ +
  • {#MAIN_DATABASE_INFO#}
  • \ No newline at end of file diff --git a/admin/templates/documents/alias_doc.tpl b/admin/templates/documents/alias_doc.tpl new file mode 100644 index 0000000..40b870e --- /dev/null +++ b/admin/templates/documents/alias_doc.tpl @@ -0,0 +1,398 @@ +
    +
    {#DOC_ALIASES#}
    +
    + + + +
    + +
    +
    {#DOC_ALIASES_LIST#}
    +
    +
    + + + + + + + + + + + + + + + + + + {if $aliases} + {foreach from=$aliases item=alias} + + + + + + + + + {/foreach} + + + + {else} + + + + + + + {/if} + +
    {#DOC_ALIASES_TABL_H_URL#}{#DOC_ALIASES_TABL_H_ADD#}{#DOC_ALIASES_TABL_H_AUT#}{#DOC_ACTIONS#}
    + + + + + {$alias->document_alias_changed|date_format:$DATE_FORMAT|pretty_date} + + {$alias->document_alias_author_name} + + + + +
    + +   + {#DOC_ALIASES_BUTT_CLO#} +
    +
      +
    • {#DOC_ALIASES_LIST_EMPT#}
    • +
    +
    + {#DOC_ALIASES_BUTT_CLO#} +
    +
    +
    + +
    +
    +
    {#DOC_ALIASES_ADD#}
    +
    + + + + + + + + + + + + +
    {#DOC_ALIASES_ADD_VAL#}
    +
    + + + + +
    +
    +
    + + + + + \ No newline at end of file diff --git a/admin/templates/documents/alias_doc_list.tpl b/admin/templates/documents/alias_doc_list.tpl new file mode 100644 index 0000000..7b99857 --- /dev/null +++ b/admin/templates/documents/alias_doc_list.tpl @@ -0,0 +1,75 @@ +
    + + + + + + + + + + + + + + + + + + {if $aliases} + {foreach from=$aliases item=alias} + + + + + + + + + {/foreach} + + + + {else} + + + + + + + {/if} + +
    {#DOC_ALIASES_TABL_H_URL#}{#DOC_ALIASES_TABL_H_ADD#}{#DOC_ALIASES_TABL_H_AUT#}{#DOC_ACTIONS#}
    + + + + + {$alias->document_alias_changed|date_format:$DATE_FORMAT|pretty_date} + + {$alias->document_alias_author_name} + + + + +
    + +   + {#DOC_ALIASES_BUTT_CLO#} +
    +
      +
    • {#DOC_ALIASES_LIST_EMPT#}
    • +
    +
    + {#DOC_ALIASES_BUTT_CLO#} +
    +
    + + \ No newline at end of file diff --git a/admin/templates/documents/alias_list.tpl b/admin/templates/documents/alias_list.tpl new file mode 100644 index 0000000..56dd854 --- /dev/null +++ b/admin/templates/documents/alias_list.tpl @@ -0,0 +1,92 @@ +
    +
    {#DOC_ALIASES#}
    +
    + +
    +
    + {#DOC_ALIASES_TITLE#} +
    +
    + + + +
    + +
    +
    {#DOC_ALIASES_DOC_LIST#}
    +
    + + + + + + + + + + + + + + + + + + + + {if $documents} + {foreach from=$documents item=document} + + + + + + + + + + {/foreach} + {else} + + + + {/if} + +
    {#DOC_ALIASES_LIST_NM#}{#DOC_ALIASES_LIST_RB#}{#DOC_ALIASES_LIST_CH#}{#DOC_ALIASES_LIST_CR#}{#DOC_ALIASES_LIST_AT#}
    + {$document.document_title} +
    + url:  + + {$document.document_alias} + +
    + {$document.rubric_title} + + {$document.document_alias_changed|date_format:$DATE_FORMAT|pretty_date} + + {$document.count} + + + + + + +
    +
      +
    • {#DOC_ALIASES_LIST_EMPT#}
    • +
    +
    + +
    \ No newline at end of file diff --git a/admin/templates/documents/change.tpl b/admin/templates/documents/change.tpl new file mode 100644 index 0000000..289d9c8 --- /dev/null +++ b/admin/templates/documents/change.tpl @@ -0,0 +1,76 @@ +{if check_permission('documents')} + + + +
    + +
    {#DOC_CHANGE_TITLE#}
    + +
    +
    + {#DOC_CHANGE_INFO#} +
    +
    + + + +
    + +
    + + + + +
    + +
    +
    +
    + +
    + + + + + + + + + + {foreach from=$fields item=field key=Id} + + + + + {/foreach} + + + + +
    {#DOC_CHANGE_OLD_FIELD#}{#DOC_CHANGE_NEW_FIELD#}
    {$field.title} + {html_options name=$Id options=$field.Options selected=$field.Selected} +
    + +
    + +
    +
    + +{/if} \ No newline at end of file diff --git a/admin/templates/documents/doc_search.tpl b/admin/templates/documents/doc_search.tpl new file mode 100644 index 0000000..da559e4 --- /dev/null +++ b/admin/templates/documents/doc_search.tpl @@ -0,0 +1,214 @@ + + + + diff --git a/admin/templates/documents/docs.tpl b/admin/templates/documents/docs.tpl new file mode 100644 index 0000000..ec94e73 --- /dev/null +++ b/admin/templates/documents/docs.tpl @@ -0,0 +1,546 @@ +
    {#DOC_SUB_TITLE#}
    + +
    +
    + {#DOC_TIPS#} +
    +
    + + + +{if check_permission('document_view')} + +
    + + + + + + + + + + + + + + + + +
    {#MAIN_ADD_IN_RUB#}{#MAIN_SORT_DOCUMENTS#}
    +
    + + + + +   + +
    +
    +
    + + + +   + +
    +
    +
    +{/if} + + +{include file='documents/doc_search.tpl'} + +
    +
    +
    {#MAIN_DOCUMENTS_ALL#}
    + +
    +
    +
    + {#DOC_SORT_TEXT#} + + + {if $smarty.request.sort=='id'}{elseif $smarty.request.sort=='id_desc'}{/if} + {#DOC_ID#} + + + + {if $smarty.request.sort=='title'}{elseif $smarty.request.sort=='title_desc'}{/if} + {#DOC_TITLE#} + + + + {if $smarty.request.sort=='alias'}{elseif $smarty.request.sort=='alias_desc'}{/if} + {#DOC_URL_RUB#} + + + + {if $smarty.request.sort=='rubric'}{elseif $smarty.request.sort=='rubric_desc'}{/if} + {#DOC_IN_RUBRIK#} + + + + {if $smarty.request.sort=='published'}{elseif $smarty.request.sort=='published_desc'}{/if} + {#DOC_CREATED#} + + + + {if $smarty.request.sort=='changed'}{elseif $smarty.request.sort=='changed_desc'}{/if} + {#DOC_EDIT#} + + + + {if $smarty.request.sort=='author'}{elseif $smarty.request.sort=='author_desc'}{/if} + {#DOC_AUTHOR#} + + + + {if $smarty.request.sort=='lang'}{elseif $smarty.request.sort=='lang_desc'}{/if} + {#DOC_LANG#} + +
    + + + + + + + + {if !$smarty.const.ADMIN_EDITMENU}{/if} + + {if $docs} + + + + + + + + {if !$smarty.const.ADMIN_EDITMENU}{/if} + + + {/if} + + + {if $docs} + {foreach from=$docs item=item} + document_deleted==1}class="red"{/if}{if $item->document_status!=1}class="yellow"{/if}> + + + + + + + + + + + {if !$smarty.const.ADMIN_EDITMENU} + + {/if} + + {/foreach} + {else} + + + + {/if} + {if $docs} + + + + + + + + {if !$smarty.const.ADMIN_EDITMENU}{/if} + + + {/if} + +
    {#DOC_ID#} + {#DOC_TITLE#} | {#DOC_URL_RUB#} + {#DOC_IN_RUBRIK#}{#DOC_CREATED#} | {#DOC_EDIT#}{#DOC_ACTIONS#}
    cantEdit!=1 || $item->canOpenClose!=1 || $item->canEndDel!=1) && ($item->Id == 1 || $item->Id == $PAGE_NOT_FOUND_ID)}disabled{/if} class="checkbox" />{$item->Id} +
    + {if $item->cantEdit==1} + + {if $item->rubric_admin_teaser_template != ""} + {$item->rubric_admin_teaser_template} + {else} + + + {if $item->document_breadcrum_title != ""} + {$item->document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#} + {/if} + + +
    + + {$item->document_lang} + url:  + + {$item->document_alias} + +  |  + {#DOC_CLICKS#}: {$item->document_count_view} + {/if} + + + + {else} + + {if $item->document_breadcrum_title != ""} + {$item->document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#} + {/if} + +
    + url:  + + {$item->document_alias} + +  |  + {#DOC_CLICKS#}: {$item->document_count_view} + {/if} +
    +
    + {if $item->cantEdit==1} + + {foreach from=$rubrics item=rubric} + {if $item->rubric_id == $rubric->Id} + + {$rubric->rubric_title|escape} + +
    + {if $smarty.const.UGROUP == 1} + {#DOC_AUTHOR#}: {$item->document_author|escape} + {else} + {#DOC_AUTHOR#}: {$item->document_author|escape} + {/if} + {/if} + {/foreach} + + {else} + {foreach from=$rubrics item=rubric} + {if $item->rubric_id == $rubric->Id} + {$rubric->rubric_title|escape} +
    + {#DOC_AUTHOR#}: {$item->document_author|escape} + {/if} + {/foreach} + {/if} +
    + +
    +
    + {if $item->ist_remark!='0'} +
    + {/if} +
    + + {$item->document_published|date_format:$TIME_FORMAT|pretty_date} +
    + {$item->document_changed|date_format:$TIME_FORMAT|pretty_date} +
    +
    +
    + {if check_permission("remarks")} + {if $item->ist_remark=='0'} + + {else} + + {/if} + {else} + {**} + {/if} + + {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + + {else} + {**} + {/if} + + {if $item->cantEdit==1} + + {else} + {**} + {/if} + + {if $item->document_deleted==1} + {**} + {else} + {if $item->document_status==1} + {if $item->canOpenClose==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + + {else} + {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + {**} + {else} + {**} + {/if} + {/if} + {else} + {if $item->canOpenClose==1} + + {else} + {if $item->cantEdit==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + {**} + {else} + {**} + {/if} + {/if} + {/if} + {/if} + + {if $item->document_deleted==1} + + {else} + {if $item->canDelete==1} + + {else} + {**} + {/if} + {/if} + + {if $item->canEndDel==1 && $item->Id != 1 && $item->Id != $PAGE_NOT_FOUND_ID} + + {else} + {**} + {/if} +
    +
      +
    • {#DOC_NO_DOCS#}
    • +
    +
    {#DOC_ID#} + {#DOC_TITLE#} | {#DOC_URL_RUB#} + {#DOC_IN_RUBRIK#}{#DOC_CREATED#} | {#DOC_EDIT#}{#DOC_ACTIONS#}
    + +{if check_permission('alle')} +
    +
    + +    +
    +
    +{/if} + +
    +
    + +{if $page_nav} + +{/if} + + \ No newline at end of file diff --git a/admin/templates/documents/docs_add_new.tpl b/admin/templates/documents/docs_add_new.tpl new file mode 100644 index 0000000..5301240 --- /dev/null +++ b/admin/templates/documents/docs_add_new.tpl @@ -0,0 +1,59 @@ + +
    + +
    {#MAIN_ADD_IN_RUB#}
    + +
    +
    + {#DOC_ADD_NEW_LIGHT_TIP#} +
    +
    + + + +
    +
    {#MAIN_ADD_IN_RUB#}
    +
    + +
    + + + + + + + + + + + + + + + +
    {#DOC_NAME#} +
    +
    {#DOC_CHOSE_RUB#} + +
    +
    + +
    +
    \ No newline at end of file diff --git a/admin/templates/documents/docs_simple.tpl b/admin/templates/documents/docs_simple.tpl new file mode 100644 index 0000000..7201b92 --- /dev/null +++ b/admin/templates/documents/docs_simple.tpl @@ -0,0 +1,123 @@ + + +
    + +
    {#DOC_SUB_TITLE#}
    + +
    +
    + {#DOC_INSERT_LINK_TIP#} +
    +
    + + + +{include file='documents/doc_search.tpl'} + +
    +
    + + + + + + + + + + + + + + + + + {foreach from=$docs item=item} + + + + + + + + {/foreach} + +
    {#DOC_ID#} {#DOC_TITLE#}{#DOC_IN_RUBRIK#} 
    {$item->Id} + {if $item->document_published < $smarty.now && ($item->document_expire == '0' || $item->document_expire > $smarty.now)} + + {else} + + {/if} + {if $item->document_breadcrum_title != ""}{$item->document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}
    {$item->document_alias}
    {$item->RubName|escape} + {if $smarty.request.idonly == 1} + + {elseif $smarty.request.idtitle == 1} + document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}'{rdelim});" class="whiteBtn" type="button" value="{#DOC_BUTTON_INSERT_LINK#}" /> + {elseif $smarty.request.selurl == 1} + + {elseif $smarty.request.selecturl == 1} + + {elseif $smarty.request.alias == 1} + + {elseif $smarty.request.function == 1} + + {else} + document_breadcrum_title|stripslashes}{elseif $item->document_title != ""}{$item->document_title|stripslashes}{else}{#DOC_SHOW3_TITLE#}{/if}',{$smarty.request.document_alias|escape}:'{$item->document_alias}'{rdelim});" class="whiteBtn" type="button" value="{#DOC_BUTTON_INSERT_LINK#}" /> + {/if} +
    +
    +
    + +
    + +{if $page_nav} + +{/if} + +
    \ No newline at end of file diff --git a/admin/templates/documents/form.tpl b/admin/templates/documents/form.tpl new file mode 100755 index 0000000..a678cb1 --- /dev/null +++ b/admin/templates/documents/form.tpl @@ -0,0 +1,829 @@ +{if $smarty.session.use_editor == 0} + +{/if} + +{if $smarty.session.use_editor == 1} + + + + + + + + + + + + + + +{/if} + + + +{if $smarty.request.action=='edit'} +
    +
    {#DOC_EDIT_DOCUMENT#} ID: {$smarty.request.Id}
    +
    + {foreach from=$smarty.session.accept_langs key=lang_id item=lang} + {if $document->lang_pack[$lang_id]>''} + {$lang_id} + {else} + {$lang_id} + {/if} + {/foreach} +
    +
    +{elseif $smarty.request.action=='copy'} +
    {#DOC_COPY_DOCUMENT#}
    +{else} +
    {#DOC_ADD_DOCUMENT#}
    +
    + {foreach from=$smarty.session.accept_langs key=lang_id item=lang} + {if $document->lang_pack[$lang_id]>''} + {$lang_id} + {else} + {$lang_id} + {/if} + {/foreach} +
    +
    +{/if} + + + + +
    + + + + {if ($smarty.request.Id == 1 || $smarty.request.Id == $PAGE_NOT_FOUND_ID) && $smarty.request.action != 'new' && $smarty.request.action != 'copy'} + {assign var=dis value = 'disabled'} + {/if} + +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {#DOC_NAME#} [?]
    {#DOC_META_KEYWORDS#} [?] +
    + +
    +
    {#DOC_META_DESCRIPTION#} [?] +
    + +
    +
    {#DOC_INDEX_TYPE#} + +
    {#DOC_SITEMAP_FREQ#} [?] + + {#DOC_SITEMAP_PRIORITY#} [?] + +
    + + +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    {#DOC_MAIN_CONTENT#}
    +
    + + + + + {if $document->fields} + {foreach from=$document->fields item=document_field_group} + + {if $document->count_groups > 1} + + + + {/if} + + {foreach from=$document_field_group.fields item=field} + + + + + {/foreach} + + {/foreach} + {else} + + + + {/if} + +
    {if $document_field_group.group_title}{$document_field_group.group_title}{else}{#DOC_FIELD_G_UNKNOW#}{/if}
    + {$field.rubric_field_title|escape} + {if $field.rubric_field_description} +
    + {$field.rubric_field_description} + {/if} +
    {$field.result}
    +
      +
    • {#DOC_MAIN_NOCONTENT#}
    • +
    +
    + +
    +
    + {if $smarty.request.action == 'edit'} +
    + +   + +
    + +
    + {elseif $smarty.request.action == 'copy'} + +   + + {else} + +   + + {/if} +
    +
    + +
    +
    + +
    + +
    +
    +
    {#DOC_REVISSION#}
    +
    + + + + {if $document->canDelRev == 1} + + + + {else} + + {/if} + + + + + + + + + + + {if $document_rev} + {foreach from=$document_rev item=doc_rev} + + + + + {if $document->canDelRev == 1} + + + {/if} + + {/foreach} + {else} + + + + {/if} + +
    {#DOC_REVISSION_DATA#}{#DOC_REVISSION_USER#}{#DOC_ACTIONS#}
    {$doc_rev->doc_revision|date_format:$TIME_FORMAT|pretty_date}{$doc_rev->user_id}
    +
      +
    • {#DOC_REVISSION_NO_ITEMS#}
    • +
    +
    +
    +
    + + diff --git a/admin/templates/documents/form_after.tpl b/admin/templates/documents/form_after.tpl new file mode 100644 index 0000000..f496a76 --- /dev/null +++ b/admin/templates/documents/form_after.tpl @@ -0,0 +1,93 @@ +
    {#DOC_AFTER_CREATE_TITLE#}
    + +
    +
    + {#DOC_AFTER_CREATE_INFO#} +
    +
    + + + +{if $innavi} +
    + +
    +{/if} + +{literal} + +{/literal} \ No newline at end of file diff --git a/admin/templates/documents/nav.tpl b/admin/templates/documents/nav.tpl new file mode 100644 index 0000000..a37ade7 --- /dev/null +++ b/admin/templates/documents/nav.tpl @@ -0,0 +1,15 @@ +
  • + {#MAIN_NAVI_DOCUMENTS#} + {if $smarty.request.do=='docs'} +
      + {foreach from=$rubrics item=rubric} + {if $rubric->Show==1 && $rubric->rubric_docs_active==1} +
    • Id==$smarty.request.rubric_id}class="active"{/if}> + {$rubric->rubric_title|escape} + +
    • + {/if} + {/foreach} +
    + {/if} +
  • \ No newline at end of file diff --git a/admin/templates/documents/nav_top.tpl b/admin/templates/documents/nav_top.tpl new file mode 100644 index 0000000..5fc8da6 --- /dev/null +++ b/admin/templates/documents/nav_top.tpl @@ -0,0 +1 @@ +
  • {#MAIN_NAVI_DOCUMENTS#}
  • \ No newline at end of file diff --git a/admin/templates/documents/newremark.tpl b/admin/templates/documents/newremark.tpl new file mode 100644 index 0000000..0fa31b1 --- /dev/null +++ b/admin/templates/documents/newremark.tpl @@ -0,0 +1,80 @@ +{if check_permission("remark_view")} +
    + +
    {#DOC_NOTICE#}
    + + + + +{if $answers} +
    +
      + {foreach from=$answers item=answer} +
    • + {if $answer.remark_avatar}{else}{/if} +
      + +
      + {$answer.remark_author} пишет: {$answer.remark_title} + {if check_permission("remark_edit")} + + {else} + + {/if} + {$answer.remark_published|date_format:$TIME_FORMAT|pretty_date} +
      +
      + {$answer.remark_text} +
      +
      +
    • + {/foreach} +
    +
    + + {if check_permission("remark_edit")} +
    +
    + + + + + + + +
    +   +
    + +
    +
    +
    + {/if} + +{/if} + +{if $page_nav} + +{/if} + + +{/if} +{if check_permission("remark_edit")} + {if $reply==1} + {if $remark_status==1 || $new ==1} + {include file='documents/replyform.tpl'} + {/if} + {/if} +{/if} diff --git a/admin/templates/documents/replyform.tpl b/admin/templates/documents/replyform.tpl new file mode 100644 index 0000000..906c5d9 --- /dev/null +++ b/admin/templates/documents/replyform.tpl @@ -0,0 +1,31 @@ +
    +
    {#DOC_NEW_NOTICE_TITLE#}
    +
    + {#DOC_SEND_NOTICE_INFO#} +
    + +
    + + + + + + + + + + + + + + +
    {#DOC_NOTICE_TITLE#} +
    +
    {#DOC_NOTICE_TEXT#} +
    +
    + + {#DOC_NOTICE_DELETE_ALL#} +
    +
    +
    diff --git a/admin/templates/documents/user.tpl b/admin/templates/documents/user.tpl new file mode 100644 index 0000000..c4b99bb --- /dev/null +++ b/admin/templates/documents/user.tpl @@ -0,0 +1,107 @@ +{if check_permission('documents')} + + +
    + +
    {#DOC_CHANGE_AU_TITLE#}
    + +
    +
    + {#DOC_CHANGE_AU_INFO#} +
    +
    + + + +
    + +
    + + + + + + + +
    +
    + + + +
    +
    + +
    +
    +
    +
    + +{/if} \ No newline at end of file diff --git a/admin/templates/error.tpl b/admin/templates/error.tpl new file mode 100644 index 0000000..d76c851 --- /dev/null +++ b/admin/templates/error.tpl @@ -0,0 +1,5 @@ +
      +
    • + {$erorr} +
    • +
    \ No newline at end of file diff --git a/admin/templates/finder/finder.tpl b/admin/templates/finder/finder.tpl new file mode 100644 index 0000000..a33d5eb --- /dev/null +++ b/admin/templates/finder/finder.tpl @@ -0,0 +1,22 @@ + + + + + + + +
    {#MAIN_FINDER#}
    + + + +
    +
    finder
    +
    +
    diff --git a/admin/templates/finder/nav.tpl b/admin/templates/finder/nav.tpl new file mode 100644 index 0000000..259eba7 --- /dev/null +++ b/admin/templates/finder/nav.tpl @@ -0,0 +1 @@ +
  • {#MAIN_FILE_MANAGER_TITLE#}
  • \ No newline at end of file diff --git a/admin/templates/fonts/cuprum.eot b/admin/templates/fonts/cuprum.eot new file mode 100644 index 0000000000000000000000000000000000000000..c8473cdec8765ec6a5455f4a8bb73ba7e5ca3a37 GIT binary patch literal 54687 zcmb4~Wl$XNo33ZD!QFjucL?t8ZUKTbxLZib;0}X3!QCNv2<{LpI0Sc3f(K6iy1(7C zd!($%^jySl6TL(ALMAHM+rJM#bl+#e7Cf2)W{NPjB`KmZK*rvXsa0<)40X6`;KO-lA#h)$!Knc+Q)A0a! z0_*{<02cr?fa?$30FHlF0N}sw0|1cLQPBL$LH-`$fgch98jb)BSAb?S{^U{Y*Kd&| zjak9hC0GDe@+@*lhyCQG<}hsq0P1Q{yjM=oG}lwRD$j*lq9#-`lZ0*@;>%OVSJ|b! zc};4|Z$~^p%e5B9fdAVHUpZ4UNHz6S4NdI!w$8g_X>Ur^sSjon zxS%3j;_^Pd6MQGBsUoMi4H}+I;c}jeFH5p<7wvTq`fT%?UJkhhF7kXTc0Oqcjr~U* zaYmoApjs3!op>E#uRG^*HRloZac+4bD{q=+r}bb!)|~?4^8F3v?V9LRLhhHD-c$kj z-ru{xUYvbtGa2OB4E{m(c8d>~scczol!)_Kuar;lx)it6`-c;*`;@CylCvQFjIC`fTx5y$oKs|Ac`3Aid}h#v5T2=->zD3I|kDj z;N63?2@fwud-ME=s48K{0iK<6kwY_^T}}?xg7@WDI|y9YKc5iuU)xMbMC0r^62@!d zor-f63AhsM!QX@b2ljknoTxQ{yxet)J)b{OR$g8n(a-A+`#KnM=_ST#M)I{TEt6B+ ztM^zc&My7M@fN)% z`eJIg_M7t`=Jw-u{IK@Wkv(tCy$52ofqFaE@@KBF{$NNRR6-SaS{e$rTa_U}lTJF; zl_%>d2xG1$oI;oNs}Y+tgef2Sp`;`t*_$zQ{!0Tf- zn&LG%BBKb7-FQT~Gv9T}A1~TlX{b+7gRua)H`$`}3@F(vU6cAik+0Tb&=rmoB+4p3haG2H@H&_vL zs5K7F89-LN#&H8UM)EOzM@*SnQ=OP9f?PYc9u*<59`Rfic^9-isg~+z(0%GcU5NGYr=9iv(x~U9}$EJ~XVKS8JaZZvx@rzhTI((Y%*s z+3FP40ob$H$E%@4bCLIdpr6C5ra;HiQ9LwC)HNfi`32u1H&|pGWb#JJuFV_wCvvfs z(lX$sZZ&%H7kVxSn$UQQi|)h(zTzWX3ZrE_hGcvaWAA3a(&~3deHR${?TX?|mj0CP ziHFl~LGx`D%Uq63Oe}Yy43eGa&RY(V;c9IqGk@em5@aV~4$ibm5StOJB5*RIyp+Vm zY1SRaafqMm1CoAXrlEE7NyaV{a4KX@wO;-lWPn&AlrBvg`^wRhQvh1Q4Dda%a&Ra# zCY7ZuF$$**eto8fLuH`TW?FrUgVF?6+6a{CXAix5Fi{Qm&@9TJmN8@(0BT7Q1dl%6 zM~R<8q>O141$Vd{{P}fl`p?qaCD1MWOPDrTt;{%jr1p+tBF)Kgwvg}Nrzs4hD4 z1c}aL?n!;51IxToJbdgt1k^%G2{%MZKQdm?2(?3|RE83Jo3FC2k$4xjZ8;Vs3)E0z z&*!LamNvV;8ZIYJ6_h(JSgadh0vaOUU?^zvPOj-s&`RzQ8ENfyKz!zdQT@(`6d5pB zKcQmrqKBKXDG43IIdn@pTbb<>6HA*dP2HxE%2U0j!G81Q9>gF<&vl4Qv~5KxbY)$v z35K1N@$2d+vnLswa-@j-kmmZ(6_++Wx|En2MWRXi@#bu@QxIv@Q9vpKj~Ifge#OPM zgO)UB%t9`+Set%3l~BNZ52u7I6g$$B;OXx22uFcR6m7MZb#YiXzN=}HExE)7#GzX3 zE9U{RWlQBx$iTIz$$lJJDTjaLE#88QMa*}4hwqE|nz4}cCu8V(gQ$cy%{p}+f=pSB zC3QX6JiD(1LQCKO15-f-D&AMemiD@^{9V&cVL0?IAZ05TsX1I!LWu;YLFnN9nZrY+ zvum(WN*MEWB!&hgT|Ixd%e$uoFhhD|DmLuYtOorUUu6-9_O|>^^L0O%yuGm44l&$y zQOo)x=_?XO(x!|Cuc`&7br26na%4l6?F@Fr<@uf)wGXE2Pb?>l?8iwOkgBed*F8rF z(sf!2QPnH0XC>*Xq0eeg5zkndN~j@>e8@1R9Cz!J6EZ^d!MpBab=pHS8;NBiUL;Fr z7z=fCmQe9#s3u~jBlFQ@@t1%_-VQ~jWohkHY)y}o^)Q4+HE~1!yult*!ATY%sr4xd zZNfIv{m2cSyORaZ5PaZk4~YYn9Yh|U-(PZ7+Gqwty9pXRIJxh~9wgc*T7KgeQvsBn zQKkcNujYFRj!2j7K4M7&w&v!zBCok*w=N+@mzsUDWnwh$yTvuUzX>pQ%9zF$BXFg{@`pL%7v?_uy9Be9;p(#($MW)%@zjRtLRr$ zc7xVR{`q5A?=w^gkF`BH7UNMzBD8a68V_Ih-`7fkNwoBsD=3wl@{Kwj)F|`kRB?t-p`!F*6Ec(0L_5djIRY^4PbOI zIdKEaKe2n*DYldNb& zVQSVI&q=!H*!pKIysJj8Y`cDuRVf6j@9sjD%|)fO3njAz#Z5$ZIQ4*G3X`G|Drjv# z%F7=Juv9USjBS`vM8|*_h=Iw0ADiJ&%9a}Xj;*+6o_M!O4z9ksy8NoTS;KSRdK?M! z7T+*1)MWvH5PaslhfOuV5!v;e4-Z5_gyvF+`{c3k9xEgX6P~YVVaXHDiU%&tL2Woe zNp2Ibq+=+9MuX#9F?#i#nzKvnBAH(+hgn)X^)zfhNcXe~0xQhLxZ$x5e(6q>)(;4F zBL}j3&UC#r=5BLMCSVoOR^((VSz~dpNr=tsy2;ge!mrfEMq{V?*P4b7XI6t}cuPj} ziu~o&C=(4%e*7jcrqLdy%5=<^UCO~lPsUI`j?U|{CG--l6lE};vK4sER@IV=bSlM* zBufLO%EzfYK>yh3n6v45noWwSTMuw8b@6aAIDQ-)Z^?vqrZ^f3_j*uAG}$;O8@rsR zJ6ZH@a>^5$4L$!Bx`rj7~|L*U?@D^3)sol0!j z--Vyp*}T&6F@CxxP*ZMintqWb~;@m)l14QAF_nnH_=ry%Dx^%Y=JqUsIKT_-d&_ zfk6_fvX2YXRk~ykq}V`8C$lp6xV#(p6K9B}3>Rdyd4nEW2Jh}na+pM`nXAkj_Eri( zJwmO(s(gkQToR{(=^7&MjsBe{gR9%5AYSEoPAI1ozZUuQs<}QFP)ZYK{x%qmaBSXQ z0QshNU?$OOc#IXF%@Vllk)P0E^*uOU3;d=&U~_lS}}T z{7%Ax%JIGEmp0ng5w#Ljxnc4a24pbS$FZLVC(_pEK4=CldIVlc*Vt|O2=LwL>K0)^ zr5Msjg~AN6ER-`tu&x^oRmty%uk;dPw1dc$B{zMIv=HPrFkA85L+fC;QOt--EcO}u z8AQL@B*#r0y+tjDd$AA;sY3^$alzPFaHiivcJ#4msHEUSh0-y`S-#aTGWaHVlUU=c z76sg~QedxKxnFxmDFe>p&3E537xwg`a!g@3jHc(Wd`6b$i}_^qE5uC+$DF@KD`gnW zoRiEiB~46Lp8&|D#+T`XkU1n`kB1v-PJ9IH-*rVYx{C}27t4-}MS+Ww$Igu(kn`2B z^}_ZD3T~}KlTVXmof_Y7-XsiKf!VcE#UDJO=V8p(QWaG{6`SR}3C1wuA43&b$cKBnHwtq7&5AUqV2`E|l_?s8Xc%`Ur(y@&wpr3scNpYH3945}p^0hzteRkvLry>` zhx+H9q;gX`rn5^s;<3V+WHW*wuN7j9fqsC6a--kXRoS9~9~Ak~e8em8kT;-x?=9k) zA6DzHdnJ^lm_FwB-<>qX(+j1Z?{DmPJ2M4EIYy|3wv^ziomeB{l)7K~cBFnChMlPL z%;xlwM6VRMb?OP+h3ydw62Qxl;`HSoPo1G7ck7%{zZcf<(k+99Z!Ls>8PFQ(2*|n% zBvLdpkmsZy%ndyQws*+MVah!Boah0`zW*5sZNB)45oCfs51 zk|6cVB|0dY&o0!?oaXTD!1?1?Q=UxkoxDk;Yst%KrIWV+oSz z1T6>nV%q+K?$&8@Y$59!4J2-Qro=kJdC8N{ioGunrg{+4P$svC#3Y7Nf%(;udtulZ zP6m(;3J5?>;U_kn;kH}~2dq;lhZM!bCD}*h%g^V-CoNml5HBd)Vc`!3I80uwgnbFh z4y^Gy*5&5)%gU6^LxZ#M)FU54KUH-Q%M+OIrgeFnnV-lAE;p9Gvhrro|KUc6@=cv{ zwdJ>7w21iqM^7DNV|M9%y>7Nt%0rjCsz*$B464hYnIB@u8bzw$aan@Du#;iGXwn^D z3=s4TG7gmr9+AqyT2JsK4n7gJ@yYbzzZntsT-BWlKyE@hF(*dkg3|Ba?+mAyeayKH zQ@~&vU10u=3fvsY&gB6jADO7-rGtlrmsuF|qDNVs-)XDe?pxocN|bypz>(FLDmZ5O zjIKym6s9wRQ~Nv*@_|xi>|i^fd`fh*l6}m7Aq8=gxX&O7+X~{O4J*6V5+W#;`&nD0 z$1Odfnh=mjVr0H~UyO7hO^cM7^2qAmwzNXPaf2tzs?WKe>9(GDc5TO!BDT&idPmJ} z0+$b@>BmZ5;Ch#nSB9$a4Ju0`=uei)6}=giU6#(Q!_yndhhJ-h^%Fzi+H}kGkSyPv ztPHZA_d=_NQ+Vi?z?MH`dyDhZh%p{KPx(cLbz7tXyNcp=_DkAbK*22TQ?`k$e`aZ>Qar%%n?y{|kjH?VLi@3wwsmlE=xGH_~htAAy= zkA>Ag9;>g8_L)wbg0WmUhy-!$31tyVkbrwQp%X7}L2FAb8y7mBV&Eq@NNR+Q23_+7 z9viuq1IKH{p|~GvE~97%5%qJ}+#afW6FV?`+T1c46R7|DUN@H647#tZ#5-$c$apt_ zG@Y90EG`h&l5qNdYIZTM;~_m}ZlDcI)J>bw{w{nsoyBr$m=%W-ALE;mR&{?JGoqC#T2?3#9;hbaW9CacYF*^LnGq-je+5yOLrrX{I( zbCImjJ!Qg|$aLG3o~#erbpo_)k<(XI{kCGu*_?j&1-(SG_o zVbZF%6vNMST|O#{it8e{;-_0dvs=fN&Yf-{hiM{?HoF$i507q2q)mw3(ytZoE_m6C zAF^0q-CJ6-M2jSwC;H;PnqTIbQ(WkB2iU!`;8t|xC)B2KkZsl#OBUt(9pQfkd_oub zL}YzQF8;+5FKS{L)`}`&wBBlIxC>IP2MKrHYheT!TX}!%(sc9BmN8m2w+!{pSvIv8=eVuQUc)zimX9sj!}&Nqe%DUR7t(phW>_QSwAo|0X! zHM^N*0viMGQo(#-qm(sV?f@zoLXTTzEEv=2ona=(hPtqmC7zF! z6PRJOy)?x#SsrgypN7I?NE2k}b2Bg3)F&9^&jc^Yg)&f;t{Uwti9OTs+6G(Dy}0tc`Kd((SJAFh?{YAIYW?TbwmRPs}=MY@)=B z%6XsoqIvp@iy$c8@HQ8|KQpp-hTa?XL zb+2yQ2eJ!<;C{>L^|Gc|@Gwc>DTY~J6?>7Zy5riT@G2g zaD$4iUHi_O6}vctAii@qOPsgfMWeI$SMq8Ld8v)9laf492fR1_1*3%ePnv^AQUxW6 zj{a>8L>#sP*bYxAZJS~Kd=At49)6EOp2#FCaEF7OdMm(X5pz6p@i3{KjeZ*uUk7+s~v=uf;H1lY=Tfx zJIy0ktLbXC=3%ta*sZjwu^eI+m|AI>%)946mCPzHUo@V->DjzBqbJr;<%EHN+xD ztUJWFn1dkdNGmwds*UY2nO9vIE#Rpsgm;3N?M5XglP~vfj11oMs=vk~{yYKMjb9u} zb6c&BHzTc~mB2;CdENzw8H30CUDuEJjH8oCM_cRs8nUkd~T6I_HgFdgDBcyWF}18 zve9UxM95*R>}~1jMHQS=1(%bC8!r7|z}lVhdd@Y%ne_l7n@e(he)Z@4&bni^_{OMQ zy0MoADNTnvEglas6W6m)aIB;c7X25Ufx1^9@v*e}9Tbt?fe5+C5wdj7ms z`^Jk^(}D@E%?$Q>LJec(g3+wKEe82Si6FP>5TO84XjCQIfzFO&)mElgt4s(()j@jb zcNZqAC4j@13F@1~K3>XFwU~-yu9#0bwDi2)-f>|IP3x+vKoHQ^VmqBo9r?K``B<=5 zIX`r|s1+U`R1}ho!$C4j_kB7w*qn+a1HJy>dp>7$Z2gctzoUq8PoL|<=%+D-g9y*c z&lr`tZ=Mvmjyo!1MP(^Q-(f#&G*16=w{CplmR~8H9&Br{s{%I*J~~NqO=QGpr-uK8 ztAV2?%aJz4Rq)!6`aWO?rkIm^ZNY)jlj%}fqVnxV^Gf>HJJG=+BMN2cmE8MN0F%YN z6aLmRvrTo}YRmVu$zkMJpEASuS|(3W`RG~o7g>B|1MMs7K{gg-elD^?KXM((G5ca^ z>8~Qc#?;~X{Q7Cq8-Vc>1Ls9tV(?EES-Ef7`O+J3cGD_@KYbldoQ9CjAe~n$dIP8V zDNXP)e~2DpfOa-agS^(ygLWvGEtMs2hr*gx23487ZQr@k>%mIzEO;4~!}-h;x(-9> zgjXBj&G2vuF@-QCuPWn0F`4ol4PS4|W_?l#+t)fWH{g38Z`>q7&bXg_dO5Ej^W|+- z^ER_s=S^3M^K%Z&UWsE`kD7u3A&M1b2*SLv_(UDiUb+V!rXYIIU1xzqBGqKs-}6;0 zjQ{p@^qa|>nj#YooOGO@D%$NGngj<&5Zy-XTB;8TYDV|_=`D;9d7DMZPOgKOoLx;( z4CPlsMy1X7p#>ZyF-9Xnh@XjjUR7aW$`gwc_Yvbx=kU=K5(j(2qF`g&taKDfVwn4_cW&IK(P2wES`WcH0ZWz;`B9|pqjB@@i zO-abeP-5Kt7VislB*Gvy(crVGJ26SoR{)TB(tBH`R~aXH59n^nLGpVw=Ah7ArO>Cp zBEux>2mAt*N;$~Z6$PGlgCol`(35}RqAbX;5!^g2^(Cv2PM^Q@JV-cj4%TI%-ITG0 zD~pNR4T36UybC>=^~N_NWzOvE>taZvtwr&v9Oq97w>4d^$cu&J>1YjNC*t5t_@Gvn zk%E-N##Pi=u5W1Tx?*NKy-RGH{#^@6zx;Z`8XTIRLDwTtR!y=Eq%!uua#X%_+?j~_ zW@U*@#uarOGjFJLEc$FJ!gC(WlhBGjy|7$`KhTXjjVHAr7z~*~yicbV;3?=)sS z@8Xk@og1*+16Zq}J&x`Dol2&57iKbauAcPrm)QLT~v zv44n2PD9TK-O)m2DLnPC50?x11@6|nw#=15uT@-yU({CyC1YIgiF641gxo>%`8E2y z{#qK4psVd&`Q`84da#B>+BsO_G2wAbp77PobY~G}< z!O}49^BQm&-55>R&wSCiq@2uZDZW1beCd#^;lN9B9S zeNj1Fjyxy-8aGAlhU80KuQ#cba!f^7u%;Voen*z&`C0T`gQ#~*tjhsTzJW{;>LeDg zcvo#qjr^uQIRh$S5TzA7h?@NhX>0y48CXs9L<}cvLkwq|`}AwosMs`x<~Yqku{ji+ z_eI1Xpp4z0uPBc4`ovI)+~Ni2qV7dF=}3=UVwWu(7n+2<6UO518tuMc>3ct(Uws&? zH!)u8FTF_d-Uf3f>T3WV$mKnOs->jFR&>3I8hWUg;lAZ7F|KbqnKU%9?kFv^>?&NA z^w<wVw*a(j?I$Zhqy;`px!<(D86VD)0kU6=gep~ol z4&KhUPdA6G zAKflJh6R)Le{9XM$r<9Hy+d1mUqx+x9Y2M)a`pgL0Nh~^BE!HB;5TvW$M>{X6p9g3 z@>`Lm>IwlDS2*sE3t>t;=o1=jirk3!a_je#7J1Wj9S#HXctswr)0`z8JJ=ExNs4O+ zqV&B})`Lk%Ly2gQ1x>Jws(1rqhL*Hv+JsRXRrvOfYtbxIo#FMX>^l1lEz8SNQ`SWc zLI11`za+h1@ydt;u^Ufub3cUdW}bF?nUFbQc4O2gT;nOp-kg^jSpZqRjDAkdWKd=? zNI4_f`%qT8?AD0o;9*#5^0#6&Jb9d`_H;WnVPo=YE469lrNi0a z52k1ZZ`X92zKvt+lo(%dHwKxBHo3qUsDX79T?uGq>-fv|wfPtiYR z0o{l0(sIvCtDaiH$CqZ3pAKX2+T-uxx4k^lpgen0(fwTG>yGTY(}2AJdGL-r#j%eK z_qJ%WX%%&-BtEi)9F8Z;rlRCqDl$w=dUDA;Xz;RA|CZk=7XEZa7%WMm)*Cto5h3q_ z!~>@>exM;SV(#a*@ncZF$I+T};%4|g0ltz=)jq{IE9-?ZM`O!r3D{ZYrXq%v zUVCl5QjL8VGx0tHV~%zK7xFgi4&E~4UM{B{2 z9=JBID*Bb*BI%>PTWZ_ zeW^vb3~r)1kPe$mZj_5blVv)>f(firMci-Jq+l_pjXNkZ9Oc~5dvL;4VR?_t)Z25>88}QHiCJPd)nN5N_1L2WubgX1bv_wjXf| zsmvlqzlKSsPRpLsXT>syeqb_2)Hf(P(lWNBNbS|%bqgcze;bP9)!qf2CM4#Od^G+2 zj*?RAfQ8qgMM&drU`KD!72a~3H)^MzKztlm@*h%!smE) zKxpQZ2S<*Xxt{uh@tch&>nnkDx zz%*1iONeju`pyA#j~boGOWjSo^-cO#MDNO|kCXvXGU|!Yqmo@^)?Sk?GrYQ-KQ+%y zSM_vkdi*Q(hTl~PSd*QufgT-N(-vIhLfF-Jw9VZx-z}IyJxTp4i^x>HLuenN6|R!} zI@s9@SBe6yqg+Z}-phxK49IXDdOaJ80#{&XYtgvbR$xk3@RP71nOyRHN1X|iu&$>5 zkugt%?;&xAcz9pC$R4itw_mqyRNS9<+h%MQ5WmvrD@Kt!=o0jvCN{^_8Sys0ZbwW| zA#mZOnfJHSTi{uucyG*Nj3n(q?JWE>gw@H?KtO^0$&WYSwWcPnUaK16h_=`7Anmq4 zlTiK(UoAe429hk+qkk^)`wr+0MxYX7$licCyim^pZa2p` z!vs+Xd75~Xu9q0Io$=^-VRJ_@l)qr`p>OmKYR~qU1*&Cd#jsk1SG(l>KWWD+GBz_j zBv?NQmNps3knTA$%c>y4<0|tRmAsV>4Vl{ooImv3ZHCaWKh9kDbl3*VDdXv}bCaT( zq@maOK@LXDg)iB<`h7mPa;5io4|ck7F6zr(9k56__oV>CjV1ya`BnHe(@DtnGE{&X zhc=OnW(I6~e6zS#h6v8nmN}Prpv6oPPF!CU=uC&=A`2ODrB{uE)Q#A3W{zMH5|DK0 zuEl3XL7_xjr&58sX#{tJf#31s+?aWfPiSMd+rKJDtl@}OR+gBH-dlrl%pidKhN^v ztVrVpT(W0Zh=!j6$did8*;N&K%}ww8Rt-YBAFM!b*e z*P17Eo#|q1sK}nv%-#RO0;$fb8xf;H=uiMJ^5@`)U`iuxQivp@Ow6;{Zwb$s%$Tqs z=7R`MFz^X;i*#A|C24ix2qdWtevCc&zlo{3vU$%`7y9io_%lr3R>HD~&h{H(t*_p7 z{m3|-s-4UeE_q?ro}C?f^opZqZ zN)^ab?Jmf%L_)#?%4f53yl4Ufl>TsI+_>)sq7cKXWp#%H9VWpMP8AVppbx(^AMXlNtc`okBj- z!jga;Qf9HA69%um0@wU|;Zq%<1xK!~LQ+ly8ZZrW<7Kn+rbkP|lJJgP3@O^_wj z2k9a5J5)}JK%!gYC7ChqYnkSH036HhdjB%qY2t4q@$$}BiZtaWL08FlgYP!G>mfuP zz6ENPIu4vQ-z(lnCIxhRl0-&y7;=-fhv0Z3&=fKZJ=qt7?4?o|2aEjG?>%z+)k$XU z*JDqOa+?Hk3$zQBMzwu(Khi2EmK5nxn|-o!v;0sXQ_Mz+&-S1Kr~Bxi+Lc^KS2g-{ z?T&b2)Ec?6XyNx~dc-sR!wEgjh^d{8-gcl*HD~1AI?XI<$d!O?wh3<- za?48)jSZbUJ|MaV2@&Lu@a`5h0Q=|KZBtUpp0%f&)wET3TGzPLV5wzlraE~lMEMha zG;A09d_;~0+iwawwnW$8ZgS*ciEO8GQd>|_%6(>{2h$QtQTk?mWz=J>;&2YIR2Kn$*@w)K%LTmaY%}X@3*buoNkls%s zRWSBs|IoP3xz0WQbz(D2F~G8ozY{ZP|59JPxb*;zI1Hz_bel<* z{4Gjq?$v>?JeTi1Zi!;~(nV)Y;J1@!a!Q+F+h)E+l#0f78TMWijV-K2p3ri^bR0~f z_dDmy^7!YR&i3*4oVv`h&#-zfXLCuT0wc*~DZMv(%~g(7$CZGhM1?7xgp-t>{?9o6 znp`W;x_vQ8%x*--6SNn?8^}gu-A|c(<`cp!p%gi^H~D*T+ydxpokANHo_z5AuC=a> zkTl0`V|n9P=DRvSzaN$Z6RS_UFno^=s z^MfC9n5-Z1VB=}5x=MA6a;oh1q!;{Jq=lqU+}$&ptAIbBmIv|&3I~aYGGn*m?p>2s z30j7-;HAzC6C8Rp6=mhBwJGFk7PA}kU{^IxZL9P_{htT;gKerEoaSRIoS7rbl7mY` zDW@tHv>_FIB{wSe0n@X;6l5E83o5lxn2uAZQ~bhOLf?kI3!M)SLN~>zz+xdC5Ru9D znU{PU%;=7}kV}=DCIa&c64vE)N^&G+^Z%?C#?GBVj9H3eQSOm*k)Y{geSScMxS^9e zaGx%(jb70x*S9x~8#S`eErtD91>P6=ds%kqg;U$0YumZ$5w+joa+ z&s|p1+8|UJPO$SEIZixnpsXB?7VW&kPgxO~4cbQ<01giFi%Bp)O*ah(4JVBa?SV(* zF48?o1w|j9m41l!j(6=%4@3~c1aaV#B?}R5q)T>GOj2hsn%g#Id%bL&jvYDPbwX@3 zw1)H&rye&nB6Nrd`eA5G$|*H#xmbqOoe1)ZMDz&yL1xYOpaoZReV$*1@ewaVMN=LD zG19i2$$~|Qog|VXk}ndC-N1=Q1>8EFN^K17@(B<`6GHn*K#ZS)=3X~bZYbFbmc%Zu z@9YgA*psBL27HEzZGwrZvL51~70|ezL_iAkW@bSZ&185wj;#}7688OoYN?{ZH^YhetWi;koy7>cet;~2fz>dW?k?< z1H=J#Ke6v(F6A~8`s_a91<{VwZOsiC;C7LqU|+vQ>V_N3!? z@izs>%huAj;cb5J&%^S=DbAK`iC@vN|2Az=8u(Ed@u%n^@icD%t->Tuhd^`ptcvtL zP9CfJq0X#+p>q>Oaur2#3sK{C-(EqLidaDdB`S->uLe1VSzgIAl!cy81>P1ig7Mt1 zED0un>fqCXU@oA(&JfO>tJ+Q#$c)O6@DjxJUKJn%LT9|(GNw_R79eIrF~qC4vHBdLLPTg__}hYE(hrbZPi0Ox^)0u9W|uQ7z=CfT<_WA1&Vq-0 zty_m-gbtG4TE@MjT?ft+Fu6)8XQP+nNQH;z0D$EVg&whpKx1B}9VkEy(E*4L2f>;? zlFACxBi0qwWG#{gqO1UQ1C?4658j~;QEVJ-p1(%hr7&rk%#@FfV;0$E8U1t9qvKvb zXUWALCw8?S-uDrft>zg~mb4C+nId{)v5Zak7RCd|hmlW8s>8V1Q)=Z1TtLSsZWEYx z5eNN5@RQgCNRkHC!p$Qyv737aKTd7IB%ga>l1dve6&>6!^NG(TU%l~l__Yp#+=7?L zq-Ge=H6o*#G5}g>4tPcwd2VR=KSLG(PH30-u?)v=FVchy#n9p}`Rjm^HRp&uJFsV*8D z6D>(>FUTt-q~?^?ia@1awZ1|HMPk(^2Vn;blJ?Gk&|i_sf7Ws+&mHZ71lJ&%Vc?S} z=I*pk8~32zn6Pvva$AqxQhZvkty^`fKT@Oen)#>5yk=TeiM)D!|ER%N1<$MD)!(Iz z=T-1Z3C|09tBCb)q4|dC(_7nuFf>wMN7RaOD?UMMF$sG6+A4ECerEuY(ONDA$`i5gMw21EAIe%mDBL5cBT^#nrKrLUzpq6aVO*SX3GdBc$K_vQ3l)3pHd{mjVwY z(>s0XCQ6P4g6r+6ccMe=adSc^ga31W>akr9U;QL~zz6_+8R4HN-ADg{Om{kv|Y^k7WdW;4}{E;$)qzk9{DAfqC4D(Sc__9eB`AYLa zGA}|3lnzA&BZTn~3?LxegReH3XIQ77q>}VCKa!uDi@OJV2n+){# z{;eHv7Xkepn}3L3e@D-SUw=!_h2Wo(bHUf&l5_s4|6R`chyHi|f9WEr<(}2`Z*oa$ zIr^uf1rCdxqXm}!L$uDpudEQ9Ve-rW)*^zloBYC0XV<@K*I8YD{;yJ#pPzUBmj;|w z<>&vd9(q+c7jxWFAd5L}Nf3+SA2Ax@djGfL`}JSj42HNiK@6I>Ho*T7y(X?MkY4h? zksz*45dD9aKn4mkG${iG3{4{b9|c9rfPy38i2n$f0VPocru^RpgOVTvVO`doBxnQD zSJ+*$oH&0CkBVkAM3G_JV86(J1QNe+GjMvO&Gw%_364046_vrl?jPW~LjMzx`}?>q zV?}BIrw}PhgM}Q@M}7IX00`-!zC;#<`)fGG_Cufqf}m2H*nV)7fCwmf6ZzjEfcVdd z1_0~9C5Dp$C%E8?$7un$H`V^(R`Y}5z?uWpzbq-Y{nvdXmu75v*fn6Je<_3L5=GZgRB*K#nZ4x-jLGquYKE53bs^MgZx>E7-{Mp+Fs6-FdCe|kC68;YO1b7B~07yV7d;hG_ z7qA*)lA+`dB)*FIIUH*pE@~-2d=Zpx|C79cynvkl0awa{|HQog`G3RN(SPM!IN3X+e3NI@jS|GxlR$?g7+ z7?A%9ee(ZccGoAxR4A{aoMM#_o3@#;mi%kvUUDj>u_~LPVT~Y7hB~IMWt*KeJ1QB` zI;|Mak>ZAIEZsWFY_Y|(NeaE_uA}v{M>Ry+df-NJGL-aml+4I@J;@^|ek4{E=PC-1 z?L}L?9iDR58HH~z1QXXBQF@scnXwstjW!QYEGTlDuYn`qoSPIqyHGQ=Gn$&eLMvoAB3`99CEX~fZ5h1P zA81KXhrXA@I$S;AF;Py+Xs$^1Ha9k#;!IJgnQjh3n_UY3*sj2byd))-XFE!Mn7LXl zi&L!RvjbF|vR+BraGz{P`VsH!#;Ek?Px3^|id-dBp?nYSOv=raE3mfuK-nli9{EzM zqW=y)Y6MboMxmyTpl8>I>XPht+oDQ`iMWyUger}eAn;AGZC_v%a{s7)`LaV?+J9Dx z2)ov&BLbPcL~@cb+LKPM{1(mEW{En_>Rgb-b6NjFU;e;S27mX+0)E*nCB!2FiG;ht z-RO_Kqvt#P$h&{0xw1@lINWO$E1vLU7u1XxrL|=bqWF@M8FjPZWa%;qx~LUaRXJ4{?4c}Wjv2|%V-a*)fZKMO!NM^hS14eEb5ix zpH~tMey%dQ59{XprvWIT^b z7z1hKG+mbxw9wYVVNet`mav)GL>JOQ^EFx$Kc{AMOKgklGIv+kt=lqNj^CTvJ;>+5 zeDlf^6r71D#OZsDCKa=X)}DhiBI&?*9OjSw0zQEy{08S_b><(zN@}X*InF$-QIvrjsNkxg=(4( z1I?EtJ2*lSRE$wovVoljAwFY#9cLEP-R8nJmwJD^kM4XuCE3VoN9n&R1*0R?!(siw z0W|jw*?I&Natc~n^Sa&yBy#dvS}D3V|NlYr>~OtohPCpl||5 z5W51wP#fJbtEB`qwA;N9tn@!R`lSo2RvoAe|q-v6TPt%BlU!Y<)q7~BSTcXx;2 z?(Xg|xJ!b&ySr;}3+^6V0tDCK1ShcX?&Y`pU;K5d>$F$jbXA|Ho;t0?R@67)RFwr$ z?q=XKZc+*<31>uf$t>?K-?>hc#p;#)PS(-cYTB%74F3aUT;_vzp3$aAO@*7(ziroi z__tmuBZgxY(w56?J+0Rk5>D9}a>z1@0y{y}R7z7{O67i9CJ>;#kRq4^q1RpkAP`Z+ zvXB1GV>E{JyvXOuA)k~=@So0~nJN2miNp}2FGpjfbvBzbxteztTdscxa{5T|E@a8t z!nxQ!@WG$({hae6U4C*CNP(2)($h@IHUIyqq#jYtt>QcyXBcP61H{5D4aJdD#job3 zTIs_YOEwC{SC9uknQwX2Im1FOjb2YY%HiMG{vBZ=Xx+6M zEwxu!qrD-NNO{nK+7Mx;M21BW(vZl!ByhGu(a!JPUwgK1RCh2%Z9K9I#BEzEu-t$M zrzn#MCHsdFKj6`9FAI^GYKYSW>3ooO`$MYyC@igyZD=dr2z;{fgBZt$Ih*7H7X>jN z;Cr^{0yI<`!hN1iP%+#FVxAM>%S2#(U6wm(+obu4+&`9p?{}s-paBfm$ zn`Lp$<$XLPq<N zgT{mtQx2L|KsjAoOHa#6>wl0s3Q-zp8yE@dqQd-yS`@X4iJ-9qOeH1rC7G3k&lm8Z zvXQ6>$<{#rKS5olIG|W@i^*som>Fkgpz+CJb}ND31!{w9HI?;TVwhOqiM(qUnV{Cb zu^dVA25DfiiQGX^0<|MQJzz6m8^eDw4{weZ92DWk3is$;4I542TCz+SmCS$n&GabF zl1}C&dJ((<-3(`mIzgNy_+?u5Za#!bUo%E^ zc@-QfFA|4zdUrrtMU;$Jig4?+^N_*bYn~w7ub+bn)6BGW1BTDvjGFDr@-mM z1^F4Sz<5VxbAbLg9sC4(^s4iL!8_22IfIOkY~I^4 z?qF6PHr1q)C1jqDtT9I4Og}#=fFB)xZWgf6SMi#A?p*zU5#g!x@_(hcFXHt-Dm_g4 zIY2UR(B@I?2=OAieBcjO+-NJr4OJiu*k12kO`So37%$JmPC_%Wlz@)Td=_ zf*o`jv=?M5nh018X8iuYdzeL$0@?t~|IBE~#ppnU7ep(N!6fJ=nydlAeXl7LJSNIv z{UE}=vD$ERfYbA?V3aiYP(enqQt2B+VWiyLHz_(_Qf?3HUEQ( z?*CttrK`rpicOIC`{3tcoy}V!IK$_vaR;|Y)y$~#o+9TIx#(PfOX~2B&PZv@&{^u; z5@R)vbnel#iR#q1%LOrVWpL`aLKxY^r)bEU5l?3Q#JdCbN(Mqb?YZHGE%|I*-0m@spVTFpOY5g1 zslKp<% z@PY{`?4q%s85VxNxNO6l$||>|>t)f!k+qg|v0i_MNLY5+z5IMSntEl?mYE)!h!X)x zcqNxR^vF*;a~`*WooDP`c#PAz+_csDx{W*3O+-w^8Ao9uGeqOEW~ z5aV^ddd>h^QvEI2KE&6!lNQA?Rm!J=R!lOqBJ)}uN6~gK)@LxKmN-PR^8@Nt*swXX z-kZhHT&>ZH-1>IvE{pfQ%mA0w;k%oVt(N$emp=vf(BV&BX}9m!b1H6qkhsVGwSqs5 z$6J4em}l?QtdCPjXon1N@|ouBS=;b3ouUPfzd34QZoqy0#BrJ~L3glb48^w-t6*O2 zcxM=A{?9NYAhDNvB{R!OV)RLmLtUM%Yg?^NU_VX$Vf#U~+A}FGy-D5!mR3en$DuC0 zt!mDQ#Cy9+@>?wS_1HwF{Ot&CI!mP9gPYu8AyvHN?4Rq{#;lGqek?TF`E*-XVw|i( zwtLUI(XAyLFzQ$JFo24%eizN+9xw;6cVR?H zjp)^B+HR#U7}_cb41pf$lpEC2_j0QKDe4WQG2)Abgcd4suC$|k8v8=@pMR=9H>*G8 z-~K&xJe^-(Ebq98t}-*f>kB@nKK<&Q@!w1)|_>-Z7t zS$9UgKgMgXQWRGsaM|R9lvM&VrWzBF!L_hImfe&~7lx|;3!hsoOPibX6D8%alT+zI zHt;nPRYB~-)4p{D7q14EdCM8I7b%YirXkQ;lHQxG?Lu+mM9RywG2c#gDQy?9Cnm5K zPZ=4cMN^?(QNR8lyFEbD#1q!+dD;>Nv^T2&{y3!~R}vvGdPn!NZKWg(T3sSUZ0>|z9N<`{%rvZWCQGYcEP&z`3o4?afcBGCdB>~{GEZ{gs*EL?i* zs!DR4>s)3VPhLqr?Axbi3ypBKo;Yq?1#{NaFOQIP3b{@-A#>!iFT?KagEn`@)#A$> zYbgKbcS4+i6j+8JO)Hjs*_(=m?w%@iHM1{G#3d`;D5;BB8c32I2&EW`&Ju&S=~P_z zLSgY6*ZqUp<8QIdTfD`$w*5JUT(BIX1U0)@3-HikC>l^T!(rd|lE@&U1EOvfcKH8D z05-`JT=c|Lo`eTYU5myCNwiBw_hJhif6^XZ2ehilf((~_9tM|<0Xg<#!ZrU~oq;(X zmF!d0nl9#Wr2o;Za4LuVE2GPV|54%#Jwg+~Dww6A{RZcD7K4+ZL3lq?I*jE2Pxw@e z(C^;NAZiBphh3_T!EXVBrouS)7e0~w%Zii!Oe1!gbuSD?iISa{$wLURH`!i{Q^bHD zo<>E=FxaBpTr_>~CN+*veP_Tz@ZA)dNkRt9e1(E6x^gwae_j_v_=slWRfWm#&O_TLB`w=*9wJ$@zza;!j|lh zi`+&6hZ_?(UHj<+WR8>~ zoy~MqQIX=YxGoCa);!szakRXU_#ONYqIDD6RrgRK&oJ7BsEI`0EcVsF8gnX*2LKR`h9|Hx|(B016^F=cA0>uXP$ldA?S>r$AArIVT zcSBJL!xb;NRh~_i76`CPo-6r(@hC?I~PN$NR#tSR&+SeA*j9SdKVwT zLQ{brk`4WakjXZb5iS|Ck!sf1LuIB~r49Z7$3)!3#ANx2zpcc`2KP^gOV?@LKPF-5 zqx(jZ_#6X3;Nf#~iRIcsWyOW~y5!UZuRAk>Fr>6g^L_SROP+btONzq@53XYhBfzKY zS&~>nt<5jlDj@p6aD~FG1ld>%WeC%Pd2OJE#SAMs8z_jS*Q0Z39+g5`6V>a_meSQD zQ7e8c`I0=gYHwRKCgdZMS$=o8g4wB*X)U05BYLzhM8b^ zmQ}p6-1LNwR@astUjx6FQLMUww9w*iRW2W=;c5)Q2XS7$ROliXrM@L(AKSf-kipF~ zo3cgSdXcX+!qXDlj*|cUHEy>KydI6OC#7Obflp~s=88w2aLyN^h*oXndOS{kpX9hoVqrJ=R7iX zy}O#sYcNOM;L=*6M;x2FBFUsYZU3ye+LEnWkq5sfslUc|VQ3~vF{~sN7+yONrVUVK z*M-Rs9IE`RP)|C_^lPY4R17j1$-vZ- zRHjd#U*wxWN~l&?=_uXghe=qy?zm}Pp#eDfLN;~*gs+WSKi>?q^4j4Ec@9~gJRe3~ zHY3Ju3Pwq`>ivtf&d!d^{^uoo5ZaF(=gzGBN~s_x)*&L3r?Wt%eXwSlQ*!@xHcD@( z4z-D(w`d{2NVTK&k4S|}21BeE2Mo6Stt9-lSqXl{qnS8W=$1-uNuI;o>{AZ?Dh#y| z-i_d0qGCVe@6X4jCRt-^Tf|nsI`P{(}6Ua;eu4uCH#M;2_4f^g6K`Y*tSgQP)^3~dm=H|0 zI{G}(*hJI&Qup$5`*O^3sh>$)BB-jh+ZsSpIGH8$5HP8w=8sYhR!7>ol-T%qD5Fn) z8sxCBfM1NN89xt&=wDyBRcpKznmD;{RWD$_MG$s^($AG{Y3EOk^X_V#0AMK& zi&Zr~Nf+I#22mQwYyDBhwWEVM>etaIN%W6`Ipf^<=lDU>Uf-qhbMj|qh=7U6i( z`cglYNgF;eI4ym1ppM1N<3n0?vU6lXOJWKR9yMAiHuDDqhirKhD{pn0I28S1r_m3) zrUsnM|3r=xPN19Br{h{9N+vxxafoZUbj75bXSnanStxHq{kOv~bdIk14o1;V0)zd) zFU(-V#!jMeJ(f?&GiYcwaOoHERvbo))iW4jsh+D$wG|bEzo|8dvsQzRaHyOji(xvi zl~kR?W+Q&}Hon|F)6fb$yjpH`WCrj{at{?->?L&HWQ;fx-~>FCitVAJ2AGhjDKLhH z`RjCx46sjs%H@C387kw^k0k+?Ey+AGx*zCzF$hHAMQ@o&GAxnE%`2xfRmeAi7P#IZ zqqUT+9|?O5gVWsMneD3bWJPz3T#oWIVrk*DdOcEt@QpKo!msbNzTmDP+BtE0BA7)e z-GScl9^)i3zd-0Er>$!$aV9+~$;yDMpLZS6G81CqOgfJ$+%X@G16#5~J;Yhpol zkexFmubLsr@)C}2nc+ze8}S~TlKCNTsl_XApjcF@YC}>*+Sp7z>a$87UN5PME}L@>n#(9m*mk>ijNjI;kgB}f8uQCEEghL2(rD%8sh^@ zWQ5v4PWVxHk#HiMx{metRt+?fpctxe|GD#Y(iQ?GqgkB9?uo&A zM$F_EI4s zU{sk?1EH8Ii*xo?{OLtZblbT25Hd0 z&)xKepq7QEi4x~T)g;eH#*l;nA!YnTjH47ykS+pw(E?ahOsFPS7{VGdcAbt0Ot+{1 ztglhoLS>4Qs=iK`HH%rk5{K=F^2>zN?M3o|QE8J~u=Hf&3Nnw-SWJni_Z+2VRY%zv91>*Yge+vzzQMe@7*lCE-xPHQ`$95Uq2!A)vNz zCQ=;>$@*e;5;`uIh4hzMBfQ)R-a7NBOe57cEd>(30hM8Q4xx*`bEZ0Uulf_a-5waL0C;#0^s9OZ19Skupd zNsx7gKk<^jhw5obGOSJGUrv|LPo3N!g7_dL0h4nnK)A8`AFq2#+53b#ItX*2zAprHaWrKc>gULmp~ z9~s;@l17Ylv@pm^nV0QWVk zDHG}K(_1K(h1iAe-B3hBREZjOGIWfW1aO=cWgH9>rQ{YkFKqPp1=pC0*YqNq0=i3e zj=3EtY?Lz?;XZNK`XSeJ+*-xZ>W6yO2{DcIyeqKN7Z~ivJc8zOkoMP4*L#Ol{%e9q z>RL3=oL26@sLMH03QnDJz^j3cg#EkN0RW>|_!0vg{Pz!lz$9Bj3U&Rv}brNkwzhue_GardGBsYh(zGQSlM zcYiIaERlrWr=`1Wfu7nwTNajpGV)S{5?5x$Pj$rx?EbLKx$jhBye!%i!$^3icFEW^ z^UYuWTaExeLZ=9icC9SuC)*cgvKXRM_!#t+C(?ic!m%&tldDsoTTE7hJw^Yr9ek)n zIGY7@UQt@`0;$x77!qUZyj6Z*4o$al*_?{!*mhj6L11CLy05r`cu!=h(`4) z*kD8p@D-da7+B4U0Ue_LS!ICH=SKs8dZNza^lA>U{w^-`DDpDO3Fum-L(wH(7D3{+ zC`riwDJfnEib4a^z&eEu*ac5DQHXBX>M8uO zHE3Pkip?w_LPcV-$;Ylm-a+)g*f#CfHzIQtHiQnd}#9Xyc`{x}>w z&bn#XixAABHF{aEN@nru(!{sE<8BF$$+mC#Af?vSg_5F@^>GvFU%X2x%=@gid(<9a zx1V8m6P3fwqHx2{Bu9wV8)myUp80Hso(qW7)Du{t4RV8ZY>A%M=KcqcQaRGhDlz*r zL0V8#)+Y@wHGgyovbi>QO)*g#!;(bk&|(?`Hm~f30@P%S`Lrr!DNgtKO*v_R6@b}a z`xZ5IDNbD-+LMPBUrcM3e1l<4;CB;34QvRAFCMEz6t*xa8%rqw%ayJ3v)N7K4SZwO z_Q9l>qYNvHU3TK>r_#mZ)?VQb;)v`vwWy2#+|r(@Zx3_0=jpA3+X zr|nk>1|I^}F#|dkdKRR*LgNg-soNwZ$`)STcAx|gS@sd9hz&}{u z`6;J&=USm+wm`F=mG~%Z`SK^fV`K``Q}#`Ti!n57j^2p_ge&_78)ai^R^ARNmF#Gg zBmPKpGag?QkZ~S*Ws0eHSqFsb|NZl)DF8dJ_adb(_$#+-m0j*9{SldrVthzE84-%# zkV(w@dG>4~*A`4j2Tg9!2z^lzqF*Ew^t&YVA(!sg2jeCkSsf_ZG4)oPQ0CAYa*>-_ z)i>l~70KYpr<&hv%b*~<=;6k^3gx>2*^vTA-lIsPq_{Z$xs}kVG4BM*H1y_z`0P29 zPF0s7I+^-dQEF*2e@&%&HH}7(;dOkR_mzR#{{$^TA;7AK>lt*TmpqXj8=z?KP)OIh zT6?6csI#s`m>^a5ja=BAhG0Fk7$4Q1E+t#s82&u|M?aTo$v8C+Y6zS=P2p%f^KX?r zqMNWf9!9D-S}Aq0&y?YtwHq;YJjzau_Uygrk+2lP!ZUN&T+uMfIq@iI<{Dutrml|u z2b#o)SA$8c(8sn#pvH+IJHvmflWjg6da_2#+!L9UC-pE|@_S=+QXd#&I1~k8(p=S| z%e+AeA}K8w55yOfxwEK<&1fqbJ(q1r4k>T6a6mU=ML<+Yl$GUR(3kDm5U!S+0xwFV zYtwVk{sai(-NW@jsrW#7CPvMV7YqdcLPET*?%(E+I`=hhO-n+>t0<*QGF{Z)jl>A{ zFkcq^FZ*R@LSFecnaQzo$$FddFNd}tgB!zqVQ?ISpW*3TKq7At*a%N@8j$uc?#{vb zKtYc8Au^>FxszWZ{x^{t(002qk&A9eHmn(fHe}Qa zA1Y~fyUXXCHe_&{5+^G;TC2q*5Knin%mbT}j*JMx19qJ4;;gkv!9_{s=mvu!?o;LA z3uKO%64vix6lkd8!6VfDD!dR_TNOG4w9CZ=`dh?xHh_++QO4_yBP;h`T=sS^p4n*g zptT$n)N%fz2|2W;v5wOlr>_`0gnviYn|Y{E6u=d3yY)Cg#$tF^tQkU`b?PdGI}RfA zfTDS7p;}HsVj$u&05%KI_`>)Y9)f2Y2W@ODs{EGAOH*1QI=}`PV3_o^Gka1yfJYYP zJ_W&=N_ogA&&WOtYt~Kpx}cc@b9p`R;L16xtiQY>88g9k+*)P7ab4YDl@Ai%vM4tm z5k`C25our5G-ndJ!!=xD`3%~9@vAXr+GR2%9uyME5U5)x5%DVP&@PV+VsjSd#%tOs z4*3FtPtX}UgOQ@xP*lRey5TC}vNZ(pY%9T&Q;F-eunk@#eVUU2KFFZu21~@iW)fHBQzv;=n&+q`H#`I5 z82)wDNjtOy8m`KXT_Q-ECduuKmc^#f1E z&HA?~fa_6JEb^aXFJcr^aI**?1iNGEmAu?tx*^i#rVzA;*$w@-8}ZSMFktk27l0nj zg&9lGER<%U(vCl~EWu)@A9yW%( zWy9fNJJ+v6)1xh}O{`(D61H3{C}5HAvc!};;l%4Ah22CC%3rxVlL!V<0e)Htc*>jx zY7$IBU!3_+Q53#6U`>3Ey0>ynsu01UlqVOrP7^8PfS8Zxrg(A&*g=RmBmqw;)ntu; z3w&wFAC+$BQirMz6PRc`U;q`Egz*sWzu-YPkN6N60tsq$J?-uNq=G)7V@=7McUZ*q zMzpca6!8=hd`wHa=;wNj-1NEA@XK&IDAMVhJddqnGeR>#|kT;#9r z$1Am6y$+YvdI@J7&ox47by>|bNh>oW2)cY(36rc;Xf@#tozon)(Y9Ln@X&p$T~7P zR@o5*%U^hdY=F(ZD`*s@PjBDHG?*k|8iWfoqOif-k3PPM8KaHGy}bp1*|q{9WGbuj zZ^UE5C{B}#Hy|&zLha2bxAhO7?TwIp!%^u(^t&=rbESE>o{{PY``?&Rhd2)YPzDlx zH!W`j7g*ANhfLhbmod0<%qUONL!{VmT7ySF6h}qK;Bre%?f9-CBd`>+P_L=c$?{2M zVon==)kAmSycJ(6=Ho;N(dEKejJmiV%a$Cl1M@{jaIsi zpm8es&O9JR0s5Jj5*E=6oio7no06+fw7^>9F{kqMU{{+g6S6cdc#&&JmI1R8^Gz3}2U0%Ef1x|Z0wEokeW(HwvR z2689W4CwEaCo>aOKaYdNm=-GHc;m@vhykj=U>()q(cCqP3zK)6J|)$dWk)0}Qv_-g zhYw}{+{IpL=v3U*u{g^`}rBN#$9YzxAK9#Vym}iR}9FxIE(8wEi=r%y* z7E`ZFU(El?{Ye0N4JX7=l=10QQsQAsV?p0|Kxzy>tgOm%R+W%WdS2A2E1(>xD-y^o zuOl}5*5;93!G?4+u2Q77+05IL#Jk@bp?XQ&krBhsZ!u;%k)6XQ)e<-;?ap8zZOAu= zD6xlq$j5jj%Z9pzpnpyX{k@DQ5{HRENP9|LyETB6q!_w9c{Vc>t%)nJGy>_%nk1b4 zC+*i}z3)U9UJBeevR+0gnhTaJ%-pYCKXCeHhtw>Kr--u6ZLza7_Fr$xLI73&o{#dc75Jip3n&#kbX4&M!ZbVLdP~n8ntLFAO{oJD{yk>tE}m^bMQ}0MNs8u4_2m z1@ZI*@w&n~!9_i$?=$EPJ|;B)ZpYAMA+dK5LJZo(#4xGT*AtXz7?Ca0E9&zkCVh>6 zC?gii_|K(9l3ww9I*lR=hj@H17y=lfbR8$NZisKPXbV4teuZH1AwuEAAGmBF+nT~# zkD=yqiX#i9*f8Ek!>hNrd;NmmE8wg8F}@o0k>H3^gED5^{&NyW#)sC6$Ut~2nt4Z; zRTRI&N`)KN_Bu}WsJCJ>k_DGhkM1WtFPXbRluP-TF9(eWu!`38~DWuMYwBq(UnoE@urkQDh(6w(=&8N;s?XI_P@nhNPb8gtT6f4iOsyn1cITj}^B$HL*v zgX^p-de2s_TkqrU5T|2;ShZNBHC&5OlFK-M-WUPOOo0^&u2wfUI(1`PhRX5ten zLlN6=_`Bt<5Ka0=D;fQ`gQb&D4${jZKd&OBiw86#5BT;m+4z_9ad-teh7k%vX)Uo^ z%EHlS9}DdsQD3MmwfK@ilQOWuXDJKmRLcw}8<3u1=4{Epq9(ZRf7e$~A>m?LKXfSd zQO4Kg*9z8hDT4DEo zZzF`7op$p1!h!C5Z!jInXM)poH3s4SGv1>Y@L=7btA;e#vf=v~6C|pHNJEFmarF?? z))IqaoZmASr2&%7eEF3`SI5r;|9GB^bc4g4I8U87qJg%c75SdT$e4Wl2FVAU`5+Ib zX8^fw@Pb-!h^b;G(kd6G5^<{FGwpJzj%`6rFT=`~HE+LiWjvwv$*}d?mvT_o>@AtS zH~fa&-p@t@&Yc2H2m7!Mu^}A+tlu%AuxD&Ch=);lygb(W@WbIM-0F^;veUn;W|+i& zE^%3MA4$_hkMSJ_v>YMDC94kNb2fzfz($>##?8eY-4`}($>)@4?g;^TW?wDSgO2 zqh%4LI<4ZgQ)q98A}L=SsKTP+FC^JcoY~$Ir|`xWd&b?M4RmxamwQlmzn%?MkF1q{ zLA>RGQbk%tqzI8NG_j9f@M_?SK{6^^$TV7a0FqHeOkeSEHnbCFb3WV#F5C@oM!Hj}RbgR*gzidd*k5#sdWdk!yqd z`s%_MRZtbqEw&-MuLQWr)b7^8rCj%9aFlD8aF&QEi=(G(Lo^kTsnwK!!SwVvWqsv! zc@7-a$2s8Rn@Mx*n~a9WtH3JCKNv0>VjsPf`ZffVZ`-pks%(6|180Y_I|{_B;*KQ? zd?K=8L5v0;ScP{Uoz3+S18=hAb74y!86XAT2mWF)2 zBA(Q&+i&LYIN!xG;9<@D5pY-@^lIj+qQa|CfoYA^rwpWPAGH&$sETZGNof(2UqN@m zwsCj|@jk86Ees3H?S96_o#J%~sZzrVm zxamZLhvSOu~|iqHeZ zCb;*i{$#yiIhA}BfyC^mc?5M{+l$1Fx$ha$A%;y@p=+%KP)mvU&y}uS7RkS zr&V&#xkk7LccYE;cz;eW%ILsYW?xi%dUdSP-`4$%5agBZAbh6`$1Cp<+wnZO%kBO~ zNp({@nh}aH6}5Ns9YxfUq2@Dl9&ZFLwo?CN(ZW!W-4H(I3OSS<^RK^P@FxwWe^K@5 zLv7N^47bboJTcS&+)#5OnGjpcc*+EhHotgv7LJey3e(ZjKKj?*_DOIHvfUo9Kh98S zK;*3!DSpJ~>Sbn-WIKGd^z`XKF43K(K~zd|koOks*N?wGijUn}9HAm%W=AkBu)jwV zakCpmMe#f@^37I^45DQj08=Y9fWI#!?v57=4kPLJ=~Pi-WhHo=wt4xjc^tyk$c^tx zAIWV+W-RFalsPL(dnsfdfu{yuQBHjLD(H$&ZIyj?UOVYFLy`dz(&>G?vGZuWsj5MP z`&~QlJO{;n6y5pE%57H5gcXvU1lQv9r@UL&Vgy=h9Xh#O2-If$SKUi5)RG!AOM-oz5#>p(5%0`{a-!h z0Olk18Hz-poHE1iY;`(_YYz-t*0OAp*{q2%x}MvBXb<=8JZFxly`a@t2LaX=TSVQM zJgcYYvl8T&!u3mPHnP^80(!c zR;%4mZ{%E>wVo~TblT1&g)Cu@Xe6)n1N$HoiL+atY$#m!y)%PWud6q=`tSp1*fBm7 zU7g0s(FR&ifTEHuc{21l$_om#+X&C;J2ax6^pzSLm>ImLqh!u4FF{kJOPyLw0E;+vl_mR5?l!O2wpQG2|=aZ z{5U>|HKW#gk`f_NTc0u+u!SvdLXvINrICAFX-58;#k4qss&4vV176u-YXLV)UC7RH z-#5}S=Sy32mDZQBNs^W1i(<$yDaxPvB0>*AXqfbA1AQS^p=5B4Rjyc8nZ*E;0j=(A zsvamv<4qHfI3DUoVkfeQRVIh%NR3{7jH@j@e(Y1^1PP z{m#^3Jjk)F?Ex}j7~GCth$!PMtZFN_i*E{*G~1(Eg9l%QcDpx&xWlk$x-T<@MkR)S zK{4@EqppVEE~~sSTQmTZq7SxBh2WgjzsDqRahWo;B>+e1-}gv=1Abf7O>O13B{5@?dkj z+*xes3N%SB3`ynbqf``!6BXp#Kfo;$!c8`F?!2O{Sg(T#wb{&aI@-WhYPqN zvGgy&`DK+r9{n-V5u_AnIx)t^x9qsc9wY}3K*EZ^!L9h(*vsaJ0Xs7FhS;K;||0|dDPAi06-V7lSzE3cAxb-D{>S*Blw-9 zrtYwp+{mEhQs#n`b%085X6#rDorN)dTVkp_-BG@tik@8ThA*?X7cneBNY%z zY=R&%{QE9Z75Xe}QtxYP-vd6yo>?R9j#$){(tmgkRWG?VCe>)BL{OP zQZU&_&iZ!Ibm}5C&tqs$j$<2M9X3uqr2*m=mN_*9o(@Fz4?Tg1u9H~gK1@lH^Y~YK zwr?BTF>1>KUr%=8vB(@SNFPW&D#f6IXovVM zDqbT9OwFh%1qdr%`7f59sz$CZPgReDa3#Q18C$3AsYX*Ka^oYehxk@Kc&(bw^gEjp z8=cN@ipJ-40GinALGHn zb8I2a^ozpoCAY-Xao$T^Rf5?zLwpUIl_*K|#~YlgpF+;bKm8|vET<0b-th;I^SmXd z0eN`XgKDHnTWh5T`str@p%g4oQoJy)Hn2G*3f~l2!#r*%iOP;pZq8_T>_oqvuC4y{ z5sLmIalX|pJ@((Ln-&+oaU97IeIQ|&zlO|cB5ME8eB|ooT^ZVNb0YtRrEaCNnAk`&Sa1ls%4^4UWf6+Y zhAW|8>0d=PMHrUo2E6CTmOAYP@LeiiNgcS&Ye)Luj}pzq0Hw^`FWxt8W54d3C95?g zC5F}rC);y(bjYVw$KliNDV~9*kzN++xm^ZrS1?Jw)4}x!DF4O7U3c%euU}Qyod)Dc zG_LwJkiNFWK&(mr29f4W!a6=I+#NuoNF?S^B4&HX1<-hfckNYt7$yg&?}en#!Ypx0 z&$~&?($Ron9YMf59z6?28qu5Rc${ZUUrkk8B)zuXiMNvcC@o$~u;M%Pc}L-k|EshVv=iaI+;Yv{|g~N-oL;Ppz_FU?D`PdwhjW)E6xuGKMby8W?4O=fFTQP;o-kn z=pq)#tf`I@_$O|7?Otc6FSddSoX%)q?kaL_stqAHF!yt+JkAIQB=3>47x*>-9MBB+zmaHkD?YL4{GK18z)-Etv zD!&TSqO#y91Y|2&1ZN@7$u~YRzjI}uH%&OOIk3uUR&uQ+nn5g7y~SClumXE=*hkU~ zxO*PH)Ef@d9HZV}b|-}2dJSaq(dht>1$5JW7sE4lBQJow_dc&Tg!?ChDCHzHvP&B=9g05^2&y5F#lpOB}(2Cod4~hFd4HS+_A0CLV;J4ek6Q7 z>&G?|hiX+P^bq=nS&0_6dLh6?9+#)yC8kID*ZN4t4(%GZoG_{nHUc(Xhemw^0c%rs z;?4x3;1V035oEBh*$D1GHZrC!5REBH~; zRk)$oHrqNC7lAxRxCm#NuMIb1*Q>xmGSsYwz~UvapkSq

    3zPzk$1+o`Dokl<7JL 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


    S);`s6zxA*8fRJ0KyXv_(51 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%0AX~3v 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 literal 0 HcmV?d00001 diff --git a/admin/templates/fonts/cuprum.woff b/admin/templates/fonts/cuprum.woff new file mode 100644 index 0000000000000000000000000000000000000000..c0363f6ba20756ef7f921687420003692d9ee9eb GIT binary patch literal 60788 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�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 +$(document).ready(function(){ldelim} + +{if check_permission('group_edit')} + $(".preAddGroup").click( function(e) {ldelim} + e.preventDefault(); + var href = $(this).attr('href'); + var title = '{#UGROUP_NEW_GROUP#}'; + var text = '{#UGROUP_NEW_NAME#}'; + jPrompt(text, '', title, function(b){ldelim} + if (b){ldelim} + window.location = href + '&user_group_name=' + b; + {rdelim} + {rdelim} + ); + {rdelim}); + + $(".AddGroup").click( function(e) {ldelim} + e.preventDefault(); + var user_group = $('#add_user_group #user_group_name').fieldValue(); + var title = '{#UGROUP_NEW_GROUP#}'; + var text = '{#UGROUP_ENTER_NAME#}'; + if (user_group == ""){ldelim} + jAlert(text,title); + {rdelim}else{ldelim} + $.alerts._overlay('show'); + $("#add_user_group").submit(); + {rdelim} + {rdelim}); +{/if} + +{rdelim}); + + +

    + +
    +
    + {#UGROUP_INFO#} +
    +
    + +
    + +
    + + + +
    +
    + + + + + + + + + + + + {foreach from=$ugroups item=g} + + + + + + + + + + + + {/foreach} + +
    {#UGROUP_ID#}{#UGROUP_NAME#}{#UGROUP_COUNT#}{#UGROUP_ACTIONS#}
    {$g->user_group} + {if check_permission('group_edit')} + {if $g->user_group > 2} + {$g->user_group_name|escape} + {else} + {$g->user_group_name|escape} + {/if} + {else} + {$g->user_group_name|escape} + {/if} + {if check_permission('user_view')}{if $g->user_group==2 || $g->UserCount < 1} - {else}{$g->UserCount}{/if}{else}{$g->UserCount}{/if} + {if check_permission('group_edit')} + {if $g->user_group > 2} + + {else} + + {/if} + {else} + + {/if} + + {if check_permission('group_edit')} + {if $g->user_group > 2} + {if $g->UserCount > 0} + + {else} + + {/if} + {else} + + {/if} + {else} + + {/if} +
    +
    + + {if check_permission('group_edit')} + + {/if} +
    + +
    +
    diff --git a/admin/templates/groups/nav.tpl b/admin/templates/groups/nav.tpl new file mode 100644 index 0000000..806de22 --- /dev/null +++ b/admin/templates/groups/nav.tpl @@ -0,0 +1 @@ +
  • {#MAIN_NAVI_UGROUPS#}
  • \ No newline at end of file diff --git a/admin/templates/groups/perms.tpl b/admin/templates/groups/perms.tpl new file mode 100644 index 0000000..ad4b609 --- /dev/null +++ b/admin/templates/groups/perms.tpl @@ -0,0 +1,168 @@ +
    {#UGROUP_TITLE2#}
    + +
    +
    + {#UGROUP_WARNING_TIP#} +
    +
    + +{if $own_group} +
      +
    • • {#UGROUP_YOUR_NOT_CHANGE#}
    • +
    +{elseif $no_group} +
      +
    • • {#UGROUP_NOT_EXIST#}
    • +
    +{/if} + +{if !$no_group && !$own_group} + +
    +
    + + + +
    +
    {$g_name|escape}
    + +
    + +
    +
    +
    + + + + + + + + + + + {if !$modules} + + + + {else} + + + + + {/if} + + {foreach from=$g_all_permissions item=perm} + {assign var="header" value="_"|explode:$perm} + + {if $header.0!="$headers"} + {assign var="headers" value=$header.0} + + + + {/if} + + + + + + + {/foreach} + + +
    Модули
    {#UGROUP_MODULES_RIGHT#}
    +
      +
    • • {#UGROUP_NO_MODULES#}
    • +
    +
    + {foreach from=$modules item=module} + ModuleFunction, $g_group_permissions) || in_array('alles', $g_group_permissions)} checked="checked"{/if}{if $smarty.request.Id == 1 || $smarty.request.Id == $PAGE_NOT_FOUND_ID || in_array('alles', $g_group_permissions)} disabled="disabled"{/if}> +
    + {/foreach} +
    {$smarty.config.$headers}
    + + + {$smarty.config.$perm} +
    + +
    +
    +  {#UGROUP_OR#}  +
    +
    + + +
    +
    +
    + +{/if} + + + \ No newline at end of file diff --git a/admin/templates/images/IconHome.gif b/admin/templates/images/IconHome.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ab9e101c777eb830d26a1a09baf5cef8eb6f880 GIT binary patch literal 549 zcmV+=0^0pYNk%w1VGsZy0Oo%H;? z@<~Zaz`($1X=$OMq1NoV@9*!`)z!MXx-5#A^7-ld`ud`xqBMiDt*x#0_V)1h`rPlt zq@<+g=H`Kcf!NsC>-XJ+zP-rE$fu{Lj*gCnqxI6#(ujzN^Yinn*>CXh@VnrO`u+BG z!4!0r`*fd(&T)Bl$4bC`1s(gui})L-o(b~Kt|uVyW88_ zUaF^0iq-h~{`~#+9?0?EQkE`!{;de#Il>h>UN(3f{J2^RjIy{NK!NNd@#XLYgJ&4N8JwZW3K8DQG)IL5A+=bfP n+}sx9h2i8D9O)c|w@v|^YDZB^0xlAfdBwIUR+mw literal 0 HcmV?d00001 diff --git a/admin/templates/images/NavBg.png b/admin/templates/images/NavBg.png new file mode 100644 index 0000000000000000000000000000000000000000..0b8a67d1e99b12bdd420ac819c610294f43b47c0 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bK!3HE}&F^>uq*#ibJVQ8upoSx*1IXtr@Q5sC zVBjhRVMZ_2yMKX#G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r4s zdb&7w&4vdvN)BgYef7wl3&UDM>DNfpL0?Z699+K+Y T{*>teH8Xg+`njxgN@xNA86GqS literal 0 HcmV?d00001 diff --git a/admin/templates/images/accordion_off.png b/admin/templates/images/accordion_off.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b01d6f53f6d3d7b8e860a50278e9ac0ecd347f GIT binary patch literal 1020 zcmaJ=PfXKL94?@u1j2!YfQjT;uB?Cdmo`)w>nbypkZqC0c%W%it}}B!-KQQ>-&@M`+nc=_kQoe^3wI8fy)CF zMGa*Zd0cW0K@o}L)a8GGwVB=UV#`C;hJen^pE{FG%yW`UWuuk>ZD-VT&TM+S6|BO z^@=VS^z1b-;B-wPAarFVRh1k*tGbmIh4-u1NH$se-x;QpklM#&98>i*q2( zGkhePNF=5}nBzH?3$uJU#3#f^SmZd+`e+i(HA-SuR$8&hPNK^gJ0i>0YBi=7VUWAV z@`4})8sTt=AVS`zjWs`Hdy{Pi8G5>FI@m-u2o$va#`>DW z@(dTG)CQ{R|Dl%EL3=n0&;0&V*voG^kj+95Rb8E2Txl{0<%lU4Y8bhBgf`k$TrMMw zyfSh?Di;GQrfr~_*F>wTn6W*q**eU~5>5DwX&PcO8BYk)@i@oFc%D!5$%s6iPNleX zOi2pUQK8M1kzTc+joVz~jGO4n4I066NMsqh=3QtgF0w!~VbSdFCE8W5#WlKniFM_& z#0(o;>tEO0J|evnEIUn0Hl4PIHtBVjH1&q{vPvF=n~{@w|7-CnuPaj{BZo97&Gk2a zpY$D-4;qcehi|W|l`pTn?_*=*<3|Jcjt3P*8C+jqUrmD-pZkX=7WbW_-rJA1wt9B9 zx93N9g)7hc9*#^%^`EuFJ++aH-XDIPx_R#H)wy4zH{QMP=^do1pKhJ(?d-;a_n1j9 K$&gP7p3TxoZwPj^Gb(k)VC0oz6zVhqdfKo{7ZWp}WJgaqXx z2_%N22jj(q2OoIzk#P3H#Yloi6Ydf;YQ%`f+0qsd)=g&Tk?;Hd|DXSx#eu$y4W1?s z!!QlWZYf3QIy#QjAEN(Lc=;ZkPLo8Ir12=pD>hJ@5dm|CD` zvLq|_iYhjIii`0T42!ZEroE$JDe43wU<8fnW|ZA|vBm;ji?V|unU}3N%IV#+HcHR- zWz^XTRnXXu^Ps&TQUL=I1r&@)(-8|%wx}!8wR_C5pa>xoQFcG6tULhX*hV1a2YtL-QW+@A|A!hz1?`X&I>`5*!cJz!LR<|Uh^IqfP&YN4cZz6P7L%q!6jMb>Daum5PuDdu0%1f51tAYZ5W)nE3Bhwh zBH)imp-v$dj+eO-R;LYQk}_92;L_$);krgJEE-utwtgLHT{bpAv0zcJnoFRos$Pk! zRnLX5%H?P>oZHsF+FU-O-f@=|)6z}F_Q<4Ox2dVw?eGG95OYZ>mMOdqE<;aU%dv!d z5{(~yyn25lef-_Wt*>>>!<+iye*XLAHvi(2v(0;Z{kz#7!C61kcw>J3*}{*h)tXCh zhLXKIznavS%NtEgaAmva!H#{aeq-plPAdQa literal 0 HcmV?d00001 diff --git a/admin/templates/images/add.png b/admin/templates/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..383263657e71d11edb1b7ce17f63d94b2ee35ba0 GIT binary patch literal 944 zcmaJ=J#W)M7`9ZYMMY(R1rWo@MHK_K@0=#Ct(Yi{6B>l0$cdDUIQAv6Qu|!{f}M;o zAu%BS0?Z&L1|(o$VWtxc;ur7-kjgoYQwD-9`@K6o&+~rXvv%wL&i2i1j^lQkM~21h zR`y-mWdAQ#?;A5WXuVH6WJnV`!d%rQ0}PtJJ;D~Y-Py@kT;{k9;C1`7Z$8u<;)`~M z5mP^8Y>q2e($ID$n1TTwd4bOV`tXSdo~!e{q6y8ghR5E~Ji?uMtLw}sj_UH2d!U?Z zOu)y~2C07>#9FHJ3tf$^vtx+|3kaR){CQA)vkht_!k{QZ!GR?RN=QV7eMM330vRGG zL0LkwfE2ADYY>9v!!vJ@JJc+rvGm1uIzOf~)FdfM5-}-=BpOLbRn<&GmIa0o;#olL zR0!hTT*1Jx6L}%^NB}ZLdqAdC=UJrZDfr<^Hi(yHVg-{@JCu+Jvy^h6Y5pJT`zv%z zEqoF0KZWD&EX0z9V=|2#*0|wr<|@=`5w`s(M)=cn(lfzO=$ VVC#w_ynCJ9p=P~hyg7XIvcgkUs)lGv4BH$xca9+@RamyGl;PX^KDJhEf?@Hsdr9YK&1 zjzO88Wrb6^@{-pP`|4Vi!P11!U3ulyFgyhwWdt-8*ofdh1p7!qx?!5;GoV2PRj8>* zYar9nH3vd)^TfyTY2mtysrn1ary;l%CZca5|%$7BiXyuWx`5M@d$ltMaU(^$APfk~m;A1swLNh+i z#(Mch>H3D2mX;thjEr=FDs+o0^GXscbn}XpVJ5hw7AF^F7L;V>=P7_pOiaozEwNPs zx)kDt+yc0Ixnujbty?y4+PGo;y0vRouUffc`Ld-;7B5=3VE(+hb7s$)Ib-^? zsZ%CTnmD1queYbWtFxoMt+l1Osj;EHuC}JSsEZKEj1-M zDKQ~FE;c4QDl#HGEHorIC@{d^&)3J>%hSW%&DF)($PXnb8~{$GZx^>#A9X6@R~_O Yk1O$=e8FR+0CW|Dr>mdKI;Vst00M?z>i_@% literal 0 HcmV?d00001 diff --git a/admin/templates/images/backgrounds/darkwood.jpg b/admin/templates/images/backgrounds/darkwood.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f0269366a2dcfbf0d09dfab637c47469561aabf4 GIT binary patch literal 14979 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 literal 0 HcmV?d00001 diff --git a/admin/templates/images/backgrounds/grey.png b/admin/templates/images/backgrounds/grey.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa8db7fb3d89156b08363834405b08f5c594bb3 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XJ(ik&<|IDnvrBc%h#=PdAuEM{Qf z76M_$OLy!300rerTq8a>QWe}Xi&D$;i?WLqoP$mE3|Gs0yauWi z1F3W_N=+=u%+FH@$;?e^t__1gJvP)5S4_V`g%~0j9Kbb2Lp0ns|74 Z7$T2w$CpKH`Uh0N;OXk;vd$@?2>=uhGqnH! literal 0 HcmV?d00001 diff --git a/admin/templates/images/backgrounds/wood.jpg b/admin/templates/images/backgrounds/wood.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ca663c9a61cefd5d8e2021650e2fbbbc8aba3fe GIT binary patch literal 42497 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 L6Q6nNjYt34y=G_% literal 0 HcmV?d00001 diff --git a/admin/templates/images/blanc.gif b/admin/templates/images/blanc.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/admin/templates/images/chevron.gif b/admin/templates/images/chevron.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef423314574ba3c47768cbe619fb9d919eaf39b9 GIT binary patch literal 121 zcmV-<0EYiZNk%w1VFdsb0J9GO;^N}%?d|XH@8#v?HNcMvV^%B?16DGCMyc literal 0 HcmV?d00001 diff --git a/admin/templates/images/chosen-sprite.png b/admin/templates/images/chosen-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..3611ae4ace1c4b1cbeacd6145b5a79cbc72e0bdc GIT binary patch literal 646 zcmV;10(t$3P)0006_Nkl&pbAC0n?)s%2x5M$#UgGxI1~gymp~v; zh<`zGaTJP5BybQY4tlRo;SIcmE0t>ueW3>*u6N;@_u;;|BoL8PuhZ#FWY9$(flan1oVvxDBL8~}0Q5z;^2p>Ov z7}Q$E7=l>$BZLUt1*uKMCaQwKYf$lsJCyerWMd+%BeGH6f_f&Vpy%=$BN%uK%Ahxi zF+%Jj=Pc-WXF;djSiJw|m4>cN%^Fi|FBZ!E{_yJLS?RI<3U696XLkQSs z{{&kQJ$K(#5CgC1;GbA>mjm56zJZ^-Hg2_ASKI_K@CybPh7Rq}8ud``)NM~eZx}qT z)oK?Lf>t!B;%Uh}*P+)Ef?jbx#w|BNEVb(l{2LK}m#fw4xx>ddF;&j}!S{N-e!<&Q z?kvzyI_AT@H-u4tUz1h&GCh8>?TnA~?BZ7WGP<9`r gQ6DuZO!_~60ju@{TzXF%TmS$707*qoM6N<$g2#CqL;wH) literal 0 HcmV?d00001 diff --git a/admin/templates/images/chosen-sprite@2x.png b/admin/templates/images/chosen-sprite@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe4d7d1121ca45cd35783696940050c690a8676 GIT binary patch literal 872 zcmeAS@N?(olHy`uVBq!ia0vp^89?mC!3-o5mOWetq|OBRgt-3y{~yTgfB`oc01C8& zL0el}Lqh|Q1oD8A5J8A6G6@lfkU;ftMr&&;+$f+RkloVK0wm!8C|FWb0x`e2xj8g6 z6i7l;BAWwL4-tfu5G@ccP!{MmqnYOy06pVW666=m!0_*bfx(A_gav;C1PU5HKT!C5 z;g7@l4POuZ{>hQBP{j4uqq`I2WP9&Sn{}I8xJi*&v*QL&+Dw-Bf-CQLyLk0Ht2-;T zynum$iPO`?F{C2y?bYjfj|~J`6Xz~`vM4Ef+U{Vpli%)D%kKSey_RG0Bi9Xw4jtOb z@!)?~_%DVelO793W#Pl3vjdNCDTnGGb(^YY+BbF2;mJK!nq}@nBGoHxCn#7X*gdxr z+~ZQF6rpL6;MDP)JzehcJBL53AM-QU?@65Plc4-}1EW@`H@EEGrnFmTubZ~5iUzVn zrZYyBIm|RmW$3F@+wkq2)c>|mGh5Rv3%(p~zjStyruBl(TP2_51LpTH2noN*e&}J; z1;$+4EpJ(Mb+^1}Fv>ms%b`r}+KYy~zf5x(4?8l28%eNnEHzx({;NGP)_hX&tEw9t zSKv=Qjt(d#~b;F7hbDdUu$OUK8iumkkl&-=~$APCd2zdqHg6@=Z#Pt*5RY_s@Hw*YS9+ z^u)7AmzM6Ux!dus_!gJY)Vtf?+t>a3wO2S)_Vct=T}#@RuG(h!d8WYZS9Tst+VfKv zt~zntPsvfyqLY`klZSPslCz_dlcSRJLa$Px)_+W2Y&u!?oJrIMCNTz2S3j3^P6 + + diff --git a/admin/templates/images/darkBg.jpg b/admin/templates/images/darkBg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8449171cd5e3eaf41b3e31a52b225062c2bba11d GIT binary patch literal 1193 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 DSQaqh literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/blank.gif b/admin/templates/images/fancybox/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..35d42e808f0a8017b8d52a06be2f8fec0b466a66 GIT binary patch literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_close.png b/admin/templates/images/fancybox/fancy_close.png new file mode 100644 index 0000000000000000000000000000000000000000..07035307ad435f8f2f8eedf0bce50f7ec8a858c2 GIT binary patch literal 1517 zcmV1To%f)hA(E>uTT$~N#GA0orBqo9-jKM;POccZrXJjTzge4|Sa0ca~7y<+{ z2m7~>41(Jqf9L`mBM6zAjf4;hkjP@@B~d6Xz385|dB5iCM=Ro&JZZmk-uHdZd2i=@ zK0a@Md;u9DFE7t8BO^nxckf<*yC?SckUFGmX^jwM@NV80+eiP zQ*s##s^a3}Ldwd@cHO*r^T5i=%Fj}=Cr_R@78e&C((#usU;YFS>C)2Dw4tG)YO=*P zWt;6ZfL46;=u!R1$jGM-hhvcpVyCa+S}Q!T2ALHx;BHe#M~BsHHos=s2iW})#C?}q ztqvud-gYjKsG$zHm2XhmYPB(Bn>kzw z=gS!w6cG`jJ$?H00VK+=!cMnBDn?IFkCkj7KmNq~hrkZvU@n=EP}|7Gxw*M}1_lPI zNx@_?IS^|%_ok<(o3gXBH^f+@(X7_g)K~%n0$gMM{{Ab=%gZ*hH99)_Eo>!VJd8_C zE)WMoNsBB#u&}W3BMEnPby>y64F-cra9>kX)4DJoA0KZ5fitNn`NTT4wY3%+fA;Lz zZ+K4ucJi+Mg!m%<>Ug8kSg^LX_JD-5va;NEM#+V_H)8UHgaj8UJ?LiZVx92t@KxlB zb1oz#Bo|{kAO!IDVfOII$VfwRad8C+y?XV^;VEu~g@tQka>%(zhlYl1p7P=0!-vj9 zYiMYw3l0uW##jWq+eZ-;6r@4F%{+PXGcz;xx78|Q_F7Eb+}ynGO@4TI*h!27r4#SzfR=K~ zhtpe&%-o-olT$}R&!0cHdm}}wbdd`2lO~)PlarHXnm>2$+(ng2^$EtJ+=vwl#Xg-* zSA%x<9|=lJ3CXuACMEY46&1O~{LGm%7HKm8lhZ|+Pv?nF1LcJswy+L%zshO4HzpR4skij zxq<8a{QPpl!oq4$R(*n7$-q`gsjcF2;NWZ?##l9wBW)lu_Bpk)RJgGO&Ey+2dDr3J z*x2~aJFl#)G^5U)q~qh`_b^ru6q9Xf%arlfse$W(T#z5f?cqE0>k)x`c6QcMUS4jN z#$B996B84z1O(|{7{3S{Bb#j7?T~OCi+pq$fP9eGqJ%Evk~i}B@#8tcAnk_QAg)9f z!qn81MJO5W0n6>}?Q|$y25QL`+uU$0x?KbSI<(UOBavf=wCW!^J3Ie)^yty-8!yk& z($YLG4fjwT{k&5mHL@*_7Xi1c4?x$HT^y5qc2zyPPCG3CUKl!f@Zj&~&!7K?fD>&z zDk^G(=74sN=`q$#Wm{gaK5myi7K~vRQ8s=CoB+NC8j<}iKpXzI(SMmt*2r@wST=`s zW7t-}X4hPqXy3W00000NkvXXu0mjftFGKG literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_loading.png b/admin/templates/images/fancybox/fancy_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..2503017960b3972499d3aa92f89953935ae40934 GIT binary patch literal 10195 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 literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_nav_left.png b/admin/templates/images/fancybox/fancy_nav_left.png new file mode 100644 index 0000000000000000000000000000000000000000..ebaa6a4fd34e51575a01da366312c20618985cbc GIT binary patch literal 1446 zcmV;X1zGxuP)R`@usIzf?P{x4#0gFqr~|(;IJySuwjr=+Ar78e&sHZ(Lu;P)*wKU%|U#jmpg5~Q6= zNl8{#mZGz>Q!_F$qJ8n=#Z9x>Jn_n|ZEtTsSzllOW_Wn`!@Rt_=!l4jAl`tKb-5%L zv7js_CMF<1KR>Fcr{|nbr~AR4Y-MG|y0EZdwI6@^^5yrikSZ}TQ5hH*C?{R4Q{?KT zKD6U2SFWfB2M0g0TCEGD5GUP%Y0a>J0W!M1fVuVU?d@ix(YV91PjUK7@OzY8E)OJ~ z&Q30n%8njA8kC)#t?uvd&xMXHQZzI)WQmTB-n1vQM_gQ-{_*3-7UA?*_bJ9=m|W(F zT+IHE$H&L3T3T8zSS*%BTHM>)YZi;eI#;9uNVch|X-go#ckf=VQmKq2-ORBYaGo52 zejyg&!SS;_ltMX3~N9_#ORsfn&tMTp}T$j*yAd)6-A(_4O6g z0=-^ug|9bVkxorbSsNQ0x9sPG&EF`laq6qgf=!d ztnQGKnVtDqz_Vx1Y=Kr=TU+Vx?;nS;5H`1m#Lv%9fqI)#T3Y%!3C+yRSpE-E!h;77 zwm7Z1{&Y;%TkkIqz&m9sAKBbnCkzsHry#@vbY{a-wI?zu7 zloV4Q9NtQWLUAT7Ev=G-*4EZ6|HZd^F*!MDB>C#<>PDGN_5sGi_Yq4ZlG7@css!ck z9};wyN`LrygSGPaaLVfqXl2Z+Nkm;ygvo12>(Bf+YwDwC`Hbwy5foiCI>(Z2*F z+nZVe;)K}P*aF#9Y8tUS3{lK|w(!NULrkdP#x17leSb zXU`h&IIwaw4`8eqNV6{>BDOh|vjhZ0E{e&QDDu0Pe|>%Zmb;{dg@s0w$z&rPA0K~+ zu^J$UblaCq5g(ljxEe?Y`8AmFYt-vOfqZ&;+Eh?bV07kp3Z#jN34Zfk3!OW_7k zM!Hz%fopN!Lja&lI}y+lIZjBszTeT&@!Ra|?DQ)q4Us*EN5ey8M=zh0NVTlX;X`2G z(+8kuN)-Dfn@v@Ns?$arfE9ks%*_0?uCDGc0&cYN@bK_KngiO{r&oDx0_$@6^x5~= zW5Gx^5k=$2z;)mYpdQiR47B2ZEBzOVMD;v(on_N_Z6xdRarMj=Ped`)=n zv4Dh?$k=SYcJSdjDa(58`F?t%ZzxBbaRs;9zaA#)un(S!5dZ)H07*qoM6N<$g4RXF AD*ylh literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_nav_right.png b/admin/templates/images/fancybox/fancy_nav_right.png new file mode 100644 index 0000000000000000000000000000000000000000..873294e969db9160f5ddd4e1ab498ff60b080e3f GIT binary patch literal 1454 zcmV;f1yTBmP)Wa6`&Z+!IVkxf`V#(j>y7#5eg z5*PD+C=wGBwT+F9xi*_^fd=>X_FBba@wz8b0c3ma+OG#c&LYnSBp_4S(*6BG8m#QpsI))yBSw}|WBy?ft)>pk?VIMu|0u-xC@UxO$< zHa9o-0~vR8bXeVyB61x;@W6T@vgyO$TgWvPslhu zJ>BGvFeN3$D2UT9wO!c-2M2E;RvddB6cm(&J}nRg`1!DUaA;_#J})n?kc`&W*6f~w z$XoI8@o`6>)z;Ql1O^7iqc4Qr?IQ^Y2vDQmrd_^#`AagIo}RXO6Tw=o)=2K&OZ?8A zJDVKcH{^2p2j~ms)bf#Ff5Y^8{ZZ7~8Zw%koV0nHJ||9`FbS!%u(0sL`TfAafI}Du zN;}#qfQDkqhr?T=R;!O@W@c89(aOq-SHe5pO)Do4INRL6f8R{+tE;Q)Wir`E=nLN^ zERjf#VBjT`yZ^}0T`IW~brs!I17PDwDHNtJpz(@u7&_Ci&*x`nXGh4eva-_hHlhTo z>wKX6jrLg})!Ef*2q(qH#unh5y~V~`*!#E25W2>+0$@y%jAkE;d^% z7KiBQ=;#CV)c|?K?OZZNymTtyIv@+;=i$b0QLhID@u{gPOF=<_+1^cd)FbceJt|Pr3Z2#UW)pC9hbbpr%#_w3xu>9DucKZSqKjwKC}oa!!=;B zxw)ARh3h~maWUsB$KtMw06>R!GGHKatdM5?eS3TRA2TyEQ!m{-s9LkQG(13d^zuqc z)WBRWF9N%+J^)=)qIgeo*i|*CI?Xfzc;V-hCr|!<<;s9veooizpgD1ug<#0dV!Z literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_shadow_e.png b/admin/templates/images/fancybox/fancy_shadow_e.png new file mode 100644 index 0000000000000000000000000000000000000000..2eda0893649371f8d92b92976d8542cdd1b601ed GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W@!3HGnP3ltxQbwLGjv*Y^lSRZuwe#}JO|p{EaWGAM`~zK|Yh zF7SQ+m+Ig>B0@o-N8?trihfzZ+Vp1~`{zf0o*#X0$hUAi%N$P)W1wCJ22WQ%mvv4F FO#q)zAp-ya literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_shadow_ne.png b/admin/templates/images/fancybox/fancy_shadow_ne.png new file mode 100644 index 0000000000000000000000000000000000000000..79f6980a3ba5c43de120d963dbba2516b8f27ac7 GIT binary patch literal 347 zcmV-h0i^zkP)dR9Yb&V8f!h)aDezHAsc|y@|hdQ zYJb}?8~~zFbQ)ku!Ey)KSukutuvdZ@MKMX|x|A3tPyx?YVhN^6z!Mi4Mj2f#%<;nh z2{>?YAzu|{u^;Oq!;f7Z4tPBpJEmZ+^GZ#$=9nz(K+UmK7}|u&EPi%aRt_C3qOFB_ zHc`~N>51%{?ijG?xsHt>MwRChgk=x_z0gh3O2xSL)-6?+2LKZL74~Q>MZjWtwukkA tvjRC=&j+0R$&bLyT7MhBcTXDISHC&xXU0&5CWHV0002ovPDHLkV1fX+la~Mh literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_shadow_nw.png b/admin/templates/images/fancybox/fancy_shadow_nw.png new file mode 100644 index 0000000000000000000000000000000000000000..7182cd938ae98e7e28c65a0bc55df576042ff9f5 GIT binary patch literal 324 zcmV-K0lWT*P)2-&4CO{qhKP$XKD&mgeXEM77>~`RA}h@U^Z##eQZVtM>a-K?QT4 z&(8BFf(rD5V61)2I__wHYuRwoaDIqw5Vdr_JSDVr){#J@r;{vbDL|tRyCiirf~4OF zX-l=Ecm>@yR)1nSMt~dy90Zb`^`)TQbhf8jR@fA!l6V$musRyB9Y{p$SCW}!$3==V zk)fW)Xo{s^ez$t+XhmZj;ts)!kTokvmM>z)zt70000 literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_shadow_se.png b/admin/templates/images/fancybox/fancy_shadow_se.png new file mode 100644 index 0000000000000000000000000000000000000000..541e3ffd3e88224b34a4d2097c66a780e6060aeb GIT binary patch literal 352 zcmV-m0iXVfP){pM9=`y8<_IvWD02WY@RZ<9dgjNmAB|sYF}Xw>7Sq@O0000eMf9z;FC21=)67q_`W0*0KnS4AR00W2`RGn3i8UfsEegLO@ zPhds?2e1Tm)FK3=bymIAx?X=YFo3Mdh7W?@I#8s#svp!&PB> zwah@Ngd|l0N4SCfzvjtQnd$dZ0yM)N$X+lqdtN!Pt{Wn*_`0U}m1^#r1 mwpaW{;a?9KKt^WrpTAEd?0j1W(3L*`0000P{ho=rRL|66mGO)=r*Hk83F#~lnc)I$ztaD0e0sy?& B8X5oq literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_title_left.png b/admin/templates/images/fancybox/fancy_title_left.png new file mode 100644 index 0000000000000000000000000000000000000000..6049223d1ec6af46e100499c01f6489c9e2c6240 GIT binary patch literal 503 zcmV+)0005LNklqcp9&~$uJw{{rUub~E?-XJ#Upm4Fe%-Gl z!u%tb0N102a|s5;SPlQvJlFCTBbvYaK@wIW6Gjx@?i20AlVDJcHNfh25WRlbF6CIq zv9_ZnqOH`}ppaUR0@%ZcM9zpDt2uQM>f+Z#wIMmyuui3DeoYXWE|hQ{D$te=Yhgkq zIvyj+$t8T|S1wITzUftNOe(E+Qjn$kDotY;I5}1lRgwi=?K26ke)djLR5W2|!7CVH zJ-`tuAq|`lK978y+CnqGNCkUke_%Gig ukvFM-ftpWh!il7Wg7kz7Y?7xB@G*olNlgoj4E_Yv!rmdKI;Vst0Ha3^zyJUM literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancy_title_right.png b/admin/templates/images/fancybox/fancy_title_right.png new file mode 100644 index 0000000000000000000000000000000000000000..e36d9db2a7c6e570aec993d3665cbc13620115e2 GIT binary patch literal 506 zcmV+)0005ONklxjQB-g>5=x46nGBwseihc$zfzvTFh(=tCRj6cJ4M&ASrCAq-HbokPnRBAHVa2(-|l wYU(UxfYLN;KDSr z1<%~X^wgl##FWaylc_d9MY*0Xjv*Ddw)7kFH5l+P-xcE$W)3=fYI&uMKVzWNT*W|n zhqlRY)q0r(8Mg&Fu_zpISivgz+b7g)c6G&O{~njE??Y{u-MM!p^=9_W+X-j8mhfK? zj`H2Yy;kp%)!V-M3;EVThyB(Z@o88wpMja-vy^g)SgE!<&|(HpS3j3^P6|6H_V+Po~-c6$N>^IEGZ*^681?Yf#{6Zf~e!I`r4y-J+3m*Ue*gH=cNZ zzpU%p61aCO%jt%FHUKW&bEWLcUAGzK?;SYE)E{9#W9O8@uj{O@89qzNU(dkI YVCW(7-@(*!CeU;SPgg&ebxsLQ07`N|KL7v# literal 0 HcmV?d00001 diff --git a/admin/templates/images/fancybox/fancybox.png b/admin/templates/images/fancybox/fancybox.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a83639c3b30de618b866fe04db184ba9b7c3df GIT binary patch literal 24303 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 Xqc(b@IGUq6x}!YWqdsa90RaFz)XSS% literal 0 HcmV?d00001 diff --git a/admin/templates/images/forms/addFiles.png b/admin/templates/images/forms/addFiles.png new file mode 100644 index 0000000000000000000000000000000000000000..afbfbd9e4663050107ca65ea88c27cf8962418fe GIT binary patch literal 834 zcmV-I1HJr-P)b5m>`I!64a2mrn}Qal2yxOGBGjr0t9Lvt*&SF{Z+(izlqtMOBzQhC@nG!ov!{)>8-a@Q${um$M3Cq9N66MW(3=Mc{L0iO|}n7AI^MQbs0iC_aW&3@7nEA z@#g4AI&KZ0VcD6T9S9KL-j-GLV03Ty904`5Y`L?nW^tKjs{jB19CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o zcW-iQb09-gHt4*vi~s-urb$FWR5*>Ll(C8;K@f)jX?ugo1n~(3eF70*<3KR*O@s-2 z27|>&41^I3<{1V?G&e9YGP8q$a|hh&>e}FD7mwY&+vzE2Xc|8H@2darV7J??0Q>?F z;OFH4tdM2dZxOK~!WEXyvMg6hsYb;+0HpHxR&f%-DYN}q9~Y%D%s2!Bh37&iDqyj`VX)9F;TS}g_q@wWbnN%A}ohQncCjKSq{0Z^Lcf3o8^ zR_%5>xZm%%UattlP(Eb8|0KqkfQbHT+ zFq9-ooQQA~MFK#Y&8C#)9>*2O@e8)wZBZUbzuy-CG8ha5fHWEnIh{_QKoQ~fdj0bF zW;q-V7>!2Q@Am+J<#LH`xBDUWv4{xzVN?P@Hk*x#q6o+15tGRTUxC2)qjIy^Oug^F un*uXK-EOz9^6dTv8e@crUNtj&=lKoFLbCzPn=D^8Nq` z@dZ>+fsml(Cn((^AyGi*5+PC1koyEc?l>;79l+S$nKTFDP8Z1}C{0EhX}5U0tC@Mr zX0zE>0C)fZ2H^t%;G0ZD_t|Xri=rq}C<+m5+ZM~^@?PegOPZ#I0s#Ps2mnArM1{X@ zLI-0EIOjk_AR{7NdH@jtB3=PT#D51Lng0pCPQiTN4;;r4s;Y(_QQNiyB09*3_%xr- z9{}Lyg3CPscw(1M*Llc)?Q<@dyU1tDvaaCsrERh-i*wEa5rGpCgh|(RS+CdAI-O3+ z_k9-nGgvGZH@dFh?shw=(P)q)N#Q1JJRYl~(I~EI8noMON+y#V*LCR)yjrc~NF)O3 zbUHYKhGBd*3`0w$Qc$ngMLZtg2qA(uVtAg%bX~u597igZNh(!8A<;0H9bbQYMr69t6SZsplyl-9$ve7<;bOYIlRdAhKSs;qmd&IUEk|M}u-| z)mgP^yWPH&%Vo{;JbAz0|NN)}r<*;`d+#$jj$<*#erud<+W{gTWFq=wpML>I^X4Iq S7_o@}00008U}fi7AzZCsS=07?>3@Ln2Bde0{8v^Ko2Tt~skz|cV7z)0WFNY~KZ%Gk)tz(4^Clz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiFN27#ZmTRp=I1=9MH?=;jqG!%T2VElw`VEGWs$&r<-In3$Ab zT4JjNbScCOxdm`z^NOLt1Pn0!io^naLp=kKmtYEgeeo;J&4sHjE(uCSxEHIz#UYgi zsro^w#rdU0$-sz9QwCX8VC7ttnpl!w6q28x0}I7~jQo=P;*9(P1?ON>h49S0l>G8y zuxejlE6=>*lEl2^R8JRMC7^!2%*+%kS94QiV`p;<19L-DLqk_XOA`ZgXJc1OBV#jH z17ky1m|mCsATTy&ej{a&NxDLQ#p$Fc=4mYI}9ZYfKArKGU-Si@|m-`ZaF4s{OK|1!pwE)?jj zEeYK{G32F@iAWO5{zc~FqZ0KI3zDiqqfSsh(#d*FWiMP++9^{{8#ihV`$@c3+?C_k5L#XOBa5%fo^bdU|>hi!WY?T6>MLCZ47Fps?oj z(h|jX&9|6fL`%Q#XIQhpO|+TQgP{sR#wW z{`%{8*49;Lo!#a}&sz4>@c)7UxfyR{WM$W0es=5DtmLqLR}_{8y%e|{elerOxf-m$LSnlHMcLRg2{&AjD!3SrWGG6 zY>Y!g>yt0l+y0+)|K&?fZL#i}IZM-B*Qa0naWiMy(jd*cSqBpmI$fGt4?oPV%G-Y1 zFmipm)6ST*lPQygkCti*L`{1C`m4_CuQipGC$*+>?OvJ7RZvrN=KI&GX|3~GlP1{L zznmSvStxE;-oy7F_?A~o1eE#|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFe_w+M3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWfo`&anSp|tp`M|! ziMhGCj)IYap@F`Ek-njkuA#Y=v5}R5fdUjL0c|TvNwW%aaf8|g1^l#~=$>Fbx5 zm+O@q>*W`v>l<2HT7t|lGSUUA&@HaaD@m--%_~-hnc$LIoLrPyP?DLSrvNfBF)6>a z#8wIDQivCF3*g4)6+?pw7-0Gpi3R$GdIlgb!4&%X;#ZoR3s+rS5|oN?FIIz#Ln;eW z^@CE2^Gl18ff1Lc46>@g%DE^tu_V7JBtJg~7K#BG`6cd1|nJHF|=5B^A1_nk3jwX(VhOUN|7N!;!rpB(8Ms5}s z=B@@Xy)OC5rManjB{01y2))KQ^@0*YZUN9{m(-%nveXo}qWoM1u!pTOal6F;r+HAl zDY)HYh*PgV&@uX;Xhn)X!4>4Uyq8ZR%|2RhX|ZWahXt9EqmZZ55p zi!SEOYSnH|;Ns#swL;_C$}X$9-xV&DTzs{}Q12O^c$@i|xyH}${C@XT(`)IZ23~_! zr-^}DQ{_Xlwo37}KMp*|(bQ14|9{)#9n(+oCbC!Uop;AB_^#3&7G(>wriJ%?*}mxC zULi9{butkCzHAh4v_mKE(X-#YTl}}&sNL7yyq*2~tKLbHR{tt`LbO=dolZQygSjm= zVD;64FaJ1>CVi~qS)0}B#Q5k2)8v~i9x6=huXEQOQJ#KYarW6qPcC!b$us9+Yc^@? zNLg($(d&0ecZP}A!82*brvfZw+U~z+KWwn$N7crnn3Iz_H*=qmd0MnnW5(_Iv;3Cd zsNUGF`&I1L+i$-nRYh<1Z4?k+zQ_9fkNGye?h=!ObS6oBs<06dW4iS6%iK~XgZZbO z732Jt7uR~qakC`W`d{1L?GMM!oIax?Mmn>4mu-2uF-DI&ZF8k*l|T5t?9~J-uP@^JUzrHm_=n` z)0bkzIW0AO`k54?zyIf{7~OdNHNiy6aHh|+s^xL(?PH2nd0v(5T6%EJ(%brC+?5WK z*-d6DN?y3{XV;PM!Z-0ff4g&$-xp_72_A<(8-3qY)^;B)`sUrh$Z-9d_rgt=c$Gn= Nt*5J>%Q~loCIISQF$(|y literal 0 HcmV?d00001 diff --git a/admin/templates/images/forms/select_left.png b/admin/templates/images/forms/select_left.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cee52263cf2bafbc408102f38d1f3667cf51fa GIT binary patch literal 306 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 XTHEN$y;(Zc9lXj+YFxQHGIjY6ZCFnE literal 0 HcmV?d00001 diff --git a/admin/templates/images/forms/spinnerTop.png b/admin/templates/images/forms/spinnerTop.png new file mode 100644 index 0000000000000000000000000000000000000000..6534f8777873dc819e4b4724e61f3e899c633945 GIT binary patch literal 1019 zcmaJ=O-vI(6kfmsA#wmCqNmAnwB4VUvUWqovRkB)R#KW!J+a*#=u&oP*`3mDFA@$K z?j|18tA>l32r4mwlLrr8Br$-AUPw%;go6?eM&oR0iwEl-cHT_B?|a{S^JaNGd9}0S zLI*`ro$*mQMb>UFZf_<3i@ud4S z&moMQ9I}8k5dxFCsiC4%MJEzs+;p&FsxU4`Xu@Z7T@yomR0vBknUe&G=VN>{EQO?i zB#lS|Q7*^{b*_xmf&ooj=V~Y1SW~Vy2!=&6%h1*rpf+M715^tZ_2yoNo9flLT5~T_ zQ!Y!)u->))bo9>gnnFv^u}F z_4xX7Vei|{^PTN&w^UkRU;py%;hmMmu3l8BRHXja_Kyo+KloE?EvI^^d%oND{-bMW Pz2_K@CFLi>Q%ipUY8Fx> literal 0 HcmV?d00001 diff --git a/admin/templates/images/forms/spinnerUpDown.png b/admin/templates/images/forms/spinnerUpDown.png new file mode 100644 index 0000000000000000000000000000000000000000..7950c0d24b6a7217276d7e2ca6370dcd6a4b8ee5 GIT binary patch literal 1116 zcmaJ=OK1~87+$SHEmriPw8g`)f)8l+m9#NSV@B)BECheZ5321^`Hes@dYYgL`AJQTbt^^xG*~pzVG|L|DS*MG&RLq;E@}p0N^9u0 zV7$9Ap>%gBK9#Or25Pb*5zrx)L00cHY%%Mn$8|-rc8*yZj6-mTpZ;ws8EpbVWI<5H za4v#YO=$8#(vu)N^ny`ozXISx#GG>K-ZZDLFcPsAcSKb^wZ6j?Tt z$uJo=gRFLz_xXH|h9I~I!e!?SEN5MYy&$h3L0hpj6Klu-j-uR(y0D)nPJgGMo0GDJ zJy9l7Fg7cjEYEOGN_k*3`hTddPoixcgMa+~Q`k=AOvuKdjk+v_TwL1%CzL4$EhuAT zB@pV&SFtIDFtSs~1i^R}Xx0oBW$bZuG%7|68_R|QBa)vcd`8n$(d%|sR|{3VzzG4K z5Ai-voe*9s1q8_x_If?RJXb`3vVlXdbx7NwPX9rSLMEq%)j_~^Q@yq-yam8KEHS`>OG@X zgoe}mD|&9m>l%9B3>|sGos!Gi*36qWMcA|@JT|&^AiZw&quQVG=2e5~^Do{{ok_J% Wzd!dt=k6oUdyj+~rM|k2+kXL-x_Mv# literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/add.png b/admin/templates/images/icons/add.png new file mode 100644 index 0000000000000000000000000000000000000000..e02c512d5bc560fe6563a81d489565b276e2c31e GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf4nJ zaJ>d$#-?uGD4?KBiEBhjaDG}zd16s2gJVj5QmTSmW>IQ+eo=O@f^)Fhi#?lqfa>Br zT^vIsrmmg1m+OFnK=b6sGO{HvfA3$wCu_Z=+i9b{hRKAdKR6ybdCr*H+b-a=W~-gr zod-*w+)wa26n%VkkeADEx14in+olGoa4wc*P1|%O$WD@{VEX7WqAsj$Z!;#Vfk}U9uEM{Qf zdJV#iP2IdvKtY)j*NBqf{Irtt#G+IN$CUh}R0X%pqSW&IqU>S?=U}rJdp7j|)rEPw zIEF|}?VVuAb-;j!Id!pV^X4!A<$K!uWUnl3o5Ut{kk`yes7*yg<#x56%w(hB&+n3> zGEb*WnkKlk!+;@!|L)y>!?tISrj%S0J^AnU$usLxpPieZ_q@jcwPVo3K%fl_p00i_ I>zopr0Db>TcK`qY literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/cog.png b/admin/templates/images/icons/cog.png new file mode 100644 index 0000000000000000000000000000000000000000..4f163ccd06a9d2a738b9eee66c497ecea4ddcf4e GIT binary patch literal 1554 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qf{65hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8*2~%I`PAXnQNzNH%bU9mPQ1qw7$|QdCAQm zYg6$t;;u~<=aEAS99Qf_oK;08O)_HERu$bIWghPPiCNS>@b~#e4-ULPd#3vHv%NFF zOJr@GwQ(51Sb+<+6Y>U(oIj1AW%@&{>;cV7^*phRtvi0=SngZoXTPH@Yziz%zyT?>>`sv+U zqtBkz@n+8U z2putLRUTWp^B)STmj>+LuGAMx#nA3Faizc9!B!+##OW|pHGteNq3!%4rXn< z{Z{HsT5(VBYlB~Z{}q~K=1Xs?x&8Tp)DE5L6_34*6m~Gn5u_^GB`ugj?7hHb%XPHZmNlS_LTt9O|O~<|YKWgfHmj=b2NHKc9 zChWCvO`F!NA30WY(*$>0{IOiUf7cYa7o_@Oh!%^`Drvfv3!alA)`Ue;o>zx)B T>|1>YR7!ig`njxgN@xNAKQ}%A literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/cog2.png b/admin/templates/images/icons/cog2.png new file mode 100644 index 0000000000000000000000000000000000000000..e40224d75f916e4795f90e3ff7e4b2c700cb70a8 GIT binary patch literal 1526 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xa$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qf{65hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8ZP|IvE%mx*A%T85&!d z7#Ubt7&;poJ6gc>dgc|EB<3Zj!tBii+6&d|h*z(bb5UwyNq$jCetr%t1q5W|m*f{` z~S1o?IZ1&Y-D%9&?>UaoB=_ryaBIAWeeG)X_SOt|6J60;@a zs#!}+$L_GrLM@SO$0n?0ixH9PzZ9U-Y`|73)|ts_ck;@N)+KiTf352=x?1vJ_x|VB z&#k}5%siX6_}{h|z2nJMj5c2?Y<^#nR8w}bxD;`p(T>61eeuQYsa{Xz`j3|`4XR{L z*GiDqP?+G-!DV#j`RCt7JO5}-ds4vhocr|CNl6mVw4TYUd)~O2BX($yyIGNuicqKB ziDHXfM(s-Gz9uvGNAC718M>$swF=RW5G_7lIG6biP)t>2$!G*fSrPW3#O(A8JtFTeaU z(Qmo&^Upt&}1P zb1lKZMxnn$YH5bauGwePPQLD5ZFlT(;o_@Vf7z6r{~lK;>|@_8$<@kd{o3cEmIrrk;reU-xYW7mhpJGg zjict%hXpr)p>$r=^Htuj8yP0A4kRyi=)N&&0!!!7X<>|JV;*P)Y3R>gTe~DWM4fnR_%X literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/cog3.png b/admin/templates/images/icons/cog3.png new file mode 100644 index 0000000000000000000000000000000000000000..218459baf659eadbdf0d50401c329b33efe1117e GIT binary patch literal 1587 zcmbVMdr%a09KV5)Nf{_n#K#27>I8$_?e0Cf?GC-C9C=2^1r(<2-R^m--0ix%a4)d( z3FtU!A*uLibkrgZEfPY9OpyTwk;3scl1x5E#elFdB5e;i>kr32+L_(o@B90GKcDY= z%d?g&ikdQeia;QUGG*v3{2Cp6Uy9(r2^qpJewoD?^0;iu!Fe!-5NL49MgS%kwt}z_ z817r$N~i>aaGbQ}ae3y&sGV|&u%M2}>!NwIK%iRSr7`;|f&*;C3ev3x`x~1;fW*~c zuFMRZX&vDtGyDvZ?O$TG`&ZeOIJh7kP zOBFG8z8;RbAuyl27aIyH^4_3tG9+IVtWZzci(G`8GwIbJekEFxiZSeH2{iopf zZES60?6$=7MqgrG&BaJp9YCK={;DEz*`&<4@;G1R^!0dL@1C;mH6Mvn??UF5>b7cf zXg3nuv{$lg%kj9q{eezpecF(J zB6Lqt`aY=tcfUD$6B{3>5~v4aHY9KNZY&x3`-xq?`{Bs)zTq=xG>5a2OR6&FX}4uq z50Sgtaj|dRnS~pN8ZcYxj5*G_cW3WOZu&Xl7Sqsu<;qN`GPA2;>9MBzdT%c9%D|4Q zs;AKnF<%%DthU+h2Ts@4-n`)WnyR^!Qo6pQqob@9_b*GGG5oOjFKKyFK~75SoFl3u zmmi!m9vHM9&1r(F+MBbIA6+eg7q{XkHa9jlzP!8RPHDr^^eJr#U7Z)g`s3*CKp+r% zap%IRM(OORl*%?wFa0>`9o@n9dSm?RxY}2qJ$Mm^%Wk41Gs&OdXdT;KzUj~019UU#I zKKW%%P2`{_x<4cR!-Y2^&^2K54fpW;<9Q{9&$6o5!LPUCO!Gai=Y0L4m37yun{B?* zlC3|b&e$BDJNfpGI!&>d8v%S}QdV1~`H-6H2H*$Xg^Y~W5!Rv2-P&U+ln<>5Ml={oIe{;3)a&6LU w6=Czge=>OP<3lYf$|2qf4XisnX>?kFpnE{vE1Y>{U+_0>GAz*_(-y4#2irkiFaQ7m literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/contact.png b/admin/templates/images/icons/contact.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cc728dca3cc9d71daade029254d6a6de176fa7 GIT binary patch literal 1247 zcmbVMTWl0n7#>iasETRSYjGDpUocF<#<>kw$BEL#i~DfG-$R5@KpJhKiU<6KOru?N%QeOq^uq z+`jMouV;?uI@;HJ9`X{0d%n6Pu8qaY3RN@1DWy^D-EJQh$P5=lp`Xcq58sU=+=&)sc?B9|bj zH%irUK|lssnr-ukLZMcY11w+w$FQ7_4e@Op4*eKuakM9 zO~!)>e+bkyR^x&|m~8_ozy{+X7PAvV+MkL8|ISn}8BcKGIya+PNYo@)x2s^gHLj4p zCznr}P(->}(Dh2a19Ck&(ybodAd{T|a=)UKa%6KN(}NGmP6B|7w-`7VbZHy3+V~v2t~whVP4sFUGAW=iViVH4kQlc)|I;B!97? zxIN-r9=~+y)cC~2#N9tTMrKZKd=5N38z&G6yYv%dM zx7uGE9ICwV)3>LaM@|v`*SB1papr!#cFUffzB_hgabYca{m1I@&E?qOnLD3+b!_8- z$*Cz?KKkg)nv(a!tuMdQH#|K2#I7R?gO7N<@Zn7n!ZX%%;}|%3mhQTMw#!$peO%ty zIR8uTy{78#vDSv_Yaq1v>f`p!$R_FMD`y`Y`mUWkysm1G{IQi>*f6&(H_~#sI!vCN zo&N0U!&lE`gRw&`XdgE{YJbobi=Aocx`90%^?JSWk=xBJ7w=nlXItf?FQ=w%UN|`3 gu=&JMzzz|O#NGu|w4Q4%xWAlCszZ1`aqyYH0U;-|K>z>% literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/help.png b/admin/templates/images/icons/help.png new file mode 100644 index 0000000000000000000000000000000000000000..80e5bd1afc87a7bf6f972cba76f8f1dd21183d91 GIT binary patch literal 1280 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4NtU=qlmzFem6RtIr7}3C)9WTXpJp<7&;SCUwvn^&w1Gr=XbIJqdZpd>RtPXT0NVp4u- ziLDaQr4TRV7Wn$Y4bCfu1{5&J^eYkz^bPe4^mB7T{sOBmE(uCSI0LKd;*iRMRQ;gT z;{4L0WMF)xDZ?}a!w$biAca8JSos%a0wX0c$0a|xG&eP`#M8xA2`HnNl9^&{`@R{cy_kAa7k%tIrGl{4oN!Y@9t#Qet&njUSeP6=Vx25uaB>1-so7Q zVCuupC-Xr_L}X2Z1JmZTv$uY}y1M$g!nO$$0z^G{A0KY#KmYO5C#fcudZ3|?4>q%# zH%_uyv}n;OgWmb}^>*ivoIJUbP58&JudkQyE`J|)<@)vYKfb=cUOvOZgZJ|P|NkWu znH(k`Y53tE6(yxFEiJ7+DSO7u2EMwUH~W@)Pk+b7$G6Q%torx2x6WyaiHUi|#l`Aw z3JjcH9v(F{e|~(_c6D_XPD@J*ThRMI?fksE?30Wm_SO8%dh)>Wn0ENO81A6MJY2W8 zW?#Se^WWd!*_xV~j0+B1*8TtY_cM^cUEP14&HgQ0N)!Xm);2IOGaTnxn7mmqYXhiE N@^tlcS?83{1OVNQ#m)c# literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/loginEmail.png b/admin/templates/images/icons/loginEmail.png new file mode 100644 index 0000000000000000000000000000000000000000..394f17f4a6ae56eaa8d6b2519b9a7dcf7b00eac1 GIT binary patch literal 1576 zcmbVMdr;GM9FHQ346EV}mEo2J6j9nVeS|inDm3NcEU?;B)H{#Z28oa+rV&Etm^wQ< zxoysFsMq;q-sJGb)E(NJijF@VQ+(bb4p7i5K0BCfo(^3C)a?(?KbA}K`~AN8em>uK zKFiC=91|HE2>`&D>@3_Ot>Pn#7%9FVe_VB0Tqg6Te11Mt$d?fu38dMXWh9tQ6U#{p zN!ZI*o+DEMAgqY8=JWaHd6C*fhBCkBo8hlms1V{6!f2hK+0}_ z7HZ8(GixM^s4N#p&UfWlZLVUQ-VV*41*Qs^NI;W30Sa`9!-)w7Xn+?J_mUWfzyTG$ z*Z>VWm2b`ijSNSET7_C}Qz8h6q6$Q#MNuRfR4EY^tQ2olj%Y9~im6h-p$ihNarQ#Y zf@cib5>E!Gi04@hhRe#z6lH1!!!3sqyXPY0(rtt}-GxstR$u3TrZ=X{L02TAC^aK@by?rp1l85>3||QxHiW!e%?1 zJmIjBA-j}lcL=M0EfzC!B*8PBm0?Ok9gtVV@QkyFVL{`36r64*Y?MP1BuNDtj29<4 zs+6>6a10F&WEi7f;ek?(YhEAuAlCkWvIdLJz*2ksr(HrKu?MB?%jOpkFUN;;h%>{9 z!|~HQD}Doj;R~|yG^^06u`H>KCMG>EjGK}x$j18CY_?iRHPT#*?@@HyHW&hsPPd9e<)UWHRH+(bqSn-kT z74L1&Sz3K*>zp0$Z@zkPLG9c{Rbw-&FS&~}GZdz~{L^hq51pDEHL|?=(vu&r++7VE z5A+BX=4sw>(>nH9XUyz#^*0wNbqxvLb4Rf42ggOaPt4uhyJFVPQ=^I}QtGIuBN}GJ zt^OQ`I^J-fL2>`L4Fy6;UB2g>y)}BoEm=e$Y%PHJ&f{-3UIA-XmNq<(ZTAVm!`&xk zw<=H{-MPB)4mZB`nrrj~9@OT=x8(l(yqCuebFOqHTaZ0qLG;6PVaE&4hnqK_XnQoQ zB60D71-okco_+Mzg|L|M-dk*orS@8FiyPb>J@q?FQg~KV?6gGnwqIpaZnC-&vfGn8 zQ^S|YH)Z+T+NW=63KVq394&0|1-Rq1PU!4&eV%LyMAr+ zoQvBV`%iWR6HER5<1ar#x_X`vHCETgBsZ)3`|ZwAo+aTo;GQqQ(y{s{KFMjYiyt!`ap$+$;wYPg)9wzQjdY84eVk@@P-Pqk6Xi{drFu+q&eCNH#79R+& zi|n~<)q4^WX8PM46Y*f4KVx5aL>xQC6V?HYo-}OsnuVuh4#)N8t{Dc%CuC;MJF>D- P`gdoWa`1!c1?&C+#v)b| literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/loginLock.png b/admin/templates/images/icons/loginLock.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1c4b042bd9c9e8e5e43b398dc178fff6c6a0b2 GIT binary patch literal 1270 zcmeAS@N?(olHy`uVBq!ia0vp^+#ogw8<4F3I>j1DNtU=qlmzFem6RtIr7}3C)9WTXpJp<7&;SCUwvn^&w1Gr=XbIJqdZpd>RtPXT0NVp4u- ziLDaQr4TRV7Ql_oD~1LWFu?RH5)1SV^$b8>f+_U%#ji9s7p}UvBq$Z(UaSTehg24% z>IbD3=a&{G10ya?8Dv#~m2**QVo82cNPd0}EEEGW@=NlIGx7@*oP$jj!ZY(y^2>|C zs(pQ}JoAc667!N%JzZ>-fco_^GgGWATucodjh&n=Oq`7k4P6Z#T}(`zTusef4Gf*l zTnt@ddR_99OLJ56N?>|Z5PDs3>IEf)+ybD@E~!PCWvMA{Mftf3U=Lem;&zK8PV=C8 zQ*gV*38!9tpkwqw(TWt!Fd<;t0Wsl;7RZ4o`_w#OS}y`7YWD*>S1>Rz=6Jd|hE&{Y z3AD{VlpwIrT+NVkl8Z{oiYDiU-sS%r7JGQTysmA*k4o>GJ1VMk!!A~ zRoZ4YFPL_`6(DB{Q=auhw%G`ecJ)rfm#p0;7Wyd9$4|Ol9*qZx$?W@gQ zZ+5+#yzceixb@RDx+W~-+TQP z{xck!!d9DRZNJ^Bz!4r%_t($Y;Jx+SbE|IV+$)ft_q=xXsw@S;vfZ*zD(h}E8bnU} z`NhQ7(S*l&{q@&-I+YeY6=>Gz%5crPv)zIwmV1v kxiddv{=xqrKPn$!uyS11qwINW6R0HeboFyt=akR{0PVQPVE_OC literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/logout.png b/admin/templates/images/icons/logout.png new file mode 100644 index 0000000000000000000000000000000000000000..f9664d63029fd370dd687ddda5e5fa435f99e591 GIT binary patch literal 1258 zcmbVMZD<>19KV{>%yo5wLsmEOdWEqMP42nN%Qd&grnzfewx(;7$nrs)m)w)|Xz!le z-F3Nyjm|g5s!%~D-G^3(G8l-#DPq}N4J}Lst%4usV67j@bTSk{9Q)AL=h~+Fp-k}L z?s@zDe*f3!&i3~`+r0hB?F2zICk~1!JT^J+wukZe(g&q|cxbVDvQ`=utde9vqFY8e zNG4RN2vbm!%g4Whodn^Ml}y&kCVTljQhkzx@!6`5*#yzqW$RLY2wG$g78NZ*{eESJ zA{9A89StTyQWxN$a+Ul@o@^*w;)8+Bp*`_IS z4Pp&NsCB2Z$$nBm1|)+%;LU>&AVZ9g@dr4LYbRO202;6~!+IHx_p>|z7G6cDLCey4nl6<}zLMXEj3Uj1!(m5*WxW{THOrbM*eGnQk^dUTj_+sNwr!;ET~UcHK)54SN$}cgDV%D}3>2 z_MNWLh57mUQG0b|d8TC>QRC3U$;w}Me|+t!11G+8-GAf8E@moh#tVzrPEA*j&8*!2 z?bemm>IesA{7&Yxc& z8}rRxe9S#DF>zyhdit&1n0|9#YwN(uPqkN?(Bie_Z)>%hXX)@5(a`(H1>wx69=H1k zKXGdLlWMi<+JAfJ+*I^#)7=*xpUsLbl{Sbu@_(d8<=6Rq5uE@ literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/mainWebsite.png b/admin/templates/images/icons/mainWebsite.png new file mode 100644 index 0000000000000000000000000000000000000000..387efd9806fd9b61690c0a533eee8a9bf882c65f GIT binary patch literal 1236 zcmbVMTWs4@7kH1OeiOhlx$v#6_@b+Ta1PZd@jT(5fLALNFe7p={7XyA6(;rtnY=2|xIp z|M>sD@4p>S_4oCJTDP_m1QE*i%6Ys7`__#u_`RPya~v=Cd+DM#fJ$CPaUhY>kqSZ9 zRLU?96}`Iq6ig7rZMsn?dd1wsf`&{=34AEuv@x0>5?#KnXd}=ADl8jTlKkb^ha@oc zB)Kb^V{*0xhmGEG2M&z)6}0gYEv}PY4}pX)U;-0*3h>QQ%N6`2xxy>peQ->ZV8z87 zNs{%Tin)FuAqRpe#e_8`#()@0u^kbf=XU^(VHuj?XqF4JywJf33b}qL@Y`Lq2!X=}9#im(`p-nT$YsK63^6;N9*7bG^RU6WI=%O)4!~H02 zZ-8;_ZY>lz;%J0N90NB+8I_SXW#tRVoa3dGZNP+GHjY#6@|)^)7@ ze=0`fVCY~p{xvF%BRqe>c5U#nv37N!h3|`lFUJ1!wI2wgsU<6?3jR5DsGIoY(;9s- zF|qXC=Gl_+QPV3gJkVt=Fa3V;10H?%c=M0fhIV>OzZplcwRd9i%C~<#xp-x8!xN|H z-Yvh#%x*q<@Y>I3PM(-pUf9xm57#o4tX|cBJ-G9boZ5Qdk-=l{_lY9eUVCld&Fj_j z`4bZh;LTj+^0}`~RaM(w`s3z}<+J7X`PXZ;TDGU>xOQKP8YoSjQO$;(KiL>EIjnt|B_(ca-0qC5(1Ai)t;kC4~SzDEL8iI9E% z6q7RIFt6^NFk#O`cUGPlmBR|z@i=IAcr2hnTLg|)&@JAHkgK{pp1a#L305KYXoRdd zl}n{T9GMXKDaIo+0R{wEiuL+}!C)KU7?zETOCfWFX2apItHE&|jPO|Fx-B{$-D<5W2+)#E)v#5h16NU$(3l+| zv8R;~G$WN-7uKz{MB$Xtj%d&<#n77O#xQ~W8=|4 z%ok*;8XI!`-h{w}S%zZ;7PDiCSRfSg3*Jz|m+*z6Rc=zZY*CkC)voH=t#Fw;a{0Ik zMH`t}gbLLTNavA_tUNM6yvGmvR9!(u%PmeNRsovoA*ghkNCT_c<<*U>|7X+{uJV5} zMq_7aw>AFND%CCAf9`a>@$q8)>OdXe7ZYEMt1l&Y6U3&*q!7(IUrEj{Kb)T~Ui)VG zlV=aSdwBe3UvooUX6!eP1DAbNXyTQyC)_}o3aj@9_lu%sx8^nT6YI}^LV zxNu?5)BXLon+8kZ`sI&m2jAS8%N^hP=*sdR!N+D7fBpUEue;uET)B1Q$D2oYKJw6q zOKo#=b7#usa{Utr?w{V=d$NCF1@nTFM{eEx_Je2k%+JpcmHxu)npa+(x>SGl`-=ku z1E))+(sFs=?4ib{!plQZ=f;)A+7o?m4DQH$w&Tl&mX?cl0B$WVE~4oFXh9`#1c7DgtSOQhr3jRL>E#I z;m}&p)L=$92MrBEAOv!2u%RUyYOP7`@rOo{An#{zhtSgy(KX9J;wUFQU(*e_w`YEz z<$YgankEP7bULR26PN?L*=%-lFeBE*cDsERcmiBs%dCLcz=K>a_w|t2YPIrO>o-D( zW7FyMd#~5~5C{YUnM~$FBoaBHwH^y0uI2OjoquAp+1%7xZwnzplgZ>;u~@9SuKOMc z7>04VUa#MeMx!US)<1<17cI;Be8jfx8@}(q1wvYDlv3|p*L`N&_C4FSZ;r>~r-Q+u ztF;D*uU4z3ZQGl{!C;U|r_)kO2|yx|aDbKLIL30h3&S#&rYCWUF5 zre#@o%jNQ&U@#c;JkOC*o-Y&%IbhLfGjsZ<^-rC#orbH=i)how^K zRwxt-Ypp*CAzlGeYkgY?acVxF|E|?)&%533Bj8uSFbsg%Xf#s&e*aG@m5RmV@pHgc z;0kbjG#c$ztJN1usV(5gp&fxJkWD6&mo_#wlHqVzDy8-u$LRsv!0f*VSmP*Q020_+ b7xwuJ3qHhu1D=mh00000NkvXXu0mjfw&?yB literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/profile.png b/admin/templates/images/icons/profile.png new file mode 100644 index 0000000000000000000000000000000000000000..944f911d6f00efda834f231ac8a021bef0a4372f GIT binary patch literal 1233 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 literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/subAdd.png b/admin/templates/images/icons/subAdd.png new file mode 100644 index 0000000000000000000000000000000000000000..a87d7801ecc62c14132325107b000d50690eb847 GIT binary patch literal 972 zcmaJ=&ui0A91l~wGMGKuKsm zafkj1V;4_)7eOx~2wn=?#e+w|({4iq#h0$_JXixS?|mPi&*%H|J+D>oE-zhQVi;z* zvZ>bT9*VbaU_FC$!Emmw?r5k(Rb4 z8QA9Z2*ZW8OW6#wz7e{*v4aR`qps!1?CIP0EU-+O-OgxGa~0IHHU}PR4603Iuw&#+ zcH<6M4<#yKBcg-Q-gSH_l-aSaM9?Kb>!o|XVAuVl94M{Qaq#+>@_joomR2d!vy<1>;k2c z0o#^i;=muHHBG8GKG7WmRaBX!e9p2=31;&JHCHU8b3#@SNk%@`9=5?aVab{wOKz^-glo=^B|n$T(_r|ht$($7 zdPQd^I?jfc8ndxS4xM$64)xKkHzWEWiWRlc48OFGPfpPO-;1NOv$F#z+>9;k zA1-_hPQU(o`T6o;a%FhqUZQU%w+^m6TN$R0mG7~mS4TAh>ZODySPptSDkPRVj#V7lmd~sv<7Lf}n2nO>CkIc;VDF|Y^JP6}ZR>wwW zU<*Z611*unN$HTFAl)lF7;jED37eu?T63nX3_%Q1a8NTs^yjH(G|y*oWqe2ps&wmq(2^5~fDW+?a{91g3%L+o)D_6uIc8{3gy5kN{o7Ph>IM;H zLE!hY9))dYK{My&d`*EszzukoV;PobINrkr1RpQ3ELi(!63tT6LR{=vi$!)JI)kw( zFibX^^=5ruWDPQ0Fc@?+c-})09(&Bda?WGejU@#U+KQ!_SVIPI6y+2e#UYwF{hfkt zmSqiltxTj~Oinf#&dWL}m4K4;f2gjP(Ke35KYsryY$wJ{$i$(IMlFS0T)NQ-WeO1s z${1M*goaC1?9L#J>lfM9QcR4P4@?Wv-8{$aNY)H%Vj>TH0}_c34OU#e@Z| zvKO(U-Wpe}=!K6~#Bd_F zn3|iPhxv)q8#gafw_daj43@uOcYoWHTwR*V{+xK!uu=sU zt~cw8uKpTorZ>Oxd|~P7i6d3VR^NSmdoz&F)PMN#_0zye$EBC|jy@~Ad;h-hD(}iK oKWrP3?$fSy`7N1j_0A|&<)Y}$!?j@B;H2}UW6>`0Zu`KgU%OOkJOBUy literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/subOutbox.png b/admin/templates/images/icons/subOutbox.png new file mode 100644 index 0000000000000000000000000000000000000000..159bc913be29699c003e298e594640f5c39046fa GIT binary patch literal 1101 zcmaJ=T}TvB7@bWKOQV#6tf0#T5!CL?tgY(~uI@Cm=7MX>x}_1u&dyxjL1*qXb9GlC zstrP4gdU;@f`~#0vgj!ii>Myztql@{ilUbkG9RKy((Y`o_0TqO=l*cc`Of#ctt^f|Q`56a*1n?t^hCtHURs z!zPL<16raRcSqZK1?e8y!FaN|N!S$C)RHx2r5|FDf_<71q!*?h(Lhs!beAv6Mokf> zwYCupc8+u;l#zZVpwcbPpef4}0Ucr)Wc2~V=CeV%pv#lBbIj170Kxr1`nRd>XbgzR zg23lt-3r^lf(FjR)gSQt{riEJuM~r3({$f zO`c&gnT#h>??F}{!vz8XN5kuN6NK9yHn5y^8}{y^f&^{F(oC!&12~Fu3Ju~QO`QHt zK{wZA4STgrq+m=|HW|*tIw=)_(dhr7y1s_CaUA~f`%hszF>FF64sA4ODdggMcRQg> zUbLW$k(EGbpjgFN8ewFokqN|3AL!By6=m!KIvV98hK*%Ife|T46TU~&R9=uoK?pba z4>WQGN?lX7rE*mZevNV(+IjrB1_QHhM?MNAsrMF z=C#sZd?oc(xoT-I4JEk@F~d05`qwoVk4W!0%eAH@o3*xw2I+N+H1+t=$#>*IJc&p` zB0HPC|7+QEcz5Qv$OVE6t2KNV&Nwee%NU7e=(8dY0n%J-!Jwe9TL*P*tW&>0tX;mQyS&Mfvg4?Gg?kR}f%bH4z& C;&HhE literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/subTrash.png b/admin/templates/images/icons/subTrash.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8c38e69469ed6a65f6de3a1546b4bfffa3bf2f GIT binary patch literal 1181 zcmeAS@N?(olHy`uVBq!ia0vp^AT~D#8<2F%laT;Yk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?nx$EjBz=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6NTDb6D0|Nu2u&0Y-NX4y| zKws}x2a(Y9Bm8$Hz9^`0G%awL?wEZzchCKc{2$wYaA#dTmfOuCt|aksTVq20PEyHV z^v&k|oS>@S60=jTfol%BUwXKrGxzrNzQ;1f=d6$2*#2Ny=Bj<~%}ZnJ9kUl{RH>v! zK64bf)A#tq>QzyPFC6-@Ggo7I=A%T3d)<=vLqp$kD6U$T$x|$tp*!Q$raOl$7RH_J z7yQZCaozh=y<6d)_#0e5AY(0Cq0P{JjgtG6ujuk+t@*vhfVOMKcgR)atZe zzNuQo70nnUMy}7;95*```KGmoDQMuP<7xcvn=KwVw#Kg{%dqV0xaBNv1bBI)QnNPJ ztc=aiWx;HuG65G;6GZO17pjrQ_jFaZkFO;j^dNLiJUp`&*sE&QC=P6~lg76w^;JpgbUI>35lPULP$rX! zHDp;}2qElx)Qki#oE|C|IJ5%Crw;KztY|h!n`%7sv>$@&m&=F3UN}e;OPLgzzJx?5 zxo#X+4;|7f{^Q1x=&;uHu~fw&X$Kao$LjQu%yM_Up%}=#QEvqfD~h>p5UcHCkCqIL zXMaT7vDFkz%ITsm&*UL0AcXSyJk%3%0_nL_K9Pn)jib0wR}95S7om&{#Ml`lF_TN` zDP7TZSuqMjZpjO&=~;Ma*I{-C+`_S3RS&R9Nl+tXeb@m@Eka4yB0kWUlVHX1Y|;ti z;`C!RaNyj=w(-RjiyEZxbguB{2__hD@?6$3e^Vi-_?JkBN{L>Q;xDoE$p78YZcB36nZK+T( JUgmE<`VDQdOOF5m literal 0 HcmV?d00001 diff --git a/admin/templates/images/icons/upload.png b/admin/templates/images/icons/upload.png new file mode 100644 index 0000000000000000000000000000000000000000..a947156156f20886739aa4e2a1e076fd49678dac GIT binary patch literal 956 zcmaJ=O^ee&7>+KkZe;~Mt&8B074cw`nRL4$p|PY**DY*HX$viQF-@jz=q8g*rY75y z=xMK>1kZX9@ee3?@#4jcH$m_p=noLqNw?{Gup5}n2ha1o&->0h$IZsW_1tETYoMo7GXu{o|(P6EpwV+#6s==vJ}>%%7=xQ@nmizYOKDjvCe(-60(jgCDX+ls@N zAAnM#G64@$3nbowAE}AP&vaF`PLD+%%pi2E@u#MGW)oCNh(S?+c^mFPu!96t*p_Aa zK9C@SB9ufV<&mrwBo#t1|9BQHbOvh6*qz5>JB=Sv8mOWe$FUF>1QHHKq$o*V-~S3noudGYEgX?aXtRqOY^9+BwHjiJlCVR_K~}})h)@!ZNC2wsBIvrl zL*i(LHchqeN7V9dTsJhH@dej)R2f1^(v1p|6@*X?>BS1v3#cX)Yf=FsJ>we0o_N@& z8P_@ER+n+bfNvnd?Edw%`R)3qP> ooJ;$?J3n(TH-2*;UvL*zx!bRESMwM9*V6Y?uQiPKmB-Ki0US@ZiZL&MFF$38&ZdSXr1f1PDn;nw5 zWM)eDK9SRIv6&LJdunYAqy1tr8Qg1jI)B&`O(&XOi9ML+FD8 zGw1y0{NMNA=k1>E7wYSp>j;9V7dwR{UUxaKs|J5tIz2b>(qzZecCVhZ3zCV5sH|rY z5LKxkC6OeL41I-K3E~M^Nu}*{qKnJws#kJ!yhYW(Xo6^MD;iRE0NEge`V}ogE?=4; zfg(r9qk#mSFnE+#I!8^^JKCMfjt*qQGTC+*v=%u`pdwoWMRicKxMGCd;N|e%Ii^Uk zp<)k2$W5oxi5|e~CISI3?a9(X8U&#i`ur@*J`Wfg(iF{5knup4^D!JvgYrXSYo?sz zl0rw>7M3Dp-nI>nq6&qAx8U>YWy3Ne3<2V7>Gj%Ll8?* zA4Bs&Iuwud6^`w&;g}!t9efPNV>EvR<&9;%vq$AX7PkE&oht>lVz;@e=gkrY z((JY0XZtRl5Q&DvNS5WRi=Vn!_WXxw^>S(T;`c3}{rq1Cb`Sn=?oQjeW4WQBp-}(y zyL%_*ube!P(KM~vtnYgD>kpo@PJ8<JX3kfyH$BI?Em+#-Z_t16g z@1>jW25`l7%G2a}W8%yiVsX#4lMn9pp2GJ-OV8|BdGz2$^RLs# hdX|{?YDz?PBXL@Of4;Sy+Ufk1#CW%GHulQv{{X+ny4nB$ literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png b/admin/templates/images/jquery_ui/ui-bg_diagonals-thick_18_b81900_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..954e22dbd99e8c6dd7091335599abf2d10bf8003 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEr#)R9Ln2z=UU%d=WFXS=@V?HT z#xG*`>Yvsgk=}99w^d^D^d*@m74oMo<%#FcopJf?u00-~YVKV2wzrI*_R6;UORMea zBFVSEnN~eiVA6V&z`E)YLz5Aok^D)In}Yn=OzDpgR5Wv0XfT8pOkmV{sKAJ-PO9#T zZK}IXj&Q-V!U)!LcB_3K0&C*{ literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png b/admin/templates/images/jquery_ui/ui-bg_diagonals-thick_20_666666_40x40.png new file mode 100644 index 0000000000000000000000000000000000000000..64ece5707d91a6edf9fad4bfcce0c4dbcafcf58d GIT binary patch literal 251 zcmVbvPcjKS|RKP(6sDcCAB(_QB%0978a<$Ah$!b|E zwn;|HO0i8cQj@~)s!ajF0S002ovPDHLkV1oEp BYH0uf literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_flat_0_aaaaaa_40x100.png b/admin/templates/images/jquery_ui/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_flat_10_000000_40x100.png b/admin/templates/images/jquery_ui/ui-bg_flat_10_000000_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..abdc01082bf3534eafecc5819d28c9574d44ea89 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsY*{5$B>N1x91EQ4=4yQY-ImG zFPf9b{J;c_6SHRK%WcbN_hZpM=(Ry;4Rxv2@@2Y=$K57eF$X$=!PC{xWt~$(69B)$ BI)4BF literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png b/admin/templates/images/jquery_ui/ui-bg_glass_100_f6f6f6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..9b383f4d2eab09c0f2a739d6b232c32934bc620b GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour1U*q978O6-yYw{%b*}|_(02F z@qbE9)0CJMo;*v*PWv`Vh2h6EmG8IS-Cm{3U~` zFlmZ}YMcJY=eo?o%*@I?2`NblNeMudl#t?{+tN>ySr~=F{k$>;_x^_y?afmf9pRKH0)6?eSP?3s5hEr>mdKI;Vst E0O;M1& literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_glass_75_e6e6e6_1x400.png b/admin/templates/images/jquery_ui/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..86c2baa655eac8539db34f8d9adb69ec1226201c GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq)a_s978O6-<~$)Vo(rZKDhVK z|J9WTLT^QIG;Q^ml{ow8HvtEZhta#LLqp$|vO7%bGjI7IBizcw`SFI!bT^;@44$rj JF6*2UngEbSBdP!Z literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_glass_95_fef1ec_1x400.png b/admin/templates/images/jquery_ui/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..4443fdc1a156babad4336f004eaf5ca5dfa0f9ab GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hIh978O6-<~(*YA|4MzBvER z|7}eQtdCVXoUc2b{PaWeaIKu7gJx>{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png b/admin/templates/images/jquery_ui/ui-bg_gloss-wave_35_f6a828_500x100.png new file mode 100644 index 0000000000000000000000000000000000000000..39d5824d6af5456f1e89fc7847ea3599ea5fd815 GIT binary patch literal 3762 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 literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png b/admin/templates/images/jquery_ui/ui-bg_highlight-soft_100_eeeeee_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..f1273672d253263b7564e9e21d69d7d9d0b337d9 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l%l7LV~E7mxPQ=F85a&M@g_{ d|GeK{$Y5lo%PMu^>wln`44$rjF6*2UngE4^EGqy2 literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-icons_222222_256x240.png b/admin/templates/images/jquery_ui/ui-icons_222222_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ee039dc096a38a3753f92519546eee94bcfbeffa GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-icons_228ef1_256x240.png b/admin/templates/images/jquery_ui/ui-icons_228ef1_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..a641a371afa0fbb08ba599dc7ddf14b9bfc3c84f GIT binary patch literal 4369 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 oBo%DI*Kv;w;*%(i9W@e{{5C=l}o! literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-icons_2e83ff_256x240.png b/admin/templates/images/jquery_ui/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..45e8928e5284adacea3f9ec07b9b50667d2ac65f GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-icons_454545_256x240.png b/admin/templates/images/jquery_ui/ui-icons_454545_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7ec70d11bfb2f77374dfd00ef61ba0c3647b5a0c GIT binary patch literal 4369 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 k*Kv;w;*%(i9W@fAqs5i2wiq literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-icons_888888_256x240.png b/admin/templates/images/jquery_ui/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba708c39172a69e069136bd1309c4322c61f571 GIT binary patch literal 4369 zcmd^?`8yPD_s3^phOrG}UnfiUEn8(9QW1?MNkxXVDEpFin2{xWrLx5kBC;k~GmI3`<(O3xvulR&VAkQJHZBho(m=l0{{SA7UpJl008iB z3RqU$@Wfh}nb?QCTyjovo2=)B^qQB=#XMCF_n=?1Jbh>5sptJM?}}{I zHzR=-V_TFXKM0P+&lrh3TPr)c<8EmLl3g~EY}W@od*0X6Ljv>L(67bjz58EDypsu&ddu2a@@x)`5aA^S^DxkW8rs_vKtu8N8(o0 z#Nf}*Ch4&iw866BiW!_r4*HRsHn%80xlBW<`IOcXDu%LQam7$Ge$q#1415XvN>cnS zk_qU%P}4fO0v>J{Zw9o*)JF-CPA!KcpFR1Pn(l@*bKh=1_!ZRWb?FoG5a22cVG<$5 z0|%Qj7p@n}=Hrkk`BkD99I57h7_+lQ-AZ-?fETz5E~q(= z!!d%~_yivn82d_pX#M+Y`|`-F^s6-{6}S!?_mFzr<=n>M{{PUq7g-N`hqOcY-y_m= zc#xZEqMPgqc5cu{ag@Tdli5@JlV{xH8J%TA}P<$=Qej`5Hq>_Gzk+NDFM{b*SA6Yydp9VOs1VgIYAcj@1BIt< zXz@=NF2DLCC>`r|^h-z5@eIEh>Vnjh+|-6M@nuC!oc*856_8#_6jL|rKLYu=)Ew4+ z*XiJVgHrKl?=0wjQ)aeNu2^jkUW>@Hei_S;nuA%RRe49V`VM;8SxUBxpZPe>l9ZA{YS(NU; zhnP(vSd1kYiV^KQ02>XpH6u}Xk)wrk`+SxNxC73cSAefm+V!<`c^b#A9NaTn45bEq zkRYp$U%h-|^9P*syb!eKG!QC-$;IS9MdE^@-`WRSzTp+8M9zqJCUsoPC-3Tr+qbkO z$o;ra-wGjC64H8m{(*FVitg+LQKH+96D4!FREFb|Scex)lw()`rHV$WMdUJNe3E}`->+?@(FDYcZt1#>wXwgHzQ6{p% zTY#PF?iBGE7<=u*`SFt0Lw0HX!oh85UlzQH{;k~&JH?kPJzdQX=gAmX40n@#()wBu zSllJ`lX^ZF9!&n2{1443>o2BzK(6sGDQ?n~RYk_ih&{?TJNBH*Eq`73g$F~WrJz{` zce}LL0;S^ZMb&nKyWR#(_t{VguBs~LOSLX&q*$M&haRh5HO5G%C&MvDmi{a@PM;Zq z)h;XzD;Cshu#GG)RsptBTJvnQHC(-#7@G7B`iqJMl=F%g zD7I#-8sWBC_kJC!{tU)rGSX-nt`B$M86ARc$^oIWRNOCMU!X+%PKM$X`mI~kxxaKB znBMvsb8nZ)0}JBmidn3FUeG@ZcdpwZy_4oi*b{&c?T^HaVC|`tnlo?1SjRKLNPk{gDWT+_1fio|Ic{5kU=X{rvm3 zZIZ6BO4vMQdqO`~Ef~j4Z?cQ(+Ff$wxGAlyMBqd}_S__(_xM@v-fTM;$Q^HhR@PU= zE|8KP1IM4s;)*-+Z@m25>p^N(PgHJsq+a!8`ezsTQ3Np0+k4Mtdkgu z^}tg`-YMQKuuO>dsJQkgyjabt1)2OM)|R(}hto4zSIj5V;^@PYtIwI&4#+%;&Kf)o z7)jrDgZ%f?x$UCa=&~<9SHq{ZhxKx!b+ft~!I?(H$&BMOox4KuOo95gl<%5AIg+is zd=%?6ZOr(k=S0U?!*k{1h5q3O_ZrYo5Hq#Sl|1?L+WU%}6JI(orD)*qq-300E63z? z#iM){^ff?RwehBsE3Uh)}m z74!C`a^?2x1@?-i<#cI?a=RcP4Xx$88l&B!g`Nm)Fo$Fcf!VX@0y$z7EVz~OXbALP zyfX0m-nf+4I&E=bsAjk~l_2g3i}1e%qO!KkQ@Ij*%HbGO)w=i^^5FvkHIIee`4l@J zN(eR%MpMiipJjP0Cxd|&4n@b?>6{Ue05+A0q?xd^oCpYNXpePmO#{q`vISfX)oT82 zc+d5gPn5-?9wBmlt3pk*z*hj`X#ycn4?KJY!|++>4l2@t>FhVEjPeFAhW%k5Vkm2~ zbcy`#HFb1XOYOKAcKGGN*GG%skMBnYSL@4d#@wS$CLny@9vSEwSCUSW;OHk%_<>T$ z7HwfvT&)@WQFkIm_dH-5Csjc|H+OBX6;F-rR3wuTudV;|_Oc(#-}UUgloD_-!aH>L z-NF)hJ|F-%gI?Y8Jvo7qXRG7UV5l2_yAHF93IhsP-b`cH*wlEz^Qi99$$*D?10PGQ zCkYPA5Hltd=c+>(bWIfjJP@1Obe?Gx$=qVDe)rPM+5sw)!8F3K7T{OMLFj_+>SX>F zTT-48YC1?q1IV|?OSG8?IGXAN;&q~nz?z0#i+qM9P~U@BNG1FyO9#kvk>T>G=#)_^ zj!fMlH{X;+ONmr!LsJx(j*b2&WMpJ+s&cN;7Tyu8gf>RT2kOR+DBzZr7=m-v-UheM zgj$|(0HN;F)qrlz6$FyVsy6e02`M!$<1L&Bz z+b!=_(#ur8?I=h&thJP2c+^S%)lEi*8fSaPs>Or&i1kF^p9QX&8C;)E+S__7fCh{W zSpW930L|8eV$Pa=LO*oao@VWHUr>MSl`x%iydJaFA!rB6u0`Jo5337p0UZNmSb{=o z*%W(>6W|^!F&8DUAC~&Vo2D?gE{V0S3{B;atoXLUNo9J? z0AWHot1HHimnr%xGf~-qSOO6>z*MtHe(EIN3<7@k-U&gFD+Xq}Ua*o~(!1kApC zO+-7O=jP#uq4B~*JwPs<`_;tw%;J3m{g-9xU(RBU&q^x&eSc@Ik<8NR$i0+>JBKgT zPqjfRC3Q3V=4q|BVK-yVuyUMByvXqR1a4^k&=*MqJ_v2b7I+El z1&0}s^tJ?^uXsz@oZ9j4x^n+$X$>D_nE$4#I-;EJG6wc;Jy@i$hSA&JVNoE;;UpDo l!Q;r<<-MKrq~`aIaqoP9xRgPV&EKy+z~U_0tkM({{ePlYU?u&Z`mr_kcwz5Nh&g=McJ3E!;CE1E0ryV5Ro;>nvty8 zA{omJnn+{p4952Let*87zvA;auXFF~{<`_uPA4&sV%P>LMpp1PTBEIL*yWZ2%{t3Pe;FXZ3XmxI8(D_g57_$Zil~sY6d4T}-hu9_Wqp4C0AMO{-e2$W~1A}=8 z?24)=?B)4HUDo_oXckN%okP)HFJjaB4*3_SNpKaf;yPT}KqfS{2x7`d{0xbPErH%h zh`mQJ03DaATP9aP!}a4$fY#``NI~M6&RljED)8z}hhWxrNbxIBlTxG^j z!X>$3AQQ&I%_5mRECOjaGwR-GHmde})^)t-3_~aFM1G_L#mpCNdcLqr(RKjv3R}(z zG2^yBftMYh;H3a#-slaj|5$BX9+{PTv&NtR*P-L?l21FGTG`$H9~##p%VE!uR>=NG zc&auxVl!1_lP%uX71AJvlz(wLYl?63oLd~dqjZRrU#UEWw8J6Yn-7L~T$$tjeAQiW z9$XG5Hu>rxFBnzgd6ho#^gE5pY>U$dTCRN85Y1tQQ0=Pn{?7OJ10x9Xk!>P2f(f^f zILd}5--N;Po4*25F|J3ywIv+R@rfcYNj}R-sXrH2TFAiK{jFGG(ru1p=w$wR;IXQwAX*S~oiEK{g;kZPW;YE|!QY|g^2`dMS{&1Fr zkf?!sj~m)xO3v`hh4KQRJ&&Q!=X1HNq8T_Sg2P^B&rZX{VQUNc9O(K+B_Z4hiTH7M zW7K5Y!Ec5xD~B9zFlKUWG_Rd)xTK7U#hRGhp51T++e6oS{gT^?3s~>V4?6{zchhc_ z3UBb_W2U+~guMsG-g=@#aWPSFypk)5jIUTxFiM zycGZzbxQuCTnvH*kv=E=LsRnltLbhgm$=ttS1IzU0)1t~4(XE>bHVwJpAPKOqoI-# zrdc{yo0R7Qx%~ZQl{UPa?gmxo#ZWM|vNHNxl@8NLksfn5Ek>C${w=x~pekl%gfwaLwWspL{af)?f zTOBmhTyU&3;}QeF&VLwhJ>Dezu>~P zc+$aFxKDWKj-CmD(v`}uH|ts*SefX@lyrc<%~WE6tHU#dv;y+LlA@cTgl8J!u@@u6 z@@fvJdC)1TvBa$QT@ck`rUxF**7w4Yh0!vZUsGu%Lm(cl(l#QPpmoOH3JC>FMe07G zq0kl#K+GLndyoOx8{t9g8JiLs#`pH8JWqR_ZM%J!Yr>cp>95<^#=FWQfzPm%q;5B+ z0>}ul8+l+gRaHV$$tsq5|MU;?AJ~m-XNxjW3U6JH2k`tOXAqi)yGI@^uA&dQ% zZCJIe7{qK>+p_F)Sqy-GC!x-5MgogsP6lwiUH`N^a7*LKPdO{!4L^_^;goe*e}3s( z0i~~@V#)#L*W~2F?}&N*IQ)0a4Z1$uTU)p7^Mq&IM6K6d*$vpX2+L*+$9vY0=7?$b zxdD4R`8~74HMWsx#*goNSp#(_;z`UT-GuGxoUl-){JNk1rf)aSKE!W`#m`t#v6V!u zgn>fufpkVprL(KqSkhl*Z+yRQosF)bEiV<#K8hOr>yQ1@7Xg>g3EjKwLB7)(9$3%X z$G30OD&Z2Nh{;v5!}oF4fUu0TM%&2F-6aS1+fqu3cn;K4k4-#kkB|BO?bZtcTygp+ zB|R0)0x`)UVEm;Fwx~Vt*6ZV3k5Xcj6_=(X2y*8M&NGz^?Jr>Jutu8idcHpesED^^ znM9MV2AcX%oppm45TS9yYBtteX?1liAe($}l8Mrk|YY*cFUp@Yl5_|Ih%+ z5^dz*^BpQ&l8;Le-Z+E?J1_|}dtK>`0HCSg@u z*e9pUpX4zkcJ~*%3c8N=D_*8f&2puu6>riMeA#MG3E+*kYt|0Dnl;U^u0x`IJLnY* zjELAyFaL6=ihd=uwgnc)F;a_ZKEBsA_UuVc$NS1$GwozcE)2-hGS_c!*V9@%u`#?lhbMR;p$MXpbUS7*AsAt5?3(xQtcatZ zK;B-KhX__vb(?F4Q0GloBJ>|QvdJoM?lDbgsR3iM@a;Z3?cA&4wtslYkr80ETZHkc z9*>q7Q7<0~XHK7PK#yo@cBi@smopq(-%`e-KH4Qx-~rbHu}dW58QqJ{;3Inef@=x4 zI)BgQYXff|j7xg1Qx_M8s)u`0@M0d&aKAfD6qe?B3THxh84PWrQX5xII()>h>b|f$ zpKR+*4#vbnsS3H{v&>IrrO}Xrp{O`p?Q{I%z{XPHRAc7mQ~rVVZ80t_sel;~R{!fE znoWNU9=P1`jx=A?#Ye1fm8**6`|yK3jKQSofyZy4XkM$FK?NExjqO&YVea7N(7$X$ zbR{k3PT@a2CJt_@Dead-55GO?f3gVr{BdM(wXV#1%q{YCJlyB~k-m;m1@SZyhI$5p z9ViBGQ5QzVRGUDbbtaN^E&{f(lI64ub2s){aFm!11riDV*6MFh58H{nU5}0{$^Hi; zJVW(-UYp)>>|Lx|%+y^DwKhz`tPS-85#6Rh0)ckL)U$^na{7 z@VVG(5^ui@Hf1odF537(mlR>ZBhjf%rT+ zPUdZ~CgvIZM_wUkJAw%w}x9jc8!TL)0!EfOi*AMUgP00QdmWDhdxHH4HGc<~J zIVYb|Vj$~E#d*)1>gzKQFOMaAy}BVVo}IK&7ZMB zx!9l*+ek@g>FsKVCTu!A+bt50<5zR%LvhtB47 zphLoLmz-;H4@2#)g8=!k#zLI#UMqFnH)&}~tj#&gW_Q99mQw+L7dU5Tu)W%;@9Qi9 z>QGi--TSZnR2z4)8B5wJy^vu$s+IRc0ll#|LNt!?I`me%fGty24eDN4Xl+O{(+NPj z1ygVh>zf*$Pk&fEX-3AP^1w$s1y_e7lBxzgSu6?iXt=l939t1dNMV&Hw?hI}<+!vx zKuXRw@aAWBEW)iT2xma>qG11B|GnfLf43m`S%SD z3d3^-2o=m;T`_XFO4d`JiOd4T*vl!w_t?SMNPGOr712xew$!m3PP4`3g2iVGiU!9* z&w=GY2O}!evGB%RQa5rA7s5%`YA&A$+(`a%B< z)4%^Wyf-xKA)KjJ=y>(k$Cki3nVk)wxAEYIGA3p>sG^i;f$cIw3$H&^I7dNHU=sw$d)j7 zh|(sSuhT>1EWU{wVQLz{XV1iYPIvxnNv=>Vu3kdkB_SVNJ(KJiSF;#9T-Gc6A9!kU z?a4i1-1H;R$hx=;;1@G7Jsm?|a=U>2b+qZz`aN9sgsIyFSp6r%%!9oq%tbmjY#K7P z-Gux{jUMaKw>DF`W{3tTZ|SIDqX6v)w4@1rITXmow6pv9GTr+NsJ`V>Zv++iD5MFK z@5#Rx6sk|u-Qs__;w5Q)X2-Ad+QXxzHC&)U-n+`G@G_e77|5&TV3EucN^AXqK{AmK pCn+FvZU>f5ukGw-)qi%3dglGbB=rNWkH7i=^YbXv3KMkH{{f&jC-?vW literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-icons_ef8c08_256x240.png b/admin/templates/images/jquery_ui/ui-icons_ef8c08_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..85e63e9f604ce042d59eb06a8428eeb7cb7896c9 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/admin/templates/images/jquery_ui/ui-icons_ffd27a_256x240.png b/admin/templates/images/jquery_ui/ui-icons_ffd27a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..e117effa3dca24e7978cfc5f8b967f661e81044f GIT binary patch literal 4369 zcmd^?`8O2)_s3@pGmLE*`#M>&Z`mr_kcwz5Nh&g=McJ3E!;CE1E0ryV5Ro;>nvtvt zk&I==Xd;cVGZ@>q_xtnx{1u%7-D)N|5YqOB>i;(bZ#o62{J2Y9&^D3~R^$o+X? zwbxAEIb)xwCwK3TSR4QVym6N1rVgPmmt0caryBUceHP_&u}{?^Jn7f0PT$#h>UDqI zr!q(F&1jJ2_!jxdAB<)7H$foI*2zuncvu;;$SoU7br=AiJ@4=BC4vNO>DS`&UIB=K z;2)0F*t^FBvVfPuT4FVMSwUw%Xksjyl+;#*DDy%=ocFOyzDLvLR(`zCSOuJ=?FWYn z5ZD!UaoF>-$@=Vt?a&;UQYM$Oqe0ZB?Je?8ZnMxDe&uzzs*zlHd)V58nfJPc8S^({_4bj5HQ_B&EXHWj6wx@B;!mr04b_Mx)UFL)W7`V!c zpMp#C!a!!sh3h491y}^qfimXVY%!+sYu0_DWoJMqpN(FR9LM#jdZ{vJzEck`P^9(1N=4J za9%u4$2J8TAkUaJk_FX%iHuv#svL_mMmp{SR}ifc#ZcXv%CFsT?*>N^6r(%D?1YnU zAaT?UZGlOna6UXXs0m)3YDp}d%hb@)@Y!lK_A&D6{OPlNnj zYY*$b>vnRzL8=CDbQSi!DL3D!P^xhNtwrYByo?h-&OvQZYJ6ka{Re# zSc0ry_d(K$_Q2M{Y^O~DOK(szDOnMi_*h_Rx%eSRxA%n|FuC&=F=)B z_Qsgmj8g!GA+LZOX)gOW}vbo9|l8QW3iYw9qCD{o~xt^HIU>;dV5MJgc0#uHTA z80%Ee_r;G`GUjssm z*AhtwpW%Ly;X4Lq1Zq#ZpuwzrZE$sR087dN{w7PA6|Mo#6wwJP085K+h7+D>NyeX# zk|?MJ^Es)JtP-2eNr0EQe*ZM`&}OU zCD*uSSviE&p}uX|@1g_%|3*ra*MbBV#~cshdcFQ(dGLnTqaO-3{u==x1;Pp2im!#` zuZ2`ThfAmiSzb|4h`c4?^ZoGOF*oXYcV}(ge!v@^bse?daA`Ma+bSZLIg;pIN17vM zIOYfK=@s_Pj?~#lqnY2o?d1$MpoqsYQw%eX%X6Y4*^27{hMWGqILEMnVYUEMW#x7f zu^I*nzXQ@6HJ8n;26 zo^1+Ewi$fN$Unum1(FTb8I#cYgcGklwIExt#Mb(D=x~OTeZ^ubJ)S-ywfdZS?SRCq zDm=eU+CCWO@8S_m!W{alT)zj zZJbjxm5&No5xe_~Jw-i7`&G}=r)POGGfFq+c@kQbB#)ay`coj&C3- z(#&xV@Q3@VJd{qdH4g@4ZJi&mx9e@Io7@~(o5vTrkW>QEO1T-gmlTRHH+3)gcUC0P zk07rvDnf*7Y5J}8!>F_7D^Z3IoH^uGH}_a(ax{Q(IrvV$olf3WN&DY?uYZfvXI(;Vv&EAoQtfH;+4VI_a>yh*J+Cj!?h!QX?O`QXk@@G7AjloJe51Cw*rPXQ>#y?B^^ExRQFui zolmv*C5K|-p){rZiCNai^0H`1(Qr(Hz3v%7NnmriXu2tD>xsbN#*R3*wsZhRj6Lvb zn0Cu=qkC?*e4{NF_3=^bTb1f!g?@ryFH6Zw2tz%A zzz&o{w`dDv66!6Wk9w1-dglS#Sm{doxw&h5Z8&ONmlBBte{J)puaDzc!LC==rPRQK zQNH23?-rIo^MQdt3Tk!B@8l#}fxVtrlc8Y<>ORaVE($DKc{77qV^`+`%_DotrUD=8 z4}L7QnZi3RgUy*tteY-=$SqA2@IZWe(}mI`nzhAT{qC)my#rJsfoS*)xCXj!Tk6=3)cr@Jw#OcNqgS3pg7x|4!A$|w15X!huR*vB3q9Ya4 zF{xuzEQz{9YPl(gk`}Gffut%jotgqp$jZvzRO4EsExf~93vY~04AxH=lR>R3v3Qs2 zy$v4SN%ee@Kz#kDtARaQD`d!R%}#@T1=v8DAow*r>+0d1KS{ZtA~KMtgm)+$JHumW zw=;@qWk&MuG@LKx#K3@&WMw?r=jD2_)(*$LmkCm4_@};QZI|SPe8hIC6xqBy!LQyK z01_xmfNA9UlBU@Kzu7;zQYxHE>OCADA$gwaVqm`eN?XQF@NkrocB}lU4hcCf>wqir z>Ya=PcE!Xm#JG8v@G0lj&~)hScM}X57vGw3g<$^SUls53f|Bk>5FQwqE&{%u(f$!1 zl8+53vyYZ`mEEp&YT<=(krhKrw?~pS{N)?q{0qBR#2Y!w4!hWMdj`a(@A@r$zVB+u z06Hb@_9(cQ_AxbXI|-2w>#QUhp7k<+`z9+(jkh~v-Renr#C9U+&jL4vg6-E$f7@UU z(1fxB8{U2vq}h3rE!Z+n7=(>D&}@9~3mJ^R5}|WVG@!RSh3r{!>QHwg!t29YS&jiR ztyn_q*k9H0efZ7hO*b(WR|G!TDY`rol~Ob4&1OwdM8kbGj`^$~L5gdWYceWwL=PB{~NX=cu3p-{S;hqaE?bSHv$g+SA6bxy+VU3YVTPDj6CN zKLb_(9gM2Y#KW8ONxjH9To^Y)r?ql2cq8+WE438uIF$hjfdLs6-;!jv55jGcc3Ipg z;}aT32NAEGeU;J}&j5=+u`4?%xlwL7?NDn%2={4WS39yn3f;&r=|}5=M-Y2yrxeSw zv%*PmV{_{#Qk1sD>?M2KDapb~z3!E*-LPmCe9q86D%MGSe;4~~K-jKQxq6b^902_{ z%>4G>@Xqk8muR*|vGe5{@7sds2i|i;g}oMkd!o^0=HG+vcPrcN54A zLGv$PlTePRxp~-OSb_*aACO1qc{MpfS-fv(@UmRv%UO)cSt;ee@9(S)f>|~bwU@eZ z=kTS*sdjLclwMZG#?%U3)bq-uj?@@vj~6tq)ZS||Jxz`+di-M5SXM=h3EL`?pB>W9A;`V2vM)vk&%KFy|TAh#AQA zb_?J==3f@%LL{`vU$3Z@A2a9C3aC-YY43dR> pI7J0n@;b3~`)ubvsr|iU(l;L{A#E6J`}eC4usn-0uQEf&{2ws1m(ltoqJ#RmwV2==ic*rz7lOw=eaq=H~;_ux21)-Jpcgw zdj+hrf&W^f<%Qk9Zpqf#;q3n5{{POY;f!wmTR1An9(4&I0z1LNX50QSTV2M%4|y9c z#{ZQIVJKu~aY5?ZaZP*GIGqGs=e@q6o|EPhZB3CC?@LnORK8O@z{{<0KtSn5?#~OW zy=L;x8T&*%xqElS;s5~Pjk7d2bqIaA)xZbovnZd7eX17WNxx=w`p(8vulwUZ zl{so}MuRNJx5!8S5G;$o2?BApPHt+)!^#*Ww`?rcVE}mcyuY`X2o|uVUyI9o1t11O zemGWR?;aD#0$vJhiPhv~0iXS#iLq!>Qd$` zU{}<|Vb9Md>$4TMbL7C3GP#r;4Wc$}Z;^j;n}yc!E3d;`wry$!JkmJP0%(tIh!!TET8=+{rhUi^60G0t2HJSxXv-*DgC(HrJd8`|Dp3NvL5yg>xAvU zho|fEA~w^-HrW&H-JwkqNX2I-bEXBR&Uhp+y2^)1h1IIlNCzC!v-Mz@&z&VPz+cl1 z=f&f6Y*U~C`ixm4Sy1hl$hg(4%Dy;bq~k7d1<@K&%%NLT`L+A)-QXyKVswX?op90( zB#yeFEih@c{OXU8Oq~1CFI_38GXmns3(`;W(i+bslovCx4u7gvK>DrGOug*?G|1nz z_OR}|ZYS3pq-p?rS7G0qa`TM}r5XqDT4cV>%Qyk#9ES}`jc+Ww|DcbZrF6UG>CeXp zOVIV}K1e#z9@tu#?X)Ri=?zXMB`X3G-_I7FL-Zq`nbfWtX_EO1*!+U6pJW-_k&+vk zMd}THh}{(Ch_wPk(PI4vVB_KT76kGxVytLxpWg}&bHw`a3G#QzxV@ICNax&@hk3<_ zBh`Tq66G{-tCw$V{(y0v7l!tp20~@gdFXjzFbF#bJE7i>T4ux zQdrF3org^wFcnw$#bQMv@SfN3$Fuo7HnB_`2ZGB{ZqGr>%xP;2_!Q{=N-ZhU1c~^5 zdt=OO#wmcpkXJyCG?{{&n=R{Sn=Ytg;<09CH)l7TA&wkt{Q;>RrA2Ia6-QixEPLrU z%0)N$3Nh0?U825&v($Sz}0G_(!v&xSSAzje4{rup+^W@^}ByqOb95$E0sbwK*%#GP}!6`%*Z@L;&C z3^dE&>5%bWAXmP*X1 z_m}Pivs*u7@9i>qA!58fDCwj^M<1P(u^m;urVdlM@>aIf+E3-d9ZW>fc4cS7w5O3sCmKKn z+94A?VyfSBb9{}rEbCIYtXORJBCv__fnZ>?a}edaA%bP$jI?J^q0UKO!mduA8U!3b z0CJ_Js}NWQZoebapVUHP%pPOUm?1<)zd%`hzUM-Y6g1z|@@3G_kio?S0bcbjQuxJd>vU$Uyz(4*peEDSVc-G;O;% z9Y97%Tq}TRsH+oN%2u(oyC=W<9`e@&m;i;jC%L;sP(9RBDQnth3;ZMEQNFH3GEf0c zU<3RF!hNG-vCDooYFS^nPlFnv4(ElI1=vNcr42TF^uq67f{MoN>{f&>xA91r4pz5Zc&@P^i-9||`98v$Si!U@}ouZ88W zg;YL=OQ;4}UQtkpyd~lD{qWy0H|lwJXKmenz#E=*9kt$YX*X!wDk7ITlIUGWnj>a7 z<_GQR752@J)Y(U)ncu(dIit7P}oBq8x$FP85)&Nsw<#rOW z8U_x(1J)Zgm(8tZXU%+(yYcO+Z7#ZszPwa2`ygiMPayX9KondtFMRK!7x`9uWN;(f zfWW?8yOdj;GA3We0YAW92gWipn(d>zcbA+vZ_21BxF?-pfcW` zbqY??6ie(6M)p@6@WQ?Tl7 zoKrKEj|x~2yZehhMLkFRRnOC>XL&L+N;m0B{_OQ9gzzTYb!!Jct=bk?_hIpY9rOwY zMnr69R(?8EN52qR+k!~qnCYc-KmV&*d$&NY?t5cjR)V+ncMor=puTRoo?{5dH;@!* z<~RrV!+ljAN+;Qx2LraY&JWnz^|sYbZjP+Y;|pC#DuHUH+>F~x3PqTkx)=OAE0X9( z(AO6gp~AH^{nq+n)LHYDD8mQN?DDFcd!U&d4PaajzSD1~lXq3p{x=^vItrq3gD^4O z=hYS`?&C-0&KuAV>Jv}T?ba0IafL$~+bZ}p$9lwyyx=-uPN`Hpvv<)Ia>OWHa4+N4 z6zscrW$^XA32EJw^7hYtkRJr{Q8 zQ|*1pp_q6Mno|D6EX!kgSv0h0I3~ef_l%$DTFjL`0y16n%^dGNQn;2V82mqoIi9i{15vu zLq&(BTl9CInUjZlTIa>^!!HlMK3W8Sd_Ow0+E8IT?h$=55$^Z)$WYIuig=O;Lp_1Q z4wOT;XbWQ!>Mh`pdXuSo=KBba;wT!wK`Hf1Ueh04*%D7Kfj*#b~BNfvz zsbf?uiMm5-xhaQ|7Om2OrYbU>ngUM9%F5nU<65IFyu(`yZ;Vb1)=wCd!L2K?c$ezE z4IbS|^?Z>)eEp}ZfjwF)Waw?pPJ?{~*g%;efxO~Nx7dQGLWZ)cPQ*T!((W- zGm2?tM)K}7oG<0Xz<`ltWjxvE<$AH!4*R{A2~uYGr@m!vm*j+e#CE9^*}Oc#uihB| z5;#kMY2^8mrr80%*+02bDx6B{Jsch(d7kQGV7~iGTgFZBu$Pf`tNf`B2{|t7fGhIq zos0xF#l$bfxOtcGDd*MDbdKBaCKxgCEbr8JTNd_1bjWC{Ubgk z9~)9;A1&=FyIt$l!VBXfD~6VCk0fjO%QwLJ7k00RH*%I8cCqF542VzP^;`OU-_?=< zbV}OoQE)HqV`|)X5+WbgSxGWH>t+7-O;(l~Z+FJJ)sygu^+eF01#Suj+pnAcw!s>p z$-xF}c>7t9X6H$^V9hvT5H{jKv+=zzWHA0pgw8e5fZpm9vIphVq3%S4*N3%&jsY^Q zK%sSPuj=?d{ATs0o0y6#0w3%YT^@-_sTuTUwI(Q{;l3KjeAbVk#Wmi%PDxm`zoqQ~ z((<-}*FSP%5gt7uI3t1&75ne{@1^bpdW1;MMGNkSr~UAuDbB4+VQi|x(gdO^zin_) zncfs2hj8xdiiy)@vVkfkItLKvsGtJhrTb0T~tFl4Q3J!flauS==b& z6Bm!g%dDvlCf(St$kVofvH90|9yl-gmvRvcKS&Ye9DdoTK@2m}iSvC{3m%4E0 z@TJD7c1V?!URM7+t?f3)%{X(6JXg~A9TvGQyX6n(^Yt0NX;>vDPcr~mICPooLWA_` z<1A>FuXr|C)dtDr*PQt%Xs5WePWUB&gBj$zZ#BIY%?jDdpbSA-PV0`dGf^oa_Jp}Z zlrGV7oe`#B^+nPIQ`ZDJeJas=ru#=*YL#+n?Go}f33>1GsZ{TTy2bdBihj}mz*mp! zOzn%{WgLM=*CpiuKUs*GnHa{B$2siJqfNi|Z;|rH%stM*8b26kAMCYY&NHwPGtlYn z7UVx_^sgR$Z8x27foS63FCPt|gtcG_ zy#@C|!VQV~TY}G5e57qp?F4jRxqq~@h6^?-cvD>ySwVLl2m7=gERtEn>Fw_@ND%pO oiVC*mbz<%I+0K1Z`+LWvZ$3~$+A!Gm?^hpSc@||}WrmLVKLvuzv;Y7A literal 0 HcmV?d00001 diff --git a/admin/templates/images/leftNavBg.png b/admin/templates/images/leftNavBg.png new file mode 100644 index 0000000000000000000000000000000000000000..d06ee9d8f0b4a96daa0de9276b80e0e458f14133 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^OhBy0!3HGXb$hV@DVAa<&kznEsNqQI0P;BtJR*x3 z7`WzuFyog?_l1ChG9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r6C zdb&7$dPGj*FGFQfJ5UdU Mr>mdKI;Vst0HWtJng9R* literal 0 HcmV?d00001 diff --git a/admin/templates/images/left_menu_show.png b/admin/templates/images/left_menu_show.png new file mode 100644 index 0000000000000000000000000000000000000000..3f72567cad6623b6c1994b5b75f0c4a679d31c3c GIT binary patch literal 1523 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

    9Zniu-qOv= zY6s!MheQi#)gvx0dkwAUdM4jh+OFh^Y463Dx-o5^TDn=egPuTdMU=k^2-;^2^S~ve zv#$WbcQI7Ys(JR6rJEJc{Cyx8d-XNono%dF(2}^2u!sWf|5Q*%uSBC4o*!p~HfW0- z68Es`dU4*&oF literal 0 HcmV?d00001 diff --git a/admin/templates/images/logosmall.png b/admin/templates/images/logosmall.png new file mode 100644 index 0000000000000000000000000000000000000000..4b03a953f8aa4a3dad5cec593ff2898b063a230d GIT binary patch literal 1151 zcmV-_1c3XAP)X1^@s6b5wmq00004b3#c}2nYxW zd000W>0fLJSS^xk59CSrkbW?9;ba!ELWdK2BZ(?O2Mrm?o zcW-iQb09-gHt4*vi~s-w`AI}UR9J<@nCWsGRS<>0kz~hqyb#I81aLN>fTH-pbMQbs z0}sS=@CzzbfGQJgXL00BmMmG)@Z+3ju7;6pk;Lw*Da~ExcAs8O&nV0DocAR^{PZ0^ ze*g15;2ux|GGGi`0t28A^ni=E)s?+ZAeIH71#AI}$$ai>gg|wGBjEi1D7gtBAvNG* zVEc-F$G|QyoagYH1QOB&9$&HN0{9JqSqC89lnG1d;S zg!2E0f}W31Z3Np5ffEE|kREiM)LH`W`oM;j4N#$V-x`YTKt;Xd^FhY{VqM#)t`V$zxYY?q@r|GOz;d+3+urGt1IMHPVG@AT7lA zY4hr%##Kj=2?+)3sNt>p%rWZNZC}^v32o%SFfa$c^x6q>*!@I*G*VzPwQ8vFnjQ}j zBOD=K&rwM4qF0WQ6>NJvO)h~~iE-296W}A@we@TQrzkRA%0Ozs=fIlh z_pNw5L-CfC*FEkc;2qCBWHNdk;18;!vjco+5Ow6tJsTVH6-Ao&fTyW_0pwHU+1$!b zW&l{V;uViCfdk*K+xRoos2(wyq7z=UJU~u~GwxS_c!W|O0&oBGjmtKpg^^!fA4QyKP5%4XFYzpE*3Bu}m2BFe1&=R) z=O~9iD1iuBF@Qr9>2nk%e9jYt-SwUwuZ0bnL2P>5MJ)Lr5CJ5-RYPeJ8#CmsZRBB4 zPQLIJg*yQLLMgQBE98z1d7gl1+Q1s{J4FV>bMYGA^0OmUI|t0D*(}fV778&aDs6*^ zH_nhYB7sVeB(jXyr&*fsCF^~INI$5)Mp69Ldlx-Ew_P(Oiv4kgVo**VBah76#aoC( z%Dt+MA~-6|hYkA_g@0`cAQ_^+HQ)CUU7j-M2Tn;AP>)$gsd&P4GFeAme2kd$bRI>w z`5Ip(X=WTC)+Xv7g^a_SGpqo@z|~ z@vw#1G9{ZcR9`1l6n_Azqln}_^a6RmLE-tJzKBZhwN)z9GUsKivf_|l zqbp>{`-ZoTN1s1CmM&Vgf0ve5YWuW_`}Xg5DW26|8h0gecJ$(V_ustPcKo<; zM9KF*e`1;z7R)(t=+L2%sJNu6p59dl^(-AeeEVisxoXMQt&Vw5Zq@fo$YwOTcGc^S#b*zix}w>IkRmg2B6m1LYNr7bnB z$&f=uW%eAkRb1V+GRv0FnagjxR)#}d!CqQfhjB}{;C3YeX9-r`{elPkFKLVdor8aSaz#v%ecCjaWW{{*r;_gX=`(nMoN)fs*mP8cFOpM8$YtK~qCN{2!9^}d8#y(CR>fF8Z0K@eum%9r C-op+6 literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/blank.gif b/admin/templates/images/mediapool/blank.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3b9078c58b49e367f803f65da09fcebaae764c4 GIT binary patch literal 250 zcmVhnA7C#liIW z_@uS9k*1-{*U<3x_W%F?s=vClxwE#)#^>?z%*@Qf)6?qr_pQRcpR}*X&BcY8mA1#n z&eqo2;Mf2F00000A^8LW2LK%aEC2ui01yBW000GdVAly!X_k$sc9LOOK^#<4x+aP> z6-U2437ZJ#aO`-CBx7|k6pg%I;KDR0p2x#<1+iX>#{gtCa4Ejfz<})XVl8Xc;?X`o z9g7u)UPohA1P^>>Uj%@HgI)@TDh!B;XG(RaEu3fwJ z;06OKQ2fcl$j%_epaT*H*~!3KxL_G?VCJ;O6=(lHZsJCqPH8FmYg%Z94FsM?><`@m6d^6B)(ABK6G@4q#@{Z?=N%MUwm%~@W4 oG@&t0i!GgBPftk5M~P3oEv181oKH$vfR|y`>^Zyw!io&m0H7^$MF0Q* literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/doc.gif b/admin/templates/images/mediapool/doc.gif new file mode 100644 index 0000000000000000000000000000000000000000..80082f572c77b49726ef738c787b8b46b1db3b33 GIT binary patch literal 591 zcmZ?wbhEHb6krfwc*elMpi_JD$=hYSwzkfkTGij}ma%OAg;QUC{Ft+G&GU~RJLX?f z3R;-av;XR|XB&?mjIKG*K5gQy=kJ7^7rEpd{Ql?9q05(-Y~9+maFcb!q^awkzWVY&&%AD(^szU}z&d*8nY<*(>o zdc`k)&$(;YtYa2jd-na<^~Vu)=Wji@0rbZZ1&Tje7}*&d8FWDI2gL~k`e(A zwpQb&E=M&H5vd8v%A#tW-F)m)oF=?;%@z2jHO2fWp{QVzK|)4794Em4ClOMaA4u#W)Zd= Ujvyx%7A6Jft`>zwE(#3R0G64*RR910 literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/exe.gif b/admin/templates/images/mediapool/exe.gif new file mode 100644 index 0000000000000000000000000000000000000000..29bd58890e6428a54c08f5faf5e7f6d7b9e30fc9 GIT binary patch literal 613 zcmZ?wbhEHb6krfwc*ej`(b01C*|S~y56s`P{?X^ptM>0YbN#}yU0Y|)oVo5-#P!>^ z_g^@5{^Q0Ue}6u|_u|LiTd!WfJbw1*=11NCA8tE-`SRjrbKg9F-9ByNkMBROuLEjb zv3~2?`)}TS`Ecy(o|oH>AAfLj{hKfECoWsKbnTjbM~`+)>ihry|COs(&zw24?bNXk zA3ko~x_0G~KmPpLym`y>k000W-MW3(uK&+Bt>3hH)#}yD*DkyD;0D7` z0E$0Z7}*&-7<5361;q&i`=JI84{puYwpO;LE)Pw6TN9RvEFzkn-SYM(jxvmM<<;b; zHL+@_ESt-yyGp6cOxajMK)_671&dLaGoO~4gqkALwjCbQLOfdP>JofShFvoAJ@N?Gea(RUGcon^w_E_C!Ed!P)k^ZkLWR?_LQ**R(sY4IM7_ z3h5_l8Z2U9ZmVWxb!BK^aO7k$W4ZU6F?k|~u!8R&3C~GWU1SxVC;eHd%p@e@p!Z{j O=jLau3K~p|4Aua+7v$6c literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/gif.gif b/admin/templates/images/mediapool/gif.gif new file mode 100644 index 0000000000000000000000000000000000000000..9cba87e619b96c8cd89448ade541089249c1c3e7 GIT binary patch literal 244 zcmZ?wbhEHb6krfwIKse?Hj`ohg;Q1i-D?l+{r>0A^N$}VE?ap2&6}&wo-NtBb=&dd zAHIESpEmLM*`sI9ocaI%|CXJbx1Bon<;Ra#-@l)^e&OEt?}sj5Zk;)G>(RaEu3fwJ z;06OKQ2fcl$j%_epaT*H*~!3KxL_G;VCJ+bE3yO~eOzNA0(WT%)hO)wq+urLwkbk{ zZ+FY34N?MK$7I(VWY{e{E*r}7qH2GF?{`PG3G&a39CH3Gx*ccs%QyV=!!PUi)U=h~ oOlYiEVoT@O(-RW%QQ{SEOX*+{=au3U;9;6Idk&8PpCW@b02y9yxc~qF literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/jpe.gif b/admin/templates/images/mediapool/jpe.gif new file mode 100644 index 0000000000000000000000000000000000000000..d2feb2b8663478f03222446233b828e734f6071c GIT binary patch literal 244 zcmZ?wbhEHb6krfwIKsd%b0)+73#Y33yVoAt`~ASaVJzKJM>$c;^ zKYaVvK5gRhvq#UIIrIPj|1CQ=Z##AD%a0$gzJEV+{ldNP-w$2B+&XjW)}wpRUAuPc z!3_pfp!k!8k)1(`K?fuZvXg9rfj>)b!$go>@TsD;DMb-XsjW}HrMxZ#~QegEsc-*3WB-+xkFm%DE9 p_k_j*CAM0AJv|{IA0=M#wzLiwab77t0UoAVv*+*#@F_A_0|37+axDM= literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/jpeg.gif b/admin/templates/images/mediapool/jpeg.gif new file mode 100644 index 0000000000000000000000000000000000000000..d2feb2b8663478f03222446233b828e734f6071c GIT binary patch literal 244 zcmZ?wbhEHb6krfwIKsd%b0)+73#Y33yVoAt`~ASaVJzKJM>$c;^ zKYaVvK5gRhvq#UIIrIPj|1CQ=Z##AD%a0$gzJEV+{ldNP-w$2B+&XjW)}wpRUAuPc z!3_pfp!k!8k)1(`K?fuZvXg9rfj>)b!$go>@TsD;DMb-XsjW}HrMxZ#~QegEsc-*3WB-+xkFm%DE9 p_k_j*CAM0AJv|{IA0=M#wzLiwab77t0UoAVv*+*#@F_A_0|37+axDM= literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/jpg.gif b/admin/templates/images/mediapool/jpg.gif new file mode 100644 index 0000000000000000000000000000000000000000..d2feb2b8663478f03222446233b828e734f6071c GIT binary patch literal 244 zcmZ?wbhEHb6krfwIKsd%b0)+73#Y33yVoAt`~ASaVJzKJM>$c;^ zKYaVvK5gRhvq#UIIrIPj|1CQ=Z##AD%a0$gzJEV+{ldNP-w$2B+&XjW)}wpRUAuPc z!3_pfp!k!8k)1(`K?fuZvXg9rfj>)b!$go>@TsD;DMb-XsjW}HrMxZ#~QegEsc-*3WB-+xkFm%DE9 p_k_j*CAM0AJv|{IA0=M#wzLiwab77t0UoAVv*+*#@F_A_0|37+axDM= literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/mp3.gif b/admin/templates/images/mediapool/mp3.gif new file mode 100644 index 0000000000000000000000000000000000000000..54f7e5d3f066fac30671b8d37a586f369dd2fa45 GIT binary patch literal 385 zcmV-{0e=2RNk%w1VGsZi0M!5hdXJ0W?Ci9;vm<@Ls=vCz)6<->tY@|L^!WIY(fLQJ z@YUw#hnA7Q(8}xY?~B3eN0;#T{QSw{^SHsyk*1;E@Aag$wcz67(&zZh%*_A)|F+7; zsn+@B@%A@{z{SbXioyHh5$>#Ll=J)64=UuA#+Thp#00000 z00000A^8LW2LL<(EC2ui01yBW000J_KpwBLDH@9+p^~?WL}s&&w6IAoM~Imzu;{Kd zBdZXrQf;}GG-b((lq(5tx58pa5akjsz@;ws_zDg7t f%%GL9YeFtD&CQh&F)lnA0t^7(;Nc7c89@L$;m*b! literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/pdf.gif b/admin/templates/images/mediapool/pdf.gif new file mode 100644 index 0000000000000000000000000000000000000000..494052209b174453fc8374ee8ce2f4bb090bbcc9 GIT binary patch literal 375 zcmZ?wbhEHb6krfwxXQp#)!%*p&6`#GcYUz3dN*y_nKNhRY+Up8$B*a7j=d}@YM(ao z-uLfUpFMk%lCtg8vG0HWd|b6^$=0nCmo40X;ndd)7e0LZwq@t$51yX?|Nq~3^x&J8 zmKRHwyxP9~(B;d|KYo0_YuB<}TmSj`ehCjhbN#}Ps;XDtzpp*Ccm9_3$Il*ZojG;e z@#A0CtT}h>+MDIe-;|dAKXc~RgBuK_0L7myjO+{s3_2i9AU`p%O>vOOd88rLt-Mg^ zS%r<)ycNqId*~UnXEYoPO*9Hq+!pkaW!uCpDVbFhPDighexxj1h~snFJ`o!}c3zGs zMmeThKXzT+l(aT)1wVdX=6pF-1#dwKKP7o_8R=$0Z}mAUBHG$4QhK85-fR*p8`$$j s*)~cjPU>vf=_Mp_c+RATY$pxPBS-dXY8bGJaWP!IcAZO%)sev(0OQi4kpKVy literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/php.gif b/admin/templates/images/mediapool/php.gif new file mode 100644 index 0000000000000000000000000000000000000000..3167a72c6d58b04032ee09454012cb6759caa716 GIT binary patch literal 368 zcmZ?wbhEHb6krfwxXQp_oHldOzH?Rm-CutF+Ol)={WovCE0-2d+ji#qg^9}+ZaaSb z>a%BO&YZdT{ris7x0h_)YLz{^ecHs`C(l&P*>n8t(a7dC|NsAAduVUlf@L4ReVej= z%eGU;e*F34kU#tR$B&0DU*3J{OmO|m)|pec9^L!u`}bXE?=~#h?^HDJ+_h`B9^7D{ z7%2W^VPt2}WY7Vb1o9IDTknAot}U8U-5d*zwo3AN%vbEE)0<{0bT&=vWe`wsTHd^oO~RW~Rjr~@RG5!B+et)e&K#MeGD;$vJS>7t O=gwacWZ`jSum%9w@{=L} literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/png.gif b/admin/templates/images/mediapool/png.gif new file mode 100644 index 0000000000000000000000000000000000000000..34fb938cc526a0c576bf69c4966c5a0c247a773d GIT binary patch literal 244 zcmZ?wbhEHb6krfwIKse?#=vmq`h}|g?zM;Ze*g1l;Kr>;JGwq)zp z58uAEPn)>y`0@Y$|8Lp3`OKL!+fE((^5e&=@89oz|9P0Mw$7Zo_2}Mn*RI`q zaDxFADE?$&WM`0K&;bd9>||gqT(C?rFmqbtiY!4#AGe&4z+GlSH7YfaP0R${HbqGA zS+{Q5ASKXsO!mA%hTX#BvY{+5s`e-NUUy`hAp6Y7At!I~{rGP;edGK07VOwtTfh2d nLSw8JYdW8vo{*4_l9+f~N(YO$n3MoN57VsKb9nd#6d9}mKKO0V literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/psd.gif b/admin/templates/images/mediapool/psd.gif new file mode 100644 index 0000000000000000000000000000000000000000..1d40b7019bea6b0036523a96af3e861bacf53c21 GIT binary patch literal 243 zcmZ?wbhEHb6krfwIKseC)!)7U!m0lZ3~LYV{r>0A^N$}VE?ap2&6}&wo-NtBb=&dd zAHIESpEmLM*`sI9ocaI%|CXJbx1Bon<;Ra#-@l)^e&OEt?}sj5Zk;)G>(RaEu3fwJ z;06OKQ2fcl$j%_epaT*H*~!3KuwWT$VCJ+bE3yO~eOzNA0(WT%)hO)wq+urLwkbk{ zZ+FY34N?MK$7I(VWY{e{E*q-yqH2GF?{`PB3G!(r;W>G$@4hbl$s@ku{^MVFz4ebD nY>3lhOXt_q6B6=K;uUXAX=f4VmEsfNVVF5Tf6r9MCdB@KkokQr?~<)s_g^@r z*!bc9_kG8Abr{e5-#%?(*ZKc9XQ-x~`Tzf-^Z!Rl_uss!36_etYzsjcZoz-=&ece#O&& zAHIEK2)goqsc7q!|2YT#znR7`>GS{3+mzOP|C8y?d*%$#rvF=y?%j6k*#G}CS6un` z|Ns5xA3xTg{MQ&SXS5P1*=Uxt{^{P_LzgdWcYJ;I{rms_{cbD%A3u9^*{-egx2(TA zl`&%a-PV~?|7}+*-}iIvp}hRKUo;r8FCnOKn8%~gn|8ZLr#vAM{8TFNmEyjhmLh9>qORIkIrruzEB@k zj=3yuEYq6Y`K+yH&yifk))i!?lC4{}A3OHp+qW~cub2zG&hEL4I!;;psDG$#^ph^YAQU wpUB3%UU=7Pw!J&N_%?3ZyoEd0NnCE%=~dI^#1$n)Sy-=LyUrpi>BwLW0C78kzW@LL literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/swf.gif b/admin/templates/images/mediapool/swf.gif new file mode 100644 index 0000000000000000000000000000000000000000..e60d0071e85c13eb26e3f0d26c2104f7f448448c GIT binary patch literal 375 zcmZ?wbhEHb6krfwxXQp#)!%*p&6{Prw(etMy1!w=@v}z{nw!trxaP}`A6K6}+iz;x zK5gRTg9kSrJ$Uc?_wRrH9C3DDvUTgkWea!n^MCmE?acKH|NsAAwSU*C;NWeij&0ew z`Ofz3&p&=V0|ds#&yOD6f8o@j%a@OOdA<7neeI#W^S7*TojG;e@#BYic^_}yeD2z{ zTMuq9PyiHvvM{nUXfx=5%mDd`fo;lxt6WnwrMg8I7EP_Rahs!|KE+c{nj=Huplzg7 znBp|2hb-GBZb|X1ns7Q=ul-1!!aeB|3Wo7b2|KQnHQ=)&N7_kS72D literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/tif.gif b/admin/templates/images/mediapool/tif.gif new file mode 100644 index 0000000000000000000000000000000000000000..ed8c142e92d5ec09650e3586ed902a13ee997712 GIT binary patch literal 243 zcmZ?wbhEHb6krfwIKlt~Y1>X6tLpFm^5e&nty}NEd2{IU<@RY4?|uKi_R!w_7fwxF zw(#n+XaE2IKXc~Hw&TY?eEYU#=jQK!{yhKq@%Y)Jtuv>dxqe~m(Y>#}e?NEa+N}pS zKt>_~#h)yU>zUa2hN;npEmK)=g$+DEnK;G@6O}L zzyJAj^xV1oZ{BP_c5KPktslO9J9GWQ|NsBDojSH<=jLU*w$5C)^7z@K&p&=VbLPyU z%a>n$|GsR`p4ORDw;tVl?%K6m4{k8f5-9#;VPt1eV9)_s0`e0BTc3l#3Ik24Zo!2@ zCXqU3?JpdSJ@sT;c$W#juu|b$eZe_k25aY$ZoTN1s1CmM&Vgf0ve5YWuW_`}Xg5DW26|8h0gecJ$(V_ustPcKo<; zM9KF*e`1;z7R)(t=+L2%sJNu6p59dl^(-AeeEVisxoXMQt&Vw5Zq@fo$YwOTcGc^S#b*zix}w>IkRmg2B6m1LYNr7bnB z$&f=uW%eAkRb1V+GRv0FnagjxR)#}d!CqQfhjB}{;C3YeX9-r`{elPkFKLVdor8aSaz#v%ecCjaWW{{*r;_gX=`(nMoN)fs*mP8cFOpM8$YtK~qCN{2!9^}d8#y(CR>fF8Z0K@eum%9r C-op+6 literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/xls.gif b/admin/templates/images/mediapool/xls.gif new file mode 100644 index 0000000000000000000000000000000000000000..6103f63cd1204404d615fc2fa8e57efbe91263a6 GIT binary patch literal 385 zcmV-{0e=2RNk%w1VGsZi0M!5hL~=CJ_ra>ax{SGrdXJ0r`1s7%(B%BsSf*az@#Lhn zwbkb4ztGC+_xF9VgU;;EoUyDqh&;5pv-kY`=kf7qrDwLs$A^}Y-u=$S;k~xhw~?ly zO@luF|Nq_Z-QM^2NO(KV>C@Q!#b%ji%*@R3`10`f_O{B#Y_xZ+!o8-twZhZWSf^m$ z?CeKuIN9~mpR}*X&BcY8l~068-v7n5#l6+~!|D6tKZ!lw^xR5&LeAFKTCHQ+;Mf2F z00000A^8LW2LL?)EC2ui01yBW000J_z+R7WDjJIhp|W?HOd6CZWpzp}Ed^+6!L@WO zR$;ARGErJvg?h70P0Hpimy&8v$mR2vz7$MK2o)3#5eW+v0)2lTJUBBU2`z|ADib#k zC@cUPITQ^lO9~wa92^4(ATJFK3QI5@7_k{6E;eN_OAs9*yu1McWe~X?#7<5H$ihk+ f#Kp$QY(gGdR2( literal 0 HcmV?d00001 diff --git a/admin/templates/images/mediapool/zip.gif b/admin/templates/images/mediapool/zip.gif new file mode 100644 index 0000000000000000000000000000000000000000..29e3543396962fbe74db25700761d5e53ba58191 GIT binary patch literal 622 zcmZ?wbhEHb6krfwc*ejG=cfGsw#m%}j111_wjDqI==0}^%N9m&`G57Tf6r9MCdB@KkokQr?~<)s_g^@r z*!bc9_kG8Abr{e5-#%?(*ZKc9XQ-x~`Tzf-^Z!Rl_uss!36_etYzsjcZoz-=&ece#O&& zAHIEK2)goqsc7q!|2YT#znR7`>GS{3+mzOP|C8y?d*%$#rvF=y?%j6k*#G}CS6un` z|Ns5xA3xTg{MQ&SXS5P1*=Uxt{^{P_LzgdWcYJ;I{rms_{cbD%A3u9^*{-egx2(TA zl`&%a-PV~?|7}+*-}iIvp}hRKUo;r8FCnOKn8%~gn|8ZLr#vAM{8TFNmEyjhmLh9>qORIkIrruzEB@k zj=3yuEYq6Y`K+yH&yifk))i!?gc($$NRb_&wMgi4@gg~TF(CUCU012oW1w;h(kaStZO ztAD_w7d?3J;K8$h!JnW9PbMZNu2Yt>9>gZo`N;D;@AJO%&Wld_@j>=ZmgBgCR#We? z`3f7#{vP|+%@01CZqvqq_Q;4XtPpcGhYT@jdDa+rvE?jJKI00?v4XISBl{Hx}Y7MB=i%?IwI zF1d}J+@uk_fJN4E=$>NdI3yleCydfYP*3|E>o*uFXaj&J<%=pXj=Z|kUZ)7r=?ChoLj$?WU?o7b0ejYaeLrMi~FBK>6Q(g43$7}hORbRW#W^plC F0|4?mD+T}n literal 0 HcmV?d00001 diff --git a/admin/templates/images/numberTop.png b/admin/templates/images/numberTop.png new file mode 100644 index 0000000000000000000000000000000000000000..cbaad9491faf817f57dfae2ba29ac75e025eff38 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{F!3HF+&llYeq*#ibJVQ8upoSx*1IXtr@Q5sC zVBi)4Va7{$>;3=*{(+%k(&%kzt}ixr%MP4x^{%X_>A zs3h;{}>3BP+) hIQIQfZQlEk@%2xYcYV)ImIKXT@O1TaS?83{1OPD{JH`M2 literal 0 HcmV?d00001 diff --git a/admin/templates/images/ref.png b/admin/templates/images/ref.png new file mode 100644 index 0000000000000000000000000000000000000000..bdcd6be0a291878031302386a9c9d11780fc6a2e GIT binary patch literal 5090 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 KelF{r5}E*2&#L7B literal 0 HcmV?d00001 diff --git a/admin/templates/images/sprites.gif b/admin/templates/images/sprites.gif new file mode 100644 index 0000000000000000000000000000000000000000..014338aaa359810493a9ab0b812a43ab1028d9e6 GIT binary patch literal 6579 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 Ee^A*xNB{r; literal 0 HcmV?d00001 diff --git a/admin/templates/images/sprites_doc.png b/admin/templates/images/sprites_doc.png new file mode 100644 index 0000000000000000000000000000000000000000..4088cce431293116827adae07a2e956cb2e9e82e GIT binary patch literal 1093 zcmV-L1iJf)P))a=rU&&Ex|m&n6zXEEl%n{Ra(CgK;ZYI&K$Jx5 zFuhtAVx`uqV1_Aa?Enr>m_ghG^0(iA(E9VjdoI;62<%%tEG~u9a6kie0oQ=n|;%l@yki{L2BhfA*RZ@zT z(K{fPp@f?7W;k}=N+X^fg2*gBi)V+xDdG@B@WWm4Z~}M|o?T{5_~90q1cnn(Jz-Sx z6Snq%ii;Bf{j*{*Y)f&Z>kx3En0}_jy3YYh!b)Z?nS_yiV)!Z;o|JYcK*wB~m|6bM zWvER;+BP50CxPJvXgGEiBAGI6v$*SoSCwi*35ii94fVn8m;f+CAh=SFgjkjptoPoY zQo=8V7uV%;+Hz3Pb?^f)NcIS|B;vidQSX z=pciPC{{$Xv-oNVTK9)r@lB4X=SGHm&nTiif)5?xID48VTqVIQ2Q|S&P=S3x)=?Sr! zT9i}qB&bzRXpzx6iz+V&c+U^^R9+D9TzpnJcSCGO)S_G~%V@+{Kfs-&)Rc2L?@1gp zA&KSz(QInw1CxM6;0Eu(CBJSBeY^UQ!toa4mpG~5SQ zC)C#cZvgnNwC6s4DeXUSAJQDS3-1y6DZCf*w5wne_&fxLFGEV;4ghZo_#4;{Goe0a zJ}?OkC&0~UYgSrWatJ@%0>cT2PQ_VdI4_a9Keta{;hDaQmsza#{7XW^Yrg?J!SR0c z8~|fdYZxpkuIGXgYjWcRO@&wFx%_}=0S#lchwz*q_|X3u3?G8ORi78GAu@mv00000 LNkvXXu0mjf3sBoI literal 0 HcmV?d00001 diff --git a/admin/templates/images/table_level.png b/admin/templates/images/table_level.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3993632c1160d359595d54f9db3f763aede74f GIT binary patch literal 2948 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

    kiMH{6k);cGnd{85pbq D1PBXP literal 0 HcmV?d00001 diff --git a/admin/templates/images/titleBg.png b/admin/templates/images/titleBg.png new file mode 100644 index 0000000000000000000000000000000000000000..fa86b9539f17c5a0d76e7b2c70b1f76cfa07f71a GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^j6i&dgAGV_WUiPDq*#ibJVQ8upoSx*1IXtr@Q5sC zVBneq!i--o-4_B1%9OZ9lmzFem6RtIr7}3CzLfj%G?*$MNNg+Tmk);^JGAcFO15!v{NCE_$QG%j? z(t;ZTYQ?3ZRmS%7pv(DviL(fo|!ju@44UiopaCouI-NP zF<^)-+9Uv^QZ{e`!(r%$|j%!gG zxEKfJg1{h)L8(r~&4>z5*6M}KSEtS~5v@kZjQ5K|qYR;VidK?i#24j6%hfrlYQBaU z^d%B#5ms)!7;kV$s>{t7z7 zknBfi^#L#{>i?lSoqYiPvL>?(AMW>~!X|mP0q4qa6Omz5<0RbEPBsWajkwZG807?! zHaNwY6v9lHQV0VQy2uZS*XlJymZ={d6(x}BO=hKDjZ4FXOp?#hYBd5B6Z27Qt_bx( zLorN@@liifxNnHxTpxe2D4Z8C$PFXZ89H2V9^`6A$c*J8~}pBkB!sH6!=JACb!?o8j7j>j%GiFhzRDz8o?wxf!xOt|z^2Bu#Dm9gOR@ zD$q2Lj|Z~d2de?}=|LF|cqj(w6bK?u$#3Z3Qx~=dKz9PuK_Cp#0fi31bjWrd=m3Br zX!zxm?NVUiY_IlVl1w|e0J1Plg{UN;KOhR-)dOI#h{>CvTxbpPOqcmkS#$_M)B(hM zoCuMR)@=a6qTQJlOa-TN4^=Nm_*UyE$Z zy}P?b-A-q2UU%d5gEL9z+}f-Pw!F-%=}IB((QJN%k=^)3X|G2X%k8UVV_qD4Rk4)q zrkumRLSt0qIw%yyVIFA60V{j{p#$6F~ z8C5~SS2L*36i4W>lnY{*5-#oRncm*9zO?78)!9XVxS^=Bk#j|{3EJ%3nnk3k$Wa`b z6R3K2X;wo~p?DlBNm_BT$9h{;R)29x``h1CJyW9QEVW#1PL#KTOOju+nNt8ey(W`& zV!o_3ZiAzw0i|sMF^AYGl>COc9M6f3Q}IQmnL2CAR**MRH>y{Sg2WO7_0H?A-IN90*TEE(TB5m5eJ%MO$RE*|5$ptB8nFs6!k zzGjw!(ebVD#-yswyc$gxHVMf|*h80{l*`iEE(DWp-Tn*ImSQK}j%V!rCA;)x#nm5< zZLfX%^l;wFx?OvBZClX_8}sjT7$@kW-H+*U=JJ3j?*0cEeX#QY literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui.totop.png b/admin/templates/images/ui.totop.png new file mode 100644 index 0000000000000000000000000000000000000000..130cab44f0c3d4a88e1321a5f80cf1710305bc98 GIT binary patch literal 1111 zcmaJ=TSyd97@iVMG^HM*jHqGkq1*19*==`rC%4d@-P~#xTelRFa-2EpWHV=)Iku}^ zsh|tgQy@eU1Q7%&7M595SOiiAnZ9Uc_0&U9pb%6Ko!MOLp>5#Ix$u48|NZ~@&zYL| z=8~eNMHEGq#Hz&vnHQ09oGju!VGp$><7X?HscVoq^!C5cAtqy;MVo zkp*d=8@LqU2ehAabKdnl&#$9BfCDV>u$;%m@q*VQ06@=t42fo`%|b$q&cq_S5YvjW zDX?rRm2#)NZe+EvTre1PG&~*`LAdM=1IuZbVV7qWL})9PW?~H)w4*3Dp>`Z%h|}LG z=;o}fVb7F_6pT&FCd;{jlTsEaN&koH`YhVU3HZnFKZWgNhY8sPv{AdIkc(?BcS4y$ z*n%=fRuZ9o*(%nwB8==-WYXbUA6=&zDoWWIv?K{J!^X0qz?c|f2;Z$~ssN%szgQUv zfXI5laS^V{2cm%pFGl@h72qrRELTKIyABPU<*I+U!JJ&D5p2-@V_0o;Es>p*Fj)|4Y z^!Vp7u5=L0&#&Q|sJ?mc3x_VP?e(4zPIUIaEbFH>+-!V${$lTq9Y^M^JUVpacEz=w z7n1LOco)9CS2}(0T|?K|SBv?Q51s&6r7hDJgxh1Q+~3`B@YuHx14Ho@Z$=-VJ6}3~%iaw? z2c{1nJ$W^MbTFRxY{`|8=XH7P)%;7lCJql|l)j((ROp`?o|I5A^AYcvQ$Vem<{yst Ra4(#v9*e}q?yAP)zW~bwcJ=@O literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/arrow2Grey.png b/admin/templates/images/ui/arrow2Grey.png new file mode 100644 index 0000000000000000000000000000000000000000..4b98c1fa8944887a40994b630481e9cd783bdcbd GIT binary patch literal 950 zcmaJ=O^?z*7;b`5v&sGdjV6<_$r@eSPN8%=p^`$u#aKdsxLi!Ov;#D3JGC98aN2lM zPsXc1z?%oJ9=v$blV|T9H~s-5PFY|*h)t&Rk>`2d=Y8j$m#yZ5-JP2|9LMc8j?6Zj zud;FNdiuZjx^&K_8?@G=9WtO(JHnjdl0F6v-yY&Nw%ys&FSx{U8Q^t$v}Zj+4)Fy$ z#R!QXGB(GR%1LNDV@yFG54}L=e}4SL1JBj@W5trJu!=|C(LBPPd9&-x$ByRm<@=zN zASU2rYJEvs$1^A`BEk$~jU|0!1jmd_h&!10YLK z5+zxLat^8}FC$3;tB+^VB6on=W_=Zl?R0)bX^2E|I-LsByg;I%2sKShHDo!*5V?33 zP&>&5adxd>;@FA2ka{ElsiNH{6RPvf=|u{DxRDLwRhd}9#KaCoC`f5aYoKNQAL{!X zbWGd$((gZoK}6jV-|o1#56@3N c|G0a`Ww_ty;al;m`6PWwjat)uUpaaH2R0Zao&W#< literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/basicBtn.png b/admin/templates/images/ui/basicBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..c6a98b5e591785f88bf5cc6cbb654b2593133807 GIT binary patch literal 2896 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 T&3N*wH+YpwCMUm0%{=%6IAcY% literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/blueBtn.png b/admin/templates/images/ui/blueBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..bcba4db3fd5ffb13c57e6b3a2991cf19bcc4c700 GIT binary patch literal 1047 zcmaJ=-)qxQ7>(<2b2@amhjt={44+(^A8pq)w3fE%whmKfS6ClSliM|J$&JaK&H6HM zPH-qP_7@Bp`XnL>LlJSHAPjsEbjXwqd=%Y-K5D(`+Rg`S;O73|ob#RUyWhPzo*C)x z>gys1qB}h*WbxdF$5`iK{9k^)cot6{l**$CSVU#X1Vmhc1wf`XX$oY4q|9A;10n?B zBGp_T<;4rU3^kwRV0^Y_U^YQSVzwd4(*ThLFs15I>ie@76samvYBDG?qLBn8b+lrF ziAp9XSEl8#LdDLL5u3*X8bA_hYcsmV+fk~f%j30kOjBeHf~KR?zNx%8P9~uV$e@q$ z%FG}`4zfPh9|(m)10=_=49##f%X!%l@8@`iA?qK7qnS#P&kDo!Sa=tuN(dP|O_$4M zU)k@2<`m6_!(m5*D%43wQ7XV$6s54!{S-8#DXUxc zGU0;Jwq($(k8x6J07dctP)%#1EtCZZe*Ym}PXMqK0O&MQYvEK=0@JSO$2%0$v zXBt%;FF^#Y5;Vxm7Rrj&=KD0b<^lWFVzjp&2cX|`;@1n-N#Ob%4D}}F-_Mba< zkH?tJcxdm8PRnDz`d=-KQeUH(^2 z@N{tu(U^F5qBj?lp#bY@=f&wIk7bVZ-b*p7T6a;KgIUlsZK5CBr;iM2p;umuUvgRZ zy_n^~)%}bY&R=JKuwk)FbHsrV^+PYFcRrqZVVl$KEIpo36;{2^FV~A-xt;9AZ8tsK zNGa)o5l88k^H08~JYHh9_gBHP^rE?eTmBz)>}SZy?JnBvzaVfO&@Bv}u6{1-oD!M< D+Ff97 literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/greyishBtn.png b/admin/templates/images/ui/greyishBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0d908bd6fba189e5bbad9cce0436ca0e9f0869 GIT binary patch literal 1046 zcmaJ=TSyd97#_;hOeqM{F48d4L*dS4*S!sHy6$LhG_tK*E`jMdb94utIpfT+ot1)$ zdoA7_MycCaMk z2x2p-CXy&A9^+-G(UOCqZOy=Jf@o^C4M`pXi0lW0sve@&9zUZrBXFLvm1|nh%prHjf1~fF#n^hINa#LsV9m$7|=9p~x%*4TY$6Q%NyKMxY5u zFU`7S*2j`Qj^;d#e!stgbh8}Gux^HPyEs4Zaq}!o<~|BXGnD~8F0|)j;a!MIA!P6j zlTN4Uw1!g$iisJvFnpQwtC=NFK{!`dWWDLN>fdxlR8DHE$y%WmdBPNg# zG!qaG=c^b?K?JQ7G{{Jom+V$`1*WYmS`_)HZXrpRK~xA)m`|&!!V7F9z&855Y%t*F zxHb-tf!2V};}3dSpEu0qxdN0&HK3zBSJ~kDigKMs& zIL}rJd%sWjysuj>sTuh(EyND~o_qV+cW9>i!JD5w<>~8>zD(R_dQaY&V!y6kif)}N zDGLjqD(&Yj^x1n0wH>9~7OU%Su9o%2R$M1`Y!^SCK3>^!YVGcYUmV@Kt6_e=X5aMU z&Kt2;SAvt{x0jQ_*;}9Ye|Y)iTm59_-O`p?VkvrUq5a%UpYu|qZJom1*1n5>0F@Y2 A#{d8T literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/handle.png b/admin/templates/images/ui/handle.png new file mode 100644 index 0000000000000000000000000000000000000000..44c6454ee570d2309d1c781bffedd8cb52d88822 GIT binary patch literal 3425 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 D$Ww4! literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/handle_hover.png b/admin/templates/images/ui/handle_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..91b926655423bd1bdb0a164198cb6df0c49eaa72 GIT binary patch literal 1496 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{LuV&FryZ!{sAMiU%{ATCcU8J9VTaVz#^}YnDNW>m@b_%Y$`F?YK`Xy3xSLlVcyRsKs%y=U6v)_>>P^e)$Ic5&`T-&Znx?cBMV%?BR{%;|r?modHj z=%e5%<)?f;|NOIm0e|gD#qeXtd&ZG9GtccZh$HUij*()0V!do$XrqKjrZ*#n}QL*PFP|M88DL}wYFo&vHNrVmd`$$7Qa1e?Zy|9hm=IPcn$6t zu&G3^4GUG5Xw07T<@ewDXVX4w%=D>CDtuOBw?5TKa&3Ud7pBGo;VHYjB+U3kX76-S z^84B2lJYNR_0_&dA1gSYNbZm>?5xNsnB}2z>R`eLZymAfmMp#tw@Rf79b&)K%<)@( z-&Be>?!KhulUYSO=ScXNNSPKUGnB7+_wQ6*UiP%p5xf7h*=)RS&&0!UKIz~gZ-o`x PL1nF{tDnm{r-UW|+s`;W literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/leftNavSub.png b/admin/templates/images/ui/leftNavSub.png new file mode 100644 index 0000000000000000000000000000000000000000..74f70b7384fb7b0a7926229664e2cf2241a95503 GIT binary patch literal 941 zcmaJ=O^ee&7>=$7U0DzWQ4cbtAZTqeN!raeG%jt^x`9n8ZDH$e(`4F)ZZcysHR*yV zd-Epv5BvdMJbGC4=AnPUf1n^j6{`cQrd%&hUw9%(sJfyK5BChJ<0RpCPk5C8M?(EqYRN=S{;Pv{nZ|!Ri z_60k|2#HS^o8v0G39+3CqF{hVUZC?oKc4cyb9MfpWI>D6(b(HN4pH~G)pL#~PTA#m zAA?GwF##V@8zlZw5NV0dFLX7wPLD+%EFg5E^XI1eRvXlDh(Jkz1qW_Juq_FaQdCv- z5s;w-MJS7sT#!^vku?ax^5a>w&>d`?o~PiGm240#%ft#MCN>cz0j4QsK+F0+ z)c05Dh<4D0-+u~6y%|Ab2Ss=qI_%LIcz4tp3MWmRmCF~!js6HxD#z=0RI zIF1%*%hJpsqITdQ)6jXw7d+3^cB)NSH5$cc)2K;O1J)X}J>-b=MAU!_2(*{``Kw|K}U;?z&W6 zd8!h_uP3+e{JoE(G=miM^l_LN^}PO@Mnz zk4vH%24`84Y4)-#a~^lojGLm-%et6m&dYLcAHM$($eStmaWOu!?+cxRL>fYaqo_0Sz|QIOTF z{W76~QCZQT7?QSA$^!-A|4>yepe+~!2l4(>*ox;2K*fNi51A5bT%Xf+WpH5=h)_4< zx;~JvVs~1Hx|P-qJlwWe5Tn)hsA#5{U9a0%?$nB6BS)?+yES#vhLG z4AaiE`DnJy8>S4*L$KDnO7aaUCICK~LGGr4!@Qp`sAP(1rN zxxKT~>fk;OfA6b#xH5TSeW*9|=zU3a(|DOuR_-$8KMZE>;@PRuxTDHry_lJ#$0p`5 zhtugy9Ixt*om`r4a4xP+6HO~`R~9FdbxXH8g)4()wZ}@z1~7SR>+6GS?yDnPPrj@@ zZJnx|zxRQ1{9f2z|MvWjbFH2Z-1v3BGbqSd^BF~J3KP`Y@%`ODCL_u)Np$N ge>GmQ+2Saz!AgJnR_o3^UbgRZw7rX;ZR@@H2i%`w^#A|> literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/messageArrow_right.png b/admin/templates/images/ui/messageArrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..6478330eb46a979f190581e445b7bf767a9603ac GIT binary patch literal 1074 zcmaJ=O-$2J950H9An^k)7-LG|APMWo#tLgT$+j|?TAbU|osiPLZ4LCp_Q49#KsYG} z;bNi(5{+o$L4%1B6GBWxF|hy&VHMF^zAAwLH|7ol|)MwY)Qd{o`yNm1XxhkI{_Y5#SDl8QSQ4i2mBbe zy;e!4U`ja2NxDjk4u-T<1F6 z$ef4N%?!o(d_G6R?RFuA%j(mhXuCA4Ca=H)OEMJ$D!PU{iejhU0|Nw#bUg*t*p$_* zjWVHvQMPDM3`sjF<$;3mf2gW%qAeH)Tk-x=*h=;pfQkc4?=dCRxO9!<%HYB#5TR}+ zb-g=Z#aLE{x|P)pJe*+hBZ4R?nq#P2V+aBl)hsA#5{U8v0%?$nB6CeF?+rKdUSBxE zGfWE;YNXkaH%v$PmSE89@#ML@F7>EDgL$sJ#bpa}oncT7sjK)}(wtH_ z7EeLF4X#``mWF~{3I#(st^KRjc@vr+XS+GL=&(8ZKtuCxqQNdr%=Ms4F&^cEN&8** zsbJYNdhemGf!9+DtAQN@H#^RMtQ;PBC27+QqvN&J2et|CuSLeWiP5ne-{#MLZc0}_ zANzXUnw{*eyW?N*JbH7PX)l7pqW|G1^~27o>0k8h;FHSJuByeCv5ETfyULJtb!leg z)?mf)dp}l++h>;T(3#@-j{7g@-Sw0F_qv(e>DA@o^2eF|{O{C>x_zN9Z+~h_^;A&_ X2BViI*{O?%om(7jY2zP+I)?rLDg0vY literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/numDataBg.png b/admin/templates/images/ui/numDataBg.png new file mode 100644 index 0000000000000000000000000000000000000000..94bec4343b80e26936222b5e6adc44965b5b2625 GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^j6l4XgAGU)$%?lFDVAa<&kznEsNqQI0P;BtJR*x3 z7`R@8Fk@3UZxm2aro=U(Bsf2Q5tk<<|AfIaV_}a7}2Ly!^9t;njQx zPse8M<#FvzCF|9H*j;5@VZB>y{(W=d$LpP$V)yDC*_Zq2r9yziR5jKMp)rkd-z)#R z7A<6mt=rS}_pptcMMdQA>Gf$>-U+5K#p*-ee`?-+xFdx z+gDh5dItWRzR4-}^P{RAoLj7O|FfrT_KVSzOU_)}nD&z`keS1H!nCVfmag&@b#R{Z aj{9?-!L8?)rM?0~fx*+&&t;ucLK6V|*^+Aj literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/orangeBtn.png b/admin/templates/images/ui/orangeBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4bf5385003dc3265ffb754a4f84dcbeed36488 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|#!3HEJ?rl{CQY^(zo*^7SP{WbZ0pxQQctjR6 zFmMZjFyp1Wb$@_@G9|7NCBgY=CFO}lsSJ)O`AMk?Zka`?<@rU~#R|^BriEJ{n*r4= z^mK6y(U@2}VI!}TA&<-Z3->3<&S+}llxSQkAjJDfIncqeH7WQ=-~KuBtLDsEZax2} z%{vi>W$*toG0a%-ib+p}lXsc;(H0Ay?-M7rx@UA}#1}YUG>JSAnsY%Zhj-ff-F|V) z_lnM0f77yT+C>-Da{goCz1b`=LVKQFjw;z3c4UQueEV9_J##OcdOZ8xp!P~Sp1bW$ m0^h?kf0}11|GHrIldA)j z+ls>$E`ofbQUMPU3nbo#AE}APc6C*{PLFvObRlG2V-HL<%tfH%5CNGJGPaNvKo)XP zn#tvI(?ArUzzZS|#SF};lBfy-=zT1W7CNhH)hPF3(VfP&2nkf4kK>q&B@TycJX91V z)eyxDMP#CmPpl;4M^k+T14VY|2E@faNENLnZWE2AP7hM>f`P0b^~yvG#wS+5LrzFj z>H|&l|4`2xpd(U6hkpMl9MwAk;;Sga?a-zdw>p)E3RFEr7Qta1GQCIYAIV(yzu_TxK zTm#!}5Ba3ebq=}Nq1?0)ynseFQ0QJmPC3LL=q9YX!@WpD^?F=qxR;rsT%MZY(`)_f zn)^qzchcpcY3XLr_Q`dYK-gP5-v#d`Aj$w|m&PbQrkFS0^xxzd> WyZP?Hl~23rORJO?j90TOxBdWwDm6C% literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/progress.png b/admin/templates/images/ui/progress.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3580aefc30984139d5396a92f2a65c4bf41650 GIT binary patch literal 945 zcmaJ=J#W)M7`BKap@>Rs2&R)e01~l%PSeO%Oq=9VYN?JQC#cz|V_y<0vCo_@*vY`a z#K*wj=mHC3Vt@_7Pe2S66$=Z0fpeOq3c)jV_Q2ab}E(1J)kO3 zkrh>jY7tiSlBz2TSbidpM!kVrONg{M8Lrv2%4OK02L@}O) z%t?!3yuDIDICiNYF`tAWQ*`=d$_$ZbdQn0Ut!2Y_*(TmFIdvi#N=jDJ3TRpXhX%nK z9WxtW=KD|KxI2rmY~z?rsmm{Ju$_g9^ajNaBeYA%WYxv?h%ge5NCX<4GC1}_k0kK| zZCSb*#>@#_Y$8MCe98AceFxRGa!o^uR#6~qLahW5f)(DZI#NqDxZ)z>P6HgW71z7u zHaBuJBLoqTj4<_|VDEsE04xgD{mr@5H|j09-sW5y8@V!1M$WGFuWMc%aqncywQ2cg zZF?MYuTyU7UvFrhKZx5Vs&&(E{qOI`H*&e$tJBjv&wreq3HH&oll_M;f1ZDSy+ZONo9K?_mSfwxA*^->^`y$D@2%LwePhajRtI-{=k&^B=9T=>54|Nj5{XC&Hm ztRTNMpCE{WNP`%|a~>W=J96;YE;+`$cQd?f*6q1RNoA! zB8Xg4iziS*Y7`Wx)3S@99o@uif~cx?Oj+pxh-?R)nh~PDPCuncO$|{keuZ4?pBVYj?AenUZUc(lg5VfW&;I(_qP~;i}^@ON(Qwb?bhM@&W zKh1g+Ho%erj^=z7JkK8?y)4Hvte4@u9*!4$UV&xFjgP|7EVV<3iS-+?@GeAkA!G^+ zlT0S*q>qMHC&LAUL07};^C`tc^>iQKrV15-ii%3VSi=T+ zmgDNU%1TZQ`@;brALM;vFp%MjQ0do!fihfmi(8wO>o$UJ;>aSfv~xhMx1dh0B`j#! zy;Nq^+u*9%y#%vz8El4eul28M&K%+1ahID-i#MBX4-DMv7H;ZS^I!r$h+7e{Chojz zymDse09#a-H~G9URdVR|kLC8op%chQ*Jwor1K;o7i%#yz;ct9iN=*nWvvy$D#MQYp zchH^zGr!E0{L=TsmuCl0-qfVQzOkR%LJwOXOdZc1c(M4Q`*Goysr}B(^*6iYtD|he zwE6LEo0GWKYLs|PJimIOynOl7`1#b~z|iZLXU8tJ97sPZzO&H(ZSHqo Y331WeDew!mr`;DEscRDN*R~D(0Z*=BqyPW_ literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/purpleBtn.png b/admin/templates/images/ui/purpleBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cdc9cc4ae066ccea7979bf8a08f628fd428d20 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^OhD|#!3HEJ?rl{CQY^(zo*^7SP{WbZ0pxQQctjR6 zFmSyFVaBFz-YB4;T#0K$NpOBzNqJ&XDuZK6ep0G}TV_#ed45rLv4V53sh;6#c@Ll# zhFP92jv*QoTPGOu9Wvl?ogesazjEIJRso?Lo;fT>f~*uuH%SVqAIi*7fBpP#{{K^7 z3(Ok6)cG-}@Gz83(VuxUqrgJ)-;!jvuhTQNuPmCo%EI~hkFIHtcc=W+iQFllzw^PL zS?woHCsb_yb@oMB@bAk>tbKc5`6t9&$j@Wd{~fGnVY`f>+au&uz|=Yqk#HxoSl($X g)*M=V;NDkOmj%TNSD)XW26QEZr>mdKI;Vst02j1uQvd(} literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/redBtn.png b/admin/templates/images/ui/redBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..7f62bb71c728bc3390d5cdc84a2bdd55724e0345 GIT binary patch literal 1026 zcmaJ=OK1~87+x*3p;)k|QcuH14+XP3yJ?zcNg9%D(nh->B!T9j;AVHyEa~p7yHm62 z%~$b-P!JDZyoeMJo55|SrdGLMT|NZ~`bF)~O9~(U} z$}r4WenBqL`6wM{0>kvb@#^|1I!%&nm6UOvv{VN%DIM1k$eZdiDj`*GU;KpP3^N3b zN|jWVMM=XZr}`MqGi}Odn0V5&Rjr8#sG()UO0YXyuUTN|33e%>K*i3WhOw~bpz>Ow zqOCQxn9e5WK-`n4fQg6-JaffzB`?8tbS1j>k9ih!Af%aK4@^~+BFJC|fd~gf8k~V( zM&N|-bTk@04MZqF9*VpmhJ>gT79|Kl_hV@^N3TmIIoFLvcL}yZh%NDatJUIKVGcXX zybz1Ud<{_yQAEgXTSWCjmK*FT$jH?k!zKo{fUl_5@G42L)agMArrnpd+-{j@!FW%# zd4Yp|NQr>cjYH27hCs@ko3`3W4sYpf)r!p`$3k4x7q-UdHIW1r2;m9;|`n{mJ)zzu)`)zISzYW@=>k z@GwPDBiU&wN5Dj8b2r($avSB6Y?@yl5z|a%)d`RIGI}Izwbi;vj zjhVdGSkz)VojeKRo=5~th*jX3OO`8o3A(K-lDWUl(x45&iwSx=se&>K(#U}z#Bc$P z3v(dMGkkC&5{Zlhf#W%r6Ifmd@DVX6h#Utx4^5&udP&Slawis9CFlyqw#c%zT8*g% z8RV2%J{F7l8iEiYh=5zSu<8XYcdV-*L05AO8ym<1zM@)0Rh*znrrSp_?VhaVcFIHw z#(JvF@(kx6sS8w;|3gi)hjwue?&SMVVK-m5A)A9PsyZ5JTxrY?Ws7MCsu($WgqFHh zoUI^?+zPTmdM*U!4NFHgw~ba5F>AS4wKSNO5;Wm6hM|iwLExhiZi0(Nd7jVkDOr}I zVOdTG!{mpY>T)HdRZVE&E?3{-hWc`SBbYXcEJ4RO4|Ul=CTJg6H2UWv^wsNd_5Qg8 z`*K;54C}Y`uQqqLhxc1(bk(x^Y`-;KU+uEZeLh=q}^RF3afintF&@0e}B2L@$FtD zT2&jLlWW1|jSqKP$2M;s*w=iqv5=C literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/sliderBg.png b/admin/templates/images/ui/sliderBg.png new file mode 100644 index 0000000000000000000000000000000000000000..fa27d7f84ab7f3b8313f76323c410586eb1e481d GIT binary patch literal 2811 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 N002ovPDHLkV1jUuHGcpA literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/sliderOverlay.png b/admin/templates/images/ui/sliderOverlay.png new file mode 100644 index 0000000000000000000000000000000000000000..caa7820428fffc9b2a3cb25202a3bad21da9f3f8 GIT binary patch literal 938 zcmaJ=y>HV%9Cax|s8V)7LOQuC@tvIy*H%oF#tF4lM^O@~nE=PWG*)V#IbX1o0SQ=O z=l}yFD_j2o23R|@u`n<(F)*jkIr#T5VnCo7_y;#sJkSPoD3tS zLB!dDP^+hr<4!RHBYft_ z05b=q!AThFsUa?Pb-vH8p$L``HZ{bHq=t4EGzrC^BB7#-st8nNNiLODRlNfgBqN9v zC@V!-)k}(w5Li7Tk4C+*-ZR^)So~y&6UHJP!X!zgq$Ck~3}sEzG7Uv3azrtnhs;Tf zVZ56wm^gN+A2FYVAX9WkWX24UXL?aW5Upjyc-1D}Fqk?KlqHmvlml)1|Ii>? zm-+rvI3CO+40|{xGwSlejd!z9k=~@(VT29{Imx@&oe)Oi35h_nUjavc=#eB|qHSBZ z!k9Usi!IX-IbZU9PcK*Y_7Q4VkXq7Yxg~2VQZ==z%BI<9G)y(;n#7$2IAl53yX00k zax)_Y5sz$Q>OaO_o00%53)cP3xs*2Qt+?LiT*@1{kS7DPvHmsY{EB-g+pbN^4{O`w zkb9kSQ}4a{a-07Uz%mR!t_SaAF*Vfe=!fCDW@%h`c O3@cczj(N8K@Yx@9%pxlQ literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/uploadDisabled.png b/admin/templates/images/ui/uploadDisabled.png new file mode 100644 index 0000000000000000000000000000000000000000..bc1fc9481f1ef0b24e04a0b18128bb708b957e73 GIT binary patch literal 936 zcmaJ=zi-n(7&TNvs8Yq)z<^HfO6)tQi4!ZPO5%iC!cmk&N=6*}l31yI?)ie9Oo)x0 zg&i0fSQ%hK>de-EfdLkzE-0MSIAtJMI^Pey_rCXi_uZ>b`^mxngMC2|4$M=d%ja8s z9NxXn|IMq9Lq6SS%^~ZNF^g@Ag_=u77?{32!Ch>-i}MRy6@)$D^@nU|J=GlIOLmHp z59YttR~H9G3tC|VPrcJ6#l2;_?<{9d#T8E;gKDC2 z0Ut9PB>q_tX^Aebbv3?Dk7W_8A#A3L*QSP62Q&!9peVt-14|H;kc0}ys;WK$3Pezb zij0&zQniAjK?pXV$fHqrtaXjnCKli6;*_yaljS&$rMMswI+0POQb{!wCC?H0Xb~_w z$p_Ic6(8G>TS60ZZGAXT$!7Z(`)_fnzJL`JLz)Uw0yH| zdmQjyr@X1}y}cOl2l3D}YW?JLboJ}|;kVUl^(L3geaU@&|N748g|H_qFTwBfyPxR` N6wGGZ_)vfL@(*o0B7gt@ literal 0 HcmV?d00001 diff --git a/admin/templates/images/ui/whiteBtn.png b/admin/templates/images/ui/whiteBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f16b730c6d1eb82136022b2cf3721b346642eb GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^%s}kJ!3HE(sPTd*mSQK*5Dp-y;YjHK@;M7UB8wRq zxL$)WV^cS86i`s6#5JNMI6tkVJh3R1!7(L2DOJHOvnaJZzbLy{!8zEpaO-0;pt@t8 zE{-7@6Q>3{_AwiB7>E7)fBvWQfocy$N8j*VzX*wDTdCQ_Ta7Ikhat7pQe|NhT!3;17fu9@c^9(BK1&Fb83 zyUVL4ZLylU&7uLn!MuD*R{s+izyrh-3P@|o(p Xnh!{C{r*rN=pzPCS3j3^P6+KkZe;~Mt&8B074cw`nRL4$p|PY**DY*HX$viQF-@jz=q8g*rY75y z=xMK>1kZX9@ee3?@#4jcH$m_p=noLqNw?{Gup5}n2ha1o&->0h$IZsW_1tETYoMo7GXu{o|(P6EpwV+#6s==vJ}>%%7=xQ@nmizYOKDjvCe(-60(jgCDX+ls@N zAAnM#G64@$3nbowAE}AP&vaF`PLD+%%pi2E@u#MGW)oCNh(S?+c^mFPu!96t*p_Aa zK9C@SB9ufV<&mrwBo#t1|9BQHbOvh6*qz5>JB=Sv8mOWe$FUF>1QHHKq$o*V-~S3noudGYEgX?aXtRqOY^9+BwHjiJlCVR_K~}})h)@!ZNC2wsBIvrl zL*i(LHchqeN7V9dTsJhH@dej)R2f1^(v1p|6@*X?>BS1v3#cX)Yf=FsJ>we0o_N@& z8P_@ER+n+bfNvnd?Edw%`R)3qP> ooJ;$?J3n(TH-2*;UvL*zx!bRESMwM9*V6Y?uQiPKmB-Ki0XMj~=c#id1|)_CPUkQ}>vBB8U% zWG1t-XLFX!zysHqF=7yY%P=O=cV5rum@$Iqf!PRuYw1ab!hXYKI~_Zp$sk#+RHmCv zAdXc>^Ev3;t?3H4-L~OE!Sd;(bXhEf$Vs9IZm&mY-v_Q&;Bc^DEuQow<0N6IlaKoy z$mRHniv?@-xFkcndR|wThC^Vv{QYyQh5dADS3ly|hGsM1cEd3U6r#nGo@6K}r}T!^ tN(Gzk7R-7}*5>2MEooiEUk85+FaTCNet>lOne6}o002ovPDHLkV1iP?l~Moz literal 0 HcmV?d00001 diff --git a/admin/templates/images/uploader/error.png b/admin/templates/images/uploader/error.png new file mode 100644 index 0000000000000000000000000000000000000000..2fa47b3713a9837ba690510dfaac4c024c84256a GIT binary patch literal 369 zcmV-%0gnEOP)ARhp>CWrSI@Z=u0?>4i24thz@n=P-p}PH>ubq zg2Y79d;b2ZUO4>cp8F9_tmP}t#}g^z2WI~pe+neYQcHXyua@y?4m*m3j=u3Zse6Un zC+#VEX7pt2!$H7s1$kAe(Zzh!#$Edv^vui+b{GP0^sm!twSf2GT(VOOGMPBWU^auw=K;q7aye6R4+H_Q+ergqegzl+n*ESWSd~EW P00000NkvXXu0mjf9wVU{ literal 0 HcmV?d00001 diff --git a/admin/templates/images/uploader/uploaded.png b/admin/templates/images/uploader/uploaded.png new file mode 100644 index 0000000000000000000000000000000000000000..feff985e26d967de65d5d20fe1e0aab2b92be014 GIT binary patch literal 307 zcmV-30nGl1P)OOenLWdn?O=p!6dWu_RS|| zM!3qwg^1+^Xyqf9Wr;n{i~kXMp08Vv6~;Wz_bkiSGenQj*4Jr_;|SmPp_DpcYI zWGS&G-+O-FH=n-@>2|vcBMjrN1*Bp01uCVW)M#c|DK+{IT2~)N)y0u_aO7*yN?(?a zMx%is2=MOrcQ`ye1Y->AzpkTHDrJsM7-QP@U0z;deQh1}dL6c7!*Lwg)P|4(f(uMd zP2s`A2UuQS#`yTS7DpxrH#RoVXf#lqE`m}D(==h4CX`fQF~i5dKVo-x7dEx=^p~e! zUts;uI_~@T;kqseA)g1P7F^dwKA*?=`MEZSm1ToSDPh}ok2nAzgut>a4#OB6f)D~Bgf>Sef&HB82iJAAIX?Bln_ln#c#lq}GZe|`=_!tmjJ8gMM4OoD8if9Z?t%{1$qS!l+sjzhGD>Q9B|IHc(hYoE|-U{!CWqf$3H&S;?eGd z)oK-#QfzK+rtajmwKYsmPC`m~V;*e>Ip?TUDkv6<*Y-FmB^DPK;rl*>5MOtb0RK)K ztE;P+nVIPksgy#gRKn8IQl@Ds^E_x-7Ru#vPcs%mU}0e)^C*|;RdwKTd%M?jUnzxJt(G-BNW0zEdc+_Iu=jQk`}_Ndq6qiK?|tTA(oN88 zHZlFfG^#&UF~2Ym-}i4W@Z#cPD1lN+Y;SL4XJ-c={`!D8j^Vm43WWl^g4Z+ENGTD= zG1~1m!Y~A53={qYW@l&dv-N4-O8%7=u6I5B2UH1j8_3+cqrA0;LqSS`A?s!t=bo>j@$0 zyZGef1fJJhV_9%DKzN>qAP5GoP3?n8lE5_0TM_nu7={5#DbCK$u3e*)0%^5c>gr2B zgkgv%inMAj4N^*Yo;NVXsR9Whx0c#|7<95h2uV-zT^@~mKYq)Kq1wz{<5tG4FNJTS a2LA!lOMckBQMfMv0000P000>X1^@s6#OZ}&00004b3#c}2nYxW zd4mQPRHNEpU{V~?FUwn-v2NL{vqaBGFyGuIXl z+}lGJapGeXz7R*Q-P2YaHm7V;_yAmpkkiN(5Z5!~*#n!1EF_^TaoI;2c{G3CXP)=Z zj73otmM4bu)C2&IwNER=T8kWao)Yr03w_@QZVx1cnDmuWi%ITong!4E==FN^dOg1W z^%YmTe0cwX_IjHriZI5^+-t2x>vYAp}Y(k|dcJy9=!~gTY`zGONukMkyuzexGi)OSM{^nsZ&3JkR;^$CrhP zGgpZ*hNYz?*4NkX1y*ZK6h*vz^^&qI=PQ{vsg$BttFgboPovS8A{vcG?Ck8YwY5c_ z=l|VZ07X&IYPHzg+r#rcj4>2N!N$f0+uPfWMx%u{#-p;!aU51xSMjBf`k^R_f|ZpO z!Z76K=4K(uOeLQ05r!ePT8;DbbB>OVNRkBUODdHLoj*HtIvoI_C?W`gnF%1WEW3A% zYPHJc192YoaKkEK3H10dX8pTxP9Bq-km&A~MD-tmJ>gT8or&61TBiA53B2_kWsT sjB)i(5sy1}G4B!jSqLHiM}I4S18OqRVe_N({r~^~07*qoM6N<$f>udzCIA2c literal 0 HcmV?d00001 diff --git a/admin/templates/images/widgetBg.png b/admin/templates/images/widgetBg.png new file mode 100644 index 0000000000000000000000000000000000000000..f011293e1258b7626b5ff92e1e59da068d14975f GIT binary patch literal 2422 zcmaJ@c|4T+9-a!7rA5+=oO&B4vW=Os4@1n1$z?P&mgG^hz>}&0Xz{-f=7PU#mV+d*G5R-D+D@%NB)(R z7ljHC_(BjcMWGFuXfrfmhCyMBP0Y>B4FD_}gEm5AjWAe4j5*F2i$kM~vc z@x`LAXbJ`A$P+y97rY@3v&z+<3J)}FeHpUmSAo{BB3qJ97v{i z78c7~BA*$^1$odim-RQ7^h55F5x4?bWFjc!1c59EA)gC;Ef~l7aW3{h)ceL|{WurG z54lFNWQ>-^`d?#SzLI%oY5U!@vcq@VgFKnng)&onzucGsgUOFM676V`?vS$w)3SCe z6S*y6lgTMxidzOhR%SE@o{n0dNT18?yhKwKEl$t3jZV+a%~khL^i=fmZa<$tkTfbD z53UMh4;^FuEUs-bP;W{K#Gh|7ZP917_Oz8R3R=% z8atVZHD2u{W-%_V4-d5nX=+Wyz1OHUsJLW3v};TJhQ?HL*BO%=Qkp$0HYvglQFpit z>id+Tn*2P}F=uf2PACcs`epYah4F4Nd1P$Eh5IAQ{Z@Wi)=Z_#^?#^8K55srZeUW* zY%o6yRdeOx_6qyisx&VmLj5Sfp5C*!S50*z0VL0Zc6OcQQOuK=b*~0ByGt0Rsd9}u zWCdsGhWSI=1*hRpFLe%%=P8v4%CS&z(jY!EJ!r5~J&)%9Y1d*iK28%E*&=XN-)Nw}VHT(j;oZREz|21o5M>6Wfy!IyyQt-n7yIkutR zA~#|5MbNrulLulDbqVmq_2V@wPT%g#etydao#Nd-Vyk|SwV7acR@@??&X$QQe(?;E zS9@7J1Mju1b{;OT(pN2{Wsp&;qH}d3#WhM!792)uCFz%&P?PW_1E!>_lBXV>o@f|X z6Tvz+Bk?igsWtHZEJxW4QrT?Q=CuK{%4^8L_?Rp2oK-G*s=k9PFWGj~inh(lVyC)m z?A&?{->JdLE(Le@kA<~!?JiVpt)NFMr+VHzXnN-|d&hI`RplAY($TfQ2BkLTI5#<; zk6o8O6`F5wU%l6AHGolti(jf})JYf^F+Dw>-`Y ztBrd^g7-R=_j3=7tqDq9P>vXOSqR;ac-;~uZ%ZA@12rFP)ws{v-*K2wT%yGGEzP`= zPzF@3P>N8z>bJJ%UxnD7c!M|lb;8Fs?r2f4(245(Snp(MnR}}6%+n7CUu$JieC+Tu zatgE#!rs`DhVjZSyO&L#k2BKq5`KEn8l$+o@uEt?q@SImN7U1vT=U+WswL70rL-W~FZAPHDl%f}m+dDKFr30@RS;7||>$C4k8SZfR_{YS_jnmqKoBdrn zWxuYNlc??(`;Bxpr+&;>dP`-Ze-fdbgKtepz9#6oOV7AGc@J=x^JsC`>b4FMO~quK zEk8V+enxpBf43)fZL0 z{Y~cfL)tAaHCB-F!j*9LV%|8fZN7$H{>N?un-O@)n{=ggjc3u~G~uJJ*w{m12Km}w zoLhOd3M*o%(gD3>I9Mgwo? z%UO!0&j-k2bpB76vfAm^Bv#v}a?d70PP{%1_XhdIQv14Zvw7NKT>|%dG`mQkK7&wn zpiKl+Y|>6KC2l!g+_1%Kg}biMB=b*stmi5CjG}H_$}m2=1M~3swr~Z%D3|zYAGzc5 aaM*dB+`PVz_6|#bLXIRCVv)V?iT?mth7LLa literal 0 HcmV?d00001 diff --git a/admin/templates/js/filemanager.js b/admin/templates/js/filemanager.js new file mode 100644 index 0000000..6d4a1be --- /dev/null +++ b/admin/templates/js/filemanager.js @@ -0,0 +1,51 @@ +$().ready(function() { + + // отдельный файловый менеджер + $('#finder').elfinder({ + url : ave_path+'lib/redactor/elfinder/inc/connector.php', + lang : 'ru', + height : 500, + title : 'Файловый менеджер' + }).elfinder('instance'); + + + // диалог выбора изображений + $('.dialog_images').click(function() { + var id = $(this).attr("rel"); + $('

    ').dialogelfinder({ + url : ave_path+'lib/redactor/elfinder/inc/connector.php', + lang : 'ru', + width : 1100, + height: 600, + modal : true, + title : 'Файловый менеджер', + getFileCallback : function(files, fm) { + $("#image__"+id).val('/'+files['url'].slice(1)); + $("#images_feld_"+id).html(""); + }, + commandsOptions : { + getfile : { + oncomplete : 'destroy', + folders : false + } + } + }) + }); + + + $('#elFinder a').hover( + function () { + $('#elFinder a').animate({ + 'background-position' : '0 -45px' + }, 300); + }, + function () { + $('#elFinder a').delay(400).animate({ + 'background-position' : '0 0' + }, 300); + } + ); + + + +}); diff --git a/admin/templates/js/filemanager_template.js b/admin/templates/js/filemanager_template.js new file mode 100644 index 0000000..1493c36 --- /dev/null +++ b/admin/templates/js/filemanager_template.js @@ -0,0 +1,22 @@ +$(function() { + // отдельный файловый менеджер + $('#finder').elfinder({ + url : ave_path+'lib/redactor/elfinder/inc/connector_template.php', + lang : 'ru', + height : 500, + title : 'Файловый менеджер' + }).elfinder('instance'); + + $('#elFinder a').hover( + function () { + $('#elFinder a').animate({ + 'background-position' : '0 -45px' + }, 300); + }, + function () { + $('#elFinder a').delay(400).animate({ + 'background-position' : '0 0' + }, 300); + } + ); +}); diff --git a/admin/templates/js/login.js b/admin/templates/js/login.js new file mode 100644 index 0000000..99a1749 --- /dev/null +++ b/admin/templates/js/login.js @@ -0,0 +1,4 @@ +$(document).ready(function(){ + $("form.mainForm").jqTransform({imgPath:"../images"}); + $("#captcha-ref").click(function() { $("#captcha img").attr("src", '../inc/captcha.php?refresh=' + new Date().getTime()); }); +}); \ No newline at end of file diff --git a/admin/templates/js/main.js b/admin/templates/js/main.js new file mode 100644 index 0000000..72adcfa --- /dev/null +++ b/admin/templates/js/main.js @@ -0,0 +1,960 @@ +/* + * jQuery windowResizeFix + * + */ +(function($) { + + if (document.windowResizeFixFired) { + return; + } + document.windowResizeFixFired = true; + + var $window = $(window), + _wWidth = $window.width(), + _wHeight = $window.height(); + + $window.on('resize', + + function(event) { + var _nWidth = $window.width(), + _nHeight = $window.height(); + + if (_wWidth == _nWidth && _wHeight == _nHeight) { + event.preventDefault(); + event.stopImmediatePropagation(); + return; + } + _wWidth = _nWidth; + _wHeight = _nHeight; + }); + +})(jQuery); + +function browse_uploads(target, width, height, scrollbar) { + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.8; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.8; + if (typeof scrollbar == 'undefined') var scrollbar = 0; + var targetVal = document.getElementById(target).value; + var left = (screen.width - width) / 2; + var top = (screen.height - height) / 2; + window.open('index.php?do=browser&type=image&target=' + target + '&tval=' + targetVal, 'imgpop', 'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',scrollbars=' + scrollbar + ',resizable=1'); +} + +function browse_dirs(target, width, height, scrollbar) { + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.8; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.8; + if (typeof scrollbar == 'undefined') var scrollbar = 0; + var left = (screen.width - width) / 2; + var top = (screen.height - height) / 2; + window.open('index.php?do=browser&type=directory&target=' + target, 'imgpop', 'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',scrollbars=' + scrollbar + ',resizable=1'); +} + +function windowOpen(url, width, height, scrollbar, winname) { + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.8; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.8; + if (typeof scrollbar == 'undefined') var scrollbar = 1; + if (typeof winname == 'undefined') var winname = 'pop'; + var left = (screen.width - width) / 2; + var top = (screen.height - height) / 2; + window.open(url, winname, 'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',scrollbars=' + scrollbar + ',resizable=1').focus(); +} + +function openLinkWindow(target, doc, document_alias) { + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.6; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.6; + if (typeof doc == 'undefined') var doc = 'Title'; + if (typeof scrollbar == 'undefined') var scrollbar = 1; + var left = (screen.width - width) / 2; + var top = (screen.height - height) / 2; + window.open('index.php?doc=' + doc + '&target=' + target + '&document_alias=' + document_alias + '&do=docs&action=showsimple&cp={$sess}&pop=1', 'pop', 'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',scrollbars=' + scrollbar + ',resizable=1'); +} + +function openFileWindow(target, id, document_alias) { + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.6; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.6; + if (typeof doc == 'undefined') var doc = 'Title'; + if (typeof scrollbar == 'undefined') var scrollbar = 1; + var left = (screen.width - width) / 2; + var top = (screen.height - height) / 2; + window.open('index.php?do=browser&id=' + id + '&type=file&target=navi&cp={$sess}', 'pop', 'left=' + left + ',top=' + top + ',width=' + width + ',height=' + height + ',scrollbars=' + scrollbar + ',resizable=1'); +} + +// Функция-плагин для включения tipsy сразу для всех классов внутри элемента +(function($) { + $.fn.addTipsy = function() { + this.find(' .topDir').tipsy({ + fade: false, + gravity: 's', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .topleftDir').tipsy({ + fade: false, + gravity: 'se', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .toprightDir').tipsy({ + fade: false, + gravity: 'sw', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .botDir').tipsy({ + fade: false, + gravity: 'n', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .bottomDir').tipsy({ + fade: false, + gravity: 'n', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .botleftDir').tipsy({ + fade: false, + gravity: 'ne', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .botrightDir').tipsy({ + fade: false, + gravity: 'nw', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .leftDir').tipsy({ + fade: false, + gravity: 'e', + opacity: 0.9, + live: true, + delayOut: 0 + }); + this.find(' .rightDir').tipsy({ + fade: false, + gravity: 'w', + opacity: 0.9, + live: true, + delayOut: 0 + }); + }; +})(jQuery); + +/** + * Плагин для подключения сортировки к таблице + * + * @param mixed items селектор для сортируемых элементов default: 'tr' + * @param mixed handle селектор для элемента, который активирует перетаскивание default: '.ico_move' + * @param string url адрес, куда будет отправлена последовательность элементов + * @param string key имя массива $_GET[key] default: 'sort' + * @param string attr имя аттрибута, по которому считываются id элементов default: 'data-id' + * @param string success текст, которые показывает всплывашка в случае успеха default: 'Порядок сохранён' + */ +(function($) { + $.fn.tableSortable = function(options) { + options = $.extend({}, $.fn.tableSortable.defaults, options); + this.sortable({ + items: options.items, + axis: 'y', + cursor: 'move', + tolerance: 'pointer', + handle: options.handle, + helper: 'clone', + placeholder: 'sortable-placeholder', + start: function(event, ui) { + // задаём placeholder + $(this).find(' .sortable-placeholder').html(ui.item.html()).css({ + 'opacity': 0.2 + }); + // назначаем колонкам ширину + origTd = $(this).find(' .sortable-placeholder td'); + ui.helper.find(' td').each(function(index, element) { + $(element).width(origTd.eq(index).width()); + }); + }, + stop: function(event, ui) { + // удаляем ширину колонок + ui.item.find(' tr:first td').each(function(index, element) { + $(element).width(''); + }); + }, + update: function(event, ui) { + // отправляем результаты сортировки + sorted = $(this).sortable('serialize', { + key: options.key + '[]', + attribute: options.attr + }); + $.ajax({ + url: options.url + '&' + sorted, + dataType: 'json', + success: function(data) { + if (options.success == true) { + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + } + } + }); + } + }); + }; + + $.fn.tableSortable.defaults = { + items: 'tr', + handle: '.ico_move', + url: 'index.php?', + key: 'sort', + attr: 'data-id', + success: false + }; + +})(jQuery); + +//===== Tabs =====// +$.fn.simpleTabs = function() +{ + $("ul.tabs li").click(function() + { + $(this).parent().parent().find("ul.tabs li").removeClass("activeTab"); + $(this).addClass("activeTab"); + $(this).parent().parent().find(".tab_content").hide(); + + var activeTab = $(this).find("a").attr("href"); + + $(activeTab).show(); + + $('.CodeMirror').each(function(i, el) + { + el.CodeMirror.refresh(); + }); + + AveAdmin.select_form(); + AveAdmin.sticky_panel_refresh(); + + return false; + }); +}; + + +$.fn.extend({ + limit: function(limit, element) { + var interval, f; + var self = $(this); + $(this).focus(function() { + interval = window.setInterval(substring, 100) + }); + $(this).blur(function() { + clearInterval(interval); + substring() + }); + substringFunction = "function substring(){ var val = $(self).val();var length = val.length;if(length > limit){$(self).val($(self).val().substring(0,limit));}"; + if (typeof element != 'undefined') substringFunction += "if($(element).html() != limit-length){$(element).html((limit-length<=0)?'0':limit-length);}"; + substringFunction += "}"; + eval(substringFunction); + substring() + } +}); + + +// Запускаем после загрузки документа +$(function() { + $(document) + .ajaxStart(function() { + NProgress.start(); + }) + .ajaxStop(function() { + NProgress.done(); + }); + // настройка аякса + $.ajaxSetup({ + cache: false, + error: function(jqXHR, exception) { + if (jqXHR.status === 0) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus, { + theme: 'error' + }); + } else if (jqXHR.status == 404) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus404, { + theme: 'error' + }); + } else if (jqXHR.status == 401) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus401, { + theme: 'error' + }); + } else if (jqXHR.status == 500) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus500, { + theme: 'error' + }); + } else if (exception === 'parsererror') { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusJSON, { + theme: 'error' + }); + } else if (exception === 'timeout') { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusTimeOut, { + theme: 'error' + }); + } else if (exception === 'abort') { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusAbort, { + theme: 'error' + }); + } else { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusMess + jqXHR.responseText, { + theme: 'error' + }); + } + } + }); + + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.7; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.7; + + //===== Dynamic Tables =====// + oTable = $('#dinamTable').dataTable({ + "bJQueryUI": true, + "sPaginationType": "full_numbers", + "aaSorting": [ + [0, "desc"] + ], + "sDom": '<""f>t<"F"lp>' + }); + + //===== Information boxes =====// + $(".hideit").click(function() { + $(this).fadeOut(400); + }); + + $("div[class^='widget']").simpleTabs(); //Run function on any div with class name of "Simple Tabs" + +}); + +var AveAdmin = { + + initialized: false, + + initialize: function() { + + if (this.initialized) return; + this.initialized = true; + + this.build(); + this.events(); + + }, + + build: function() { + this.toggleMenu(); + this.clear_cache(); + this.clear_cache_sess(); + this.clear_cache_thumb(); + this.clear_revisions(); + this.clear_counter(); + this.cache_show(); + this.main_form(); + this.select_form(); + this.sticky_panel(); + this.customInput(); + this.fancy_box(); + this.fancy_frame(); + this.tooltip(); + this.place_holder(); + this.collapsible_elements(); + }, + + events: function() { + this.a_actions(); + this.drop_down(); + this.collapsible_select(); + this.confirm_logout(); + this.confirm_delete(); + this.ui_totop(); + this.modalDialog(); + this.trim(); + }, + + ajax: function() { + this.select_form(); + this.main_form(); + this.place_holder(); + //this.modalDialog(); + }, + + //UItoTop + ui_totop: function() { + + $().UItoTop({ + easingType: 'easeOutQuart' + }); + }, + + toggleMenu: function() { + if ($("[id^='toggle']").length) { + $.each(["LeftMenu"], function(key, value) { + //Считываем cookie + var toggle = $.cookie(value); + //Проверяем cookie + if (toggle == 'hidden') { + $(".leftNav").addClass("hidden"); + $(".dd_page").css("display", ""); + } else { + $("#leftNav_show span").addClass("close"); + $(".dd_page").css("display", "none"); + } + + $("[id='toggle-" + this + "']").click(function() { + if ($(".leftNav").hasClass('hidden')) { + $(".dd_page").css("display", "none"); + $(".leftNav").removeClass('hidden').addClass('visible'); + $("#leftNav_show span").addClass("close"); + $.cookie(value, 'visible'); + } else { + $(".dd_page").css("display", ""); + $(".leftNav").removeClass('visible').addClass('hidden'); + $("#leftNav_show span").removeClass("close"); + $.cookie(value, 'hidden'); + } + }); + }); + } + }, + + //Окно очистки кэша + clear_cache: function() { + + $(".clearCache").click(function(event) { + event.preventDefault(); + var title = clearCacheTitle; + var confirm = clearCacheConfirm; + jConfirm( + confirm, + title, + function(b) { + if (b) { + $.alerts._overlay('hide'); + $.alerts._overlay('show'); + $.ajax({ + url: ave_path + 'admin/index.php?do=settings&sub=clearcache&ajax=run', + type: 'POST', + dataType: "json", + data: ({ + templateCache: 1, + templateCompiledTemplate: 1, + moduleCache: 1, + sqlCache: 1 + }), + success: function(data) { + $.alerts._overlay('hide'); + $.jGrowl(data[0], { + theme: data[1] + }); + $('#cachesize').html('0 Kb'); + $('.cachesize').html('0 Kb'); + } + }); + + } + } + ); + }); + + }, + + //Collapsible elements management + collapsible_elements: function() { + + var width = $("div.content").width(); + + $('.opened').collapsible({ + defaultOpen: 'opened', + cssOpen: 'inactive', + cssClose: 'normal', + speed: 5, + loadOpen: function(elem, opts) { + elem.next().show(); + }, + loadClose: function(elem, opts) { + elem.next().hide(); + } + }); + + $('.closed').collapsible({ + defaultOpen: '', + cssOpen: 'inactive', + cssClose: 'normal', + speed: 5, + loadOpen: function(elem, opts) { + elem.next().show(); + }, + loadClose: function(elem, opts) { + elem.next().hide(); + } + }); + + setTimeout(function() { + AveAdmin.sticky_panel_refresh(); + }, 1); + + }, + + //Окно очистки кэша + Сессий + clear_cache_sess: function() { + + $(".clearCacheSess").click(function(event) { + event.preventDefault(); + var title = clearCacheSessTitle; + var confirm = clearCacheSessConfirm; + jConfirm( + confirm, + title, + function(b) { + if (b) { + $.alerts._overlay('hide'); + $.alerts._overlay('show'); + $.ajax({ + url: ave_path + 'admin/index.php?do=settings&sub=clearcache&ajax=run', + type: 'POST', + dataType: "json", + data: ({ + templateCache: 1, + templateCompiledTemplate: 1, + moduleCache: 1, + sqlCache: 1, + sessionUsers: 1 + }), + success: function(data) { + $.alerts._overlay('hide'); + $.jGrowl(data[0], { + theme: data[1] + }); + $('#cachesize').html('0 Kb'); + $('.cachesize').html('0 Kb'); + } + }); + } + } + ); + }); + + }, + + //Окно очистки ревизий документов + clear_revisions: function() { + + $(".clearRev").click(function(event) { + event.preventDefault(); + var title = clearRevTitle; + var confirm = clearRevConfirm; + jConfirm( + confirm, + title, + function(b) { + if (b) { + $.ajax({ + url: ave_path + 'admin/index.php?do=settings&sub=clearrevision&ajax=run', + type: 'POST', + dataType: "json", + success: function(data) { + $.alerts._overlay('hide'); + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + } + }); + } + } + ); + }); + }, + + //Окно очистки ревизий документов + clear_counter: function() { + + $(".clearCount").click(function(event) { + event.preventDefault(); + var title = clearCountTitle; + var confirm = clearCountConfirm; + jConfirm( + confirm, + title, + function(b) { + if (b) { + $.ajax({ + url: ave_path + 'admin/index.php?do=settings&sub=clearcounter&ajax=run', + type: 'POST', + dataType: "json", + success: function(data) { + $.alerts._overlay('hide'); + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + } + }); + } + } + ); + }); + }, + + //Окно очистки миниатюр изображений + clear_cache_thumb: function() { + + $(".clearThumb").click(function(event) { + event.preventDefault(); + var title = clearThumbTitle; + var confirm = clearThumbConfirm; + jConfirm( + confirm, + title, + function(b) { + if (b) { + $.ajax({ + url: ave_path + 'admin/index.php?do=settings&sub=clearthumb&ajax=run', + type: 'POST', + dataType: "json", + success: function(data) { + $.alerts._overlay('hide'); + $.jGrowl(data[0], { + theme: data[1] + }); + } + }); + } + } + ); + }); + }, + + //Показать размер кэша + cache_show: function() { + + $("#cacheShow").click(function(event, x) { + event.preventDefault(); + var title = cacheShowTitle; + var confirm = cacheShowConfirm; + jConfirm( + confirm, + title, + function(b) { + if (b) { + $.alerts._overlay('hide'); + $.alerts._overlay('show'); + $.ajax({ + url: ave_path + 'admin/index.php?do=settings&sub=showcache&ajax=run', + type: 'POST', + dataType: "json", + data: ({ + showCache: 1 + }), + success: function(data) { + $.alerts._overlay('hide'); + $('#cachesize').html(data[0]); + } + }); + } + } + ); + }); + + }, + + //Окно удаления едемента + confirm_delete: function() { + + $(document).on('click' , '.ConfirmDelete', function(event) { + event.preventDefault(); + var href = $(this).attr('href'); + var title = $(this).attr('dir'); + var confirm = $(this).attr('name'); + jConfirm( + confirm, + title, + function(b) { + if (b) { + $.alerts._overlay('show'); + window.location = href; + } + } + ); + }); + + }, + + //Выход + confirm_logout: function() { + + $(".ConfirmLogOut").click(function(event) { + event.preventDefault(); + var href = $(this).attr('href'); + var title = logoutTitle; + var confirm = logoutConfirm; + jConfirm( + confirm, + title, + function(b) { + if (b) window.location = href; + } + ); + }); + + }, + + //Прилипающая панель с кнопками + sticky_panel_refresh: function() { + + if ($("#saveBtn").length > 0) { + + $("#saveBtn").trigger('refresh'); + + var offset = $('#saveBtn').offset(); //Положение кнопок на странице + var width = $("div.content").width(); //ширина + + if ($(document).scrollTop() < offset.top - $(window).height()) { + $('.saveBtn').addClass('fixedBtn').css({ + "width": width - 20 + }); + } else { + $('.saveBtn').removeClass('fixedBtn').removeAttr('style'); + } + } + + }, + + //Прилипающая панель с кнопками + sticky_panel: function() { + + if ($("#saveBtn").length > 0) { + + var offset = $('#saveBtn').offset(); //Положение кнопок на странице + var width = $("div.content").width(); //ширина + + if ($(document).scrollTop() < offset.top - $(window).height()) { + $('.saveBtn').addClass('fixedBtn').css({ + "width": width - 20 + }); + } + + $(window).scroll(function() { + + var offset = $('#saveBtn').offset(); //Положение кнопок на странице + var scroll_top = $(document).scrollTop(); //высота прокрученной области + var window_height = $(window).height(); //высота окна браузера + var width = $("div.content").width(); //ширина + + if (scroll_top < offset.top - window_height) { + $('.saveBtn').addClass('fixedBtn').css({ + "width": width - 20 + }); + } else { + $('.saveBtn').removeClass('fixedBtn').removeAttr('style'); + } + }); + + $(window).on( + 'resize', + function() { + $(window).resize(function() { + var width = $("div.content").width(); //ширина + $('.saveBtn').css({ + "width": width - 20 + }); + }); + } + ); + + } + + }, + + //Custom single file input + customInput: function() { + $("input[type=file].input_file").nicefileinput({ + label: 'Выбрать...' + }); + }, + + // jQuery UI Dialog + modalDialog: function() { + $('a.openDialog').on('click', function(event) { + event.preventDefault(); + var idDialog = ($(this).attr('data-dialog')) ? $(this).attr('data-dialog') : ''; + var ajaxDialog = $('').appendTo('body'); + var dialogTitle = ($(this).attr('data-title')) ? $(this).attr('data-title') : 'Modal'; + var dialogModal = ($(this).attr('data-modal')) ? $(this).attr('data-modal') : false; + var dialogHref = ($(this).attr('href')) ? $(this).attr('href') : 'index.php'; + var dialogWidth = ($(this).attr('data-width')) ? $(this).attr('data-width') : undefined; + var dialogHeight = ($(this).attr('data-height')) ? $(this).attr('data-height') : undefined; + var dialogTemplate = ($(this).attr('data-template')) ? $(this).attr('data-template') : '&onlycontent=1'; + + if (typeof dialogWidth == 'undefined' || dialogWidth == '') var dialogWidth = $(window).width() * 0.9; + if (typeof dialogHeight == 'undefined' || dialogHeight == '') var dialogHeight = $(window).height() * 0.8; + + ajaxDialog.dialog({ + autoOpen: false, + modal: dialogModal, + dialogClass: 'fixed-dialog', + close: function(event, ui) { + $(this).dialog('destroy').remove(); + } + }); + + $('#' + ajaxDialog.attr('id')).load(dialogHref + dialogTemplate, function() { + ajaxDialog.dialog("option", "title", dialogTitle); + if (typeof(dialogWidth) !== "undefined") { + ajaxDialog.dialog("option", "width", dialogWidth); + ajaxDialog.dialog("option", "height", dialogHeight); + } + ajaxDialog.dialog("open"); + }); + return false; + }); + }, + + //функция-аналог trim в php + trim: function() { + + if (!String.prototype.trim) { + String.prototype.trim = function() { + return this.replace(/^\s+|\s+$/g, ''); + }; + } + }, + + //Tooltip + tooltip: function() { + $('body').addTipsy(); + }, + + // Fancybox + fancy_box: function() { + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.8; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.7; + $("a.fancy").fancybox({ + padding: 0, + margin: '30px', + autoScale: true, + speedIn: 100, + speedOut: 100, + overlayOpacity: 0.5, + overlayColor: "#000", + centerOnScroll: true, + width: width, + height: height + }); + }, + + // Fancybox + fancy_frame: function() { + if (typeof width == 'undefined' || width == '') var width = screen.width * 0.8; + if (typeof height == 'undefined' || height == '') var height = screen.height * 0.7; + $("a.iframe").fancybox({ + padding: 0, + margin: 0, + width: width, + height: height, + autoScale: true, + speedIn: 100, + speedOut: 100, + overlayOpacity: 0.5, + overlayColor: "#000", + centerOnScroll: true + }); + }, + + select_form: function() { + setTimeout(function() { + $(".mainForm select").styler({ + selectVisibleOptions: 5, + selectSearch: false + }); + + $(".mainForm select").trigger('refresh'); + }, 100); + }, + + collapsible_select: function () { + $('.head.closed').on('click', function(){ + AveAdmin.select_form(); + }); + }, + + // Преобразование форм + main_form: function() { + $(".mainForm").jqTransform({ + imgPath: "../images" + }); + }, + + // Placeholder for all browsers + place_holder: function() { + $('input[placeholder], textarea[placeholder]').placeholder(); + }, + + // A transactions + a_actions: function() { + $('.actions a').hover(function() { + $(this).animate({ + opacity: 1.0 + }, 100); + }, function() { + $(this).animate({ + opacity: 0.5 + }, 100); + }); + }, + + // DropDown menu + drop_down: function() { + $(".dropdown").on("mouseenter mouseleave", function(event) { + var ul = $(this).children("ul"); + ul.stop(true, true); + if (event.type === "mouseenter") { + ul.slideToggle(10); + } else { + ul.hide(10); + } + }); + } + +}; + +$(document).keydown(function(event) { + + var numberOfOptions = $("#rubric_id > option").length; + var selectedIndex = $("#rubric_id option:selected").val(); + + switch (event.keyCode) { + case 38: // UP Key + if (selectedIndex > 0) { + $("#rubric_id").val(parseInt($("#rubric_id option:selected").val()) - 1); + } + break; + case 40: // DOWN Key + if (selectedIndex < numberOfOptions - 1) { + $("#rubric_id").val(parseInt($("#rubric_id option:selected").val()) + 1); + } + break; + } + +}); + +$(document).ready(function() { + AveAdmin.initialize(); +}); \ No newline at end of file diff --git a/admin/templates/js/rle.js b/admin/templates/js/rle.js new file mode 100644 index 0000000..60ef9fd --- /dev/null +++ b/admin/templates/js/rle.js @@ -0,0 +1,127 @@ +$().ready(function() { + + // отдельный файловый менеджер + $('#finder').elfinder({ + url : ave_path+'lib/redactor/elfinder/php/connector.php', + lang : 'ru', + height : 500, + title : 'Файловый менеджер' + }).elfinder('instance'); + + + // диалог выбора изображений + $('.dialog_images').click(function() { + var id = $(this).attr("rel"); + $('
    ').dialogelfinder({ + url : ave_path+'lib/redactor/elfinder/php/connector.php', + lang : 'ru', + width : 1100, + height: 600, + modal : true, + title : 'Файловый менеджер', + getFileCallback : function(files, fm) { + $("#image__"+id).val('/'+files['url'].slice(1)); + $("#images_feld_"+id).html(""); + $("#preview__"+id).attr("src", "../index.php?mode=t&thumb="+files['url']); + }, + commandsOptions : { + getfile : { + oncomplete : 'destroy', + folders : false + } + } + }) + }); + + $('#elFinder a').hover( + function () { + $('#elFinder a').animate({ + 'background-position' : '0 -45px' + }, 300); + }, + function () { + $('#elFinder a').delay(400).animate({ + 'background-position' : '0 0' + }, 300); + } + ); + $('#elRTE a').delay(800).animate({'background-position' : '0 0'}, 300); + + // нормальный редактор + var opt = { + cssClass : 'el-rte', + toolbar : 'maxi', + lang : 'ru', + allowTextNodes : 'true', + height : 500, + cssfiles : [ave_path+'lib/redactor/elrte/css/elrte-inner.css'], + fmOpen : function(callback) { + $('
    ').dialogelfinder({ + url : ave_path+'lib/redactor/elfinder/php/connector.php', + lang : 'ru', + width : 1100, + height : 500, + title : 'Файловый менеджер', + commandsOptions : { + getfile : { + onlyURL : true, + multiple : false, + folders : false, + oncomplete : 'destroy' + } + }, + getFileCallback: callback + }) + } + }; + + $('.maxi-editor').elrte(opt); + + // нормальный редактор + var opt = { + cssClass : 'el-rte', + toolbars : { + medium : ['format', 'save', 'copypaste', 'undoredo', 'style', 'alignment', 'lists', 'links', 'images', 'fullscreen'] + }, + toolbar : 'medium', + lang : 'ru', + allowTextNodes : 'true', + height : 500, + cssfiles : [ave_path+'lib/redactor/elrte/css/elrte-inner.css'], + fmOpen : function(callback) { + $('
    ').dialogelfinder({ + url : ave_path+'lib/redactor/elfinder/php/connector.php', + lang : 'ru', + width : 1100, + height : 500, + title : 'Файловый менеджер', + commandsOptions : { + getfile : { + onlyURL : true, + multiple : false, + folders : false, + oncomplete : 'destroy' + } + }, + getFileCallback: callback + }) + } + }; + + $('.medium-editor').elrte(opt); + + // упрощенный редактор + var opts = { + cssClass : 'el-rte', + toolbars : { + small : ['format', 'copypaste', 'undoredo', 'alignment', 'lists', 'links'] + }, + toolbar : 'small', + lang : 'ru', + allowTextNodes : 'true', + height : 250, + cssfiles : [ave_path+'lib/redactor/elrte/css/elrte-inner.css'] + }; + $('.small-editor').elrte(opts); + +}); diff --git a/admin/templates/login.tpl b/admin/templates/login.tpl new file mode 100644 index 0000000..309fe51 --- /dev/null +++ b/admin/templates/login.tpl @@ -0,0 +1,131 @@ + + + + + + + {#MAIN_LOGIN_TEXT#} + + + + + + + + + + + + + + + + + {include file='login_scripts.tpl'} + + + + + + + +
    + +
    +
    +
    {#MAIN_LOGIN_INTRO#}
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + {if $captcha} +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + {/if} +
    +
    + + +
    + +
    +
    +
    +
    + {if $error} +
    +
      +
    • {$error}
    • +
    +
    + {/if} +
    + + + + \ No newline at end of file diff --git a/admin/templates/login_scripts.tpl b/admin/templates/login_scripts.tpl new file mode 100644 index 0000000..be1c7e7 --- /dev/null +++ b/admin/templates/login_scripts.tpl @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/admin/templates/logs/404.tpl b/admin/templates/logs/404.tpl new file mode 100644 index 0000000..80ee4dc --- /dev/null +++ b/admin/templates/logs/404.tpl @@ -0,0 +1,92 @@ + + + +
    {#LOGS_404_SUB_TITLE#}
    + +
    +
    + {#LOGS_404_TIP#} +
    +
    + + + +
    + + + + + + + + + + + + + + + + {foreach from=$logs key=k item=log} + + + + + + + {/foreach} + +
    {#LOGS_404_ID#}{#LOGS_404_IP#}{#LOGS_404_DATE#}{#LOGS_404_ACTION#}
    {$k}{$log.log_ip}{$log.log_time|date_format:$TIME_FORMAT|pretty_date} + REQUEST_URI: {$log.log_request_uri|urldecode} +
    + Полная информация об ошибке + + +
    +
    + {if check_permission('logs_clear')}{/if} + +
    +
    \ No newline at end of file diff --git a/admin/templates/logs/logs.tpl b/admin/templates/logs/logs.tpl new file mode 100644 index 0000000..b30dddc --- /dev/null +++ b/admin/templates/logs/logs.tpl @@ -0,0 +1,85 @@ + + + +
    {#LOGS_SUB_TITLE#}
    + +
    +
    + {#LOGS_TIP#} +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + {foreach from=$logs key=k item=log} + + + + + + + + {/foreach} + +
    {#LOGS_ID#}{#LOGS_IP#}{#LOGS_USER#}{#LOGS_DATE#}{#LOGS_ACTION#}
    {$k}{$log.log_ip}{if check_permission('user_edit')}{$log.log_user_name}{else}{$log.log_user_name}{/if}{$log.log_time|date_format:$TIME_FORMAT|pretty_date} + {$log.log_text} +
    + url: {$log.log_url} +
    +
    + {if check_permission('logs_clear')} + + {/if} + +
    +
    \ No newline at end of file diff --git a/admin/templates/logs/nav.tpl b/admin/templates/logs/nav.tpl new file mode 100644 index 0000000..01fb58a --- /dev/null +++ b/admin/templates/logs/nav.tpl @@ -0,0 +1 @@ +
  • {#MAIN_LOGS#}
  • diff --git a/admin/templates/logs/sql.tpl b/admin/templates/logs/sql.tpl new file mode 100644 index 0000000..1b72d2e --- /dev/null +++ b/admin/templates/logs/sql.tpl @@ -0,0 +1,111 @@ + + + +
    {#LOGS_SQL_SUB_TITLE#}
    + +
    +
    + {#LOGS_SQL_TIP#} +
    +
    + + + +
    + + + + + + + + + + + + + + + + {foreach from=$logs key=key item=log} + + + + + + + {/foreach} + +
    {#LOGS_SQL_ID#}{#LOGS_SQL_IP#}{#LOGS_SQL_DATE#}{#LOGS_SQL_ACTION#}
    {$key}{$log.log_ip} + {$log.log_time|date_format:$TIME_FORMAT|pretty_date} +
    + {$log.log_user_name} +
    + ERROR: + {$log.log_text.sql_error} +
    + Полная информация об ошибке + + +
    + +
    + {if check_permission('logs_clear')} + + {/if} + +
    +
    \ No newline at end of file diff --git a/admin/templates/main.tpl b/admin/templates/main.tpl new file mode 100644 index 0000000..f1e92ef --- /dev/null +++ b/admin/templates/main.tpl @@ -0,0 +1,300 @@ + + + + + + + + {#MAIN_PAGE_TITLE#} - {*#SUB_TITLE#*} ({$smarty.session.user_name|escape}) + + + + + + + + + + + + + + + + + + + + + {include file='scripts.tpl'} + + + + + + + + + + +
    + +
    + + +
    +
    +
    +
    + {if $user_avatar} + {$smarty.session.user_name|escape} + {else} + + {/if} + {#MAIN_USER_ONLINE#} {$smarty.session.user_name|escape} +
    +
    + +
    +
    +
    +
    +
    + + + + + +
    + + +
    + {**} + + +
    + + +
    + {$content} +
    + +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/admin/templates/modules/modules.tpl b/admin/templates/modules/modules.tpl new file mode 100644 index 0000000..f3c2ae6 --- /dev/null +++ b/admin/templates/modules/modules.tpl @@ -0,0 +1,234 @@ +{if check_permission('modules_admin')} + +{/if} + +
    {#MODULES_SUB_TITLE#}
    + +
    +
    + {#MODULES_TIP#} +
    +
    + +{if isset($errors)} +
      + {foreach from=$errors item=message} +
    • {$message}
    • + {/foreach} +
    +{/if} + + + +
    + + +
    +
    + +{if check_permission('modules_system')} +
    +{/if} + +{if $installed_modules} + + + + + + + + + {if check_permission('modules_system')} + + {/if} + + + +{foreach from=$installed_modules item=module} + {if check_permission('modules_view')} + + + + + + + + + + + + {if check_permission('modules_system')} + + + + + + {/if} + + {/if} + {/foreach} + + {if check_permission('modules_system')} + + + + {/if} + + +
    ?{#MODULES_NAME#}{#MODULES_TEMPLATE#}{#MODULES_SYSTEM_TAG#}{#MODULES_VERSION#}{#MODULES_ACTIONS#}
    + + + {if check_permission('modules_admin')} + {if $module.ModuleAdminEdit && $module.status && $module.permission} + {$module.ModuleName} + {if (isset($module.ModuleTagLink) && $module.ModuleTagLink != "")} +
    {$module.ModuleTagLink} + {/if} + {else} + {$module.ModuleName} + {/if} + {else if check_permission('modules_view')} + {$module.ModuleName} + {/if} +
    + {if $module.template} + {assign var=module_id value=$module.id} + {if $module.status && $module.permission} + {html_options name=Template[$module_id] options=$all_templates selected=$module.template style="width: 200px"} + {else} + {html_options name=Template[$module_id] options=$all_templates selected=$module.template style="width: 200px" disabled="disabled"} + {/if} + {else} +   + {/if} + {if $module.ModuleTag != ""}{/if}{$module.ModuleVersion|escape|default:''} + {if $module.status} + + {else} + + {/if} + + {if $module.status} + + {else} + + {/if} + + {if $module.need_update} + + {else} + + {/if} +
    + {if check_permission('modules_system')} +
    + {/if} + +{else} + + + + + + + +
    +
      +
    • {#MODULES_NO_INSTALL#}
    • +
    +
    +{/if} + +
    + + +
    +
    +
    \ No newline at end of file diff --git a/admin/templates/modules/nav.tpl b/admin/templates/modules/nav.tpl new file mode 100644 index 0000000..6ff3757 --- /dev/null +++ b/admin/templates/modules/nav.tpl @@ -0,0 +1 @@ +
  • {#MAIN_NAVI_MODULES#}
  • diff --git a/admin/templates/navi/navi.tpl b/admin/templates/navi/navi.tpl new file mode 100644 index 0000000..6d395b6 --- /dev/null +++ b/admin/templates/navi/navi.tpl @@ -0,0 +1,55 @@ +{if check_permission('document_view')} + {include file='documents/nav.tpl'} +{/if} + +{if check_permission('rubric_view')} + {include file='rubs/nav.tpl'} +{/if} + +{if check_permission('request_view')} + {include file='request/nav.tpl'} +{/if} + +{if check_permission('navigation_view')} + {include file='navigation/nav.tpl'} +{/if} + +{if check_permission('blocks_view')} + {include file='blocks/nav.tpl'} +{/if} + +{if check_permission('sysblocks_view')} + {include file='sysblocks/nav.tpl'} +{/if} + +{if check_permission('template_view')} + {include file='templates/nav.tpl'} +{/if} + +{if check_permission('mediapool_finder')} + {include file='finder/nav.tpl'} +{/if} + +{if check_permission('modules_view')} + {include file='modules/nav.tpl'} +{/if} + +{if check_permission('user_view')} + {include file='user/nav.tpl'} +{/if} + +{if check_permission('group_view')} + {include file='groups/nav.tpl'} +{/if} + +{if check_permission('gen_settings')} + {include file='settings/nav.tpl'} +{/if} + +{if check_permission('db_actions')} + {include file='dbactions/nav.tpl'} +{/if} + +{if check_permission('logs_view')} + {include file='logs/nav.tpl'} +{/if} diff --git a/admin/templates/navi/navi_top.tpl b/admin/templates/navi/navi_top.tpl new file mode 100644 index 0000000..c9eaf05 --- /dev/null +++ b/admin/templates/navi/navi_top.tpl @@ -0,0 +1,55 @@ +{if check_permission('document_view')} + {include file='documents/nav_top.tpl'} +{/if} + +{if check_permission('rubric_view')} + {include file='rubs/nav.tpl'} +{/if} + +{if check_permission('request_view')} + {include file='request/nav.tpl'} +{/if} + +{if check_permission('navigation_view')} + {include file='navigation/nav.tpl'} +{/if} + +{if check_permission('blocks_view')} + {include file='blocks/nav.tpl'} +{/if} + +{if check_permission('sysblocks_view')} + {include file='sysblocks/nav.tpl'} +{/if} + +{if check_permission('template_view')} + {include file='templates/nav.tpl'} +{/if} + +{if check_permission('mediapool_finder')} + {include file='finder/nav.tpl'} +{/if} + +{if check_permission('modules_view')} + {include file='modules/nav.tpl'} +{/if} + +{if check_permission('user_view')} + {include file='user/nav.tpl'} +{/if} + +{if check_permission('group_view')} + {include file='groups/nav.tpl'} +{/if} + +{if check_permission('gen_settings')} + {include file='settings/nav.tpl'} +{/if} + +{if check_permission('db_actions')} + {include file='dbactions/nav.tpl'} +{/if} + +{if check_permission('logs_view')} + {include file='logs/nav.tpl'} +{/if} diff --git a/admin/templates/navigation/item.tpl b/admin/templates/navigation/item.tpl new file mode 100644 index 0000000..ea190a7 --- /dev/null +++ b/admin/templates/navigation/item.tpl @@ -0,0 +1,48 @@ +
    + + +
    + +
    + +
    + {if $item.document_title} + {$item.document_title|escape} (ID: {$item.document_id|escape}) + {else} + {#NAVI_NOLINK_DOC#} + {/if} +
    + +
    + {if $item.alias} + {if $item.status == 1} + + {else} + + {/if} + {else} + {if $item.status == 1} + + {else} + + {/if} + {/if} +
    + +
    + + +
    +
    + + {if $smarty.request.sub == 'new'} + + {/if} \ No newline at end of file diff --git a/admin/templates/navigation/item_edit.tpl b/admin/templates/navigation/item_edit.tpl new file mode 100644 index 0000000..b2a5688 --- /dev/null +++ b/admin/templates/navigation/item_edit.tpl @@ -0,0 +1,191 @@ +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {#NAVI_LINK_TITLE#}
    +
    + +
    +
    {#NAVI_LINK_TO_DOCUMENT#}
    +
    + +
    +
    {#NAVI_LINKED_DOC#}
    + {if $item->document_id} + {$item->document_title|escape} (ID: {$item->document_id|escape}) + {else} + {#NAVI_NO_LINK#} + {/if} +
    {#NAVI_LINK_FILEDOC#}
    +
    + +   + +
    +
    {#NAVI_LINK_SOLUT#}
    +
    + +
    +
    {#NAVI_LINK_IMAGE#}
    +
    +   +
    +
    STYLE
    +
    + +
    +
    CLASSID
    +
    + +
    +
    +
    + +
    +
    {#NAVI_TARGET_WINDOW#}
    + +
    +
    + +
    +
    +
    + + {if $smarty.request.sub == 'edit'} + + + {/if} + {if $smarty.request.pop} + + {/if} +
    +
    +
    +
    + \ No newline at end of file diff --git a/admin/templates/navigation/item_new.tpl b/admin/templates/navigation/item_new.tpl new file mode 100644 index 0000000..c46bc48 --- /dev/null +++ b/admin/templates/navigation/item_new.tpl @@ -0,0 +1,206 @@ +
    +
    + + + + + + + + + + + + + + + + + + + {if $items} + + + + + + + + + + + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {#NAVI_LINK_TITLE#}
    +
    + +
    +
    Добавить после:
    +
    + +
    +
    {#NAVI_LINK_TO_DOCUMENT#}
    +
    + +
    +
    {#NAVI_LINKED_DOC#}
    + {#NAVI_NO_LINK#} +
    {#NAVI_LINK_FILEDOC#}
    +
    + +   + +
    +
    {#NAVI_LINK_SOLUT#}
    +
    + +
    +
    {#NAVI_LINK_IMAGE#}
    +
    +   +
    +
    STYLE
    +
    + +
    +
    CLASSID
    +
    + +
    +
    +
    + +
    +
    {#NAVI_TARGET_WINDOW#}
    + +
    +
    + +
    +
    +
    + + + + +
    +
    +
    +
    + \ No newline at end of file diff --git a/admin/templates/navigation/items.tpl b/admin/templates/navigation/items.tpl new file mode 100644 index 0000000..a4635a6 --- /dev/null +++ b/admin/templates/navigation/items.tpl @@ -0,0 +1,264 @@ +
    +
    {#NAVI_SUB_TITLE2#}
    +
    + + + +
    +
    +
    Структура
    + + +
    + + + +
    + {if $items} + {include file="$nestable_tpl" items=$items} + {else} +
      + {/if} +
      +
      + + \ No newline at end of file diff --git a/admin/templates/navigation/list.tpl b/admin/templates/navigation/list.tpl new file mode 100644 index 0000000..9aaf09d --- /dev/null +++ b/admin/templates/navigation/list.tpl @@ -0,0 +1,214 @@ + + + +
      +
      {#NAVI_SUB_TITLE#}
      +
      + +
      +
      + {#NAVI_TIP_TEMPLATE#} +
      +
      + + + + +
      + + +
      +
      +
      + + + + + + + + + + + {foreach from=$navigations item=item} + + + + + + + + + + {/foreach} + +
      {#NAVI_ID#}{#NAVI_NAME#}{#NAVI_SYSTEM_TAG#}{#NAVI_ACTIONS#}
      {$item->navigation_id} + + {if check_permission('navigation_edit')} + {$item->title|escape:html|stripslashes} + {else} + {$item->navigation_title|escape:html|stripslashes} + {/if} + + +
      + + + + +
      +
      + {if check_permission('navigation_edit')} + + {else} + + {/if} + + {if check_permission('navigation_edit')} + + {else} + + {/if} + + {if check_permission('navigation_edit')} + + {else} + + {/if} + + {if $item->navigation_id == 1} + + {else} + {if check_permission('navigation_edit')} + + {else} + + {/if} + {/if} +
      +
      + +
      + {if check_permission('navigation_edit')} + + {/if} +
      +
      +
      + +{literal} + +{/literal} \ No newline at end of file diff --git a/admin/templates/navigation/nav.tpl b/admin/templates/navigation/nav.tpl new file mode 100644 index 0000000..8815c00 --- /dev/null +++ b/admin/templates/navigation/nav.tpl @@ -0,0 +1 @@ +
    1. {#MAIN_NAVIGATION#}
    2. \ No newline at end of file diff --git a/admin/templates/navigation/nestable.tpl b/admin/templates/navigation/nestable.tpl new file mode 100644 index 0000000..470428e --- /dev/null +++ b/admin/templates/navigation/nestable.tpl @@ -0,0 +1,52 @@ + {if $items} +
        + {foreach from=$items key=key item=item} +
      1. +
        +
        + + +
        + {if $item.alias|escape == '/'} + + {else} + + {/if} +
        + +
        + {if $item.document_title} + {$item.document_title|escape} (ID: {$item.document_id|escape}) + {else} + {#NAVI_NOLINK_DOC#} + {/if} +
        + +
        + {if $item.alias} + {if $item.status == 1} + + {else} + + {/if} + {else} + {if $item.status == 1} + + {else} + + {/if} + {/if} +
        + +
        + + +
        +
        + {include file="$nestable_tpl" items=$item.children level=$level+1} +
      2. + {/foreach} +
      + {/if} diff --git a/admin/templates/navigation/select.tpl b/admin/templates/navigation/select.tpl new file mode 100644 index 0000000..749976b --- /dev/null +++ b/admin/templates/navigation/select.tpl @@ -0,0 +1,12 @@ +{if $items} + {foreach from=$items item=item} + {$item.level} + + {include file="$select_tpl" items=$item.children} + {/foreach} +{/if} \ No newline at end of file diff --git a/admin/templates/navigation/template.tpl b/admin/templates/navigation/template.tpl new file mode 100644 index 0000000..884d9e2 --- /dev/null +++ b/admin/templates/navigation/template.tpl @@ -0,0 +1,748 @@ + + +{if $smarty.request.action == 'new'} +
      +
      {#NAVI_SUB_TITLE4#}
      +
      +{else} +
      +
      {#NAVI_SUB_TITLE3#}
      +
      +{/if} + +
      +
      {#NAVI_TIP_TEMPLATE2#}
      +
      + + + + +{literal} + +{/literal} + +{if $smarty.request.action != 'new'} + +{/if} + +{include file="$codemirror_connect"} + +{include file="$codemirror_editor" conn_id="_1_1" textarea_id='level1_tpl' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} +{include file="$codemirror_editor" conn_id="_1_2" textarea_id='level1' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} +{include file="$codemirror_editor" conn_id="_1_3" textarea_id='level1_active' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} + +{include file="$codemirror_editor" conn_id="_2_1" textarea_id='level2_tpl' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} +{include file="$codemirror_editor" conn_id="_2_2" textarea_id='level2' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} +{include file="$codemirror_editor" conn_id="_2_3" textarea_id='level2_active' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} + +{include file="$codemirror_editor" conn_id="_3_1" textarea_id='level3_tpl' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} +{include file="$codemirror_editor" conn_id="_3_2" textarea_id='level3' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} +{include file="$codemirror_editor" conn_id="_3_3" textarea_id='level3_active' ctrls='$("#navigation_template").ajaxSubmit(sett_options);' height=200} diff --git a/admin/templates/navigation/tree.tpl b/admin/templates/navigation/tree.tpl new file mode 100644 index 0000000..10b6564 --- /dev/null +++ b/admin/templates/navigation/tree.tpl @@ -0,0 +1,12 @@ +{if $document->document_linked_navi_id} + {assign var="navigation_item_selected" value=$document->document_linked_navi_id scope="global"} +{/if} + + diff --git a/admin/templates/navigation/tree_docform.tpl b/admin/templates/navigation/tree_docform.tpl new file mode 100644 index 0000000..c5da958 --- /dev/null +++ b/admin/templates/navigation/tree_docform.tpl @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/admin/templates/noperm.tpl b/admin/templates/noperm.tpl new file mode 100644 index 0000000..20b4bdd --- /dev/null +++ b/admin/templates/noperm.tpl @@ -0,0 +1,19 @@ + + + + + + {#SUB_TITLE#} ({$smarty.session.user_name|escape}) + + + + + + + + + + +

      Извините, но Вы не имеете доступа к данному разделу!

      + + \ No newline at end of file diff --git a/admin/templates/onlycontent.tpl b/admin/templates/onlycontent.tpl new file mode 100644 index 0000000..ce0fc1b --- /dev/null +++ b/admin/templates/onlycontent.tpl @@ -0,0 +1 @@ +{$content} \ No newline at end of file diff --git a/admin/templates/pop.tpl b/admin/templates/pop.tpl new file mode 100644 index 0000000..db1816c --- /dev/null +++ b/admin/templates/pop.tpl @@ -0,0 +1,67 @@ + + + + + + + + {#MAIN_PAGE_TITLE#} - {*#SUB_TITLE#*} ({$smarty.session.user_name|escape}) + + + + + + + + + + + + + + + + + + + + {include file='scripts.tpl'} + + + + + + + + + + + + +
      + + +
      + {$content} +
      + +
      +
      + + + + + + + + \ No newline at end of file diff --git a/admin/templates/request/change.tpl b/admin/templates/request/change.tpl new file mode 100644 index 0000000..6b10084 --- /dev/null +++ b/admin/templates/request/change.tpl @@ -0,0 +1,39 @@ +{if $smarty.request.sub == ''} +
      + +   + + +
      +{else} + {foreach from=$fields_list item=field_group} + + {foreach from=$field_group.fields item=field} + {if $field_id == $field.Id} + + {/if} + {/foreach} + + {/foreach} +{/if} diff --git a/admin/templates/request/cond_list.tpl b/admin/templates/request/cond_list.tpl new file mode 100644 index 0000000..f4ebfef --- /dev/null +++ b/admin/templates/request/cond_list.tpl @@ -0,0 +1,127 @@ +
      + + + + + + + + + + + + + + + + + + + + + + {if $conditions} + + {foreach name=cond from=$conditions item=condition} + + + + + + + + + + + + + + {/foreach} + + {else} + + + + {/if} + +
      {#REQUEST_FROM_FILED#}{#REQUEST_OPERATOR#}{#REQUEST_CONDITION_JOIN#}{#REQUEST_VALUE#}
      condition_status ==1}checked{/if} class="toprightDir float" /> + {foreach from=$fields_list item=field_group} + + {foreach from=$field_group.fields item=field} + {if $condition->condition_field_id == $field.Id} + + {/if} + {/foreach} + + {/foreach} + + + + +
      +
        +
      • {#REQUEST_COND_MESSAGE#}
      • +
      +
      + + {if $conditions} +
      + + + {#REQUEST_OR#} +   + {if $smarty.request.pop} + + {/if} +
      +
      + {/if} +
      + + {if $conditions} + + {/if} diff --git a/admin/templates/request/conditions.tpl b/admin/templates/request/conditions.tpl new file mode 100644 index 0000000..359e300 --- /dev/null +++ b/admin/templates/request/conditions.tpl @@ -0,0 +1,423 @@ + + +
      +
      {#REQUEST_CONDITIONS#}
      +
      + +
      +
      + {#REQUEST_CONDITION_TIP#} +
      +
      + + + +
      + +
      + +
      +
      {#REQUEST_NEW_CONDITION#}
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#REQUEST_FROM_FILED#}{#REQUEST_OPERATOR#}{#REQUEST_CONDITION_JOIN#}{#REQUEST_VALUE#}
      + + + + + + +
      +
      + +
      +
      +
      +
      + +
      +
      +
      {#REQUEST_CONDITION#}
      + {if !$smarty.request.pop} + + {/if} +
      + +
      + + + + + + + + + + + + + + + + + + + + + + {if $conditions} + + {foreach name=cond from=$conditions item=condition} + + + + + + + + + + + + + {/foreach} + + {else} + + + + {/if} + +
      {#REQUEST_FROM_FILED#}{#REQUEST_OPERATOR#}{#REQUEST_CONDITION_JOIN#}{#REQUEST_VALUE#}
      condition_status ==1}checked{/if} class="toprightDir float" /> + + {foreach from=$fields_list item=field_group} + + {foreach from=$field_group.fields item=field} + {if $condition->condition_field_id == $field.Id} + + {/if} + {/foreach} + + {/foreach} + + + + + +
      +
        +
      • {#REQUEST_COND_MESSAGE#}
      • +
      +
      + {if $conditions} +
      + + + {#REQUEST_OR#} +   + {if $smarty.request.pop} + + {/if} +
      +
      + {/if} + +
      + +
      +
      + + + + diff --git a/admin/templates/request/form.tpl b/admin/templates/request/form.tpl new file mode 100644 index 0000000..e96856c --- /dev/null +++ b/admin/templates/request/form.tpl @@ -0,0 +1,746 @@ + + +{if $smarty.request.action=='edit'} +
      +
      {#REQUEST_EDIT2#}
      + +
      +
      +
      {#REQUEST_EDIT_TIP#}
      +
      +{else} +
      +
      {#REQUEST_NEW#}
      +
      +
      +
      {#REQUEST_NEW_TIP#}
      +
      +{/if} + + + + +{if $errors} +
        + {foreach from=$errors item=e} +
      • + {assign var=message value=$e} + • {$message}
        +
      • + {/foreach} +
      +{/if} + +{if !check_permission('request_php')} +
        +
      • + {#REQUEST_REPORT_ERR_PHP#} +
      • +
      +{/if} + + +{if $smarty.request.Id == ''} + {assign var=iframe value='no'} +{/if} + +{if $smarty.request.action == 'new' && $smarty.request.rubric_id == ''} + {assign var=dis value='disabled'} +{/if} + +{if $smarty.request.action=='new' && $smarty.request.rubric_id==''} +
        +
      • + {#REQUEST_PLEASE_SELECT#} +
      • +
      +{/if} + +
      + + + +
      + +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#REQUEST_HEADER_SELF#}
      {#REQUEST_NAME2#}
      +
      + [?] {#REQUEST_ALIAS#}: +
      +
      +
      +   + + + + +
      +
      {#REQUEST_CACHE#}{#REQUEST_CACHE_ELEMENTS#}request_cache_elements}checked="checked"{/if}/>
      {#REQUEST_SELECT_RUBRIK#} + + +
      {#REQUEST_DESCRIPTION#}
      {#REQUEST_INTERNAL_INFO#}
      {#REQUEST_CONDITION#} + {if $iframe == 'no'} + + {/if} + {if $iframe != 'no'} + {#REQUEST_BUTTON_COND#} + {/if} +
      {#REQUEST_HEADER_NAME#}{#REQUEST_HEADER_PARAMETR#}{#REQUEST_HEADER_NAME#}{#REQUEST_HEADER_PARAMETR#}
      {#REQUEST_HIDE_CURRENT#}request_hide_current}checked="checked"{/if}/>{#REQUEST_ONLY_OWNER#}request_only_owner}checked="checked"{/if}/>
      {#REQUEST_SORT_BY_NAT#} + + {#REQUEST_SORT_BY#} + +
      {#REQUEST_ASC_DESC#} + + {#REQUEST_DOC_PER_PAGE#} + +
      {#REQUEST_PAGINATION#}
      {#REQUEST_SHOW_NAVI#}request_show_pagination=='1'} checked="checked"{/if} />{#REQUEST_NAVI_TPL#} + +
      {#REQUEST_USE_QUERY#}request_use_query == '1'} checked="checked"{/if} />
      {#REQUEST_OTHER#}
      {#REQUEST_USE_LANG#}request_lang == '1'} checked="checked"{/if} />
      {#REQUEST_SHOW_STAT#}request_show_statistic == '1'} checked="checked"{/if} />{#REQUEST_SHOW_SQL#}request_show_sql == '1'} checked="checked"{/if} />
      {#REQUEST_HEADER_EXTERNAL#}
      {#REQUEST_EXTERNAL#}request_external == '1'} checked="checked"{/if} />{#REQUEST_ONLY_AJAX#}request_ajax == '1'} checked="checked"{/if} />
      +
      + +
      + + + + + +
      + +
      + +
      +
      + {if $smarty.request.action=='edit'} + + {else} + + {/if} + {#REQUEST_OR#} + {if $smarty.request.action=='edit'} + + {else} + + {/if} + {#REQUEST_CANCEL#} +
      +
      + +
      + +
      + +
      + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" conn_id="" textarea_id='request_template_main' ctrls='$("#RequestTpl").ajaxSubmit(sett_options);' height=480} +{include file="$codemirror_editor" conn_id="2" textarea_id='request_template_item' ctrls='$("#RequestTpl").ajaxSubmit(sett_options);' height=440} + +{literal} + +{/literal} + +{if $smarty.request.action !='new' && $smarty.request.rubric_id !=''} + +{/if} + diff --git a/admin/templates/request/list.tpl b/admin/templates/request/list.tpl new file mode 100644 index 0000000..317ae9a --- /dev/null +++ b/admin/templates/request/list.tpl @@ -0,0 +1,270 @@ + + +
      {#REQUEST_TITLE#}
      + +
      +
      + {#REQUEST_TIP#} +
      +
      + + + +
      + + +
      +
      +
      + + {if $items} + + + + + + + + + + + + {foreach from=$items item=item} + + + + + + + + + + + + + + + + + + + + {/foreach} + {else} + + + + {/if} + +
      {#REQUEST_ID#}{#REQUEST_NAME#}{#REQUEST_AUTHOR#}{#REQUEST_DATE_CREATE#}{#REQUEST_SYSTEM_TAG#}{#REQUEST_ACTIONS#}
      {$item->Id} + {if check_permission('request_edit')} + + {$item->request_title|escape} + + {else} + {$item->request_title|escape} + {/if} + {if $item->request_description != ''} +
      + {$item->request_description|escape|default:#REQUEST_NO_DESCRIPTION#} + {/if} +
      {$item->request_author|escape} + {$item->request_created|date_format:$TIME_FORMAT|pretty_date} + +
      + + + + +
      +
      + {if check_permission('request_edit')} + + {else} + + {/if} + + {if check_permission('request_edit')} + + {else} + + {/if} + + {if check_permission('request_edit')} + + {else} + + {/if} + + {if check_permission('request_edit')} + + {else} + + {/if} +
      +
        +
      • {#REQUEST_NO_REQUST#}
      • +
      +
      +
      + +
      + {if check_permission('request_edit')} + + {/if} +
      + +
      +
      + +{literal} + +{/literal} + +{if $page_nav} + +{/if} \ No newline at end of file diff --git a/admin/templates/request/nav.tpl b/admin/templates/request/nav.tpl new file mode 100644 index 0000000..7754227 --- /dev/null +++ b/admin/templates/request/nav.tpl @@ -0,0 +1 @@ +
    3. {#MAIN_QUERIES#}
    4. \ No newline at end of file diff --git a/admin/templates/rubs/alias.tpl b/admin/templates/rubs/alias.tpl new file mode 100644 index 0000000..c26fee9 --- /dev/null +++ b/admin/templates/rubs/alias.tpl @@ -0,0 +1,92 @@ +
      + +{if $errors} +
        + {foreach from=$errors item=error}
      • {#RUBRIK_ALIAS_ERROR#} {$error}
      • {/foreach} +
      +{/if} + +
      +
      {#RUBRIK_ALIAS_HEAD_T#}
      +
      + + + + +
      +
      +
      +
      {#RUBRIK_ALIAS_ALIAS#}
      +
      + + + + + + + + + + + + + +
      {#RUBRIK_ALIAS_NAME#} +
      + +
      +
      + +
      + +
      +
      + + +
      + diff --git a/admin/templates/rubs/change.tpl b/admin/templates/rubs/change.tpl new file mode 100644 index 0000000..65bc498 --- /dev/null +++ b/admin/templates/rubs/change.tpl @@ -0,0 +1,23 @@ +{if $smarty.request.action == 'change'} +
      +
      + +   + +
      + + +
      +{else} +
      + {section name=field loop=$fields} + {if $rf.rubric_field_type == $fields[field].id}{$fields[field].name}{/if} + {/section} +
      +{/if} diff --git a/admin/templates/rubs/code.tpl b/admin/templates/rubs/code.tpl new file mode 100644 index 0000000..494a604 --- /dev/null +++ b/admin/templates/rubs/code.tpl @@ -0,0 +1,135 @@ + + +
      +
      {#RUBRIK_EDIT_CODE_T#}
      +
      + + + +{if check_permission('rubric_edit') && check_permission('rubric_code')} +
      +
      +
      +
      {#RUBRIK_START_CODE#}
      +
      +
      + + + + + + + + + + + + +
      {#RUBRIK_START_CODE#}
      +
      + +
      +
      +
      +
      +
      +
      +
      {#RUBRIK_CODE#}
      + +
      + + + + + + + + + + + + + + + + +
      {#RUBRIK_CODE_START#}{#RUBRIK_CODE_END#}
      +
      + +
      +
      +
      + +
      +
      +
      +
      + +   + +
      +
      +
      +
      +{/if} + + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" conn_id="rsc" textarea_id='rubric_start_code' ctrls='$("#code").ajaxSubmit(sett_options);' height=300} +{include file="$codemirror_editor" conn_id="rcs" textarea_id='rubric_code_start' ctrls='$("#code").ajaxSubmit(sett_options);' height=300} +{include file="$codemirror_editor" conn_id="rce" textarea_id='rubric_code_end' ctrls='$("#code").ajaxSubmit(sett_options);' height=300} + + \ No newline at end of file diff --git a/admin/templates/rubs/field_template.tpl b/admin/templates/rubs/field_template.tpl new file mode 100644 index 0000000..9f6a230 --- /dev/null +++ b/admin/templates/rubs/field_template.tpl @@ -0,0 +1,263 @@ + + +{if $errors} +
        + {foreach from=$errors item=error}
      • {#RUBRIK_ALIAS_ERROR#} {$error}
      • {/foreach} +
      +{/if} + +
      + +
      +
      {#RUBRIK_FIELD_DEFAULT#}
      + + + + + + +
      +
      + +
      +
      +
      + +
      + + + + + + + + + + + + + +
      {#RUBRIK_FILED_TEMPLATE_DESCR#}
      +
      + +
      +
      + |  + DIV |  + OL |  + UL |  + LI |  + P |  + B |  + I |  + SPAN |  + BR +  | +
      +
      + +
      +
      {#RUBRIK_FILED_TEMPLATE_F#}
      + + + + + + + + + + + + + + + + + + + + + + +
      + {#RUBRIK_FIELDS_TPL#} + + {#RUBRIK_REQUEST_TPL#} +
      +
      + +
      +
      +
      + +
      +
      + |  + [tag:parametr:XXX] |  + [tag:X000x000:[tag:parametr:XXX]] |  + [tag:path] |  + [tag:docid] |  + +
      + |  + [tag:if_empty] [/tag:if_empty] |  + [tag:if_notempty] [/tag:if_notempty] +  | +  | +
      + |  + DIV |  + OL |  + UL |  + LI |  + P |  + B |  + I |  + H1 |  + H2 |  + H3 |  + H4 |  + H5 |  + A |  + IMG |  + SPAN |  + PRE |  + BR |  + TAB +  | +
      + |  + [tag:parametr:XXX] |  + [tag:X000x000:[tag:parametr:XXX]] |  + [tag:path] |  + [tag:docid] |  + +
      + |  + [tag:if_empty] [/tag:if_empty] |  + [tag:if_notempty] [/tag:if_notempty] +  | +  | +
      + |  + DIV |  + OL |  + UL |  + LI |  + P |  + B |  + I |  + H1 |  + H2 |  + H3 |  + H4 |  + H5 |  + A |  + IMG |  + SPAN |  + PRE |  + BR |  + TAB +  | +
      + +   + +   + {#RUBRIK_BUTTON_TPL_CLOSE#} +
      + + + +
      +
      + + + +{include file="$codemirror_editor" conn_id="rftd" textarea_id='rubric_field_description' ctrls='$(".SaveEditFieldTemplate").trigger("click");' height=80} +{include file="$codemirror_editor" conn_id="rft" textarea_id='rubric_field_template' ctrls='$(".SaveEditFieldTemplate").trigger("click");' height=130} +{include file="$codemirror_editor" conn_id="rftr" textarea_id='rubric_field_template_request' ctrls='$(".SaveEditFieldTemplate").trigger("click");' height=130} \ No newline at end of file diff --git a/admin/templates/rubs/fields.tpl b/admin/templates/rubs/fields.tpl new file mode 100644 index 0000000..50ed23c --- /dev/null +++ b/admin/templates/rubs/fields.tpl @@ -0,0 +1,186 @@ +{if $fields_list} +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$fields_list item=field_group} + + + {if $groups_count > 1} + + + + {/if} + + {foreach from=$field_group.fields item=field} + + + + + + + + + + + + + + {/foreach} + + {/foreach} +
      +
      + +
      +
      [?][?][?]{#RUBRIK_ID#}{#RUBRIK_FIELD_ALIAS#}{#RUBRIK_FIELD_NAME#}{#RUBRIK_FIELD_TYPE#}{#RUBRIK_FIELD_GROUP#}
      {if $field_group.group_title}{$field_group.group_title}{else}{#RUBRIK_FIELD_G_UNKNOW#}{/if}
      + + + + + + + + + + {$field.Id} + +   + ... + +
      + +
      +
      +
      + {assign var="unknow" value="true"} + + {section name=field loop=$fields} + {if $field.rubric_field_type == $fields[field].id} + {assign var="unknow" value=""} + {$fields[field].name} + {/if} + {/section} + + {if $unknow} + {#RUBRIK_FIELD_UNKNOW#} + {/if} + + {assign var="unknow" value=""} +
      +
      +
      + {assign var="unknow_group" value="true"} + {foreach from=$fields_groups item=group} + {if $field.rubric_field_group == $group->Id} + {assign var="unknow_group" value=""} + {$group->group_title} + {/if} + {/foreach} + + {if $unknow_group} + {#RUBRIK_FIELD_G_UNKNOW#} + {/if} +
      +
      + +
      + + +
      +
      + + +   + +   + {#RUBRIK_BUTTON_TEMPL#} +
      +
      + + +
      + +{else} + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + +
      +
      [?][?][?]{#RUBRIK_ID#}{#RUBRIK_FIELD_ALIAS#}{#RUBRIK_FIELD_NAME#}{#RUBRIK_FIELD_TYPE#}{#RUBRIK_FIELD_GROUP#}
      +
        +
      • {#RUBRIK_NO_FIELDS#}
      • +
      +
      +
      + +{/if} diff --git a/admin/templates/rubs/fields_groups.tpl b/admin/templates/rubs/fields_groups.tpl new file mode 100644 index 0000000..806a68b --- /dev/null +++ b/admin/templates/rubs/fields_groups.tpl @@ -0,0 +1,182 @@ + + +
      +
      {#RUBRIK_FIELDS_GROUPS#}
      +
      + + + +{if $groups} + +
      + +
      + +
      +
      {#RUBRIK_FIELDS_GROUPS#}
      +
      + {#RUBRIK_EDIT_TEMPLATE#} +   + {#RUBRIK_EDIT#} +   + {if check_permission('rubric_code')} + {#RUBRIK_EDIT_CODE#} + {/if} +
      +
      + +
      + + + + + + + + + + + + + + + + + {foreach from=$groups item=group} + = 2} data-id="group_{$group->Id}" class="group_tbody"{/if}> + + + + + + {/foreach} + +
      ID[?]{#RUBRIC_F_GROUP_TITLE#}
      + {$group->Id} + + + + + + +
      +
      +
      + +
      +
      +
      +
      +
      + +{else} + +
      + +
      +
      {#RUBRIK_FIELDS_TITLE#}
      +
      + {#RUBRIK_EDIT_TEMPLATE#} +   + {#RUBRIK_EDIT#} +   + {if check_permission('rubric_code')} + {#RUBRIK_EDIT_CODE#} + {/if} +
      +
      + +
      + + + + + + + + + + + + + + + + + + +
      +
        +
      • {#RUBRIC_NO_GROUPS#}
      • +
      +
      + +
      +
      + +{/if} + +{* Новое Группа *} +
      + +
      +
      {#RUBRIK_NEW_GROUP#}
      +
      + +
      +
      + + + + + + + + + + + + +
      {#RUBRIC_F_GROUP_TITLE#}
      +
      + +
      +
      +
      + +
      +
      +
      +
      + + + diff --git a/admin/templates/rubs/fields_list.tpl b/admin/templates/rubs/fields_list.tpl new file mode 100644 index 0000000..e6118a1 --- /dev/null +++ b/admin/templates/rubs/fields_list.tpl @@ -0,0 +1,779 @@ + +
      +
      {#RUBRIK_EDIT_FIELDS#}
      +
      +{if !$rub_fields} +
      +
      {#RUBRIK_NO_FIELDS#}
      +
      +{else} +
      +
      {#RUBRIK_FIELDS_INFO#}
      +
      +{/if} + + +
      +
      +
      +
      {#RUBRIK_DESCRIPTION#}
      +
      + + + + +
      +
      + +
      +
      +
      + + +
      +
      +
      + +{if $fields_list} + +
      +
      + +
      +
      {#RUBRIK_FIELDS_TITLE#}
      +
      + {#RUBRIK_EDIT_TEMPLATE#} +   + {#RUBRIK_EDIT_FIELDS_GROUPS#} +   + {if check_permission('rubric_code')} + {#RUBRIK_EDIT_CODE#} + {/if} + +
      +
      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$fields_list item=field_group} + + {if $groups_count > 1} + + + + {/if} + + {foreach from=$field_group.fields item=field} + + + + + + + + + + + + + + {/foreach} + + {/foreach} +
      +
      + +
      +
      [?][?][?]{#RUBRIK_ID#}{#RUBRIK_FIELD_ALIAS#}{#RUBRIK_FIELD_NAME#}{#RUBRIK_FIELD_TYPE#}{#RUBRIK_FIELD_GROUP#}
      {if $field_group.group_title}{$field_group.group_title}{else}{#RUBRIK_FIELD_G_UNKNOW#}{/if}
      + + + + + + + + + + {$field.Id} + +   + ... + +
      + +
      +
      +
      + {assign var="unknow" value="true"} + + {section name=field loop=$fields} + {if $field.rubric_field_type == $fields[field].id} + {assign var="unknow" value=""} + {$fields[field].name} + {/if} + {/section} + + {if $unknow} + {#RUBRIK_FIELD_UNKNOW#} + {/if} + + {assign var="unknow" value=""} +
      +
      +
      + {assign var="unknow_group" value="true"} + {foreach from=$fields_groups item=group} + {if $field.rubric_field_group == $group->Id} + {assign var="unknow_group" value=""} + {$group->group_title} + {/if} + {/foreach} + + {if $unknow_group} + {#RUBRIK_FIELD_G_UNKNOW#} + {/if} +
      +
      + +
      + + +
      +
      + + +   + +   + {#RUBRIK_BUTTON_TEMPL#} +
      +
      +
      +
      +
      + +{else} + +
      +
      +
      +
      {#RUBRIK_FIELDS_TITLE#}
      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      + +
      +
      [?][?][?]{#RUBRIK_ID#}{#RUBRIK_FIELD_ALIAS#}{#RUBRIK_FIELD_NAME#}{#RUBRIK_FIELD_TYPE#}{#RUBRIK_FIELD_GROUP#}
      +
        +
      • {#RUBRIK_NO_FIELDS#}
      • +
      +
      +
      +
      +
      +{/if} + +{* Новое поле *} +
      +
      +
      {#RUBRIK_NEW_FIELD#}
      +
      +
      +
      {#RUBRIK_NEW_FIEL_TITLE#}
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      [?][?]{#RUBRIK_FIELD_NAME#}{#RUBRIK_FIELD_TYPE#}{#RUBRIK_FIELD_GROUP#}{#RUBRIK_FIELD_DEFAULT#}
      +
      + +
      +
      + + + + +
      + +
      +
      +
      + +
      +
      +
      +
      + + +{* Связать рубрику *} +
      +
      +
      {#RUBRIK_LINK#}
      +
      +
      +
      + + + + + + + + + +
      +
      {#RUBRIK_LINK_DESC#}
      +
      +
      + {foreach from=$rubs item=rub} + {if $rub->Id != $smarty.request.Id} +
      + Id, $rubric->rubric_linked_rubric)}checked="checked"{/if} name="rubric_linked[]" value="{$rub->Id}" /> + +
      + {/if} + {/foreach} +
      +
      +
      + + +
      +
      +
      +
      + +{if check_permission('rubric_edit') && check_permission('rubric_perms')} +
      +
      +
      {#RUBRIK_SET_PERMISSION#}
      +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$groups item=group} + {assign var=doall value=$group->doall} + + + + + + + + + + + {/foreach} + +
      {#RUBRIK_USER_GROUP#} + {#RUBRIK_DOC_READ#} [?] + + {#RUBRIK_ALL_PERMISSION#} [?] + + {#RUBRIK_CREATE_DOC#} [?] + + {#RUBRIK_CREATE_DOC_NOW#} [?] + + {#RUBRIK_EDIT_OWN#} [?] + + {#RUBRIK_EDIT_OTHER#} [?] + + {#RUBRIK_EDIT_DELREV#} [?] +
      {$group->user_group_name|escape:html} permissions) || in_array('alles', $group->permissions)} class="yellow"{/if}> + {if $group->doall_h==1} + + + {else} + permissions) || in_array('alles', $group->permissions)} checked="checked"{/if} /> + {/if} + permissions)} class="yellow"{/if}> + {if $group->doall_h==1} + + + {else} + permissions)} checked="checked"{/if}{if $group->user_group==2} disabled="disabled"{/if} /> + {/if} + permissions) || in_array('alles', $group->permissions)} class="yellow"{/if}> + + {if $group->doall_h==1} + + + {else} + permissions) || in_array('alles', $group->permissions)} checked="checked"{/if}{if $group->user_group==2} disabled="disabled"{/if} /> + {/if} + permissions) || in_array('alles', $group->permissions)} class="yellow"{/if}> + + {if $group->doall_h==1} + + + {else} + permissions) || in_array('alles', $group->permissions)} checked="checked"{/if}{if $group->user_group==2} disabled="disabled"{/if} /> + {/if} + permissions) || in_array('alles', $group->permissions)} class="yellow"{/if}> + {if $group->doall_h==1} + + + {else} + permissions) || in_array('alles', $group->permissions)} checked="checked"{/if}{if $group->user_group==2} disabled="disabled"{/if} /> + {/if} + permissions) || in_array('alles', $group->permissions)} class="yellow"{/if}> + {if $group->doall_h==1} + + {else} + permissions) || in_array('alles', $group->permissions)} checked="checked"{/if}{if $group->user_group==2} disabled="disabled"{/if} /> + {/if} + permissions) || in_array('alles', $group->permissions)} class="yellow"{/if}> + {if $group->doall_h==1} + + + {else} + permissions) || in_array('alles', $group->permissions)} checked="checked"{/if}{if $group->user_group==2} disabled="disabled"{/if} /> + {/if} +
      +
      + +   + +
      +
      +
      +
      +{/if} + +{include file="$codemirror_connect"} + + diff --git a/admin/templates/rubs/form.tpl b/admin/templates/rubs/form.tpl new file mode 100644 index 0000000..ce86b20 --- /dev/null +++ b/admin/templates/rubs/form.tpl @@ -0,0 +1,837 @@ +{if $smarty.request.action=='new'} +
      +
      {#RUBRIK_TEMPLATE_NEW#}
      +
      +{else} +
      +
      {#RUBRIK_TEMPLATE_EDIT#}
      +
      + {#RUBRIK_EDIT#} +   + {if check_permission('rubric_code')} + {#RUBRIK_EDIT_CODE#} + {/if} +
      +
      +{/if} + +
      +
      {#RUBRIK_TEMPLATE_TIP#}
      +
      + + + +{if $php_forbidden == 1} +
        +
      • {#RUBRIK_PHP_DENIDED#}
      • +
      +{/if} + +{if $errors} +{foreach from=$errors item=e} +{assign var=message value=$e} +
        +
      • {$message}
      • +
      +{/foreach} +{/if} + +
      + +
      + + + +
      + +
      + + {if !check_permission('rubric_php')} +
      +
        +
      • + {#RUBRIK_PHP_MESSAGE#} +
      • +
      +
      +
      + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#RUBRIK_TAGS#}{#RUBRIK_HTML_T#}
      + {#RUBRIK_IFELSE#} + + |  + [tag:lang:XX] +  |  + [tag:/lang] +  |  + [tag:if_notempty:fld:XXX] +  |  + [tag:if_empty:fld:XXX] +  |  + [tag:if:else] +  |  + [tag:/if] +  |  + {#RUBRIK_SAMPLE#} +  | +
      + [tag:docid] + + +
        +
      • + {#MAIN_CODEMIRROR_HELP#} +
      • +
      +
      + [tag:doc:XXX] +
      + [tag:alias] +
      + [tag:docdate] +
      + [tag:doctime] +
      + [tag:date:XXX] +
      + [tag:docauthor] +
      [tag:docauthoravatar:XXX]
      + [tag:docviews] +
      + [tag:title] +
      + [tag:path] +
      [tag:home]
      + [tag:mediapath] +
      + [tag:request:XXX] +
      + [tag:sysblock:XXX] +
      + [tag:teaser:XXX] +
      + [tag:breadcrumb] +
      + [tag:hide:X,X][/tag:hide] +
      [tag:X000x000:[tag:fld:YYY]]
      [tag:langfile:XXX]
      HTML Tags + |  + OL |  + UL |  + LI |  + P |  + B |  + I |  + H1 |  + H2 |  + H3 |  + H4 |  + H5 |  + DIV |  + A |  + IMG |  + SPAN |  + PRE |  + BR |  + TAB | +
      + + + + + + + + + + + + + + + + + + + + {foreach from=$fields_list item=field_group} + + {if $groups_count > 1} + + + + {/if} + + {foreach from=$field_group.fields item=field} + + + + + + + + + {/foreach} + + {/foreach} + + +
      {#RUBRIK_ID#}{#RUBRIK_FIELD_NAME#}{#RUBRIK_TAGS_ID#}{#RUBRIK_TAGS_ALIAS#}{#RUBRIK_FIELD_ALIAS#}{#RUBRIK_FIELD_TYPE#}
      {if $field_group.group_title}{$field_group.group_title}{else}{#RUBRIK_FIELD_G_UNKNOW#}{/if}
      + {$field.Id} + + {$field.rubric_field_title} + + [tag:fld:{$field.Id}] + + {if $field.rubric_field_alias} + [tag:fld:{$field.rubric_field_alias}] + {/if} + + {if $field.rubric_field_alias}{$field.rubric_field_alias}{/if} + + {section name=field_name loop=$field_array} + {if $field.rubric_field_type == $field_array[field_name].id}{$field_array[field_name].name}{/if} + {/section} +
      + +
      + +
      + + + + + + + + + + +
      + +
      + +
      +
      + + + {#RUBRIK_OR#} + +
      +
      + +
      + +
      + +
      + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" conn_id="" textarea_id='rubric_template' ctrls='$("#RubricTpl").ajaxSubmit(sett_options);' height=500} +{include file="$codemirror_editor" conn_id="2" textarea_id='rubric_header_template' ctrls='$("#RubricTpl").ajaxSubmit(sett_options);' height=420} +{include file="$codemirror_editor" conn_id="3" textarea_id='rubric_teaser_template' ctrls='$("#RubricTpl").ajaxSubmit(sett_options);' height=420} +{include file="$codemirror_editor" conn_id="4" textarea_id='rubric_admin_teaser_template' ctrls='$("#RubricTpl").ajaxSubmit(sett_options);' height=420} + + \ No newline at end of file diff --git a/admin/templates/rubs/groups.tpl b/admin/templates/rubs/groups.tpl new file mode 100644 index 0000000..2c8acb8 --- /dev/null +++ b/admin/templates/rubs/groups.tpl @@ -0,0 +1,26 @@ +{if $smarty.request.action == 'changegroup'} + +
      +
      + +   + +
      + + + +
      +{else} + + + +{/if} diff --git a/admin/templates/rubs/list.tpl b/admin/templates/rubs/list.tpl new file mode 100755 index 0000000..2e880dc --- /dev/null +++ b/admin/templates/rubs/list.tpl @@ -0,0 +1,332 @@ + + +
      +
      {#RUBRIK_SUB_TITLE#}
      +
      + +
      +
      {#RUBRIK_TIP#}
      +
      + + + +
      + +
      +
      +
      + {#RUBRIK_FORMAT#}
      + %d-%m-%Y - {#RUBRIK_FORMAT_TIME#}
      + %id - {#RUBRIK_FORMAT_ID#} +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$rubrics item=rubric} + + + + + + + + + + + + + + + + + + + {/foreach} + +
      {#RUBRIK_ID#}[?][?][?]{#RUBRIK_NAME#}{#RUBRIK_URL_PREFIX#}{#RUBRIK_TEMPLATE_OUT#} +
      + [?] +
      +
      {#RUBRIK_ACTION#}
      + {if $rubric->rubric_description} + [{$rubric->Id}] + {else} + {$rubric->Id} + {/if} + + {if check_permission('rubric_edit')} + + {else} + + {/if} + + {if check_permission('rubric_edit')} + rubric_meta_gen}checked="checked"{/if} /> + {else} + rubric_meta_gen}checked="checked"{/if} disabled="disabled" /> + {/if} + + {if check_permission('rubric_edit')} + rubric_alias_history}checked="checked"{/if} /> + {else} + rubric_alias_history}checked="checked"{/if} disabled="disabled" /> + {/if} + + {if check_permission('rubric_edit')} +
      + +
      + {else} + {$rubric->rubric_title|escape} + {/if} +
      + {if check_permission('rubric_edit')} +
      + +
      + {else} +
      + +
      + {/if} +
      + {if check_permission('rubric_edit')} + + {else} + + {/if} + {$rubric->doc_count} + {if check_permission('rubric_edit')} + rubric_docs_active == 1}checked="checked"{/if}> + {else} + rubric_docs_active == 1}checked="checked"{/if} disabled="disabled"> + {/if} + {$rubric->fld_count} + {if check_permission('rubric_edit')} + {$rubric->tmpls_count} + {else} + {$rubric->tmpls_count} + {/if} + + {if check_permission('rubric_edit')} + + {else} + + {/if} + + {if check_permission('rubric_edit')} + + {else} + + {/if} + + {if check_permission('rubric_edit') && check_permission('rubric_code')} + + {else} + + {/if} + + {if check_permission('rubric_edit')} + + {else} + + {/if} + + {if $rubric->Id != 1} + {if check_permission('rubric_edit')} + {if $rubric->doc_count==0} + + {else} + + {/if} + {else} + + {/if} + {else} + + {/if} +
      + {if check_permission('rubric_edit')} +
      + + {#RUBRIK_OR#} + +
      + {/if} +
      +
      + {if check_permission('rubric_edit')} + + {/if} +
      +
      +
      + + + + + +{if $page_nav} + +{/if} +
      +
      +
      diff --git a/admin/templates/rubs/multi.tpl b/admin/templates/rubs/multi.tpl new file mode 100644 index 0000000..8884026 --- /dev/null +++ b/admin/templates/rubs/multi.tpl @@ -0,0 +1,52 @@ +
      +
      {#RUBRIK_MULTIPLY2#}
      +
      {#RUBRIK_MULTIPLY_TIP#}
      + + + + +{if $errors} +
        + {foreach from=$errors item=error}
      • Ошибка: {$error}
      • {/foreach} +
      +{/if} + + +
      + +
      +
      {#RUBRIK_MULTIPLY2#}
      + + + + + + + + + + + + + + + + + + + +
      {#RUBRIK_NAME#}
      {#RUBRIK_URL_PREFIX#}
      + +
      + + +
      +
      \ No newline at end of file diff --git a/admin/templates/rubs/nav.tpl b/admin/templates/rubs/nav.tpl new file mode 100644 index 0000000..5938d17 --- /dev/null +++ b/admin/templates/rubs/nav.tpl @@ -0,0 +1 @@ +
    5. {#MAIN_RUBRIKS#}
    6. \ No newline at end of file diff --git a/admin/templates/rubs/rubnew.tpl b/admin/templates/rubs/rubnew.tpl new file mode 100644 index 0000000..9090d8c --- /dev/null +++ b/admin/templates/rubs/rubnew.tpl @@ -0,0 +1,55 @@ +
      {#RUBRIK_NEW#}
      +
      {#RUBRIK_NEW_TIP#}
      + + + + +{if $errors} +
        + {foreach from=$errors item=error}
      • Ошибка: {$error}
      • {/foreach} +
      +{/if} + +
      + +
      +
      {#RUBRIK_NEW#}
      + + + + + + + + + + + + + + + + + + + + +
      {#RUBRIK_NAME2#}
      {#RUBRIK_URL_PREFIX2#}
      {#RUBRIK_TEMPLATE_OUT2#} + +
      + +
      +
      \ No newline at end of file diff --git a/admin/templates/rubs/tmpls.tpl b/admin/templates/rubs/tmpls.tpl new file mode 100644 index 0000000..091ba25 --- /dev/null +++ b/admin/templates/rubs/tmpls.tpl @@ -0,0 +1,178 @@ + + +
      +
      {#RUBRIC_TMPLS_HEAD#}
      +
      + {#RUBRIK_EDIT_TEMPLATE#} +   + {#RUBRIK_EDIT#} +   + {if check_permission('rubric_code')} + {#RUBRIK_EDIT_CODE#} + {/if} +
      +
      + +
      +
      + {#RUBRIC_TMPLS_TIP#} +
      +
      + + + +
      + +
      +
      + + + + + + + + + + + + {if $templates} + + + + + + + + {if check_permission('rubric_edit')}{/if} + + + + + {foreach from=$templates item=template} + + + + + + + + + + + + {if check_permission('rubric_edit')} + + + + + + {/if} + + {/foreach} + {else} + + + + {/if} + +
      {#RUBRIC_TMPLS_ID#}{#RUBRIC_TMPLS_NAME#}{#RUBRIC_TMPLS_AUTHOR#}{#RUBRIC_TMPLS_DATE#}{#RUBRIC_TMPLS_ACTIONS#}
      {$template->id} + {if check_permission('rubric_edit')} + + {$template->title|escape} + + {else} + {$template->title|escape} + {/if} + {$template->author_id|escape} + {$template->created|date_format:$TIME_FORMAT|pretty_date} + + {$template->doc_count} + + + + + + {if check_permission('rubric_edit')} + {if $template->doc_count==0} + + {else} + + {/if} + {else} + + {/if} +
      +
        +
      • {#RUBRIC_TMPLS_NO_ITEMS#}
      • +
      +
      +
      + {if check_permission('rubric_edit')} + + {/if} +
      +
      +
      \ No newline at end of file diff --git a/admin/templates/rubs/tmpls_form.tpl b/admin/templates/rubs/tmpls_form.tpl new file mode 100644 index 0000000..d87728b --- /dev/null +++ b/admin/templates/rubs/tmpls_form.tpl @@ -0,0 +1,373 @@ +
      + {if $smarty.request.action !='tmpls_edit'} +
      {#RUBRIK_TEMPLATE_NEW#}
      + {else} +
      {#RUBRIK_TEMPLATE_EDIT#}
      + {/if} +
      + {#RUBRIC_TMPLS_BUTTON#} +   + {#RUBRIK_EDIT#} +   + {if check_permission('rubric_code')} + {#RUBRIK_EDIT_CODE#} + {/if} +
      +
      + +
      +
      {#RUBRIK_TEMPLATE_TIP#}
      +
      + + + +{if $php_forbidden == 1} +
        +
      • {#RUBRIK_PHP_DENIDED#}
      • +
      +{/if} + +{if $errors} +{foreach from=$errors item=e} +{assign var=message value=$e} +
        +
      • {$message}
      • +
      +{/foreach} +{/if} + +
      + +
      +
      +
      {#RUBRIC_TMPLS_NAME_FULL#}
      +
      + +
      + +
      + +
      +
      +
      +
      + +
      +
      +
      {#RUBRIK_HTML#}
      +
      + + {if !check_permission('rubric_php')} +
      +
        +
      • + {#RUBRIK_PHP_MESSAGE#} +
      • +
      +
      +
      + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#RUBRIK_TAGS#}{#RUBRIK_HTML_T#}
      + {#RUBRIK_IFELSE#} + + |  + [tag:lang:XX] +  |  + [tag:/lang] +  |  + [tag:if_notempty:fld:XXX] +  |  + [tag:if_empty:fld:XXX] +  |  + [tag:if:else] +  |  + [tag:/if] +  |  + {#RUBRIK_SAMPLE#} +  | +
      + [tag:docid] + + +
        +
      • + {#MAIN_CODEMIRROR_HELP#} +
      • +
      +
      + [tag:doc:XXX] +
      + [tag:alias] +
      + [tag:docdate] +
      + [tag:doctime] +
      + [tag:date:XXX] +
      + [tag:docauthor] +
      [tag:docauthoravatar:XXX]
      + [tag:docviews] +
      + [tag:title] +
      + [tag:path] +
      [tag:home]
      + [tag:mediapath] +
      + [tag:request:XXX] +
      + [tag:sysblock:XXX] +
      + [tag:teaser:XXX] +
      + [tag:breadcrumb] +
      + [tag:hide:X,X][/tag:hide] +
      [tag:X000x000:[tag:fld:YYY]]
      [tag:langfile:XXX]
      HTML Tags + |  + OL |  + UL |  + LI |  + P |  + B |  + I |  + H1 |  + H2 |  + H3 |  + H4 |  + H5 |  + DIV |  + A |  + IMG |  + SPAN |  + PRE |  + BR |  + TAB | +
      + + + + + + + + + + + + + + + + + + + + + {foreach from=$fields_list item=field_group} + + {if $groups_count > 1} + + + + {/if} + + {foreach from=$field_group.fields item=field} + + + + + + + + + {/foreach} + + {/foreach} + + +
      {#RUBRIK_ID#}{#RUBRIK_FIELD_NAME#}{#RUBRIK_TAGS_ID#}{#RUBRIK_TAGS_ALIAS#}{#RUBRIK_FIELD_ALIAS#}{#RUBRIK_FIELD_TYPE#}
      {if $field_group.group_title}{$field_group.group_title}{else}{#RUBRIK_FIELD_G_UNKNOW#}{/if}
      + {$field.Id} + + {$field.rubric_field_title} + + [tag:fld:{$field.Id}] + + {if $field.rubric_field_alias} + [tag:fld:{$field.rubric_field_alias}] + {/if} + + {if $field.rubric_field_alias}{$field.rubric_field_alias}{/if} + + {section name=field_name loop=$field_array} + {if $field.rubric_field_type == $field_array[field_name].id}{$field_array[field_name].name}{/if} + {/section} +
      + +
      + +
      +
      + + + {if $smarty.request.action == 'tmpls_edit'} + {#RUBRIK_OR#} + + {/if} +
      +
      + +
      + +
      + +
      + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" conn_id="" textarea_id='rubric_template' ctrls='$("#RubricTpl").ajaxSubmit(sett_options);' height=500} + +{if $smarty.request.action =='tmpls_edit'} + +{/if} \ No newline at end of file diff --git a/admin/templates/scripts.tpl b/admin/templates/scripts.tpl new file mode 100644 index 0000000..720c774 --- /dev/null +++ b/admin/templates/scripts.tpl @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/admin/templates/settings/nav.tpl b/admin/templates/settings/nav.tpl new file mode 100644 index 0000000..a23b432 --- /dev/null +++ b/admin/templates/settings/nav.tpl @@ -0,0 +1 @@ +
    7. {#MAIN_SETTINGS#}
    8. \ No newline at end of file diff --git a/admin/templates/settings/pagination_edit.tpl b/admin/templates/settings/pagination_edit.tpl new file mode 100644 index 0000000..d273507 --- /dev/null +++ b/admin/templates/settings/pagination_edit.tpl @@ -0,0 +1,249 @@ + + +
      +
      {#SETTINGS_PAGINATION#}
      +
      + +
      +
      + {#SETTINGS_SAVE_INFO#} +
      +
      + + + +
      +
      + {if check_permission('cache_clear')}{#MAIN_STAT_CLEAR_CACHE_FULL#}{/if} +   + {if check_permission('cache_thumb')}{#MAIN_STAT_CLEAR_THUMB#}{/if} +   + {if check_permission('document_revisions')}{#MAIN_STAT_CLEAR_REV#}{/if} +   + {if check_permission('gen_settings')}{#MAIN_STAT_CLEAR_COUNT#}{/if} +
      +
      + +{if $smarty.const.SYSTEM_CACHE_LIFETIME > 0} +
        +
      • {#SETTINGS_CACHE_LIFETIME#}
      • +
      +{/if} + +
      + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#SETTINGS_NAME#}{#SETTINGS_VALUE#}{#SETTINGS_NAME#}{#SETTINGS_VALUE#}
      + {#pagination_name#} + +
      + +
      +
      + {#pagination_navigation_box#} + +
      + +
      +
      + {#pagination_link_box#} + +
      + +
      +
      + {#pagination_active_link_box#} + +
      + +
      +
      + {#pagination_link_template#} + +
      + +
      +
      + {#pagination_link_active_template#} + +
      + +
      +
      + {#pagination_separator_box#} + +
      + +
      +
      + {#pagination_separator_label#} + +
      + +
      +
      + {#pagination_start_label#} + +
      + +
      +
      + {#pagination_end_label#} + +
      + +
      +
      + {#pagination_next_label#} + +
      + +
      +
      + {#pagination_prev_label#} + +
      + +
      +
      +
      +
      + {if isset($smarty.request.id) && $smarty.request.id > 0} + + {/if} + + + {if $smarty.request.action == 'edit_paginations'} + + {/if} +
      +
      +
      +
      + +{if $smarty.request.action != 'new_paginations'} + +{/if} + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" conn_id="1" textarea_id='pagination_box' ctrls='$("#paginations").ajaxSubmit(sett_options);' height='60'} +{include file="$codemirror_editor" conn_id="2" textarea_id='pagination_link_box' ctrls='$("#paginations").ajaxSubmit(sett_options);' height='40'} +{include file="$codemirror_editor" conn_id="3" textarea_id='pagination_active_link_box' ctrls='$("#paginations").ajaxSubmit(sett_options);' height='40'} +{include file="$codemirror_editor" conn_id="4" textarea_id='pagination_link_template' ctrls='$("#paginations").ajaxSubmit(sett_options);' height='60'} +{include file="$codemirror_editor" conn_id="5" textarea_id='pagination_link_active_template' ctrls='$("#paginations").ajaxSubmit(sett_options);' height='60'} \ No newline at end of file diff --git a/admin/templates/settings/settings_case.tpl b/admin/templates/settings/settings_case.tpl new file mode 100644 index 0000000..87c3828 --- /dev/null +++ b/admin/templates/settings/settings_case.tpl @@ -0,0 +1,148 @@ +
      {#SETTINGS_CASE_TITLE#}
      + +
      +
      + {#SETTINGS_SAVE_INFO#} +
      +
      + + + +
      +
      + {if check_permission('cache_clear')}{#MAIN_STAT_CLEAR_CACHE_FULL#}{/if} +   + {if check_permission('cache_thumb')}{#MAIN_STAT_CLEAR_THUMB#}{/if} +   + {if check_permission('document_revisions')}{#MAIN_STAT_CLEAR_REV#}{/if} +   + {if check_permission('gen_settings')}{#MAIN_STAT_CLEAR_COUNT#}{/if} +
      +
      + +
      +
      +
      + + + + +++ + + + + + + + + {foreach from=$CMS_CONFIG item=def key=_var} + + + + + {/foreach} + +
      {#SETTINGS_NAME#}
      {#SETTINGS_VALUE#}
      {$def.DESCR}
      {$_var}
      + {if $def.TYPE=="dropdown"} + + {/if} + {if $def.TYPE=="string"} + + {/if} + {if $def.TYPE=="integer"} + + {/if} + {if $def.TYPE=="bool"} + _tpl_vars['_var']) ? 'checked' : "");{/php} /> + _tpl_vars['_var']) ? '' : "checked");{/php} /> + {/if} +
      + +
      +
      +  {#SETTINGS_OR#}  +
      +
      + + +
      +
      + +
      + + \ No newline at end of file diff --git a/admin/templates/settings/settings_countries.tpl b/admin/templates/settings/settings_countries.tpl new file mode 100644 index 0000000..37569a0 --- /dev/null +++ b/admin/templates/settings/settings_countries.tpl @@ -0,0 +1,139 @@ +
      {#SETTINGS_COUNTRIES#}
      + +
      +
      + {#SETTINGS_COUNTRY_TIP#} +
      +
      + + + + +
      +
      + {if check_permission('cache_clear')}{#MAIN_STAT_CLEAR_CACHE_FULL#}{/if} +   + {if check_permission('cache_thumb')}{#MAIN_STAT_CLEAR_THUMB#}{/if} +   + {if check_permission('document_revisions')}{#MAIN_STAT_CLEAR_REV#}{/if} +   + {if check_permission('gen_settings')}{#MAIN_STAT_CLEAR_COUNT#}{/if} +
      +
      + +
      +
      +
      + + + + + + + + + + + {foreach from=$countries item=land name=l} + + + + + + + + {/foreach} + +
      {#SETTINGS_COUNTRY_NAME#}{#SETTINGS_ACTIVE#}{#SETTINGS_IN_EC#}
      + + + + + + + +
      + +
      +
      +  {#SETTINGS_OR#}  +
      +
      +
      +
      +
      + + +{if $page_nav} + +{/if} + +
      + + \ No newline at end of file diff --git a/admin/templates/settings/settings_lang.tpl b/admin/templates/settings/settings_lang.tpl new file mode 100644 index 0000000..80e905b --- /dev/null +++ b/admin/templates/settings/settings_lang.tpl @@ -0,0 +1,104 @@ +
      {#SETTINGS_LANG_EDIT#}
      + +
      +
      + {#SETTINGS_LANG_TITLE#} +
      +
      + + + +
      +
      + {if check_permission('cache_clear')}{#MAIN_STAT_CLEAR_CACHE_FULL#}{/if} +   + {if check_permission('cache_thumb')}{#MAIN_STAT_CLEAR_THUMB#}{/if} +   + {if check_permission('document_revisions')}{#MAIN_STAT_CLEAR_REV#}{/if} +   + {if check_permission('gen_settings')}{#MAIN_STAT_CLEAR_COUNT#}{/if} +
      +
      + +
      + + + + +++++++++++ + + + + + + + + + + + + + {foreach from=$language item=lang name=l} + + + + + + + + + + + + + {/foreach} + +
      {#SETTINGS_LANG_ID#}{#SETTINGS_LANG_FLAG#}{#SETTINGS_LANG_SYSTEM#}{#SETTINGS_LANG_PREFIX#}{#SETTINGS_LANG_NAME#}{#SETTINGS_LANG_DEFAULT#} {#SETTINGS_LANG_ACTION#}
      {$lang.Id}{$lang.lang_key}{$lang.lang_alias_pref}{$lang.lang_name}{if $lang.lang_default==1}{/if} + + + {if $lang.lang_default!=1} + {if $lang.lang_status==1} + + {else} + + {/if} + {else} + + {/if} + + {if $lang.lang_default!=1 && $lang.lang_status==1} + + {else} + + {/if} +
      + +
      + +
      + +
      \ No newline at end of file diff --git a/admin/templates/settings/settings_lang_edit.tpl b/admin/templates/settings/settings_lang_edit.tpl new file mode 100644 index 0000000..ef6cba1 --- /dev/null +++ b/admin/templates/settings/settings_lang_edit.tpl @@ -0,0 +1,52 @@ +
      + +
      {#SETTINGS_LANG_EDIT#}
      + +
      +
      + {#SETTINGS_LANG_TITLE#} +
      +
      + + + +
      + +
      + + + + + + + + + + + + + + + + + + + +
      {#SETTINGS_LANG_SYSTEM#}{#SETTINGS_LANG_PREFIX#}{#SETTINGS_LANG_NAME#}
      + + {if $smarty.request.Id==''} + + {else} + + {/if} +
      +
      +
      +
      \ No newline at end of file diff --git a/admin/templates/settings/settings_main.tpl b/admin/templates/settings/settings_main.tpl new file mode 100644 index 0000000..576bcb7 --- /dev/null +++ b/admin/templates/settings/settings_main.tpl @@ -0,0 +1,588 @@ +
      {#SETTINGS_MAIN_TITLE#}
      + +
      +
      + {#SETTINGS_SAVE_INFO#} +
      +
      + + + +{$message} + +
      +
      + {if check_permission('cache_clear')}{#MAIN_STAT_CLEAR_CACHE_FULL#}{/if} +   + {if check_permission('cache_thumb')}{#MAIN_STAT_CLEAR_THUMB#}{/if} +   + {if check_permission('document_revisions')}{#MAIN_STAT_CLEAR_REV#}{/if} +   + {if check_permission('gen_settings')}{#MAIN_STAT_CLEAR_COUNT#}{/if} +
      +
      + +{if $smarty.const.SYSTEM_CACHE_LIFETIME > 0} +
        +
      • {#SETTINGS_CACHE_LIFETIME#}
      • +
      +{/if} + +
      +
      + +
      + + + + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#SETTINGS_NAME#}
      {#SETTINGS_VALUE#}
      {#SETTINGS_SITE_NAME#}
      {#SETTINGS_SITE_COUNTRY#} +
      + +
      +
      {#SETTINGS_DATE_FORMAT#} +
      + +
      +
      {#SETTINGS_TIME_FORMAT#} +
      + +
      +
      {#SETTINGS_USE_DOCTIME#} +
      +   + +
      +
      {#SETTINGS_USE_EDITOR#} +
      +   +   +
      +
      {#SETTINGS_ERROR_PAGE#} +
      +     {#SETTINGS_PAGE_DEFAULT#} +
      +
      {#SETTINGS_TEXT_PERM#} +
      + +
      +
      {#SETTINGS_HIDDEN_TEXT#} +
      + +
      +
      +
      + +
      +
      {#SETTINGS_MAIN_MAIL#}
      + +++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#SETTINGS_NAME#}
      {#SETTINGS_VALUE#}
      {#SETTINGS_EMAIL_NAME#} +
      + +
      +
      {#SETTINGS_EMAIL_SENDER#} +
      + + +
      +
      {#SETTINGS_TEXT_EMAIL#}
      {#SETTINGS_TEXT_INFO#}
      +
      + +
      +
      {#SETTINGS_EMAIL_FOOTER#} +
      + +
      +
      {#SETTINGS_SYMBOL_BREAK#} +
      + + +
      +
      {#SETTINGS_MAIL_TRANSPORT#} +
      + +
      +
      {#SETTINGS_SMTP_SERVER#} +
      + +
      +
      {#SETTINGS_MAIL_PORT#} +
      + +
      +
      {#SETTINGS_SMTP_NAME#} +
      + +
      +
      {#SETTINGS_SMTP_PASS#} +
      + +
      +
      {#SETTINGS_SMTP_ENCRYPT#} +
      + +
      +
      {#SETTINGS_MAIL_PATH#} +
      + +
      +
      +
      + +
      +
      {#SETTINGS_MAIN_PAGENAVI#}
      + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#SETTINGS_NAME#}{#SETTINGS_VALUE#}{#SETTINGS_NAME#}{#SETTINGS_VALUE#}
      {#SETTINGS_NAVI_BOX#} +
      + +
      +
      {#SETTINGS_LINK_BOX#} +
      + +
      +
      {#SETTINGS_ACTIVE_LINK_BOX#} +
      + +
      +
      {#SETTINGS_TOTAL_BOX#} +
      + +
      +
      {#SETTINGS_PAGE_BEFORE#} +
      + +
      +
      {#SETTINGS_PAGE_SEPARATOR#} +
      + +
      +
      {#SETTINGS_PAGE_SEPAR#} +
      + +
      +
      {#SETTINGS_PAGE_START#} +
      + +
      +
      {#SETTINGS_PAGE_END#} +
      + +
      +
      {#SETTINGS_PAGE_NEXT#} +
      + +
      +
      {#SETTINGS_PAGE_PREV#} +
      + +
      +
      +
      + +
      +
      {#SETTINGS_MAIN_BREADCRUMBS#}
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#SETTINGS_NAME#}
      {#SETTINGS_VALUE#}
      {#SETTINGS_NAME#}
      {#SETTINGS_VALUE#}
      {#SETTINGS_BREAD_MAIN#} +
      +   + +
      +
      {#SETTINGS_BREAD_HOST#} +
      +   + +
      +
      {#SETTINGS_BREAD_BOX#} +
      + +
      +
      {#SETTINGS_BREAD_BOX_LINK#} +
      + +
      +
      {#SETTINGS_BREAD_LINK_TPL#} +
      + +
      +
      {#SETTINGS_BREAD_SELF_BOX#} +
      + +
      +
      {#SETTINGS_BREAD_BOX_LASTLINK#} +
      +   + +
      +
      {#SETTINGS_BREAD_SEPPARATOR#} +
      + +
      +
      {#SETTINGS_BREAD_SEPP_USE#} +
      +   + +
      +
      + +
      +
      +  {#SETTINGS_OR#}  +
      +
      + +
      +
      +
      + + + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" textarea_id='message_forbidden' ctrls='$("#settings").ajaxSubmit(sett_options);' height='150'} +{include file="$codemirror_editor" textarea_id='hidden_text' ctrls='$("#settings").ajaxSubmit(sett_options);' height='150'} \ No newline at end of file diff --git a/admin/templates/settings/settings_pagination.tpl b/admin/templates/settings/settings_pagination.tpl new file mode 100644 index 0000000..519b7ed --- /dev/null +++ b/admin/templates/settings/settings_pagination.tpl @@ -0,0 +1,87 @@ +
      +
      {#SETTINGS_PAGINATION#}
      +
      + +
      +
      + {#SETTINGS_SAVE_INFO#} +
      +
      + + + +
      +
      + {if check_permission('cache_clear')}{#MAIN_STAT_CLEAR_CACHE_FULL#}{/if} +   + {if check_permission('cache_thumb')}{#MAIN_STAT_CLEAR_THUMB#}{/if} +   + {if check_permission('document_revisions')}{#MAIN_STAT_CLEAR_REV#}{/if} +   + {if check_permission('gen_settings')}{#MAIN_STAT_CLEAR_COUNT#}{/if} +
      +
      + +{if $smarty.const.SYSTEM_CACHE_LIFETIME > 0} +
        +
      • {#SETTINGS_CACHE_LIFETIME#}
      • +
      +{/if} + +
      + + + + + + + + + + + + + + + + {if $items} + {foreach from=$items item=item} + + + + + + + {/foreach} + {/if} + +
      ID{#PAGINATION_NAME#}{#PAGINATION_ACTIONS#}
      + {$item->id} + + {$item->pagination_name} + + + + {if $item->id == 1} + + {else} + + {/if} +
      +
      \ No newline at end of file diff --git a/admin/templates/start.tpl b/admin/templates/start.tpl new file mode 100644 index 0000000..45e871e --- /dev/null +++ b/admin/templates/start.tpl @@ -0,0 +1,258 @@ +
      +
      {#MAIN_WELCOME#}
      +
      + +
      + {if $smarty.const.CHECK_VERSION} +
        + +
      + {/if} + {if $login_menu && $online_users > "1"} + + {/if} + +
      +
      +
      {#MAIN_START_DOC_TITLE#}
      +
      +
      +
      +
      + +
      +
      + + + + + + + + + + + + + + {foreach from=$doc_start item=item} + document_deleted==1}class="red"{/if}{if $item->document_status!=1}class="yellow"{/if}> + + + + + + {/foreach} +
      {#MAIN_START_DOC_ID#}{#MAIN_START_DOC_NAME#}{#MAIN_START_DOC_RUBRIC#}{#MAIN_START_DOC_DATE#}
      {$item->Id} +
      + {if $item->cantEdit==1} + {if $item->rubric_admin_teaser_template != ""} + {$item->rubric_admin_teaser_template} + {else} + + + {if $item->document_breadcrum_title != ""}{$item->document_breadcrum_title|stripslashes|escape}{elseif $item->document_title != ""}{$item->document_title|stripslashes|escape}{else}{#MAIN_DOC_SHOW3_TITLE#}{/if} + + +
      + {$item->document_alias} + {/if} + {else} + {if $item->document_breadcrum_title != ""}{$item->document_breadcrum_title|stripslashes|escape}{elseif $item->document_title != ""}{$item->document_title|stripslashes|escape}{else}{#MAIN_DOC_SHOW3_TITLE#}{/if} +
      + {$item->document_alias} + {/if} +
      +
      + {if check_permission('rubric_edit')} + {$item->rubric_title|escape:html} +
      + {#MAIN_START_DOC_AUTOR#}: {$item->document_author|escape} + {else} + {$item->rubric_title|escape:html} +
      + {#MAIN_START_DOC_AUTOR#}: {$item->document_author|escape} + {/if} +
      {$item->document_published|date_format:$TIME_FORMAT|pretty_date}
      +
      +
      +
      + +
      + +
      + + +
      +
      +
      {#MAIN_STAT_SYSTEM_INFO#}
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {$smarty.const.APP_NAME}{$smarty.const.APP_VERSION}
      {#MAIN_STAT_DOMEN#}{$domain}
      {#MAIN_STAT_PHP#}{$php_version}
      {#MAIN_STAT_MYSQL_VERSION#}{$mysql_version}
      {#MAIN_STAT_MYSQL#}{$mysql_size}
      {#MAIN_STAT_CACHE#}{#MAIN_STAT_CACHE_SHOW#}
      +
      + +
      + + +
      + + +
      +
      +
      {#MAIN_STAT#}
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + {if $cnts.modules_0} + + + + + {/if} + + + + + {if $cnts.users_0} + + + + + {/if} + +
      {#MAIN_STAT_DOCUMENTS#}{$cnts.documents}
      {#MAIN_STAT_RUBRICS#}{$cnts.rubrics}
      {#MAIN_STAT_QUERIES#}{$cnts.request}
      {#MAIN_STAT_TEMPLATES#}{$cnts.templates}
      {#MAIN_STAT_MODULES#}{$cnts.modules_0+$cnts.modules_1}
      {#MAIN_STAT_MODULES_OFF#}{$cnts.modules_0|default:0}
      {#MAIN_STAT_USERS#}{$cnts.users_0+$cnts.users_1}
      {#MAIN_STAT_USERS_WAIT#}{$cnts.users_0|default:0}
      +
      + +
      + + +
      + + +
      +
      +
      {#MAIN_LOGS#}
      +
      + + + + + + + + + + + + + + + + + +
      + {if check_permission('logs_view')} + {#MAIN_START_LOGS_LOG#} + {else} + {#MAIN_START_LOGS_LOG#} + {/if} + {$logs.logs}
      + {if check_permission('logs_view')} + {#MAIN_START_LOGS_404#} + {else} + {#MAIN_START_LOGS_404#} + {/if} + 0}class="cmsStatsAlert"{else}class="cmsStats"{/if}>{$logs.404}
      + {if check_permission('logs_view')} + {#MAIN_START_LOGS_SQL#} + {else} + {#MAIN_START_LOGS_SQL#} + {/if} + 0}class="cmsStatsAlert"{else}class="cmsStats"{/if}>{$logs.sql}
      +
      + +
      +
      +
      + {if check_permission('logs_view')} + + {/if} \ No newline at end of file diff --git a/admin/templates/sysblocks/form.tpl b/admin/templates/sysblocks/form.tpl new file mode 100644 index 0000000..afc4fe6 --- /dev/null +++ b/admin/templates/sysblocks/form.tpl @@ -0,0 +1,296 @@ + + +
      +
      {#SYSBLOCK_INSERT_H#}
      +
      + +
      +
      {#SYSBLOCK_INSERT#}
      +
      + + + +
      +
      +
      +
      {if $smarty.request.id != ''}{#SYSBLOCK_EDIT_H#}{else}{#SYSBLOCK_INSERT_H#}{/if}
      +
      + + + + + + + + + + + + + + + + + + + + + + + + {if $sysblock_external} + + + + {/if} +
      + {#SYSBLOCK_NAME#} + +
      + +
      +
      {#SYSBLOCK_DESCRIPTION#} + +
      +
      + [?] {#SYSBLOCK_ALIAS#}: +
      +
      +
      +   + + + + +
      +
      + + + + + + + +
      + +
      +
      + +
      +
      +
      {#SYSBLOCK_HTML#}
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#SYSBLOCK_TAGS#}{#SYSBLOCK_HTML#}
      + [tag:mediapath]
      {#SYSBLOCK_MEDIAPATH#}
      +
      + +
        +
      • + {#MAIN_CODEMIRROR_HELP#} +
      • +
      +
      + [tag:path]
      {#SYSBLOCK_PATH#}
      +
      + [tag:home]
      {#SYSBLOCK_HOME#}
      +
      + [tag:docid]
      {#SYSBLOCK_DOCID_INFO#}
      +
      + [tag:breadcrumb]
      {#SYSBLOCK_BREADCRUMB#}
      +
      {#SYSBLOCK_TAGS_2#} |  + OL +  |  + UL +  |  + LI +  |  + P +  |  + B +  |  + I +  |  + H1 +  |  + H2 +  |  + H3 +  |  + H4 +  |  + H5 +  |  + DIV +  |  + A +  |  + IMG +  |  + SPAN +  |  + PRE +  |  + BR +  |  + TAB +  |
      + +
      +
      + {if $smarty.request.id != ''} + + + {else} + + {/if} + + {#SYSBLOCK_OR#} + + {if $smarty.request.action=='edit'} + + {else} + + {/if} +
      +
      + +
      +
      + +{literal} + +{/literal} + +{if $smarty.request.action != 'new'} + +{/if} +{include file="$codemirror_connect"} +{include file="$codemirror_editor" textarea_id='sysblock_text' ctrls='$("#sysblock").ajaxSubmit(sett_options);' height='400'} \ No newline at end of file diff --git a/admin/templates/sysblocks/form_visual.tpl b/admin/templates/sysblocks/form_visual.tpl new file mode 100644 index 0000000..b85eda9 --- /dev/null +++ b/admin/templates/sysblocks/form_visual.tpl @@ -0,0 +1,248 @@ + + +{if $smarty.session.use_editor == 0} + +{/if} + +{if $smarty.session.use_editor == 1} + + + + + + + + + + + + + + +{/if} + +
      +
      {#SYSBLOCK_INSERT_H#}
      +
      + +
      +
      {#SYSBLOCK_INSERT#}
      +
      + + + +
      +
      +
      +
      {if $smarty.request.id != ''}{#SYSBLOCK_EDIT_H#}{else}{#SYSBLOCK_INSERT_H#}{/if}
      +
      + + + + + + + + + + + + + + + + + + + + + + + + {if $sysblock_external} + + + + {/if} +
      {#SYSBLOCK_NAME#} +
      + +
      +
      {#SYSBLOCK_DESCRIPTION#} + +
      +
      + [?] {#SYSBLOCK_ALIAS#}: +
      +
      +
      +   + + + + +
      +
      + + + + + + + +
      + +
      +
      +
      +
      +
      {#SYSBLOCK_HTML#}
      +
      + + + + + + +
      + {if $smarty.session.use_editor == 0} + {$sysblock_text} + {elseif $smarty.session.use_editor == 1} + + {/if} +
      + +
      +
      + {if $smarty.request.id != ''} + + + {else} + + {/if} +
      +
      + +
      +
      +{literal} + +{/literal} + +{if $smarty.request.action != 'new'} + +{/if} \ No newline at end of file diff --git a/admin/templates/sysblocks/list.tpl b/admin/templates/sysblocks/list.tpl new file mode 100644 index 0000000..b71f84e --- /dev/null +++ b/admin/templates/sysblocks/list.tpl @@ -0,0 +1,244 @@ + + +
      +
      {#SYSBLOCK_EDIT#}
      +
      + +
      +
      + {#SYSBLOCK_EDIT_TIP#} +
      +
      + + + + +
      + + +
      +
      + + + + + + + + + + + + + + + + {if $sys_blocks} + + + + + + + + + + + {if check_permission('sysblocks_edit')}{/if} + + + + + {foreach from=$sys_blocks item=sysblock} + + + + + + + + + + + + + + + {if check_permission('sysblocks_edit')} + + + + + + {/if} + + {/foreach} + {else} + + + + {/if} + +
      {#SYSBLOCK_ID#}[?][?][?]{#SYSBLOCK_NAME#}{#SYSBLOCK_AUTHOR#}{#SYSBLOCK_DATE#}{#SYSBLOCK_TAG#}{#SYSBLOCK_ACTIONS#}
      {$sysblock->id}{if $sysblock->sysblock_external}{else}{/if} + {if check_permission('sysblocks_edit')} + + {$sysblock->sysblock_name|escape} + + {if $sysblock->sysblock_description} +
      {$sysblock->sysblock_description|escape} + {/if} + {else} + {$sysblock->sysblock_name|escape} + {/if} +
      {$sysblock->sysblock_author_id|escape} + {$sysblock->sysblock_created|date_format:$TIME_FORMAT|pretty_date} + +
      + + + + +
      +
      + + + + + +
      +
        +
      • {#SYSBLOCK_NO_ITEMS#}
      • +
      +
      +
      + {if check_permission('sysblocks_edit')} + + {/if} +
      +
      +
      + +{literal} + +{/literal} \ No newline at end of file diff --git a/admin/templates/sysblocks/multi.tpl b/admin/templates/sysblocks/multi.tpl new file mode 100644 index 0000000..234ee72 --- /dev/null +++ b/admin/templates/sysblocks/multi.tpl @@ -0,0 +1,37 @@ +
      {#SYSBLOCK_COPY_TITLE#}
      + +
      +
      + {#SYSBLOCK_COPY_TIP2#} +
      +
      + + + + {foreach from=$errors item=e} + {assign var=message value=$e} +
        +
      • Ошибка: {$message}
      • +
      + {/foreach} + +
      +
      {#SYSBLOCK_COPY_TITLE#}
      +
      +
      + + +
       
      +
      + +
      +
      +
      diff --git a/admin/templates/sysblocks/nav.tpl b/admin/templates/sysblocks/nav.tpl new file mode 100644 index 0000000..7ba7135 --- /dev/null +++ b/admin/templates/sysblocks/nav.tpl @@ -0,0 +1 @@ +
    9. {#MAIN_SYSBLOCKS#}
    10. \ No newline at end of file diff --git a/admin/templates/templates/edit_css.tpl b/admin/templates/templates/edit_css.tpl new file mode 100644 index 0000000..2e065e2 --- /dev/null +++ b/admin/templates/templates/edit_css.tpl @@ -0,0 +1,89 @@ +
      {#TEMPLATES_CSS_EDITOR#}
      + +
      +
      + {#TEMPLATES_CSS_TITLE#} +
      +
      + + + +
      + +
      +
      {$smarty.request.name_file|escape}
      + +
      + +
      +
      + +
      + + {#TEMPLATES_OR#} + +
      +
      + +
      +
      + + + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" textarea_id='code_text' ctrls='$("#code_templ").ajaxSubmit(sett_options);' mode='text/css'} \ No newline at end of file diff --git a/admin/templates/templates/edit_js.tpl b/admin/templates/templates/edit_js.tpl new file mode 100644 index 0000000..80c73fe --- /dev/null +++ b/admin/templates/templates/edit_js.tpl @@ -0,0 +1,88 @@ +
      {#TEMPLATES_JS_TITLE#}
      + +
      +
      + {#TEMPLATES_JS_TITLE#} +
      +
      + + + +
      + +
      +
      {$smarty.request.name_file|escape}
      + +
      + +
      +
      + +
      + + {#TEMPLATES_OR#} + +
      +
      + +
      +
      + + +{include file="$codemirror_connect"} +{include file="$codemirror_editor" textarea_id='code_text' ctrls='$("#code_templ").ajaxSubmit(sett_options);' mode='text/javascript'} \ No newline at end of file diff --git a/admin/templates/templates/form.tpl b/admin/templates/templates/form.tpl new file mode 100644 index 0000000..ceb5460 --- /dev/null +++ b/admin/templates/templates/form.tpl @@ -0,0 +1,352 @@ +{if $smarty.request.action=='new'} +
      {#TEMPLATES_TITLE_NEW#}
      +
      {#TEMPLATES_WARNING2#}
      +{else} +
      {#TEMPLATES_TITLE_EDIT#}
      +
      {#TEMPLATES_WARNING1#}
      +{/if} + + + +{if $errors} +
      + +
        + +
      • + {foreach from=$errors item=e} + {assign var=message value=$e} + • {$message}
        + {/foreach} +
      • + +
      + +
      +{/if} + +
      + +
      +
      +
      {#TEMPLATES_TITLE_EDIT#}
      +
      + +
      + +
      + +
      +
      +
      +
      + + {if $php_forbidden==1} +
      +
        +
      • {#TEMPLATES_USE_PHP#}
      • +
      +
      + {/if} + +
      +
      +
      {#TEMPLATES_HTML#}
      +
      + {if !check_permission('template_php')} +
      +
        +
      • + {#TEMPLATES_REPORT_PHP_ERR#} +
      • +
      +
      +
      + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#TEMPLATES_TAGS#}{#TEMPLATES_HTML#}
      + [tag:theme:folder] + + +
        +
      • + {#MAIN_CODEMIRROR_HELP#} +
      • +
      +
      + [tag:language] +
      + [tag:sitename] +
      + [tag:rubheader] +
      + [tag:title] +
      + [tag:keywords] +
      + [tag:description] +
      + [tag:robots] +
      + [tag:canonical] +
      + [tag:path] +
      + [tag:mediapath] +
      + [tag:css:FFF:P],   + [tag:js:FFF:P] +
      + [tag:doc:XXX] +
      + [tag:langfile:XXX] +
      + [tag:maincontent] +
      + [tag:alias] +
      + [tag:domain] +
      + [tag:home] +
      + [tag:printlink] +
      + [tag:breadcrumb] +
      + [tag:teaser:XXX] +
      + [tag:sysblock:XXX] +
      + [tag:navigation:XXX] +
      + [tag:lang:XX][/tag:lang] +
      + [tag:if_print][/tag:if_print] +
      + [tag:if_notprint][/tag:if_notprint] +
      + [tag:version] +
      HTML Tags + |  + OL |  + UL |  + LI |  + P |  + B |  + I |  + H1 |  + H2 |  + H3 |  + H4 |  + H5 |  + DIV |  + A |  + IMG |  + SPAN |  + PRE |  + BR |  + TAB | +
      +
      +
      + {if $smarty.request.action == 'new'} + + {else} + + {/if} + {#TEMPLATES_OR#} + {if $smarty.request.action=='edit'} + + + {else} + + {/if} +
      +
      +
      +
      +{if $smarty.request.action != 'new'} + +{/if} + +{include file="$codemirror_connect"} + +{if $php_forbidden == 1} + {include file="$codemirror_editor" textarea_id='template_text' ctrls='$("#f_tpl").ajaxSubmit(sett_options);' height='720' readonly='true'} +{else} + {include file="$codemirror_editor" textarea_id='template_text' ctrls='$("#f_tpl").ajaxSubmit(sett_options);' height='720'} +{/if} \ No newline at end of file diff --git a/admin/templates/templates/nav.tpl b/admin/templates/templates/nav.tpl new file mode 100644 index 0000000..a298925 --- /dev/null +++ b/admin/templates/templates/nav.tpl @@ -0,0 +1 @@ +
    11. {#MAIN_TEMPLATES#}
    12. \ No newline at end of file diff --git a/admin/templates/templates/templates.tpl b/admin/templates/templates/templates.tpl new file mode 100644 index 0000000..3280fd8 --- /dev/null +++ b/admin/templates/templates/templates.tpl @@ -0,0 +1,261 @@ + + +
      {#TEMPLATES_SUB_TITLE#}
      + +
      +
      + {#TEMPLATES_TIP1#} +
      +
      + + + +
      + + +
      +
      + + + + + + + + + + + + + {foreach from=$items item=tpl} + + + + + + + + + + {/foreach} + +
      {#TEMPLATES_ID#}{#TEMPLATES_NAME#}{#TEMPLATES_AUTHOR#}{#TEMPLATES_DATE#}{#TEMPLATES_ACTION#}
      {$tpl->Id}{if check_permission('template_edit')}{$tpl->template_title|escape}{else}{$tpl->template_title|escape}{/if}{$tpl->template_author}{$tpl->template_created|date_format:$TIME_FORMAT|pretty_date} + {if check_permission('template_edit')} + + {else} + + {/if} + + {if check_permission('template_edit')} + + {else} + + {/if} + + {if $tpl->Id == 1} + + {else} + {if $tpl->can_deleted==1} + {if check_permission('template_edit')} + + {else} + + {/if} + {else} + + {/if} + {/if} +
      +
      + + {if check_permission('template_edit')} + + {/if} + + {if check_permission('template_edit')} + + + + {/if} + + {if check_permission('mediapool_finder')} + + {/if} + +
      + +
      +
      + + + + {if $page_nav} + + {/if} diff --git a/admin/templates/user/form.tpl b/admin/templates/user/form.tpl new file mode 100644 index 0000000..d1cb250 --- /dev/null +++ b/admin/templates/user/form.tpl @@ -0,0 +1,336 @@ +{if !$no_edit} + +{literal} + +{/literal} + +{if $smarty.request.action=='new'} +
      {#USER_NEW_TITLE#}
      +
      {#USER_NEW_TIP#}
      +{else} +
      {#USER_EDIT_TITLE#}
      +
      {#USER_EDIT_TIP#}
      +{/if} + + + + +{if $errors} +
        +
      • {#USER_ERRORS#}
        {foreach from=$errors item=error}• {$error}
        {/foreach}
      • +
      +{/if} + +
      + +{if $smarty.request.action=='edit'} + +{/if} + +
      + +
      +
      {#USER_EDIT_TITLE#}
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{if $is_forum==1 && $smarty.request.action=='edit'} + + + + + + + + + +{/if} + + + + + + +{if $is_shop==1} + + + + +{/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{assign var=u_group value=$row->user_group|lower|escape|stripslashes} + + + + + + + + + + + + + + + +{if $smarty.request.action=='edit'} + + + + + + + + + +{/if} + + +
      {#USER_LOGIN#}
      {#USER_FIRSTNAME#}
      {#USER_LASTNAME#}
      {#USER_EMAIL#}
      {#USER_PASSWORD#} {if $smarty.request.action=='edit'} ({#USER_PASSWORD_CHANGE#}){/if} +
      + + +
      +
      + +
      + {if $smarty.request.action=='edit'} + + {/if} +
      {#USER_NICK#}
      {#USER_SIGNATURE#}
      {#USER_AVATAR#}
      + {if $row->avatar}{/if} +
      + +
      {#USER_TAX#}
      + taxpay=='1'}checked="checked" {/if}/> + taxpay=='0'}checked="checked" {/if}/> +
      {#USER_COMPANY#}
      {#USER_HOUSE_STREET#}
      +   + +
      {#USER_ZIP_CODE#}
      {#USER_CITY#}
      {#USER_COUNTRY#}
      + +
      {#USER_PHONE#}
      {#USER_FAX#}
      {#USER_BIRTHDAY#} {#USER_BIRTHDAY_FORMAT#}
      {#USER_NOTICE#}
      {#USER_MAIN_GROUP#} +
      + {if check_permission('user_perms')} + {if ($smarty.session.user_id == $row->Id) && $row->user_group != 1} + + {else} + + {/if} + {else} + + {/if} +
      +
      {#USER_SECOND_GROUP#}
      {#USER_SECOND_INFO#}
      +
      + {if check_permission('user_perms')} + {foreach from=$ugroups item=groups} + user_group == $row->user_group)} disabled="disabled"{/if} {if in_array($groups->user_group, $us_groups)} checked="checked"{/if}> +
      + {/foreach} + {/if} +
      +
      {#USER_STATUS#} +
      + +
      + {if $smarty.request.action=='edit'} + + {/if} +
      {#USER_MESSAGE_SUBJECT#}
      {#USER_MESSAGE_TEXT#}
      + +
      +
      + +
      +
      + +
      + +
      +
      + +{else} + +
      {#USER_SUB_TITLE#}
      + +
      +
      + + {#USER_WARNING_TIP#} + +
      +
      + +
        +
      • • {#USER_YOUR_NOT_CHANGE#}
      • +
      +{/if} diff --git a/admin/templates/user/nav.tpl b/admin/templates/user/nav.tpl new file mode 100644 index 0000000..16caf25 --- /dev/null +++ b/admin/templates/user/nav.tpl @@ -0,0 +1 @@ +
    13. {#MAIN_USERS#}
    14. \ No newline at end of file diff --git a/admin/templates/user/users.tpl b/admin/templates/user/users.tpl new file mode 100644 index 0000000..f33c98d --- /dev/null +++ b/admin/templates/user/users.tpl @@ -0,0 +1,423 @@ + + +
      {#USER_SUB_TITLE#}
      + +
      +
      + {#USER_TIP1#} +
      +
      + + + +
      +
      {#MAIN_SEARCH_USERS#}
      +
      +
      + + + + + + + + + + + + + + + + +
      {#MAIN_USER_PARAMS#}{#MAIN_USER_GROUP#}{#MAIN_ALL_USER_GROUP#}
      + + + +
      + +
      + +
      +
      +
      + +
      + + + +
      +
      + + {if !$users} +
        +
      • Ошибка: {#USER_LIST_EMPTY#}
      • +
      + {else} + + {if check_permission('user_edit')} +
      + {/if} + + + + + + + + + + + + + + + + + + + + + + + + + + + + {foreach from=$users item=user} + status}class="yellow"{/if}> + + + + + + + + + + + + + + +{* + + + +*} + + {/foreach} + +
      {#USER_ID#}-{#USER_AVATAR#}{#USER_NAME#}{#USER_GROUP#}{#USER_LAST_VISIT#}{#USER_REGISTER_DATE#}
      {#USER_ACTION#}
      {$user->Id} + + + {if check_permission('user_edit')} + + {if ($smarty.session.user_group != 1 && $user->user_group == 1)} + + + {elseif $smarty.session.user_group == 1 && $user->Id != 1} + + + {else} + + {if $smarty.session.user_group == $user->user_group && $smarty.session.user_id == $user->Id} + + + {elseif $smarty.session.user_group == $user->user_group && $smarty.session.user_id != $user->Id} + + + {else} + + {/if} + {/if} + + {else} + + {/if} + + {if $user->avatar}{else}{/if} + + {if check_permission('user_edit')} + + {if ($smarty.session.user_group != 1 && $user->user_group == 1)} + {$user->user_name|escape}{if $user->firstname && $user->lastname} ({$user->firstname|escape} {$user->lastname|escape}){/if} + + {elseif $smarty.session.user_group == 1} + + {$user->user_name|escape}{if $user->firstname && $user->lastname} ({$user->firstname|escape} {$user->lastname|escape}){/if} + + + {else} + + {if $smarty.session.user_group == $user->user_group && $smarty.session.user_id == $user->Id} + + {$user->user_name|escape}{if $user->firstname && $user->lastname} ({$user->firstname|escape} {$user->lastname|escape}){/if} + + + {elseif $smarty.session.user_group == $user->user_group && $smarty.session.user_id != $user->Id} + {$user->user_name|escape}{if $user->firstname && $user->lastname} ({$user->firstname|escape} {$user->lastname|escape}){/if} + + {else} + + {$user->user_name|escape}{if $user->firstname && $user->lastname} ({$user->firstname|escape} {$user->lastname|escape}){/if} + + {/if} + {/if} +
      + {$user->email|escape} (IP:{$user->reg_ip|escape}) + + {else} + {$user->user_name|escape}{if $user->firstname && $user->lastname} ({$user->firstname|escape} {$user->lastname|escape}){/if} +
      + {$user->email|escape} (IP:{$user->reg_ip|escape}) + {/if} +
      + {if !$user->status} +
      {#USER_STATUS_WAIT#}
      + {else} + {if check_permission('user_perms')} +{* + {if ($smarty.session.user_id == $user->Id) && $user->user_group != 1} + + {else} + + {/if} + {else} + +*} + + + {if check_permission('user_edit')} + + {if ($smarty.session.user_group != 1 && $user->user_group == 1)} + + + {elseif $smarty.session.user_group == 1} + + + {else} + + {if $smarty.session.user_group == $user->user_group && $smarty.session.user_id == $user->Id} + + + {elseif $smarty.session.user_group == $user->user_group && $smarty.session.user_id != $user->Id} + + + {else} + + {/if} + {/if} + + {else} + + {/if} + + + {/if} + {/if} +
      + {if $user->status AND $user->last_visit>0} + {$user->last_visit|date_format:$TIME_FORMAT|pretty_date} + {else} + - + {/if} + {$user->reg_time|date_format:$TIME_FORMAT|pretty_date} + + + {if check_permission('user_edit')} + + {if ($smarty.session.user_group != 1 && $user->user_group == 1)} + + + {elseif $smarty.session.user_group == 1} + + + {else} + + {if $smarty.session.user_group == $user->user_group && $smarty.session.user_id == $user->Id} + + + {elseif $smarty.session.user_group == $user->user_group && $smarty.session.user_id != $user->Id} + + + {else} + + {/if} + {/if} + + {else} + + {/if} + + + {if $user->Id != 1 && $smarty.session.user_group != $user->user_group} + {if check_permission('user_perms') && $user->Id!=$smarty.session.user_id} + + {else} + + {/if} + {else} + + {/if} + + {if $user->IsShop && $user->Orders} + + {else} + + {/if} + + {if $user->IsShop} + + {else} + + {/if} +
      + + {if check_permission('user_edit')} +
      + +
      +
      + {/if} + +{/if} + +
      + {if check_permission('user_edit')} + + {/if} + +
      + +
      +
      + +{if $page_nav} + +{/if} \ No newline at end of file diff --git a/admin/user.php b/admin/user.php new file mode 100644 index 0000000..d879548 --- /dev/null +++ b/admin/user.php @@ -0,0 +1,67 @@ +userListFetch(); + +$AVE_Template->config_load(BASE_DIR . '/admin/lang/' . $_SESSION['admin_language'] . '/user.txt', 'user'); + +switch ($_REQUEST['action']) +{ + case '': + if (check_permission_acp('user_view')) + { + $AVE_Template->assign('content', $AVE_Template->fetch('user/users.tpl')); + } + break; + + case 'edit': + if (check_permission_acp('user_edit')) + { + $AVE_User->userEdit($_REQUEST['Id']); + } + break; + + case 'new': + if (check_permission_acp('user_edit')) + { + $AVE_User->userNew(); + } + break; + + case 'delete': + if (check_permission_acp('user_edit')) + { + $AVE_User->userDelete($_REQUEST['Id']); + } + break; + + case 'quicksave': + if (check_permission_acp('user_edit')) + { + $AVE_User->userListEdit(); + } + break; +} + +?> \ No newline at end of file diff --git a/backup/.htaccess b/backup/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/backup/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/.htaccess b/cache/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/attachments/.htaccess b/cache/attachments/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/attachments/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/combine/.htaccess b/cache/combine/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/combine/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/module/.htaccess b/cache/module/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/module/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/redactor/.htaccess b/cache/redactor/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/redactor/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/redactor/log.txt b/cache/redactor/log.txt new file mode 100644 index 0000000..e69de29 diff --git a/cache/smarty/.htaccess b/cache/smarty/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/smarty/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/sql/.htaccess b/cache/sql/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/sql/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/cache/tpl/.htaccess b/cache/tpl/.htaccess new file mode 100644 index 0000000..14249c5 --- /dev/null +++ b/cache/tpl/.htaccess @@ -0,0 +1 @@ +Deny from all \ No newline at end of file diff --git a/class/.htaccess b/class/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/class/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/class/class.blocks.php b/class/class.blocks.php new file mode 100644 index 0000000..63551c7 --- /dev/null +++ b/class/class.blocks.php @@ -0,0 +1,270 @@ +Query(" + SELECT 1 + FROM + " . PREFIX . "_blocks + WHERE + block_alias = '" . $alias . "' + AND + id != '" . $id . "' + ")->GetCell(); + } + + /** + * Вывод списка системных блоков + */ + function blockList() + { + global $AVE_DB, $AVE_Template; + + $vis_blocks = array(); + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_blocks + ORDER BY + id + "); + + // Формируем массив из полученных данных + while ($row = $sql->FetchRow()) + { + $row->block_author_id = get_username_by_id($row->block_author_id); + array_push($vis_blocks, $row); + } + + $AVE_Template->assign('sid', 0); + $AVE_Template->assign('vis_blocks', $vis_blocks); + $AVE_Template->assign('content', $AVE_Template->fetch('blocks/list.tpl')); + } + + /** + * Сохранение системного блока + * + * @param int $block_id идентификатор системного блока + */ + function blockSave($block_id = null) + { + global $AVE_DB, $AVE_Template; + + if (is_numeric($block_id)) + { + $_REQUEST['block_visual'] = (isset($_REQUEST['block_visual'])) ? $_REQUEST['block_visual'] : 0; + + $block_alias = isset($_REQUEST['block_alias']) ? $_REQUEST['block_alias'] : ''; + + $sql = $AVE_DB->Query(" + UPDATE + " . PREFIX . "_blocks + SET + block_name = '" . $_REQUEST['block_name'] . "', + block_description = '" . addslashes($_REQUEST['block_description']) . "', + block_alias = '" . $_REQUEST['block_alias'] . "', + block_text = '" . $_REQUEST['block_text'] . "' + WHERE + id = '" . $block_id . "' + "); + + if ($sql->_result === false) + { + $message = $AVE_Template->get_config_vars('BLOCK_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('BLOCK_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('BLOCK_SAVED'); + $header = $AVE_Template->get_config_vars('BLOCK_SUCCESS'); + $theme = 'accept'; + + //-- Стираем кеш блока + if (file_exists(BASE_DIR . '/cache/sql/block/' . $block_id . '.cache')) + unlink(BASE_DIR . '/cache/sql/block/' . $block_id . '.cache'); + + if ($block_alias != '' && file_exists(BASE_DIR . '/cache/sql/block/' . $block_alias . '.cache')) + unlink(BASE_DIR . '/cache/sql/block/' . $block_alias . '.cache'); + + //-- Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('BLOCK_SQLUPDATE') . " (" . stripslashes($_REQUEST['block_name']) . ") (id: $block_id)"); + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + else + { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=blocks&cp=' . SESSION); + } + + exit; + } + else + { + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_blocks + SET + block_name = '" . $_REQUEST['block_name'] . "', + block_description = '" . addslashes($_REQUEST['block_description']) . "', + block_alias = '" . $_REQUEST['block_alias'] . "', + block_text = '" . $_REQUEST['block_text'] . "', + block_author_id = '" . (int)$_SESSION['user_id'] . "', + block_created = '" . time() . "' + "); + + $block_id = $AVE_DB->InsertId(); + + //-- Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('BLOCK_SQLNEW') . " (" . stripslashes($_REQUEST['block_name']) . ") (id: $block_id)"); + } + + if (! isset($_REQUEST['next_edit'])) + header('Location:index.php?do=blocks&cp=' . SESSION); + else + header('Location:index.php?do=blocks&action=edit&&id=' . $block_id . '&cp=' . SESSION); + } + + /** + * Редактирование системного блока + * + * @param int $block_id идентификатор системного блока + */ + function blockEdit($block_id) + { + global $AVE_DB, $AVE_Template; + + $row = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_blocks + WHERE + id = '" . $block_id . "' + ")->FetchAssocArray(); + + $AVE_Template->assign('sid', $block_id); + + switch ($_SESSION['use_editor']) + { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['customConfig'] = 'block.js'; + $oCKeditor->config['toolbar'] = 'Big'; + $oCKeditor->config['height'] = 400; + $config = array(); + $row['block_text'] = $oCKeditor->editor('block_text', $row['block_text'], $config); + break; + + case '1': // Elrte и Elfinder + break; + } + + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch('blocks/form.tpl')); + } + + /** + * Создание блока + */ + function blockNew() + { + global $AVE_DB, $AVE_Template; + + $row['block_name'] = ''; + $row['block_alias'] = ''; + $row['block_text'] = ''; + + $AVE_Template->assign('sid', 0); + + switch ($_SESSION['use_editor']) + { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['customConfig'] = 'block.js'; + $oCKeditor->config['toolbar'] = 'Big'; + $oCKeditor->config['height'] = 400; + $config = array(); + $row['block_text'] = $oCKeditor->editor('block_text', $row['block_text'], $config); + break; + + case '1': // Elrte и Elfinder + break; + } + + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch('blocks/form.tpl')); + } + + /** + * Удаление блока + * + * @param int $block_id идентификатор блока + */ + function blockDelete($block_id) + { + global $AVE_DB, $AVE_Template; + + if (is_numeric($block_id)) + { + $row = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_blocks + WHERE + id = '" . $block_id . "' + ")->FetchRow(); + + $AVE_DB->Query(" + DELETE FROM + " . PREFIX . "_blocks + WHERE + id = '" . $block_id . "' + "); + + //-- Стираем кеш сисблока + if (file_exists(BASE_DIR . '/cache/sql/block-' . $block_id . '.cache')) + unlink(BASE_DIR . '/cache/sql/block/' . $block_id . '.cache'); + + if ($row->block_alias != '') + unlink(BASE_DIR . '/cache/sql/block/' . $row->block_alias . '.cache'); + + //-- Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('BLOCK_SQLDEL') . " (" . stripslashes($row->block_name) . ") (id: $block_id)"); + } + + header('Location:index.php?do=blocks&cp=' . SESSION); + } + } +?> \ No newline at end of file diff --git a/class/class.core.php b/class/class.core.php new file mode 100755 index 0000000..81f5b71 --- /dev/null +++ b/class/class.core.php @@ -0,0 +1,1669 @@ +HTTP Error 404: Page not found'; + + /** + * Сообщение об ошибке, если для рубрики не найден шаблон + * + * @public string + */ + public $_rubric_template_empty = '

      Ошибка


      Не задан шаблон рубрики.'; + + /** + * Сообщение об ошибке, если документ запрещен к показу + * + * @public string + */ + public $_doc_not_published = 'Запрашиваемый документ запрещен к публикации.'; + + /** + * Сообщение об ошибке, если модуль не может быть загружен + * + * @public string + */ + public $_module_error = 'Запрашиваемый модуль не может быть загружен.'; + + /** + * Сообщение об ошибке, если модуль, указанный в шаблоне, не установлен в системе + * + * @public string + */ + public $_module_not_found = 'Запрашиваемый модуль не найден.'; + +/** + * Внутренние методы класса + */ + + /** + * Получение основных настроек сисблока + * + * @param string $param параметр настройки, если не указан - все параметры + * @return mixed + */ + + function _sysBlock($id, $param = '') + { + global $AVE_DB; + + static $sys_block = null; + + if ($sys_block === null) + { + $sys_block = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_sysblocks + WHERE + " . (is_numeric($id) ? 'id' : 'sysblock_alias') . " = '" . $id . "' + ")->FetchAssocArray(); + } + + if ($param == '') + return $sys_block; + + return isset($sys_block[$param]) + ? $sys_block[$param] + : null; + } + + + /** + * Получение основных настроек сисблока + * + * @param string $param параметр настройки, если не указан - все параметры + * @return mixed + */ + + function _requestGet($id, $param = '') + { + global $AVE_DB; + + static $request = null; + + if ($request === null) + { + $request = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_request + WHERE + " . (is_numeric($id) ? 'Id' : 'request_alias') . " = '" . $id . "' + ")->FetchAssocArray(); + } + + if ($param == '') + return $request; + + return isset($request[$param]) + ? $request[$param] + : null; + } + + /** + * Метод, предназначенный для получения шаблонов + * + * @param int $rubric_id идентификатор рубрики + * @param string $template шаблон + * @param string $fetched шаблон модуля + * @return string + */ + function _coreDocumentTemplateGet($rubric_id = '', $template = '', $fetched = '') + { + global $AVE_DB; + + // Если выводится только содержимое модуля или это новое окно (например страница для печати), + // просто возвращаем содержимое. + if (defined('ONLYCONTENT') || (isset ($_REQUEST['pop']) && $_REQUEST['pop'] == 1)) + { + $out = '[tag:maincontent]'; + } + else + { + // В противном случае, если в качестве аргумента передан шаблон модуля, возвращаем его. + if (! empty($fetched)) + { + $out = $fetched; + } + else + { + // В противном случае, если в качестве аргумента передан общий шаблон, возвращаем его + if (! empty($template)) + { + $out = $template; + } + else // В противном случае, если аргументы не определены, тогда проверяем + { + // Если для текущего документа в свойстве класса $this->curentdoc определен шаблон, тогда возвращаем его + if (! empty ($this->curentdoc->template_text)) + { + $out = stripslashes($this->curentdoc->template_text); + unset($this->curentdoc->template_text); + } + else + { + // В противном случае, если не указан идентификатор рубрики + if (empty ($rubric_id)) + { + // Получаем id документа из запроса + $_REQUEST['id'] = (isset ($_REQUEST['id']) && is_numeric($_REQUEST['id'])) + ? $_REQUEST['id'] + : 1; + + // Выполняем запрос к БД на получение id рубрики на основании id документа + $rubric_id = $AVE_DB->Query(" + SELECT + rubric_id + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $_REQUEST['id'] . "' + LIMIT 1 + ")->GetCell(); + + // Если id рубрики не найден, возвращаем пустую строку + if (! $rubric_id) + return ''; + } + + // Выполняем запрос к БД на получение основного шаблона, а также шаблона рубрики + $tpl = $AVE_DB->Query(" + SELECT + template_text + FROM + " . PREFIX . "_templates AS tpl + LEFT JOIN + " . PREFIX . "_rubrics AS rub + ON tpl.Id = rubric_template_id + WHERE + rub.Id = '" . $rubric_id . "' + LIMIT 1 + ")->GetCell(); + + // Если запрос выполнился с нулевым результатом, возвращаем пустую строку + $out = $tpl + ? stripslashes($tpl) + : ''; + } + } + } + } + + // получаем из шаблона системный тег, определяющий название темы дизайна + $match = array(); + + preg_match('/\[tag:theme:(\w+)]/', $out, $match); + + define('THEME_FOLDER', empty ($match[1]) + ? DEFAULT_THEME_FOLDER + : $match[1]); + + $out = preg_replace('/\[tag:theme:(.*?)]/', '', $out); + + // Если пришел вызов на активацию языковых файлов + $out = preg_replace_callback( + '/\[tag:language]/', + function () + { + global $AVE_Template; + + $lang_file = BASE_DIR . '/templates/' . THEME_FOLDER . '/lang/' . $_SESSION['user_language'] . '.txt'; + + $AVE_Template->config_load($lang_file); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + }, + $out + ); + + return $out; + } + + /** + * Метод, предназначенный для получения шаблона модуля + * + * @return string + */ + function _coreModuleTemplateGet() + { + global $AVE_DB; + + // Если папка, с запрашиваемым модулем не существует, выполняем редирект + // на главную страницу и отображаем сообщение с ошибкой + if (! is_dir(BASE_DIR . '/modules/' . $_REQUEST['module'])) + { + echo ''; + $out = $this->_module_not_found; + } + // В противном случае + else + { + // Выполняем запрос к БД на получение списка общих шаблонов имеющиюся в системе + // и шаблоне, который установлен для данного модуля + // Например, в системе есть шаблоны Template_1 и Template_2, а для модуля установлен Template_3 + $out = $AVE_DB->Query(" + SELECT + tmpl.template_text + FROM + " . PREFIX . "_templates AS tmpl + LEFT JOIN + " . PREFIX . "_module AS mdl + ON tmpl.Id = mdl.ModuleTemplate + WHERE + ModuleSysName = '" . $_REQUEST['module'] . "' + ")->GetCell(); + + // Если шаблон, установленный для модуля не найден в системе, принудительно устанавливаем для него + // первый шаблон (id=1) + if (empty ($out)) + { + $out = $AVE_DB->Query(" + SELECT + template_text + FROM + " . PREFIX . "_templates + WHERE + Id = '1' + LIMIT 1 + ")->GetCell(); + } + } + // Возвращаем информацию о полученном шаблоне + return stripslashes($out); + } + + /** + * Метод, предназначенный для получения прав доступа к документам рубрики + * + * @param int $rubrik_id идентификатор рубрики + */ + function _coreRubricPermissionFetch($rubrik_id = '') + { + global $AVE_DB; + + unset ($_SESSION[$rubrik_id . '_docread']); + + // Если для документа уже получены права доступа, тогда + if (!empty ($this->curentdoc->rubric_permission)) + { + // Формируем массив с правами доступа + $rubric_permissions = explode('|', $this->curentdoc->rubric_permission); + + // Циклически обрабатываем сформированный массив и создаем в сессии соответсвующие переменные + foreach ($rubric_permissions as $rubric_permission) + { + if (!empty ($rubric_permission)) + { + $_SESSION[$rubrik_id . '_' . $rubric_permission] = 1; + } + } + } // В противном случае + else + { + // Выполняем запрос к БД на получение списка прав для данного документа + $sql = $AVE_DB->Query(" + SELECT + rubric_permission + FROM + " . PREFIX . "_rubric_permissions + WHERE + rubric_id = '" . $rubrik_id . "' + AND + user_group_id = '" . UGROUP . "' + "); + + // Обрабатываем полученные данные и создаем в сессии соответсвующие переменные + while ($row = $sql->FetchRow()) + { + $row->rubric_permission = explode('|', $row->rubric_permission); + + foreach ($row->rubric_permission as $rubric_permission) + { + if (! empty($rubric_permission)) + { + $_SESSION[$rubrik_id . '_' . $rubric_permission] = 1; + } + } + } + } + } + + /** + * Метод, предназначенный для обработки события 404 Not Found, т.е. когда страница не найдена. + * + * @return unknown + */ + function _coreErrorPage404() + { + global $AVE_DB; + + // Выполняем запрос к БД на проверку существования страницы, которая содержит информацию о том, что + // запрашиваемая страница не найдена + $available = $AVE_DB->Query(" + SELECT + COUNT(*) + FROM + " . PREFIX . "_documents + WHERE + Id = '" . PAGE_NOT_FOUND_ID . "' + LIMIT 1 + ")->GetCell(); + + // Если такая страница в БД существует, выполняем переход на страницу с ошибкой + if ($available) + { + header('Location:' . ABS_PATH . 'index.php?id=' . PAGE_NOT_FOUND_ID); + } + // Если не существует, тогда просто выводим текст, определенный в свойстве _doc_not_found + else + { + echo $this->_doc_not_found; + } + + exit; + } + + /** + * Метод, предназначенный для формирования хэша страницы + * + * @return string + */ + function _get_cache_hash() + { + $hash = 'g-' . UGROUP; + $hash .= 'r-' . RUB_ID; + $hash .= 'u-' . get_redirect_link(); + $hash .= 't-' . $this->curentdoc->rubric_tmpl_id; + + return md5($hash); + } + + /** + * Метод, предназначенный для проверки существования документа в БД + * + * @param int $document_id - id документа + * @param int $user_group - группа пользователя + * @return boolean + */ + function _coreCurrentDocumentFetch($document_id = 1, $user_group = 2) + { + global $AVE_DB; + + // Выполняем составной запрос к БД на получение информации о запрашиваемом документе + $this->curentdoc = $AVE_DB->Query(" + SELECT + doc.*, + rubric_permission, + rubric_template, + rubric_header_template, + rubric_meta_gen, + template_text, + other.template + FROM + " . PREFIX . "_documents AS doc + JOIN + " . PREFIX . "_rubrics AS rub + ON rub.Id = doc.rubric_id + JOIN + " . PREFIX . "_templates AS tpl + ON tpl.Id = rubric_template_id + JOIN + " . PREFIX . "_rubric_permissions AS prm + ON doc.rubric_id = prm.rubric_id + LEFT JOIN + " . PREFIX . "_rubric_templates AS other + ON doc.rubric_id = other.rubric_id AND doc.rubric_tmpl_id = other.id + WHERE + user_group_id = '" . $user_group . "' + AND + doc.Id = '" . $document_id . "' + LIMIT 1 + ")->FetchRow(); + + if ($this->curentdoc->rubric_tmpl_id != 0) + { + $this->curentdoc->rubric_template = (($this->curentdoc->template != '') ? $this->curentdoc->template : $this->curentdoc->rubric_template); + + unset($this->curentdoc->template); + } + + // Возвращаем 1, если документ найден, либо 0 в противном случае + return (isset($this->curentdoc->Id) && $this->curentdoc->Id == $document_id); + } + + /** + * Метод, предназначенный для получения содержимого страницы с 404 ошибкой + * + * + * @param int $page_not_found_id + * @param int $user_group + * @return int/boolean + */ + function _corePageNotFoundFetch($page_not_found_id = 2, $user_group = 2) + { + global $AVE_DB; + + // Выполняем запрос к БД на получение полной информации о странице с 404 ошибкой, включая + // права доступа, шаблон рубрики и основной шаблон сайта + $this->curentdoc = $AVE_DB->Query(" + SELECT + doc.*, + rubric_permission, + rubric_template, + rubric_header_template, + rubric_meta_gen, + template_text + FROM + " . PREFIX . "_documents AS doc + JOIN + " . PREFIX . "_rubrics AS rub + ON rub.Id = doc.rubric_id + JOIN + " . PREFIX . "_templates AS tpl + ON tpl.Id = rubric_template_id + JOIN + " . PREFIX . "_rubric_permissions AS prm + ON doc.rubric_id = prm.rubric_id + WHERE + user_group_id = '" . $user_group . "' + AND + doc.Id = '" . $page_not_found_id . "' + LIMIT 1 + ")->FetchRow(); + + return (isset($this->curentdoc->Id) && $this->curentdoc->Id == $page_not_found_id); + } + + /** + * Метод, предназначенный для получения МЕТА-тегов для различных модулей. + * + * @return boolean + */ + function _coreModuleMetatagsFetch() + { + global $AVE_DB; + + // Если в запросе не пришел параметр module, заврешаем работу + if (! isset($_REQUEST['module'])) + return false; + + $this->curentdoc = $AVE_DB->Query(" + SELECT + 1 AS Id, + 0 AS document_published, + document_meta_robots, + document_meta_keywords, + document_meta_description, + document_title + FROM + " . PREFIX . "_documents + WHERE + Id = 1 + ")->FetchRow(); + + return (isset($this->curentdoc->Id) && $this->curentdoc->Id == 1); + } + + /** + * Метод, предназначенный для определения статуса документа (доступен ли он к публикации). + * + * @return int/boolean + */ + function _coreDocumentIsPublished() + { + //Контроль даты: Использовать/Не использовать + if (get_settings('use_doctime') != 0) + { + if (!empty ($this->curentdoc) // документ есть + && $this->curentdoc->Id != PAGE_NOT_FOUND_ID // документ не сообщение ошибки 404 + && $this->curentdoc->document_deleted == 1 // пометка удаления + ) + { + // Если пользователь авторизован в Панели управления или имеет полные права на просмотр документа, тогда + if (isset ($_SESSION['adminpanel']) || isset ($_SESSION['alles'])) + { + // Отображаем информационное окно с сообщением, определенным в свойстве _doc_not_published + display_notice($this->_doc_not_published); + } + else // В противном случае фиксируем ошибку + { + $this->curentdoc = false; + } + } + } + else + { + if (! empty($this->curentdoc) // документ есть + && $this->curentdoc->Id != PAGE_NOT_FOUND_ID // документ не сообщение ошибки 404 + && $this->curentdoc->document_deleted == 1 // пометка удаления + ) + { + // Если пользователь авторизован в Панели управления или имеет полные права на просмотр документа, тогда + if (isset ($_SESSION['adminpanel']) || isset ($_SESSION['alles'])) + { + // Отображаем информационное окно с сообщением, определенным в свойстве _doc_not_published + display_notice($this->_doc_not_published); + } + else // В противном случае фиксируем ошибку + { + $this->curentdoc = false; + } + } + } + return (! empty($this->curentdoc)); + } + + /** + * Метод парсинга тега [tag:(css|js):files] + * для вывода css/js-файлов в шаблоне через combine.php + * + * @param array $tag параметры тега + * @return string что выводить в шаблоне + */ + function _parse_combine($tag) + { + // тип тега (css|js) + $type = $tag[1]; + // имена файлов + $files = explode(',',$tag[2]); + + // определяем путь. если указан - то считаем от корня, если нет, то в /[tag:mediapath]/css|js/ + if ($tag[3]) + { + $path = '/' . trim($tag[3],'/') . '/'; + } + else + { + $path = '/templates/' . THEME_FOLDER . '/' . $type . '/'; + } + + // уровень вложенности + $level = substr_count($path,'/') - 1; + + // копируем combine.php, если он поменялся или отсутствует + $dest_stat = stat(BASE_DIR . $path . 'combine.php'); + $source_stat = stat(BASE_DIR . '/lib/combine/combine.php'); + + if (! file_exists(BASE_DIR . $path . 'combine.php') || $source_stat[9] > $dest_stat[9]) + { + @copy(BASE_DIR . '/lib/combine/combine.php', BASE_DIR . $path . 'combine.php'); + } + + // удаляем из списка отсутствующие файлы + foreach($files as $key=>$file) + { + if (! file_exists(BASE_DIR . $path . $file)) + unset($files[$key]); + } + + if ($files) + { + $combine = $path . 'combine.php?level=' . $level . '&' . $type . '=' . implode(',', $files); + $combine = @str_replace('//','/',$combine); + } + + return $combine; + } + +/** + * Внешние методы класса + */ + + /** + * Метод, предназначенный для обработки системных тегов модулей. Здесь подключаются только те файлы модулей, + * системные теги которых обнаружены в шаблоне при парсинге. Также формирует массив всех установленных модулей + * в системе, предварительно проверяя их доступность. + * + * @param string $template текст шаблона с тегами + * @return string текст шаблона с обработанными тегами модулей + */ + function coreModuleTagParse($template) + { + global $AVE_DB, $AVE_Template; + + $pattern = array(); // Массив системных тегов + $replace = array(); // Массив функций, на которые будут заменены системные теги + + // Если уже имеются данные об установленных модулях + if (null !== $this->install_modules) + { + // Циклически обрабатываем каждый модуль + foreach ($this->install_modules as $row) + { + // Если в запросе пришел вызов модуля или у модуля есть функция вызываемая тегом, + // который присутствует в шаблоне + if ((isset($_REQUEST['module']) && $_REQUEST['module'] == $row->ModuleSysName) || + (1 == $row->ModuleIsFunction && !empty($row->ModuleAveTag) && 1 == preg_match($row->ModuleAveTag, $template))) + { + // Проверяем, существует ли для данного модуля функция. Если да, + // получаем php код функции. + if (function_exists($row->ModuleStatus)) + { + $pattern[] = $row->ModuleAveTag; + $replace[] = $row->ModulePHPTag; + } + else // В противном случае + { + // Проверяем, существует ли для данного модуля файл module.php в его персональной директории + $mod_file = BASE_DIR . '/modules/' . $row->ModuleSysName . '/module.php'; + + if (is_file($mod_file) && include_once($mod_file)) + { + // Если файл модуля найден, тогда + if ($row->ModuleAveTag) + { + $pattern[] = $row->ModuleAveTag; // Получаем его системный тег + + // Проверяем, существует ли для данного модуля функция. Если да, + // получаем php код функции, в противном случае формируем сообщение с ошибкой + $replace[] = function_exists($row->ModuleFunction) + ? $row->ModulePHPTag + : ($this->_module_error . ' "' . $row->ModuleName . '"'); + } + } + // Если файла module.php не существует, формируем сообщение с ошибкой + elseif ($row->ModuleAveTag) + { $pattern[] = $row->ModuleAveTag; + $replace[] = $this->_module_error . ' "' . $row->ModuleName . '"'; + } + } + } + } + + // Выполняем замену систеного тега на php код и возвращаем результат + return preg_replace($pattern, $replace, $template); + } + else // В противном случае, если список модулей пустой + { + $this->install_modules = array(); + + // Выполняем запрос к БД на получение информации о всех модулях, которые установлены в системе + // (именно установлены, а не просто существуют в виде папок) + $sql = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX. "_module + WHERE + ModuleStatus = '1' + "); + + // Циклически обрабатываем полученные данные + while ($row = $sql->FetchRow()) + { + // Если в запросе пришел параметр module и для данного названия модуля существует + // директория или данный модуль имеет функцию и его системный тег указан в каком-либо шаблоне, тогда + if ((isset($_REQUEST['module']) && $_REQUEST['module'] == $row->ModuleSysName) || + (1 == $row->ModuleIsFunction && !empty($row->ModuleAveTag) && 1 == preg_match($row->ModuleAveTag, $template))) + { + // Проверяем, существует ли для данного модуля файл module.php в его персональной директории + $mod_file = BASE_DIR . '/modules/' . $row->ModuleSysName . '/module.php'; + + if (is_file($mod_file) && include_once($mod_file)) + { // Если файл модуля найден, тогда + if (! empty($row->ModuleAveTag)) + { + $pattern[] = $row->ModuleAveTag; // Получаем его системный тег + + // Проверяем, существует ли для данного модуля функция. Если да, + // получаем php код функции, в противном случае формируем сообщение с ошибкой + $replace[] = function_exists($row->ModuleFunction) + ? $row->ModulePHPTag + : ($this->_module_error . ' "' . $row->ModuleName . '"'); + } + // Сохряняем информацию о модуле + $this->install_modules[$row->ModuleSysName] = $row; + } + elseif ($row->ModuleAveTag) // Если файла module.php не существует, формируем сообщение с ошибкой + { + $pattern[] = $row->ModuleAveTag; + $replace[] = $this->_module_error . ' "' . $row->ModuleName . '"'; + } + } + else + { // Если у модуля нет функции или тег модуля не используется - просто помещаем в массив информацию о модуле + $this->install_modules[$row->ModuleSysName] = $row; + } + } + // Выполняем замену систеного тега на php код и возвращаем результат + return preg_replace($pattern, $replace, $template); + } + } + + /** + * Метод, предназанченный для сборки всей страницы в единое целое. + * + * @param int $id идентификатор документа + * @param int $rub_id идентификатор рубрики + */ + function coreSiteFetch($id, $rub_id = '') + { + global $AVE_DB; + + $main_content = ''; + + // Если происходит вызов модуля, получаем соответствующие мета-теги и получаем шаблон модуля + if (isset($_REQUEST['module']) && ! empty($_REQUEST['module'])) + { + $out = $this->_coreModuleMetatagsFetch(); + $out = $this->_coreDocumentTemplateGet('', '', $this->_coreModuleTemplateGet()); + } + elseif (isset($_REQUEST['sysblock']) && ! empty($_REQUEST['sysblock'])) + { + if (! is_numeric($_REQUEST['sysblock']) && preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $_REQUEST['sysblock']) !== 1) + { + header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true); + exit; + } + + // проверяем разрешение на внешнее обращение + if (! $this->_sysBlock($_REQUEST['sysblock'], 'sysblock_external')) + { + header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found', true); + exit; + } + + // проверяем разрешение на обращение только по Ajax + if ($this->_sysBlock($_REQUEST['sysblock'], 'sysblock_ajax')) + { + if (isAjax()) + { + $out = parse_sysblock($_REQUEST['sysblock']); + } + else + { + $this->_coreErrorPage404(); + } + } + else + { + $out = parse_sysblock($_REQUEST['sysblock']); + } + } + elseif (isset($_REQUEST['request']) && ! empty($_REQUEST['request'])) + { + if (! is_numeric($_REQUEST['request']) && preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $_REQUEST['request']) !== 1) + { + $this->_coreErrorPage404(); + } + + // Определяем рубрику + define('RUB_ID', ! empty ($rub_id) + ? $rub_id + : $this->curentdoc->rubric_id); + + // проверяем разрешение на внешнее обращение + if (! $this->_requestGet($_REQUEST['request'], 'request_external')) + { + $this->_coreErrorPage404(); + } + + // проверяем разрешение на обращение только по Ajax + if ($this->_requestGet($_REQUEST['request'], 'request_ajax')) + { + if (isAjax()) + { + $out = request_parse($_REQUEST['request']); + } + else + { + $this->_coreErrorPage404(); + } + } + else + { + $out = request_parse($_REQUEST['request']); + } + } + // В противном случае начинаем вывод документа + else + { + if (! isset($this->curentdoc->Id) && ! $this->_coreCurrentDocumentFetch($id, UGROUP)) + { + // Определяем документ с 404 ошибкой в случае, если документ не найден + if ($this->_corePageNotFoundFetch(PAGE_NOT_FOUND_ID, UGROUP)) + { + $_REQUEST['id'] = $_GET['id'] = $id = PAGE_NOT_FOUND_ID; + } + } + + // проверяем параметры публикации документа + if (! $this->_coreDocumentIsPublished()) + { + $this->_coreErrorPage404(); + } + + // Определяем права доступа к документам рубрики + define('RUB_ID', ! empty ($rub_id) + ? $rub_id + : $this->curentdoc->rubric_id); + + $this->_coreRubricPermissionFetch(RUB_ID); + + // получаем шаблон + $out = $this->_coreDocumentTemplateGet(RUB_ID); + + // Выполняем Код рубрики + ob_start(); + eval('?>' . $this->curentdoc->rubric_start_code . 'Query(" + UPDATE + " . PREFIX . "_documents + SET + document_count_print = document_count_print + 1 + WHERE + Id = '" . $id . "' + "); + } + else + { + if (! isset ($_SESSION['doc_view'][$id])) + { // увеличиваем счетчик просмотров (1 раз в пределах сессии) + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_documents + SET + document_count_view = document_count_view + 1 + WHERE + Id = '" . $id . "' + "); + + $_SESSION['doc_view'][$id] = time(); + } + + $curdate = mktime(0, 0, 0, date('m'), date('d'), date('Y')); + + if (!isset ($_SESSION['doc_view_dayly['.$curdate.'][' . $id . ']'])) + { + // и подневный счетчик просмотров тоже увеличиваем + $curdate = mktime(0, 0, 0, date('m'), date('d'), date('Y')); + + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_view_count + SET + count = count + 1 + WHERE + document_id = '" . $id . "' AND + day_id = '".$curdate."' + "); + + if (! $AVE_DB->getAffectedRows()) + { + $AVE_DB->Query(" + INSERT INTO " . PREFIX . "_view_count ( + document_id, + day_id, + count + ) + VALUES ( + '" . $id . "', '".$curdate."', '1' + ) + "); + } + + $_SESSION['doc_view_dayly['.$curdate.'][' . $id . ']'] = time(); + } + } + + if (CACHE_DOC_TPL && empty ($_POST) && !(isset ($_SESSION['user_adminmode']) && $_SESSION['user_adminmode'] == 1)) + { + // кэширование разрешено + // извлекаем скомпилированный шаблон документа из кэша + // если там пусто, пробуем достать из бд + + $cache_id = (int)$this->curentdoc->Id; + $cache_id = 'compiled/' . (floor($cache_id / 1000)) . '/' . $cache_id; + + $cache_file = $this->_get_cache_hash(); + + $cache_dir = BASE_DIR . '/cache/sql/' . (trim($cache_id) > '' + ? trim($cache_id) . '/' + : substr($cache_file, 0, 2) . '/' . substr($cache_file, 2, 2) . '/' . substr($cache_file, 4, 2) . '/'); + + if (CACHE_DOC_FILE && file_exists($cache_dir . $cache_file)) + { + $main_content = file_get_contents($cache_dir . $cache_file); + } + else + { + $main_content = $AVE_DB->Query(" + SELECT + compiled + FROM + " . PREFIX . "_rubric_template_cache + WHERE + hash = '" . $cache_file . "' + LIMIT 1 + ")->GetCell(); + } + + unset($cache_dir, $cache_file, $cache_id); + } + else + { // кэширование запрещено + $main_content = false; + } + + // Собираем контент + // если в кеше нет контента, то + if (empty($main_content)) + { + // кэш пустой или отключен, извлекаем и компилируем шаблон + if (! empty ($this->curentdoc->rubric_template)) + { + $rubTmpl = $this->curentdoc->rubric_template; + } + else + { + // если документу задан другой шаблон из данной рубрики, то берем его + if ($this->curentdoc->rubric_tmpl_id != 0) + { + $rubTmpl = $AVE_DB->Query(" + SELECT + template + FROM + " . PREFIX . "_rubric_templates + WHERE + id = '" . $this->curentdoc->rubric_tmpl_id . "' + AND + rubric_id = '" . RUB_ID . "' + LIMIT 1 + ")->GetCell(); + } + else // иначе берем стандартный шаблон рубрики + { + $rubTmpl = $AVE_DB->Query(" + SELECT + rubric_template + FROM + " . PREFIX . "_rubrics + WHERE + Id = '" . RUB_ID . "' + LIMIT 1 + ")->GetCell(); + } + } + + $rubTmpl = trim($rubTmpl); + + // Собираем шаблон рубрики + if (empty($rubTmpl)) + { + // Если не задан шаблон рубрики, выводим сообщение + $main_content = $this->_rubric_template_empty; + } + else + { + // Проверяем теги полей в шаблоне рубрики на условие != '' + $main_content = preg_replace("/\[tag:if_notempty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) != \'\') { '.'?'.'>', $rubTmpl); + $main_content = preg_replace("/\[tag:if_empty:fld:([a-zA-Z0-9-_]+)\]/u", '<'.'?php if((htmlspecialchars(document_get_field(\'$1\'), ENT_QUOTES)) == \'\') { '.'?'.'>', $main_content); + $main_content = str_replace('[tag:if:else]', '', $main_content); + $main_content = str_replace('[tag:/if]', '', $main_content); + + // Парсим теги полей документа в шаблоне рубрики + $main_content = preg_replace_callback('/\[tag:fld:([a-zA-Z0-9-_]+)\]\[([0-9]+)]\[([0-9]+)]/', 'return_element', $main_content); + $main_content = preg_replace_callback('/\[tag:fld:([a-zA-Z0-9-_]+)\]/', 'document_get_field', $main_content); + $main_content = preg_replace_callback('/\[tag:fld:([a-zA-Z0-9-_]+)\]\[([0-9]+)]\[([0-9]+)]/', 'return_element', $main_content); + $main_content = preg_replace_callback('/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', 'watermarks', $main_content); + $main_content = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $main_content); + + // Возвращаем поле из БД документа + $main_content = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + return isset($this->curentdoc->{$match[1]}) + ? $this->curentdoc->{$match[1]} + : null; + }, + $main_content + ); + + // Если пришел вызов на активацию языковых файлов + $main_content = preg_replace_callback( + '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + global $AVE_Template; + + return $AVE_Template->get_config_vars($match[1]); + }, + $main_content + ); + + // Удаляем ошибочные теги полей документа в шаблоне рубрики + $main_content = preg_replace('/\[tag:watermark:\w*\]/', '', $main_content); + $main_content = preg_replace('/\[tag:fld:\d*\]/', '', $main_content); + $main_content = preg_replace('/\[tag:doc:\w*\]/', '', $main_content); + $main_content = preg_replace('/\[tag:langfile:\w*\]/', '', $main_content); + + if (CACHE_DOC_TPL && empty ($_POST) && !(isset ($_SESSION['user_adminmode']) && $_SESSION['user_adminmode'] == 1)) + { + $cache_id = (int)$this->curentdoc->Id; + $cache_id = 'compiled/' . (floor($cache_id / 1000)) . '/' . $cache_id; + + $cache_file = $this->_get_cache_hash(); + + $cache_dir = BASE_DIR . '/cache/sql/' . (trim($cache_id) > '' + ? trim($cache_id) . '/' + : substr($cache_file, 0, 2) . '/' . substr($cache_file, 2, 2) . '/' . substr($cache_file, 4, 2) . '/'); + + // кэширование разрешено + // сохраняем скомпилированный шаблон в кэш + if (CACHE_DOC_FILE) + { + if(! is_dir($cache_dir)) + mkdir($cache_dir, 0777, true); + + file_put_contents($cache_dir . $cache_file, $main_content); + } + + // кэширование разрешено + // сохраняем скомпилированный шаблон в кэш + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubric_template_cache + SET + hash = '" . $cache_file . "', + rub_id = '" . RUB_ID . "', + rub_tmpl_id = '" . $this->curentdoc->rubric_tmpl_id . "', + grp_id = '" . UGROUP . "', + doc_id = '" . $id . "', + compiled = '" . addslashes($main_content) . "' + "); + + unset($cache_id, $cache_file, $cache_dir); + } + } + } + + // парсим теги в шаблоне рубрики + $main_content = preg_replace_callback( + '/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', + create_function('$m','return translate_date(date($m[1], '.$this->curentdoc->document_published.')); + '), + $main_content + ); + + $main_content = str_replace('[tag:docdate]', pretty_date(strftime(DATE_FORMAT, $this->curentdoc->document_published)), $main_content); + $main_content = str_replace('[tag:doctime]', pretty_date(strftime(TIME_FORMAT, $this->curentdoc->document_published)), $main_content); + $main_content = str_replace('[tag:humandate]', human_date($this->curentdoc->document_published), $main_content); + $main_content = str_replace('[tag:docauthorid]', $this->curentdoc->document_author_id, $main_content); + if (preg_match('[tag:docauthor]', $main_content)){ + $main_content = str_replace('[tag:docauthor]', get_username_by_id($this->curentdoc->document_author_id), $main_content); + } + } + + + + $out = str_replace('[tag:maincontent]', $main_content, $out); + + unset($this->curentdoc->rubric_template, $this->curentdoc->template); + } + // Конец вывода документа + + //Работа с условиями + /* + $out = preg_replace('/\[tag:if_exp:?(.*)\]/u', '', $out); + $out = str_replace('[tag:if_exp_else]', '', $out); + $out = str_replace('[tag:/if_exp]', '', $out); + + */ + + // Тут мы вводим в хеадер иньекцию скриптов. + if (defined('RUB_ID')) + { + $rubheader = $this->curentdoc->rubric_header_template; + $out = str_replace('[tag:rubheader]', $rubheader.'[tag:rubheader]', $out); + + unset($rubheader); + } + + // Парсим поля запроса + $out = preg_replace_callback( + '/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/', + create_function( + '$m', + 'return request_get_document_field($m[1], ' . $id . ', $m[2], ' . (defined('RUB_ID') ? RUB_ID : 0) . ');' + ), + $out + ); + + // Удаляем ошибочные теги полей документа в шаблоне рубрики + $out = preg_replace('/\[tag:rfld:\d*\]/', '', $out); + + // Если в запросе пришел параметр print, т.е. страница для печати, + // парсим контент, который обрамлен тегами только для печати + if (isset ($_REQUEST['print']) && $_REQUEST['print'] == 1) + { + $out = str_replace(array('[tag:if_print]', '[/tag:if_print]'), '', $out); + $out = preg_replace('/\[tag:if_notprint\](.*?)\[\/tag:if_notprint\]/si', '', $out); + } + else + { + // В противном случае наоборот, парсим только тот контент, который предназначен НЕ для печати + $out = preg_replace('/\[tag:if_print\](.*?)\[\/tag:if_print\]/si', '', $out); + $out = str_replace(array('[tag:if_notprint]', '[/tag:if_notprint]'), '', $out); + } + + // Парсим теги визуальных блоков + $out = preg_replace_callback('/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_block', $out); + + // Парсим теги системных блоков + $out = preg_replace_callback('/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_sysblock', $out); + + // Парсим теги модулей + $out = $this->coreModuleTagParse($out); + + // Если в запросе пришел параметр module, т.е. вызов модуля, + // проверяем установлен и активен ли модуль + if ( isset($_REQUEST['module']) + && ! (isset($this->install_modules[$_REQUEST['module']]) + && '1' == $this->install_modules[$_REQUEST['module']]->ModuleStatus) ) + { + // Выводим сообщение о том что такого модуля нет + display_notice($this->_module_error); + } + + // Парсим теги системы внутренних запросов + $out = preg_replace_callback('/\[tag:request:([A-Za-z0-9-_]{1,20}+)\]/', 'request_parse', $out); + + // Парсим теги навигации + $out = preg_replace_callback('/\[tag:navigation:([A-Za-z0-9-_]{1,20}+):?([0-9,]*)\]/', 'parse_navigation', $out); + + // Парсим теги скрытого текста + $out = parse_hide($out); + + // Если в запросе пришел параметр sysblock, т.е. вызов сис блока, + // парсим контент + if (isset($_REQUEST['sysblock']) && $_REQUEST['sysblock'] != '') + { + $search = array( + '[tag:mediapath]', + '[tag:path]', + '[tag:sitename]', + '[tag:home]', + '[tag:docid]', + '[tag:docparent]' + ); + + $replace = array( + ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', + ABS_PATH, + htmlspecialchars(get_settings('site_name'), ENT_QUOTES), + get_home_link(), + (isset ($this->curentdoc->Id) ? $this->curentdoc->Id : ''), + (isset ($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') + ); + } + // Если в запросе пришел параметр request, т.е. вызов запроса, + // парсим контент + elseif (isset($_REQUEST['request']) && $_REQUEST['request'] != '') + { + $search = array( + '[tag:mediapath]', + '[tag:path]', + '[tag:sitename]', + '[tag:home]', + '[tag:docid]', + '[tag:docparent]' + ); + + $replace = array( + ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', + ABS_PATH, + htmlspecialchars(get_settings('site_name'), ENT_QUOTES), + get_home_link(), + (isset ($this->curentdoc->Id) ? $this->curentdoc->Id : ''), + (isset ($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') + ); + } + else + { + // В противном случае + // парсим остальные теги основного шаблона + $search = array( + '[tag:mediapath]', + '[tag:path]', + '[tag:sitename]', + '[tag:alias]', + '[tag:domain]', + '[tag:home]', + '[tag:robots]', + '[tag:canonical]', + '[tag:docid]', + '[tag:docparent]' + ); + + $replace = array( + ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', + ABS_PATH, + htmlspecialchars(get_settings('site_name'), ENT_QUOTES), + (isset($_REQUEST['id'])) ? $this->curentdoc->document_alias : '', + getSiteUrl(), + get_home_link(), + (isset($this->curentdoc->document_meta_robots) ? $this->curentdoc->document_meta_robots : ''), + canonical(ABS_PATH . $this->curentdoc->document_alias), + (isset($this->curentdoc->Id) ? $this->curentdoc->Id : ''), + (isset($this->curentdoc->document_parent) ? $this->curentdoc->document_parent : '') + ); + } + + if (defined('MODULE_CONTENT')) + { + // парсинг тегов при выводе из модуля + $search[] = '[tag:maincontent]'; + $replace[] = MODULE_CONTENT; + $search[] = '[tag:title]'; + $replace[] = htmlspecialchars(defined('MODULE_TITLE') ? MODULE_TITLE : '', ENT_QUOTES); + $search[] = '[tag:description]'; + $replace[] = htmlspecialchars(defined('MODULE_DESCRIPTION') ? MODULE_DESCRIPTION : '', ENT_QUOTES); + $search[] = '[tag:keywords]'; + $replace[] = htmlspecialchars(defined('MODULE_KEYWORDS') ? MODULE_KEYWORDS : '', ENT_QUOTES); + } + elseif (isset($_REQUEST['sysblock'])) + { + // Убираем пустые теги в сис блоке + $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); + $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); + } + elseif (isset($_REQUEST['request'])) + { + // Убираем пустые теги в сис блоке + $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); + $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); + } + else + { + if ($this->curentdoc->rubric_meta_gen) + { + // Генерируем keywords, description на основе + // данных документа, если позволяет рубрика + require_once(dirname(__FILE__).'/class.meta.php'); + $meta = new Meta(); + $res = $meta->generateMeta($main_content); + } + + // Убираем пустые теги + $main_content = preg_replace('/\[tag:(.+?)\]/', '', $main_content); + $main_content = preg_replace('/\[mod_(.+?)\]/', '', $main_content); + + // Парсим keywords, description, title + $search[] = '[tag:keywords]'; + $replace[] = stripslashes(htmlspecialchars((! empty ($this->curentdoc->rubric_meta_gen) ? $res['keywords'] : $this->curentdoc->document_meta_keywords), ENT_QUOTES)); + $search[] = '[tag:description]'; + $replace[] = stripslashes(htmlspecialchars((! empty ($this->curentdoc->rubric_meta_gen) ? $res['description'] : $this->curentdoc->document_meta_description), ENT_QUOTES)); + $search[] = '[tag:title]'; + $replace[] = stripslashes(htmlspecialchars_decode(pretty_chars($this->curentdoc->document_title))); + } + + // Возвращаем поле из БД документа + $out = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + return isset($this->curentdoc->{$match[1]}) + ? $this->curentdoc->{$match[1]} + : null; + }, + $out + ); + + // Если пришел вызов на активацию языковых файлов + $out = preg_replace_callback( + '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + global $AVE_Template; + + return $AVE_Template->get_config_vars($match[1]); + }, + $out + ); + + // Убираем пустые теги + $out = preg_replace('/\[tag:doc:\d*\]/', '', $out); + $out = preg_replace('/\[tag:langfile:\d*\]/', '', $out); + + // Убираем дубликат + $search[] = '[tag:maincontent]'; + $replace[] = ''; + + // Парсим линк на версию для печати + $search[] = '[tag:printlink]'; + $replace[] = get_print_link(); + + // Парсим тег версии системы + $search[] = '[tag:version]'; + $replace[] = APP_NAME . ' v' . APP_VERSION ; + + // Парсим тег кол-ва просмотра данного документа + $search[] = '[tag:docviews]'; + $replace[] = isset ($this->curentdoc->document_count_view) ? $this->curentdoc->document_count_view : ''; + + // Парсим тизер документа + $out = preg_replace_callback( + '/\[tag:teaser:(\d+)(|:\[(.*?)\])\]/', + create_function( + '$m', + 'return showteaser($m[1], $m[2]);' + ), + $out + ); + + // Парсим аватар автора документа + if (defined('RUB_ID')) + $out = preg_replace_callback( + '/\[tag:docauthoravatar:(\d+)\]/', + create_function( + '$m', + 'return getAvatar('.intval($this->curentdoc->document_author_id).', $m[1]);' + ), + $out + ); + + // Парсим теги языковых условий + if (defined('RUB_ID')) + { + $out = preg_replace('/\[tag:lang:([a-zA-Z0-9-_]+)\]/', 'curentdoc->document_lang=="$1") { ?>', $out); + } + else + { + $out = preg_replace('/\[tag:lang:([a-zA-Z0-9-_]+)\]/', '', $out); + } + + $out = str_replace('[tag:/lang]', '', $out); + + // Парсим хлебные крошки + if (preg_match('/\[tag:breadcrumb]/u', $out)) + { + $out = preg_replace_callback('/\[tag:breadcrumb\]/', 'get_breadcrumb', $out); + } + + // Парсим остальные теги основного шаблона + $out = str_replace($search, $replace, $out); + unset ($search, $replace); //Убираем данные + + // Парсим теги для combine.php + $out = preg_replace_callback('/\[tag:(css|js):([^ :\/]+):?(\S+)*\]/', array($this, '_parse_combine'), $out); + + // ЧПУ + $out = str_ireplace('"//"','"/"', str_ireplace('///','/', rewrite_link($out))); + + unset($main_content); + + // Выводим собранный документ + echo $out; + } + + /** + * Метод, предназначенный для формирования ЧПУ, а также для поиска документа и разбора + * дополнительных параметров в URL + * + * @param string $get_url Строка символов + * + */ + function coreUrlParse($get_url = '') + { + global $AVE_DB; + + // Если нужны параметры GET, можно отключить + $get_url = (strpos($get_url, ABS_PATH . '?') === 0 + ? '' + : $get_url); + + if (substr($get_url, 0, strlen(ABS_PATH.'index.php')) != ABS_PATH . 'index.php' && strpos($get_url, '?') !== false) + $get_url = substr($get_url, 0, strpos($get_url,'?')); + + $get_url = rawurldecode($get_url); + $get_url = mb_substr($get_url, strlen(ABS_PATH)); + + // Сохранение старого урла для првоерки использования суффикса + $test_url = $get_url; + + if (mb_substr($get_url, - strlen(URL_SUFF)) == URL_SUFF) + { + $get_url = mb_substr($get_url, 0, - strlen(URL_SUFF)); + } + + // Разбиваем строку параметров на отдельные части + $get_url = explode('/', $get_url); + + if (isset ($get_url['index'])) + { + unset ($get_url['index']); + } + + if (isset ($get_url['print'])) + { + $_GET['print'] = $_REQUEST['print'] = 1; + unset ($get_url['print']); + } + + // Определяем, используется ли у нас разделение документа по страницам + $pages = preg_grep('/^(a|art)?page-\d+$/i', $get_url); + + if (! empty ($pages)) + { + $get_url = implode('/', array_diff($get_url, $pages)); + $pages = implode('/', $pages); + + preg_replace_callback( + '/(page|apage|artpage)-(\d+)/i', + create_function( + '$matches', + '$_GET[$matches[1]] = $matches[2]; $_REQUEST[$matches[1]] = $matches[2];' + ), + $pages + ); + } + // В противном случае формируем окончательную ссылку для документа + else + { + $get_url = implode('/', $get_url); + } + + //-- Проверяем есть ли данный URL в таблице алиасов модулей + $sql = " + SELECT + module_name, + module_action, + module_link + FROM + " . PREFIX . "_modules_aliases + WHERE + module_url = '" . str_ireplace("'", "\'", $get_url) . "' + "; + + $query = $AVE_DB->Query($sql)->FetchRow(); + + if ($query) + { + //-- Передаем глобальные перемененные + $_GET['module'] = $_REQUEST['module'] = $query->module_name; + $_GET['action'] = $_REQUEST['action'] = $query->module_action; + + $get_url = ABS_PATH . $query->module_link; + } + + // проверка на наличие id в запросе + if(! empty($_REQUEST['id'])) + { + $get_url = $AVE_DB->Query(" + SELECT + document_alias + FROM + " . PREFIX . "_documents + WHERE + Id = '" . (int)$_REQUEST['id'] . "' + ")->GetCell(); + } + // Выполняем запрос к БД на получение всей необходимой + // информации о документе + + // Экранируем поступающий URL + $get_url = $AVE_DB->EscStr($get_url); + + // Забираем нужные данные + $sql = $AVE_DB->Query(" + SELECT + doc.*, + rubric_permission, + rubric_template, + rubric_meta_gen, + rub.rubric_header_template, + rub.rubric_start_code, + template_text, + other.template + FROM + " . PREFIX . "_documents AS doc + JOIN + " . PREFIX . "_rubrics AS rub + ON rub.Id = doc.rubric_id + JOIN + " . PREFIX . "_templates AS tpl + ON tpl.Id = rubric_template_id + JOIN + " . PREFIX . "_rubric_permissions AS prm + ON doc.rubric_id = prm.rubric_id + LEFT JOIN + " . PREFIX . "_rubric_templates AS other + ON doc.rubric_id = other.rubric_id AND doc.rubric_tmpl_id = other.id + WHERE + user_group_id = '" . UGROUP . "' + AND + " . (! empty ($get_url) + ? "document_alias = '" . str_ireplace("'", "\'", $get_url) . "'" + : (! empty($_REQUEST['id']) + ? "doc.Id =" . intval($_REQUEST['id']) + :"doc.Id = 1")) . " + LIMIT 1 + "); + + if ($this->curentdoc = $sql->FetchRow()) + { + if ($this->curentdoc->rubric_tmpl_id != 0) + { + $this->curentdoc->rubric_template = (($this->curentdoc->template != '') + ? $this->curentdoc->template + : $this->curentdoc->rubric_template); + + unset($this->curentdoc->template); + } + + // Глобальные переменные + $_GET['id'] = $_REQUEST['id'] = $this->curentdoc->Id; + $_GET['doc'] = $_REQUEST['doc'] = $this->curentdoc->document_alias; + + // Назначаем язык пользователю, в завивисомтси от языка документа + if ($this->curentdoc->Id != PAGE_NOT_FOUND_ID OR $this->curentdoc->document_lang == '--') + $_SESSION['user_language'] = $this->curentdoc->document_lang; + + // Перенаправление на адреса с суффиксом + if ( + $test_url !== $get_url . URL_SUFF + && ! $pages && $test_url + && ! $_REQUEST['print'] + && ! $_REQUEST['module'] + && ! $_REQUEST['tag'] + && REWRITE_MODE + ) + { + header('HTTP/1.1 301 Moved Permanently'); + if ($this->curentdoc->Id == 1) + { + header('Location:' . ABS_PATH); + exit(); + } + else + { + header('Location:' . ABS_PATH . $get_url . URL_SUFF); + exit(); + } + } + } + else + { + $redirect_alias = $AVE_DB->Query(" + SELECT + a.document_alias + FROM + ".PREFIX."_document_alias_history AS h, + ".PREFIX."_documents AS a + WHERE + h.document_id = a.Id + AND + h.document_alias = '" . $get_url . "' + ")->GetCell(); + + if(! empty($redirect_alias)) + { + header('HTTP/1.1 301 Moved Permanently'); + header('Location:' . ABS_PATH . $redirect_alias . URL_SUFF); + exit(); + } + + if(! (! empty($_REQUEST['sysblock']) || ! empty($_REQUEST['module']) || ! empty($_REQUEST['request']))) + $_GET['id'] = $_REQUEST['id'] = PAGE_NOT_FOUND_ID; + } + } +} + +?> diff --git a/class/class.database.php b/class/class.database.php new file mode 100755 index 0000000..02e2313 --- /dev/null +++ b/class/class.database.php @@ -0,0 +1,1151 @@ +_result = $_result; + } + + + /** + * Метод, предназначенный для обработки результата запроса. + * Возвращает как ассоциативный, так и численный массив. + * + * @return array + */ + public function FetchArray() + { + if (is_array($this->_result)) + { + $a = current($this->_result); + + next($this->_result); + + $b = array(); + + if (! is_array($a)) + return false; + + foreach($a as $k => $v) + $b[] = $v; + + return array_merge($b, $a); + } + + return mysqli_fetch_array($this->_result); + } + + + /** + * Метод, предназначенный для обработки результата запроса. + * Возвращает только ассоциативный массив. + * + * @return array + */ + public function FetchAssocArray() + { + if (is_array($this->_result)) + { + $a = current($this->_result); + + next($this->_result); + + return $a; + } + + return mysqli_fetch_assoc($this->_result); + } + + + /** + * Метод, предназначенный для обработки результата запроса, возвращая данные в виде объекта. + * + * @return object + */ + public function FetchRow() + { + if (is_array($this->_result)) + { + $a = $this->FetchAssocArray(); + + return array2object($a); + } + + return mysqli_fetch_object($this->_result); + } + + + /** + * Метод, предназначенный для возвращения данных результата запроса + * + * @return mixed + */ + public function GetCell() + { + if (is_array($this->_result)) + { + $a = current($this->_result); + + if (is_array($a)) + return current($a); + else + return false; + } + + if ($this->NumRows()) + { + $a = mysqli_fetch_row($this->_result); + return $a[0]; + } + + return false; + } + + /** + * Метод, предназначенный для перемещения внутреннего указателя в результате запроса + * + * @param int $id - номер ряда результатов запроса + * @return bool + */ + public function DataSeek($id = 0) + { + if(is_array($this->_result)) + { + //не нашел как переместить указатель в массиве на конкретный + reset($this->_result); + + for($x = 0; $x == $id; $x++) + next($this->_result); + + return $id; //эээ а что вернуть то надо было? + } + return mysqli_data_seek($this->_result, $id); + } + + /** + * Метод, предназначенный для получения количества рядов результата запроса + * + * @return int + */ + public function NumRows() + { + if (is_array($this->_result)) + { + return (int)count($this->_result); + } + + return (int)mysqli_num_rows($this->_result); + } + + /** + * Метод, предназначенный для получения количества полей результата запроса + * + * @return int + */ + public function NumFields() + { + if (is_array($this->_result)) + { + $a = current($this->_result); + + return count($a); + } + + return (int)mysqli_num_fields($this->_result); + } + + /** + * Метод, предназначенный для получения названия указанной колонки результата запроса + * + * @param int $i - индекс колонки + * @return string + */ + public function FieldName($i) + { + if(is_array($this->_result)){ + + $a = current($this->_result); + + $b = array_keys($a); + + return($b[$i]); + } + mysqli_field_seek($this->_result, $i); + + $field = mysqli_fetch_field($this->_result); + + return $field->name; + } + + /** + * Метод, предназначенный для освобождения памяти от результата запроса + * + * @return bool + */ + public function Close() + { + if (! is_array($this->_result)) + @mysqli_free_result($this->_result); + + return true; + } + + /** + * Возвращает объект результата _result. + * + * @internal param $void + * @return resource + */ + public function getResult() + { + return $this->_result; + } + + /** + * Удаляем объект + */ + public function __destruct() + { + $this->Close(); + } +} + + +/************************************************************** + * + * Класс, предназначенный для работы непосредственно с MySQL БД + * + **************************************************************/ +class AVE_DB +{ + +/** + * Свойства класса + */ + + /** + * Хост + * + * @var string + */ + protected $db_host; + + /** + * Имя пользователя + * + * @var string + */ + protected $db_user; + + /** + * Пароль + * + * @var string + */ + protected $db_pass; + + /** + * Номер порта + * + * @var int + */ + protected $db_port; + + /** + * Сокет + * + * @var int + */ + protected $db_socket; + + /** + * Имя текущей БД. + * + * @var string + */ + protected $db_name; + + /** + * Префикс БД. + * + * @var string + */ + protected $db_prefix; + + /** + * Стандартный объект соединения сервером MySQL. + * + * @var mysqli + */ + protected $mysqli; + + /** + * Список выполненных запросов + * + * @var array + */ + public $_query_list; + + /** + * Метки времени до и после выполнения SQL-запроса + * + * @var array + */ + public $_time_exec; + + /** + * Последний запрос SQL-запроса + * + * @var array + */ + public $_last_query; + + /** + * Конструктор + * + * @param $db + * + * @throws AVE_DB_Exception + * @return \AVE_DB AVE_DB - объект + */ + private function __construct($db) + { + $this->db_host = $db['dbhost']; + $this->db_user = $db['dbuser']; + $this->db_password = $db['dbpass']; + $this->db_prefix = $db['dbpref']; + + if(!isset($db['dbport'])) + $this->db_port = ini_get ('mysqli.default_port'); + else + $this->db_port = (isset($db['dbport']) ? $db['dbport'] : null); + + if(!isset($db['dbsock'])) + $this->db_socket = ini_get ('mysqli.default_socket'); + else + $this->db_port = (isset($db['dbsock']) ? $db['dbsock'] : null); + + $this->Connect(); + + // Определяем профилирование + if (defined('SQL_PROFILING') && SQL_PROFILING) + { + // mysqli_query($this->mysqli, "QUERY_CACHE_TYPE = OFF"); + // mysqli_query($this->mysqli, "FLUSH TABLES"); + if (mysqli_query($this->mysqli, "SET PROFILING_HISTORY_SIZE = 100")) + { + mysqli_query($this->mysqli,"SET PROFILING = 1"); + } + } + } + + /** + * Устанавливает соеденение с базой данных. + * + * @throws AVE_DB_Exception + * @internal param void + * @return void + */ + private function Connect() + { + if (!is_object($this->mysqli) || !$this->mysqli instanceof mysqli) + { + $this->mysqli = @new mysqli($this->db_host, $this->db_user, $this->db_password, null, $this->db_port, $this->db_socket); + if ($this->mysqli->connect_error) + { + throw new AVE_DB_Exception(__METHOD__ . ': ' . $this->mysqli->connect_error); + } + } + } + + + /** + * Задает набор символов по умолчанию. + * + * @param string $charset + * + * @throws AVE_DB_Exception + * @return AVE_DB + */ + public function setCharset($charset) + { + if (!$this->mysqli->set_charset($charset)) + { + throw new AVE_DB_Exception(__METHOD__ . ': ' . $this->mysqli->error); + } + + return $this; + } + + + /** + * Устанавливает имя используемой СУБД. + * + * @param string $database_name - имя базы данных + * @throws AVE_DB_Exception + * @return AVE_DB + */ + public function setDatabaseName($database_name) + { + if (!$database_name) + { + throw new AVE_DB_Exception(__METHOD__ . ': Не указано имя базы данных'); + } + + $this->db_name = $database_name; + + if (!$this->mysqli->select_db($this->db_name)) + { + throw new AVE_DB_Exception(__METHOD__ . ': ' . $this->mysqli->error); + } + + return $this; + } + + + /** + * Создает инстанс данного класса. + * + * @uses $AVE_DB = AVE_DB::getInstance($server, $username, $password, $port, $socket); + * @param $db + * @return object возвращает инстанс данного класса. + */ + public static function getInstance($db = array()) + { + return new self($db); + } + + + /** + * Возвращает префикс БД. + * + * @param void + * @return string + */ + public function getPrefix() + { + return $this->db_prefix; + } + + + /** + * Возвращает кодировку по умолчанию, установленную для соединения с БД. + * + * @param void + * @return string + */ + public function getCharset() + { + return $this->mysqli->character_set_name(); + } + + + /** + * Возвращает имя текущей БД. + * + * @param void + * @return string + */ + public function getDatabaseName() + { + return $this->db_name; + } + + + /** + * Получает количество рядов, задействованных в предыдущей MySQL-операции. + * Возвращает количество рядов, задействованных в последнем запросе INSERT, UPDATE или DELETE. + * Если последним запросом был DELETE без оператора WHERE, + * все записи таблицы будут удалены, но функция возвратит ноль. + * + * @see mysqli_affected_rows + * @param void + * @return int + */ + public function getAffectedRows() + { + return $this->mysqli->affected_rows; + } + + + /** + * Возвращает последний выполненный MySQL-запрос. + * + * @param void + * @return string + */ + public function getQueryString() + { + return $this->_last_query; + } + + + /** + * Возвращает массив со всеми исполненными SQL-запросами в рамках текущего объекта. + * + * @param void + * @return array + */ + public function getQueries() + { + return $this->_query_list; + } + + + /** + * Возвращает id, сгенерированный предыдущей операцией INSERT. + * + * @see mysqli_insert_id + * @param void + * @return int + */ + public function getLastInsertId() + { + return $this->mysqli->insert_id; + } + + + /** + * Метод, предназначенный для возвращения ID записи, сгенерированной при последнем INSERT-запросе + * + * @return int + */ + public function InsertId() + { + return (int)mysqli_insert_id($this->mysqli); + } + + + /** + * Метод, предназначенный для получения функции из которой пришел запрос с ошибкой + * + * @return string + */ + public function getCaller() + { + if (! function_exists('debug_backtrace')) return ''; + + $stack = debug_backtrace(); + $stack = array_reverse($stack); + + $caller = array(); + + foreach ((array)$stack as $call) + { + if (@$call['class'] == __CLASS__) continue; + + $function = $call['function']; + + if (isset($call['class'])) + { + $function = $call['class'] . "->$function"; + } + $caller[] = + (array ( + 'call_file' => (isset($call['file']) ? $call['file'] : 'Unknown'), + 'call_func' => $function, + 'call_line' => (isset($call['line']) ? $call['line'] : 'Unknown') + )); + } + + return $caller; + } + + +/************************* Внешние методы класса *************************/ + + /** + * Метод, предназначенный для выполнения запроса к MySQL + * + * @param string $query - текст SQL-запроса + * @param bool $log - записать ошибки в лог? по умолчанию включено + * @return object/bool - объект с указателем на результат выполнения запроса + */ + public function Real_Query($query, $log = true) + { + $result = @mysqli_query($this->mysqli, $query); + + // Запоминаем последний запрос + $this->_last_query = $query; + + // Если стоит в настройках, запоминать все запросы + if (SQL_PROFILING) + { + $this->_query_list[] = $query; + } + + // Если нет результата и стоит выводить логи, выводим лог ошибки + if (! $result && $log) + $this->_error('query', $query); + + if (is_object($result) && $result instanceof mysqli_result) + { + return new AVE_DB_Result($result); + } + + return $result; + } + + + /** + * Метод, предназначенный для выполнения запроса к MySQL и возвращение результата в виде асоциативного массива с поддержкой кеша + * + * @param string $query - текст SQL-запроса + * @param integer $TTL - время жизни кеша (-1 безусловный кеш) + * @param string $cache_id - Id файла кеша + * @param bool $log - записать ошибки в лог? по умолчанию включено + * @return array - асоциативный массив с результом запроса + */ + public function Query($query, $TTL = null, $cache_id = '', $log = true) + { + if (substr($cache_id, 0, 3) == 'doc') + { + $cache_id = (int)str_replace('doc_', '', $cache_id); + $cache_id = 'doc/' . (floor($cache_id / 1000)) . '/' . $cache_id; + } + + //$query = filter_var($query, FILTER_SANITIZE_STRING); + + $result = array(); + + $TTL = strtoupper(substr(trim($query), 0, 6)) == 'SELECT' ? $TTL : null; +/* + // Не знаю кто поставил эту заглушку, но я выкл ее + if (defined('ACP')) $TTL = null; +*/ + if ($TTL && $TTL != "nocache") + { + $cache_file = md5($query); + + $cache_dir = BASE_DIR . '/cache/sql/' . (trim($cache_id) > '' ? trim($cache_id) . '/' : substr($cache_file, 0, 2) . '/' . substr($cache_file, 2, 2) . '/' . substr($cache_file, 4, 2) . '/'); + + if(! file_exists($cache_dir)) + mkdir($cache_dir, 0777, true); + + if(! (file_exists($cache_dir . $cache_file) && ($TTL == -1 ? true : @time() - @filemtime($cache_dir . $cache_file) < $TTL))) + { + $res = $this->Real_Query($query, $log); + + while ($mfa = $res->FetchAssocArray()) + $result[] = $mfa; + + file_put_contents($cache_dir . $cache_file, serialize($result)); + } + else + { + $result = unserialize(file_get_contents($cache_dir . $cache_file)); + } + + return new AVE_DB_Result($result); + } + + else + return $this->Real_Query($query, $log); + } + + /** + * This method is needed for prepared statements. They require + * the data type of the field to be bound with "i" s", etc. + * This function takes the input, determines what type it is, + * and then updates the param_type. + * + * @param mixed $item Input to determine the type. + * + * @return string The joined parameter types. + */ + protected function DetermineType($item) + { + switch (gettype($item)) + { + case 'NULL': + case 'string': + return 's'; + break; + + case 'boolean': + case 'integer': + return 'i'; + break; + + case 'blob': + return 'b'; + break; + + case 'double': + return 'd'; + break; + } + return ''; + } + + /** + * Метод, предназначенный для экранирования специальных символов в строках для использования в выражениях SQL + * + * @param mixed $value - обрабатываемое значение + * @return mixed + */ + public function Escape($value) + { + if (! is_numeric($value)) + { + $value = mysqli_real_escape_string($this->mysqli, $value); + } + + return $value; + } + + /** + * Метод, предназначенный для экранирования специальных символов в строках для использования в выражениях SQL + * + * @param mixed $value - обрабатываемое значение + * @return mixed - возвращает строку запроса вычещенной + */ + public function EscStr($value) + { + $value = htmlspecialchars($value); + + $value = strtr($value, array( + '{' => '{', + '}' => '}', + '$' => '$', + '&gt;' => '>', + "'" => "'" + )); + + if (! is_array($value)) + { + $value = $this->mysqli->real_escape_string($value); + } + else + { + $value = array_map(array($this, 'escape'), $value); + } + + return $value; + } + + + /** + * Метод, предназначенный для возвращения количества всех найденных записей (после запроса) + * + * @return int + */ + public function GetFoundRows() + { + $result = $this->Query('SELECT FOUND_ROWS();'); + $strRow = $result->FetchArray(); + + return (int)$strRow[0]; + } + + + /** + * Метод, предназначенный для возвращения количества всех найденных записей (после запроса типа "SELECT SQL_CALC_FOUND_ROWS * ...") + * + * @param $query + * @param null $TTL + * @param string $cache_id + * @return int + */ + public function NumAllRows($query, $TTL = null, $cache_id = '') + { + if ($TTL) + { + $cache_file = md5($query).'.count'; + + $cache_dir = BASE_DIR.'/cache/sql/'.(trim($cache_id) > '' + ? trim($cache_id).'/' + : substr($cache_file, 0, 2).'/'.substr($cache_file, 2, 2).'/'.substr($cache_file, 4, 2).'/'); + + if (! file_exists($cache_dir)) + mkdir($cache_dir, 0777, true); + + if (! (file_exists($cache_dir.$cache_file) && ($TTL==-1 ? true : @time()-@filemtime($cache_dir.$cache_file) < $TTL))) + { + if ($query <> $this->_last_query) + { + $res = $this->Real_Query($query); + } + else + { + $res = (int)$this->Query("SELECT FOUND_ROWS()")->GetCell(); + file_put_contents($cache_dir . $cache_file, $res); + } + + return $res; + } + else + { + return file_get_contents($cache_dir . $cache_file); + } + } + + return (int)$this->Query("SELECT FOUND_ROWS()")->GetCell(); + } + + + /** + * Метод, предназначенный для формирования статистики выполнения SQL-запросов. + * + * @param string $type - тип запрашиваемой статистики + *
      +	 * Возможные значения:
      +	 *     list  - список выполненых зпаросов
      +	 *     time  - время исполнения зпросов
      +	 *     count - количество выполненных запросов
      +	 * 
      + * @return mixed + */ + public function DBStatisticGet($type = '') + { + switch ($type) + { + case 'list': + list($s_dec, $s_sec) = explode(' ', $GLOBALS['start_time']); + + $query_list = ''; + + $nq = 0; + + //$time_exec = 0; + $arr = $this->_time_exec; + + $co = sizeof($arr); + + for ($it = 0; $it < $co;) + { + list($a_dec, $a_sec) = explode(' ', $arr[$it++]); + list($b_dec, $b_sec) = explode(' ', $arr[$it++]); + + $time_main = ($a_sec - $s_sec + $a_dec - $s_dec)*1000; + $time_exec = ($b_sec - $a_sec + $b_dec - $a_dec)*1000; + + $query = sizeof(array_keys($this->_query_list, $this->_query_list[$nq])) > 1 + ? "" . $this->_query_list[$nq++] . "" + : $this->_query_list[$nq++]; + + $query_list .= (($time_exec > 1) ? "
    15. (" : "
    16. (") + . round($time_main) . " ms) " . $time_exec . " ms " . $query . "
    17. \n"; + } + + return $query_list; + break; + + case 'time': + $arr = $this->_time_exec; + + $time_exec = 0; + + $co = sizeof($arr); + + for ($it = 0; $it < $co;) + { + list($a_dec, $a_sec) = explode(" ", $arr[$it++]); + list($b_dec, $b_sec) = explode(" ", $arr[$it++]); + + $time_exec += $b_sec - $a_sec + $b_dec - $a_dec; + } + + return $time_exec; + break; + + case 'count': + return sizeof($this->_query_list); + break; + + default: + return ''; + break; + } + } + + + /** + * Метод, предназначенный для формирования статистики выполнения SQL-запросов. + * + * @param string $type - тип запрашиваемой статистики + *
      +	 * Возможные значения:
      +	 *     list  - список выполненых зпаросов
      +	 *     time  - время исполнения зпросов
      +	 *     count - количество выполненных запросов
      +	 * 
      + * @return mixed + */ + public function DBProfilesGet($type = '') + { + static $result, $list, $time, $count; + + if (! defined('SQL_PROFILING') OR ! SQL_PROFILING) + return false; + + if (! $result) + { + $list = "" + . "\n\t\n\t"; + + $result = mysqli_query($this->mysqli, "SHOW PROFILES"); + + while (list($qid, $qtime, $qstring) = @mysqli_fetch_row($result)) + { + $time += $qtime; + + $qstring = preg_replace('/\t+/', '', $qstring); + + $list .= "\n\t\n\t\t\n\t\t\n\t\t\n\t"; + + $res = mysqli_query($this->mysqli, " + SELECT + STATE, + FORMAT(DURATION, 6) AS DURATION + FROM + INFORMATION_SCHEMA.PROFILING + WHERE + QUERY_ID = " . $qid + ); + + while (list($state, $duration) = @mysqli_fetch_row($res)) + { + $list .= "\n\t\n\t\t\n\t\t\n\t"; + } + } + + $time = number_format($time * 1, 6, ',', ''); + $list .= "\n
      " + . $qid + . "" + . number_format($qtime * 1, 6, ',', '') + . "" + . $qstring + . "
       " + . number_format($duration * 1, 6, ',', '') + . "" . $state . "
      "; + $count = @mysqli_num_rows($result); + } + + switch ($type) + { + case 'list': return $list; break; + case 'time': return $time; break; + case 'count': return $count; break; + } + + return false; + } + + + /** + * Закрывает MySQL-соединение. + * + * @param void + * @return AVE_DB + */ + public function Close() + { + if (is_object($this->mysqli) && $this->mysqli instanceof mysqli) + { + @$this->mysqli->close(); + } + + return $this; + } + + + /** + * Метод, предназначенный для обработки ошибок + * + * @param string $type - тип ошибки (при подключении к БД или при выполнении SQL-запроса) + * @param string $query - текст SQL запроса вызвавшего ошибку + * @access private + */ + public function _error($type, $query = '') + { + + + if ($type != 'query') + { + display_notice('Error ' . $type . ' MySQL database.'); + } + else + { + $my_error = mysqli_error($this->mysqli); + + $log = array( + 'sql_error' => $my_error, + 'sql_query' => htmlentities(stripslashes($query), ENT_QUOTES), + 'caller' => $this->getCaller(), + 'url' => HOST . $_SERVER['SCRIPT_NAME']. '?' . $_SERVER['QUERY_STRING'] + ); + + reportSqlLog($log); + + // Если в настройках системы установлен параметр на отправку сообщений на e-mail, тогда + if (SEND_SQL_ERROR) + { + // Формируем текст сообщения с ошибкой + $mail_body = ( + 'SQL ERROR: ' . $my_error . PHP_EOL + . 'TIME: ' . date('d-m-Y, H:i:s') . PHP_EOL + . 'URL: ' . HOST . $_SERVER['SCRIPT_NAME'] + . '?' . $_SERVER['QUERY_STRING'] . PHP_EOL + . $this->getCaller() . PHP_EOL + . 'QUERY: ' . stripslashes($query) . PHP_EOL + ); + + // Отправляем сообщение + send_mail( + get_settings('mail_from'), + $mail_body, + 'MySQL Error!', + get_settings('mail_from'), + get_settings('mail_from_name'), + 'text' + ); + } + } + } + + + /** + * Удаляем объект + * + * @param void + */ + public function __destruct() + { + $this->Close(); + } + + + /** + * Метод, предназначенный для получения информации о сервере MySQL + * + * @param void + * @return string + */ + public function mysql_version() + { + return @mysqli_get_server_info($this->mysqli); + } + + + /** + * Метод, предназначенный для очищения кеша документов + * + * @param $cache_id + * @return bool + */ + public function clearcache($cache_id) + { + $cache_id = (substr($cache_id, 0, 3) == 'doc' + ? 'doc/' . intval(floor((int)substr($cache_id, 4)) / 1000) . '/' . (int)substr($cache_id, 4) + : $cache_id); + + $cache_dir = BASE_DIR . '/cache/sql/' . (trim($cache_id) > '' + ? trim($cache_id) . '/' + : ''); + + return rrmdir($cache_dir); + } + + + /** + * Метод, предназначенный для очищения кеша запросов + * + * @param $cache_id + * @return bool + */ + public function clearcacherequest($cache_id) + { + $cache_id = (substr($cache_id, 0, 3) == 'doc' + ? 'request/' . (int)substr($cache_id, 4) + : $cache_id); + + $cache_dir = BASE_DIR . '/cache/sql/' . (trim($cache_id) > '' + ? trim($cache_id) . '/' + : ''); + + return rrmdir($cache_dir); + } + + + /** + * Метод, предназначенный для очищения кеша шаблонов + * + * @param $cache_id + * @return bool + */ + public function clearcompile($cache_id) + { + $cache_id = (substr($cache_id, 0, 3) == 'doc' + ? 'compiled/' . intval(floor((int)substr($cache_id, 4)) / 1000) . '/' . (int)substr($cache_id, 4) + : $cache_id); + + $cache_dir = BASE_DIR . '/cache/sql/' . (trim($cache_id) > '' + ? trim($cache_id) . '/' + : ''); + + return rrmdir($cache_dir); + } + +} // End AVE_DB class +?> \ No newline at end of file diff --git a/class/class.dbdump.php b/class/class.dbdump.php new file mode 100644 index 0000000..59c6ab3 --- /dev/null +++ b/class/class.dbdump.php @@ -0,0 +1,641 @@ +_database_dump = ''; + + // Циклически обрабатываем каждую таблицу + foreach ($_REQUEST['ta'] as $table) + { + if (! DB_EXPORT_PREFIX) + $table_export = preg_replace('/^' . PREFIX . '/', '%%PRFX%%', $table); + + // Если таблица имеет корректный префикс + if (preg_match('/^' . preg_quote(PREFIX) . '_/', $table)) + { + $row = $AVE_DB->Query("SHOW CREATE TABLE " . $table)->FetchArray(); + // Сохраняем CREATE и DROP запросы + $this->_database_dump .= "DROP TABLE IF EXISTS `" . (! DB_EXPORT_PREFIX ? $table_export : $table) . "`;" . $this->_delimiter . "\n"; + + $this->_database_dump .= $row[1] . ";" . $this->_delimiter . "\n\n"; + + $nums = 0; + + // Получаем данные, которые в дальнейшем будут вставлены в INSERT запросы. + $sql = $AVE_DB->Query('SELECT * FROM `' . $table . '`'); + + while ($row = $sql->FetchArray()) + { + if ($nums == 0) + { + $nums = $sql->NumFields(); + + $temp_array = array(); + + for ($i = 0; $i < $nums; $i++) + { + $temp_array[] = $sql->FieldName($i); + } + + $table_list = '(`' . implode('`, `', $temp_array) . '`)'; + } + + $temp_array = array(); + + for ($i=0; $i<$nums; $i++) + { + if (! isset($row[$i])) + { + $temp_array[] = 'NULL'; + } + elseif ($row[$i] != '') + { + $temp_array[] = "'" . str_replace($search, $replace, addslashes($row[$i])) . "'"; + } + else + { + $temp_array[] = "''"; + } + } + + // Сохряняем INSERT запросы + $this->_database_dump .= 'INSERT INTO `' . (! DB_EXPORT_PREFIX ? $table_export : $table) . '` ' . $table_list . ' VALUES (' . implode(', ', $temp_array) . ");" . $this->_delimiter . "\n"; + } + + $this->_database_dump .= "\n"; + + $sql->Close(); + } + } + + return ! empty($this->_database_dump); + } + + + /** + * Метод, предназначенный для формирования файла дампа базы данных + * + * @return boolean + */ + function _databaseTopDumpCreate() + { + global $AVE_DB; + + $dbtables = array(); + + $sql = $AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_%'"); + + while ($row = $sql->FetchArray()) + { + array_push($dbtables, $row[0]); + } + + $search = array("\x00", "\x0a", "\x0d", "\x1a"); + $replace = array('\0', '\n', '\r', '\Z'); + + $this->_database_dump = ''; + + // Циклически обрабатываем каждую таблицу + foreach ($dbtables as $table) + { + if (! DB_EXPORT_PREFIX) + $table_export = preg_replace('/^' . PREFIX . '/', '%%PRFX%%', $table); + + // Если таблица имеет корректный префикс + if (preg_match('/^' . preg_quote(PREFIX) . '_/', $table)) + { + $row = $AVE_DB->Query("SHOW CREATE TABLE " . $table)->FetchArray(); + + // Сохраняем CREATE и DROP запросы + $this->_database_dump .= "DROP TABLE IF EXISTS `" . (! DB_EXPORT_PREFIX ? $table_export : $table) . "`;" . $this->_delimiter . "\n"; + $this->_database_dump .= $row[1] . ";" . $this->_delimiter . "\n\n"; + + $nums = 0; + + // Получаем данные, которые в дальнейшем будут вставлены в INSERT запросы. + $sql = $AVE_DB->Query('SELECT * FROM `' . $table . '`'); + + while ($row = $sql->FetchArray()) + { + if ($nums==0) + { + $nums = $sql->NumFields(); + + $temp_array = array(); + for ($i=0; $i<$nums; $i++) + { + $temp_array[] = $sql->FieldName($i); + } + $table_list = '(`' . implode('`, `', $temp_array) . '`)'; + } + + $temp_array = array(); + + for ($i=0; $i<$nums; $i++) + { + if (!isset($row[$i])) + { + $temp_array[] = 'NULL'; + } + elseif ($row[$i] != '') + { + $temp_array[] = "'" . str_replace($search, $replace, addslashes($row[$i])) . "'"; + } + else + { + $temp_array[] = "''"; + } + } + + // Сохряняем INSERT запросы + $this->_database_dump .= 'INSERT INTO `' . (! DB_EXPORT_PREFIX ? $table_export : $table) . '` ' . $table_list . ' VALUES (' . implode(', ', $temp_array) . ");" . $this->_delimiter . "\n"; + } + + $this->_database_dump .= "\n"; + + $sql->Close(); + } + } + + return ! empty($this->_database_dump); + } + + +/** + * Внешние методы класса + */ + + /** + * Метод, предназначенный для сохранения файла дампа базы данных на жеский диск + * + */ + function databaseDumpExport($top = 0, $exit = 0) + { + global $AVE_Template; + + // Если дамп не удалось создать, тогда завершаем работу + if ($top) + { + if (! $this->_databaseTopDumpCreate()) + exit; + } + else + { + if (! $this->_databaseDumpCreate()) + exit; + } + + // Готовим шаблон имени файла + $file_name = preg_replace_ru(array("/%SERVER%/", "/%DATE%/", "/%TIME%/"), array($_SERVER['SERVER_NAME'], date('d.m.y'), date('H.i.s')), DB_EXPORT_TPL); + + $dump = (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ + ? gzencode($this->_database_dump) + : $this->_database_dump); + + if (isset($_REQUEST['server']) && $_REQUEST['server'] == 1) + { + if(! is_dir(BASE_DIR . '/backup/')) + { + @mkdir(BASE_DIR . '/backup/', 0777); + write_htaccess_deny(BASE_DIR . '/backup/'); + } + + @file_put_contents(BASE_DIR . '/backup/'. $file_name . '.sql'. (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ ? '.gz' : ''), $dump); + + @chmod(BASE_DIR . '/backup/'. $file_name . '.sql', 0777); + + if (! $exit) + header('Location:index.php?do=dbsettings&cp=' . SESSION); + else + return BASE_DIR . '/backup/'. $file_name . '.sql'. (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ ? '.gz' : ''); + } + else + { + // Формируем заголовок + header('Content-Type: text/plain'); + header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + header('Content-Disposition: attachment; filename=' . $file_name . '.sql'. (defined('DB_EXPORT_GZ') && DB_EXPORT_GZ ? '.gz' : '')); + header('Content-Length: ' . strlen($dump)); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + + // Выводим данные + echo $dump; + + $this->_database_dump = ''; + } + + // Выполняем запись системного сообщения в журнал + reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP')); + exit; + } + + + /** + * Метод, предназначенный для сохранения файла дампа базы данных на жеский диск + * + */ + function databaseDumpFileSave($file = '') + { + global $AVE_Template; + + $file = BASE_DIR . '/backup/'. $file; + + // Если дамп не удалось создать, тогда завершаем работу + if (! is_file($file)) + return false; + + header('Content-Description: File Transfer'); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename=' . basename($file)); + header('Content-Transfer-Encoding: binary'); + header('Expires: 0'); + header('Cache-Control: must-revalidate'); + header('Pragma: public'); + header('Content-Length: ' . filesize($file)); + + ob_clean(); + + flush(); + + readfile($file); + + exit; + } + + + /** + * Метод, предназначенный для восстановления базы данных из дампа + * + * @param string $tempdir путь к папке в которую загружается файл дампа + */ + function databaseDumpImport($tempdir) + { + global $AVE_DB, $AVE_Template; + + $insert = false; + + // Если файл не пустой + if ($_FILES['file']['size'] != 0) + { + // Получаем имя файла и его расширение (должно быть sql) + $fupload_name = $_FILES['file']['name']; + $gz = substr($fupload_name, -3)=='.gz'; + $end = substr($fupload_name, -3); + + // Если расширение sql, тогда + if ($gz || $end == 'sql') + { + // Если файл не удалось загрузить, формируем сообщение с ошибкой + if (! @move_uploaded_file($_FILES['file']['tmp_name'], $tempdir . $fupload_name)) + die('Ошибка при загрузке файла!'); + + // Устанавливаем права чтения, записи, выполнения на файл + @chmod($fupload_name, 0777); + + // Определяем флаг готовности к записи данных в БД + $insert = true; + } + else + { + // В противном случае, если расширение файла НЕ sql, формируем сообщение с ошибкой + $AVE_Template->assign('msg', '
    18. Ошибка: ' . $AVE_Template->get_config_vars('MAIN_SQL_FILE_ERROR') . '
    19. '); + } + } + + // Если флаг готовности записи установлен, тогда + if ($insert) + { + // Еще раз провреяем наличие загруженного файла + if ($fupload_name != '' && file_exists($tempdir . $fupload_name)) + { + // Читаем данные из файла + $handle = @fopen($tempdir . $fupload_name, 'r'); + + $db_q = @fread($handle, filesize($tempdir . $fupload_name)); + + fclose($handle); + + if ($gz) + $db_q = gzdecode($db_q); + + $m_ok = 0; + + $m_fail = 0; + + // Формируем массив запросов ориентируясь по разделителю указанному в свойстве _delimiter + $querys = @explode($this->_delimiter, $db_q); + + // Циклически обрабатываем массив, выполняя каждый запрос + foreach ($querys as $val) + { + if (chop($val) != '') + { + $q = str_replace("\n",'',$val); + + $q = $q . ';'; + + if ($AVE_DB->Query($q)) + { + $m_ok++; + } + else + { + $m_fail++; + } + } + } + + // Удаляем файл дампа + @unlink($tempdir . $fupload_name); + + // Формируем сопроводительные сообщения + $msg = '
    20. ' . $AVE_Template->get_config_vars('MAIN_RESTORE_OK') . '

      ' + . $AVE_Template->get_config_vars('MAIN_TABLE_SUCC') + . '' . $m_ok . '
      ' + . $AVE_Template->get_config_vars('MAIN_TABLE_ERROR') + . '' . $m_fail . '
    21. '; + + $AVE_Template->assign('msg', $msg); + } + else // В противном случае, если файл не найден, формируем сообщение с ошибкой + { + $AVE_Template->assign('msg', '
    22. '.$AVE_Template->get_config_vars('DB_REPORT_DUMP_ER').'
    23. '); + } + } + + // Выполняем запись системного сообщения в журнал + reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP_RECOVER')); + } + + /** + * Метод, предназначенный для удаления файла дампа на сервере + * + * @param string $file путь к файлу дампа + */ + function databaseDumpFileDelete($file = '') + { + global $AVE_DB, $AVE_Template; + + $file = BASE_DIR . '/backup/'. $file; + + if (! is_file($file)) + return false; + + if (@unlink($file)) + { + reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP_DEL_OK') . ' ('.basename($file).')'); + } + else + { + reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP_DEL_ER') . ' ('.basename($file).')'); + } + + header('Location:index.php?do=dbsettings&cp=' . SESSION); + } + + /** + * Метод, предназначенный для восстановления базы данных из дампа на сервере + * + * @param string $file путь к файлу дампа + */ + function databaseDumpFileImport($file = '') + { + global $AVE_DB, $AVE_Template; + + $insert = false; + + $file = BASE_DIR . '/backup/'. $file; + + // Если дамп не удалось создать, тогда завершаем работу + if (! is_file($file)) $insert = false; + + // Если файл не пустой + if (filesize($file) != 0) + { + // Получаем имя файла и его расширение (должно быть sql) + $file_name = basename($file); + $gz = substr($file_name, -3)=='.gz'; + $end = substr($file_name, -3); + + // Если расширение sql, тогда + if ($gz || $end == 'sql') + { + // Определяем флаг готовности к записи данных в БД + $insert = true; + } + else + { + // В противном случае, если расширение файла НЕ sql, формируем сообщение с ошибкой + $AVE_Template->assign('msg', '
    24. Ошибка: ' . $AVE_Template->get_config_vars('MAIN_SQL_FILE_ERROR') . '
    25. '); + } + } + + // Если флаг готовности записи установлен, тогда + if ($insert) + { + // Еще раз провреяем наличие загруженного файла + if ($file_name != '' && file_exists($file)) + { + // Читаем данные из файла + $handle = @fopen($file, 'r'); + + $db_q = @fread($handle, filesize($file)); + + fclose($handle); + + if($gz)$db_q=gzdecode($db_q); + + $m_ok = 0; + + $m_fail = 0; + + // Формируем массив запросов ориентируясь по разделителю указанному в свойстве _delimiter + $querys = @explode($this->_delimiter, $db_q); + + // Циклически обрабатываем массив, выполняя каждый запрос + foreach ($querys as $val) + { + if (chop($val) != '') + { + $q = str_replace("\n",'',$val); + + $q = $q . ';'; + + @$q = str_replace('%%PRFX%%', PREFIX, $q); + + if ($AVE_DB->Query($q)) + { + $m_ok++; + } + else + { + $m_fail++; + } + } + } + + // Формируем сопроводительные сообщения + $msg = '
    26. ' . $AVE_Template->get_config_vars('MAIN_RESTORE_OK') . '

      ' + . $AVE_Template->get_config_vars('MAIN_TABLE_SUCC') + . '' . $m_ok . '
      ' + . $AVE_Template->get_config_vars('MAIN_TABLE_ERROR') + . '' . $m_fail . '
    27. '; + + $AVE_Template->assign('msg', $msg); + } + else // В противном случае, если файл не найден, формируем сообщение с ошибкой + { + $AVE_Template->assign('msg', '
    28. '.$AVE_Template->get_config_vars('DB_REPORT_DUMP_ER').'
    29. '); + } + } + + // Выполняем запись системного сообщения в журнал + reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP_RECOVER') . ' ('.$file_name.')'); + } + + /** + * Метод, предназначенный для оптимизации таблиц базы данных + * + */ + function databaseTableOptimize() + { + global $AVE_DB, $AVE_Template; + + if (! empty($_POST['ta']) && is_array($_POST['ta'])) + { + // Выполняем запрос на оптимизацию + $AVE_DB->Query("OPTIMIZE TABLE `" . implode("`, `", $_POST['ta']) . "`"); + + // Выполняем запись системного сообщения в журнал + reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP_OPTIM')); + } + } + + /** + * Метод, предназначенный для восстановления повреждённых таблиц базы данных + * + */ + function databaseTableRepair() + { + global $AVE_DB, $AVE_Template; + + if (! empty($_POST['ta']) && is_array($_POST['ta'])) + { + // Выполняем запрос на восстановление + $AVE_DB->Query("REPAIR TABLE `" . implode("`, `", $_POST['ta']) . "`"); + + // Выполняем запись системного сообщения в журнал + reportLog($AVE_Template->get_config_vars('DB_REPORT_DUMP_TABLE')); + } + } + + /** + * Метод, предназначенный для формирования списка всех таблиц в БД + * + * @return string + */ + function databaseTableGet() + { + global $AVE_DB; + + $tables = ''; + + // Получаем список всех таблиц, которые имею префикс, указанный в конфигурации системы + $sql = $AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_%'"); + + while ($row = $sql->FetchArray()) + { + $tables .= ''; + } + + $sql->Close(); + + // Возвращаем полученный список + return $tables; + } + + /** + * Метод, предназначенный для вывода всех sql файлов в папке backup + * + * @return string + */ + function databaseFilesGet() + { + $dir = BASE_DIR . '/backup/'; + + if($handle = opendir($dir)) + { + $files = array(); + + while (false !== ($file = readdir($handle))) + { + if ($file != "." && $file != ".." && (substr($file, -3) == 'sql' || substr($file, -2) == 'gz')) + { + if(is_file($dir . '/' . $file)) + { + $files[] = array( + 'name' => $file, + 'data' => (filectime($dir . '/' . $file)), + 'size' => (filesize($dir . '/' . $file)) + ); + } + } + } + closedir($handle); + } + + return msort($files, 'data', null, SORT_DESC); + } +} +?> \ No newline at end of file diff --git a/class/class.debug.php b/class/class.debug.php new file mode 100644 index 0000000..0c67029 --- /dev/null +++ b/class/class.debug.php @@ -0,0 +1,478 @@ +(\s+|\s$)/', ' => ', $var_dump); + + $var_dump = htmlspecialchars($var_dump); + + $var_dump = preg_replace('/(=> )+([a-zA-Z]+\(\d+\))/', '$1$2', $var_dump); + + ob_end_clean(); + + $fn_name = ! empty($name) + ? $name[1] + : 'EVAL'; + + $var_dump = ' +
      +
      + var_dump(' . trim($fn_name) . ') - ' . self::_trace() . + '
      +
      '
      +					. $var_dump .
      +					'
      +
      + '; + + echo $var_dump; + + if ($exit) exit; + } + + + /** + * Функция для вывода переменной (для отладки) + * + * @param mixed $var любая переменная + */ + public static function _print($var, $exit = false) + { + $backtrace = debug_backtrace(); + + $backtrace = $backtrace[0]; + + if (preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'])) + { + $file = preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'], $match); + $file = $match[1]; + } + + $fh = fopen((isset($file) ? $file : $backtrace['file']), 'r'); + + $line = 0; + + while (++$line <= $backtrace['line']) + { + $code = fgets($fh); + } + + fclose($fh); + + preg_match('/' . __FUNCTION__ . '\s*\((.*)\)\s*;/u', $code, $name); + + ob_start(); + + print_r($var); + + $var_dump = htmlspecialchars(ob_get_contents()); + + $var_dump = preg_replace('/(=>)/', '$1', $var_dump); + + ob_end_clean(); + + $fn_name = !empty($name) + ? $name[1] + : 'EVAL'; + + $var_dump = ' +
      +
      + print_r(' . trim($fn_name) . ') - ' . self::_trace() . + '
      +
      '
      +					. $var_dump .
      +					'
      +
      + '; + + echo $var_dump; + + if ($exit) exit; + } + + + /** + * Функция для вывода переменной (для экспорта) + * + * @param mixed $var любая переменная + */ + public static function _exp($var, $exit = false) + { + $backtrace = debug_backtrace(); + + $backtrace = $backtrace[0]; + + if (preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'])) + { + $file = preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'], $match); + $file = $match[1]; + } + + $fh = fopen((isset($file) ? $file : $backtrace['file']), 'r'); + + $line = 0; + + while (++$line <= $backtrace['line']) + { + $code = fgets($fh); + } + + fclose($fh); + + preg_match('/' . __FUNCTION__ . '\s*\((.*)\)\s*;/u', $code, $name); + + ob_start(); + + var_export($var); + + $fn_name = !empty($name) + ? $name[1] + : 'EVAL'; + + $var_export = htmlspecialchars(ob_get_contents()); + + $var_export = preg_replace('/(=>)/', '$1', $var_export); + + ob_end_clean(); + + $var_dump = ' +
      +
      var_export(' + . trim($fn_name) . ') - ' . self::_trace() . + '
      +
      '
      +						. $var_export .
      +					'
      +
      + '; + + echo $var_dump; + + if ($exit) exit; + } + + + /** + * Функция для вывода переменной (для отладки) + * + * @param mixed $var любая переменная + * @param bool $exit true - остановливает дальнейшее выполнение скрипта, false - продолжает выполнять скрипт + */ + public static function _html($var, $exit = false) + { + $backtrace = debug_backtrace(); + + $backtrace = $backtrace[0]; + + if (preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'])) + { + $file = preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'], $match); + $file = $match[1]; + } + + $fh = fopen((isset($file) ? $file : $backtrace['file']), 'r'); + + $line = 0; + + while (++$line <= $backtrace['line']) + { + $code = fgets($fh); + } + + fclose($fh); + + preg_match('/' . __FUNCTION__ . '\s*\((.*)\)\s*;/u', $code, $name); + + ob_start(); + + var_export($var); + + $fn_name = !empty($name) + ? $name[1] + : 'EVAL'; + + $var_dump = ob_get_contents(); + + ob_end_clean(); + + $var_dump = ' +
      +
      var_export(' + . trim($fn_name) . ') - ' . self::_trace() . + '
      +
      '
      +						. htmlentities($var_dump, ENT_QUOTES) .
      +					'
      +
      + '; + + echo $var_dump; + + if ($exit) exit; + } + + + + /** + * Функция для записи переменной в файл (для отладки) + * + * @param mixed $var любая переменная + * @param bool $exit true - остановливает дальнейшее выполнение скрипта, false - продолжает выполнять скрипт + */ + public static function _dump($var, $append = true, $exit = false) + { + $backtrace = debug_backtrace(); + + $backtrace = $backtrace[0]; + + if (preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'])) + { + $file = preg_match('/([^\(]*)\((.*)\)/i', $backtrace['file'], $match); + $file = $match[1]; + } + + $fh = fopen((isset($file) ? $file : $backtrace['file']), 'r'); + + $line = 0; + + while (++$line <= $backtrace['line']) + { + $code = fgets($fh); + } + + fclose($fh); + + preg_match('/' . __FUNCTION__ . '\s*\((.*)\)\s*;/u', $code, $name); + + ob_start(); + + var_dump($var); + + $var_dump = ob_get_contents(); + + $var_dump = preg_replace('/=>(\s+|\s$)/', ' => ', $var_dump); + + $var_dump = htmlspecialchars($var_dump); + + $var_dump = preg_replace('/(=> )+([a-zA-Z]+\(\d+\))/', '$1$2', $var_dump); + + ob_end_clean(); + + $fn_name = ! empty($name) + ? $name[1] + : 'EVAL'; + + $var_dump = ' +
      +
      + ' . date("j F Y, H:i:s") . ' - var_dump(' . trim($fn_name) . ') - ' . self::_trace() . + '
      +
      '
      +					. $var_dump .
      +					'
      +
      + '; + + if ($append) + file_put_contents(BASE_DIR . '/debug.html', $var_dump, FILE_APPEND); + else + file_put_contents(BASE_DIR . '/debug.html', $var_dump); + + if ($exit) + exit; + } + + + /** + * Функция для трейсинга дебаггера + * + * @param + * @return string + */ + public static function _trace() + { + $bt = debug_backtrace(); + + $trace = $bt[1]; + + $line = $trace['line']; + + $file = $trace['file']; + + $function = $trace['function']; + + $class = (isset($bt[2]['class']) + ? $bt[2]['class'] + : 'None'); + + if (isset($bt[2]['class'])) + { + $type = $bt[2]['type']; + } + else + { + $type = 'Unknow'; + } + + $function = isset($bt[2]['function']) + ? $bt[2]['function'] + : 'None'; + + return sprintf('Class: %s | Type: %s | Function: %s | File: %s line %s', $class, $type, $function, $file, $line); + } + + /** + * Функция отвечает за начало таймера + * + * @param string $name любая переменная (ключ массива) + */ + public static function startTime($name = '') + { + Debug::$time[$name] = microtime(true); + } + + /** + * Функция отвечает за окончание таймера + * + * @param string $name любая переменная (ключ массива) + * @return + */ + public static function endTime($name = '') + { + if (isset(Debug::$time[$name])) + return sprintf("%01.4f", microtime(true) - Debug::$time[$name]) . ' sec'; + } + + /** + * Функция отвечает за начало подсчета используеой памяти + * + * @param string $name любая переменная (ключ массива) + */ + public static function startMemory($name = '') + { + Debug::$memory[$name] = memory_get_usage(); + } + + /** + * Функция отвечает за окончание подсчета используемой памяти + * + * @param string $name любая переменная (ключ массива) + * @return string + */ + public static function endMemory($name = '') + { + if (isset(Debug::$memory[$name])) + return Debug::formatSize(memory_get_usage() - Debug::$memory[$name]); + } + + /** + * Форматированный вывод размера + * + * @param int $size размер + * @return string нормированный размер с единицой измерения + */ + public static function formatSize($size) + { + if ($size >= 1073741824) + { + $size = round($size / 1073741824 * 100) / 100 . ' Gb'; + } + elseif ($size >= 1048576) + { + $size = round($size / 1048576 * 100) / 100 . ' Mb'; + } + elseif ($size >= 1024) + { + $size = round($size / 1024 * 100) / 100 . ' Kb'; + } + else + { + $size = $size . ' b'; + } + + return $size; + } + + /** + * Форматированный вывод чисел + * + * @param int $number число + * @param int $decimal + * @param string $after + * @param string $thousand + * @return string + */ + public static function numFormat($number, $decimal = 0, $after = ',', $thousand= '.') + { + if ($number) + return number_format($number, $decimal, $after, $thousand); + + return ''; + } + } +?> \ No newline at end of file diff --git a/class/class.docs.php b/class/class.docs.php new file mode 100755 index 0000000..f4944ad --- /dev/null +++ b/class/class.docs.php @@ -0,0 +1,3929 @@ + 0) + { + $sql_join_field = " + LEFT JOIN + " . PREFIX . "_document_fields AS df1 + ON + doc.Id = df1.document_id + LEFT JOIN + " . PREFIX . "_document_fields_text AS df2 + ON + df1.document_id = df2.document_id + "; + + if ($_REQUEST['field_request'] == 'eq') + { + $sql_where_field = " + AND + (df1.rubric_field_id = '" . (int)$_REQUEST['field_id'] . "' + AND + UPPER(CONCAT_WS('', df1.field_value, NULLIF(df2.field_value, '')) = '" . mb_strtoupper($_REQUEST['field_search']) . "')) + "; + } + else if ($_REQUEST['field_request'] == 'like') + { + $sql_where_field = " + AND + (df1.rubric_field_id = '" . (int)$_REQUEST['field_id'] . "' + AND + UPPER(CONCAT_WS('', df1.field_value, NULLIF(df2.field_value, '')) LIKE '%" . mb_strtoupper($_REQUEST['field_search']) . "%')) + "; + } + + $field_link = '&field_id=' . (int)$_REQUEST['field_id'] . '&field_request=' . $_REQUEST['field_request'] . '&field_search=' . $_REQUEST['field_search']; + } + + // Если в запросе пришел id определенной рубрики + if (isset($_REQUEST['rubric_id']) && $_REQUEST['rubric_id'] != 'all') + { + // Формируем условия, которые будут применены в запросе к БД + $ex_rub = " AND doc.rubric_id = '" . $_REQUEST['rubric_id'] . "'"; + + // формируем условия, которые будут применены в ссылках + $nav_rub = '&rubric_id=' . (int)$_REQUEST['rubric_id']; + + $sql = $AVE_DB->Query(" + SELECT + Id, + rubric_field_type, + rubric_field_title + FROM + " . PREFIX . "_rubric_fields + WHERE + rubric_id = '" . $_REQUEST['rubric_id'] ."' + ORDER BY + rubric_field_position ASC + "); + + $fields = array(); + + while($row = $sql->FetchRow()) + { + array_push($fields, $row); + } + + $AVE_Template->assign('fields', $fields); + } + + $ex_db = ''; + + // Поиск с учётом условий настроек рубрик + if (! isset($_REQUEST['rubric_id']) && empty($_REQUEST['QueryTitel'])) + { + // Формируем условия, которые будут применены в запросе к БД + $ex_rub = " AND rub.rubric_docs_active = '1'"; + + // формируем условия для бд + $ex_db = "LEFT JOIN " . PREFIX . "_rubrics as rub on rub.Id = rubric_id"; + } + + $ex_lang = ''; + + // Поиск с учётом языка документа + if (isset($_REQUEST['lang_id']) && $_REQUEST['lang_id'] != '') + { + // Формируем условия, которые будут применены в запросе к БД + $ex_lang = " AND doc.document_lang = '{$_REQUEST["lang_id"]}'"; + + $nav_lang = '&lang_id=' . $_REQUEST['lang_id']; + } + + // Поиск с выводом всех результатов из всех рубрик + if (@$_REQUEST['rubric_id'] == 'all') + { + $nav_rub = '&rubric_id=all'; + } + + // Если в запросе пришел параметр на фильтрацию документов по определенному временному интервалу + if (@$_REQUEST['document_published'] && @$_REQUEST['document_expire']) + { + // Формируем условия, которые будут применены в запросе к БД + $ex_time = 'AND ((doc.document_published BETWEEN ' . $this->_documentListStart() . ' AND ' . $this->_documentListEnd() . ') OR doc.document_published = 0)'; + + // формируем условия, которые будут применены в ссылках + $nav_time = '&TimeSelect=1' + . '&document_published=' . $_REQUEST['document_published'] + . '&document_expire=' . $_REQUEST['document_expire']; + } + + // Если в запросе пришел параметр на фильтрацию документов по статусу + if (! empty($_REQUEST['status'])) + { + // Определяем, какой статус запрашивается и формируем условия, которые будут применены в запросе к БД, + // а также в ссылках, для дальнейшей навигации + switch ($_REQUEST['status']) + { + // С любым статусом + case '': + case 'All': + break; + + // Только опубликованные + case 'Opened': + $ex_docstatus = "AND doc.document_status = '1'"; + $navi_docstatus = '&status=Opened'; + break; + + // Только неопубликованные + case 'Closed': + $ex_docstatus = "AND doc.document_status = '0'"; + $navi_docstatus = '&status=Closed'; + break; + + // Помеченные на удаление + case 'Deleted': + $ex_docstatus = "AND doc.document_deleted = '1'"; + $navi_docstatus = '&status=Deleted'; + break; + } + } + + // Определяем группу пользоваеля и id документа, если он присутствует в запросе + // $ex_delete = (UGROUP != 1) ? "AND doc.document_deleted != '1'" : '' ; + $w_id = !empty($_REQUEST['doc_id']) + ? " AND doc.Id = '" . $_REQUEST['doc_id'] . "'" + : ''; + + // Выполняем запрос к БД на получение количества документов соответствующих вышеопределенным условиям + $sql = " + SELECT COUNT(doc.Id) + FROM " . PREFIX . "_documents as doc + " . $ex_db . " + " . $sql_join_field . " + WHERE 1 + " . $ex_delete . " + " . $ex_time . " + " . $ex_titel . " + " . $ex_rub . " + " . $ex_docstatus . " + " . $ex_lang . " + " . $w_id . " + " . $sql_where_field . " + "; + + $num = $AVE_DB->Query($sql)->GetCell(); + + // Определяем лимит документов, который будет показан на 1 странице + $limit = (isset($_REQUEST['Datalimit']) && is_numeric($_REQUEST['Datalimit']) && $_REQUEST['Datalimit'] > 0) + ? $_REQUEST['Datalimit'] + : $limit = $this->_limit; + + $nav_limit = '&Datalimit=' . $limit; + + // Определяем количество страниц, которые будут сформированы на основании количества полученных документов + $pages = ceil($num / $limit); + $start = get_current_page() * $limit - $limit; + + $db_sort = 'ORDER BY doc.Id DESC'; + $navi_sort = '&sort=id_desc'; + + // Если в запросе используется параметр сортировки + if (!empty($_REQUEST['sort'])) + { + // Определяем, по какому параметру происходит сортировка + switch ($_REQUEST['sort']) + { + // По id документа, по возрастанию + case 'id' : + $db_sort = 'ORDER BY doc.Id ASC'; + $navi_sort = '&sort=id'; + break; + + // По id документа, по убыванию + case 'id_desc' : + $db_sort = 'ORDER BY doc.Id DESC'; + $navi_sort = '&sort=id_desc'; + break; + + // По названию документа, в алфавитном порядке + case 'title' : + $db_sort = 'ORDER BY doc.document_title ASC'; + $navi_sort = '&sort=title'; + break; + + // По названию документа, в обратном алфавитном порядке + case 'title_desc' : + $db_sort = 'ORDER BY doc.document_title DESC'; + $navi_sort = '&sort=title_desc'; + break; + + // По url-адресу, в алфавитном порядке + case 'alias' : + $db_sort = 'ORDER BY doc.document_alias ASC'; + $navi_sort = '&sort=alias'; + break; + + // По url-адресу, в обратном алфавитном порядке + case 'alias_desc' : + $db_sort = 'ORDER BY doc.document_alias DESC'; + $navi_sort = '&sort=alias_desc'; + break; + + // По id рубрики, по возрастанию + case 'rubric' : + $db_sort = 'ORDER BY doc.rubric_id ASC'; + $navi_sort = '&sort=rubric'; + break; + + // По id рубрики, по убыванию + case 'rubric_desc' : + $db_sort = 'ORDER BY doc.rubric_id DESC'; + $navi_sort = '&sort=rubric_desc'; + break; + + // По дате публикации, по возрастанию + case 'published' : + $db_sort = 'ORDER BY doc.document_published ASC'; + $navi_sort = '&sort=published'; + break; + + // По дате публикации, по убыванию + case 'published_desc' : + $db_sort = 'ORDER BY doc.document_published DESC'; + $navi_sort = '&sort=published_desc'; + break; + + // По количеству просмотров, по возрастанию + case 'view' : + $db_sort = 'ORDER BY doc.document_count_view ASC'; + $navi_sort = '&sort=view'; + break; + + // По количеству просмотров, по убыванию + case 'view_desc' : + $db_sort = 'ORDER BY doc.document_count_view DESC'; + $navi_sort = '&sort=view_desc'; + break; + + // По количеству печати документа, по возрастанию + case 'print' : + $db_sort = 'ORDER BY doc.document_count_print ASC'; + $navi_sort = '&sort=print'; + break; + + // По количеству печати документа, по убыванию + case 'print_desc' : + $db_sort = 'ORDER BY doc.document_count_print DESC'; + $navi_sort = '&sort=print_desc'; + break; + + // По автору, по алфавитному возрастанию + case 'author' : + $db_sort = 'ORDER BY doc.document_author_id ASC'; + $navi_sort = '&sort=author'; + break; + + // По автору, по алфавитному убыванию + case 'author_desc' : + $db_sort = 'ORDER BY doc.document_author_id DESC'; + $navi_sort = '&sort=author_desc'; + break; + + // По дате последнего редактирования, по возрастанию + case 'changed': + $db_sort = 'ORDER BY doc.document_changed ASC'; + $navi_sort = '&sort=changed'; + break; + + // По дате последнего редактирования, по убыванию + case 'changed_desc': + $db_sort = 'ORDER BY doc.document_changed DESC'; + $navi_sort = '&sort=changed_desc'; + break; + + // По языку документа, по возрастанию + case 'lang': + $db_sort = 'ORDER BY doc.document_lang ASC'; + $navi_sort = '&sort=lang'; + break; + + // По языку документа, по убыванию + case 'lang_desc': + $db_sort = 'ORDER BY doc.document_lang DESC'; + $navi_sort = '&sort=lang_desc'; + break; + + // По умолчанию, по дате последнего редактирования по убыванию. + // Последний отредактированный документ, будет первым в списке. + default : + $db_sort = 'ORDER BY doc.document_changed DESC'; + $navi_sort = '&sort=changed_desc'; + break; + } + } + + $docs = array(); + + // Выполняем запрос к БД на получение уже не количества документов, отвечающих условиям, а уже на + // получение всех данных, с учетом всех условий, а также типа сортировки и лимита для вывода на + // одну страницу. + $sql = " + SELECT STRAIGHT_JOIN SQL_CALC_FOUND_ROWS + doc.*, + rub.rubric_admin_teaser_template + FROM + " . PREFIX . "_documents as doc + LEFT JOIN + " . PREFIX . "_rubrics AS rub + ON rub.Id = doc.rubric_id + " . $sql_join_field . " + WHERE 1 + " . $ex_rub . " + " . $ex_delete . " + " . $ex_time . " + " . $ex_titel . " + " . $ex_docstatus . " + " . $ex_lang . " + " . $w_id . " + " . $sql_where_field . " + " . $db_sort . " + LIMIT + " . $start . "," . $limit . " + "; + + $sql = $AVE_DB->Query($sql); + + // Циклически обрабатываем полученные данные с целью приведения некоторых из них к удобочитаемому виду + while ($row = $sql->FetchRow()) + { + // Определяем количество комментариев, оставленных для данного документа + $row->ist_remark = $AVE_DB->Query(" + SELECT COUNT(*) + FROM " . PREFIX . "_document_remarks + WHERE document_id = '" . $row->Id . "' + ")->GetCell(); + + $this->documentPermissionFetch($row->rubric_id); + + // Получаем название рубрики по ее Id + $row->RubName = $AVE_Rubric->rubricNameByIdGet($row->rubric_id)->rubric_title; + $row->document_author = get_username_by_id($row->document_author_id); // Получаем имя пользователя (Автора) + $row->cantEdit = 0; + $row->canDelete = 0; + $row->canEndDel = 0; + $row->canOpenClose = 0; + $row->rubric_admin_teaser_template = @eval2var('?>'.($row->rubric_admin_teaser_template>'' + ? @showrequestelement($row, $row->rubric_admin_teaser_template) + : '').'document_title = stripslashes(htmlspecialchars_decode($row->document_title)); + $row->document_breadcrum_title = stripslashes(htmlspecialchars_decode($row->document_breadcrum_title)); + + $lang_pack = array(); + + if($row->document_lang_group > 0) + { + $sql1 = $AVE_DB->Query(" + SELECT SQL_CALC_FOUND_ROWS + Id, + rubric_id, + document_alias, + document_lang, + document_status + FROM + ".PREFIX."_documents + WHERE + document_lang_group=" . $row->document_lang_group . " + OR + Id = " . $row->document_lang_group + ); + + while ($row1 = $sql1->FetchAssocArray()) + { + $lang_pack[$row1['document_lang']] = $row1; + } + } + + $row->lang_pack = $lang_pack; + + // разрешаем редактирование и удаление + // если автор имеет право изменять свои документы в рубрике + // или пользователю разрешено изменять все документы в рубрике + if ( + ($row->document_author_id == @$_SESSION['user_id'] && isset($_SESSION[$row->rubric_id . '_editown']) && @$_SESSION[$row->rubric_id . '_editown'] == 1) + || + (isset($_SESSION[$row->rubric_id . '_editall']) && $_SESSION[$row->rubric_id . '_editall'] == 1) + ) + { + $row->cantEdit = 1; + $row->canDelete = 1; + $row->canOpenClose = 1; + } + + // запрещаем редактирование главной страницы и страницу ошибки 404 если требуется одобрение Администратора + if ( ($row->Id == 1 || $row->Id == PAGE_NOT_FOUND_ID) + && isset($_SESSION[$row->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] != 1) + { + $row->cantEdit = 0; + } + + // разрешаем автору блокировать и разблокировать свои документы если не требуется одобрение Администратора + if ($row->document_author_id == @$_SESSION['user_id'] + && isset($_SESSION[$row->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] == 1) + { + $row->canOpenClose = 1; + } + + // разрешаем всё, если пользователь принадлежит группе Администраторов или имеет все права на рубрику + if (UGROUP == 1 || @$_SESSION[$row->rubric_id . '_alles'] == 1) + { + $row->cantEdit = 1; + $row->canDelete = 1; + $row->canEndDel = 1; + $row->canOpenClose = 1; + } + // Запрещаем удаление Главной страницы и страницы с 404 ошибкой + if ($row->Id == 1 || $row->Id == PAGE_NOT_FOUND_ID) + { + $row->canDelete = 0; + $row->canEndDel = 0; + } + + array_push($docs, $row); + } + + // Передаем полученные данные в шаблон для вывода + $AVE_Template->assign('docs', $docs); + + $link = "index.php?do=docs"; + $link .= (isset($_REQUEST['action']) && $_REQUEST['action'] == 'showsimple') ? '&action=showsimple' : ''; + $link .= !empty($_REQUEST['target']) ? '&target=' . urlencode($_REQUEST['target']) : ''; + $link .= !empty($_REQUEST['doc']) ? '&doc=' . urlencode($_REQUEST['doc']) : ''; + $link .= !empty($_REQUEST['document_alias']) ? '&document_alias=' . urlencode($_REQUEST['document_alias']) : ''; + $link .= !empty($_REQUEST['navi_item_target']) ? '&navi_item_target=' . urlencode($_REQUEST['navi_item_target']) : ''; + $link .= $navi_docstatus; + $link .= $nav_titel; + $link .= $nav_rub; + $link .= $nav_lang; + $link .= $nav_time; + $link .= $nav_limit; + $link .= $field_link; + $link .= (isset($_REQUEST['selurl']) && $_REQUEST['selurl'] == 1) ? '&selurl=1' : ''; + $link .= (isset($_REQUEST['selecturl']) && $_REQUEST['selecturl'] == 1) ? '&selecturl=1' : ''; + $link .= (isset($_REQUEST['function']) && $_REQUEST['function'] == 1) ? '&function=1' : ''; + $link .= (isset($_REQUEST['idonly']) && $_REQUEST['idonly'] == 1) ? '&idonly=1' : ''; + $link .= (isset($_REQUEST['idtitle']) && $_REQUEST['idtitle'] == 1) ? '&idtitle=1' : ''; + $link .= (isset($_REQUEST['pop']) && $_REQUEST['pop'] == 1) ? '&pop=1' : ''; + $link .= (isset($_REQUEST['onlycontent']) && $_REQUEST['onlycontent'] == 1) ? '&onlycontent=1' : ''; + $link .= (isset($_REQUEST['langCode']) && !empty($_REQUEST['langCode'])) ? '&langCode='.$_REQUEST['langCode'] : ''; + $link .= (isset($_REQUEST['CKEditor']) && !empty($_REQUEST['CKEditor'])) ? '&CKEditor='.$_REQUEST['CKEditor'] : ''; + $link .= (isset($_REQUEST['CKEditorFuncNum']) && $_REQUEST['CKEditorFuncNum'] == 1) ? '&CKEditorFuncNum=1' : ''; + + $AVE_Template->assign('link', $link); + + // Если количество отобранных документов превышает лимит на одной странице - формируем постраничную навигацию + if ($num > $limit) + { + $page_nav = get_pagination($pages, 'page', ' {t}'); + + $AVE_Template->assign('page_nav', $page_nav); + } + + $AVE_Template->assign('DEF_DOC_START_YEAR', mktime(0, 0, 0, date("m"), date("d"), date("Y") - 10)); + $AVE_Template->assign('DEF_DOC_END_YEAR', mktime(0, 0, 0, date("m"), date("d"), date("Y") + 10)); + } + + /** + * Метод, предназначенный для сохранения статусов документа в БД + * + */ + function documentEditStatus() { + global $AVE_DB; + + switch(@$_REQUEST['moderation']) { + // статусы + case "1" : + foreach (@$_REQUEST['document'] as $id => $status) + { + if (is_numeric($id) && is_numeric($status)) + { + $AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_status = '1' WHERE Id = '".$id."' "); + } + } + break; + + // статусы + case "0" : + foreach (@$_REQUEST['document'] as $id => $status) + { + if (is_numeric($id) && is_numeric($status)) + { + $AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_status = '0' WHERE Id = '".$id."' "); + } + } + break; + + // в корзину + case "intrash" : + foreach (@$_REQUEST['document'] as $id => $status) + { + if (is_numeric($id) && is_numeric($status)) + { + $AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_deleted = '1' WHERE Id = '".$id."' "); + } + } + break; + + // из корзины + case "outtrash" : + foreach (@$_REQUEST['document'] as $id => $status) + { + if (is_numeric($id) && is_numeric($status)) + { + $AVE_DB->Query("UPDATE " . PREFIX . "_documents SET document_deleted = '0' WHERE Id = '".$id."' "); + } + } + break; + + // совсем удалить + case "trash" : + foreach (@$_REQUEST['document'] as $id => $status) + { + if (is_numeric($id) && is_numeric($status)) + { + $AVE_DB->Query("DELETE FROM " . PREFIX . "_documents WHERE Id = '".$id."'"); + $AVE_DB->Query("DELETE FROM " . PREFIX . "_document_fields WHERE document_id = '".$id."'"); + $AVE_DB->Query("DELETE FROM " . PREFIX . "_document_fields_text WHERE document_id = '".$id."'"); + } + } + break; + } + + header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION); + exit; + } + + /** + * Функция предназначенна для анализа ключевых слов и разненсения их по табличке _document_keyword + * + */ + function generateKeywords($document_id, $keywords=null) + { + global $AVE_DB; + + if(! $keywords) + $keywords = $AVE_DB->Query("SELECT document_meta_keywords FROM " . PREFIX . "_documents WHERE Id = " . intval($document_id) . " LIMIT 1")->GetCell(); + + $keywords = explode(',', $keywords); + + $res = $AVE_DB->Query("DELETE FROM " . PREFIX . "_document_keywords where document_id = " . intval($document_id)); + + foreach($keywords as $k => $v) + { + if (trim($v) > '') + { + $key = trim(mb_substr($v, 0, 254)); + + $res= $AVE_DB->Query("INSERT INTO ".PREFIX."_document_keywords + ( + document_id, + keyword + ) + VALUES + ( + '".intval($document_id)."', + '".clean_no_print_char($key)."' + ) + "); + } + } + } + + /** + * Функция предназначенна для анализа ключевых слов и разненсения их по табличке _document_tags + * + */ + function generateTags($document_id,$keywords=null) + { + global $AVE_DB; + + if (! $keywords) + $keywords = $AVE_DB->Query("SELECT document_tags FROM " . PREFIX . "_documents WHERE Id=" . intval($document_id) . " LIMIT 1")->GetCell(); + + $keywords = explode(',',$keywords); + + $res = $AVE_DB->Query("DELETE FROM " . PREFIX . "_document_tags where document_id = " . intval($document_id)); + + foreach($keywords as $k => $v) + { + if (trim($v) > '') + { + $key = trim(mb_substr($v, 0, 254)); + + $res = $AVE_DB->Query("INSERT INTO ".PREFIX."_document_tags + ( + document_id, + tag + ) + VALUES + ( + '" . intval($document_id) . "', + '" . clean_no_print_char($key) . "' + ) + "); + } + } + } + + /** + * Метод, предназначенный для сохранения ревизии документа в БД + * + */ + static function SaveRevission($document_id) + { + global $AVE_DB; + + $sql = $AVE_DB->Query(" + SELECT + doc.rubric_field_id, + doc.field_value, + more.field_value as more + FROM + " . PREFIX . "_document_fields AS doc + LEFT JOIN + " . PREFIX . "_document_fields_text AS more + ON + (more.rubric_field_id = doc.rubric_field_id and more.document_id=doc.document_id) + WHERE + doc.document_id = '" . $document_id . "' + "); + + $rows = array(); + + while ($row = $sql->FetchAssocArray()) + { + $row['field_value'] = (string)$row['field_value'] . (string)$row['more']; + $rows[$row['rubric_field_id']] = pretty_chars(clean_no_print_char($row['field_value'])); + } + + $dtime = $AVE_DB->Query('SELECT document_changed FROM ' . PREFIX . '_documents WHERE Id=' . $document_id)->GetCell(); + + $last_rev = @unserialize($AVE_DB->Query("SELECT doc_data FROM ".PREFIX."_document_rev WHERE doc_id=".$document_id." ORDER BY doc_revision DESC LIMIT 1")->GetCell()); + // это я долго пытался понять почему всегда старая ревизия не равна новой даже если просто нажали лишний раз сохранить + // оказывается редактор подсовывет alt="" если альта в имге нету и сносит его если он есть там пустой )))))))))) + // но пусть проверка будет - может редакторы сменятся/апдейтятся а может кто просто хардкором будет код править))) + $dorev = false; + + foreach ($rows as $k => $v) + { + if ($rows[$k] <> $last_rev[$k]) + { + $dorev = true; + } + } + + if ($dorev) + { + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_document_rev + SET + doc_id = '" . $document_id . "', + doc_revision = '" . $dtime . "', + doc_data = '" . addslashes(serialize($rows)) . "', + user_id = '" . $_SESSION['user_id'] ."' + "); + } + + return $rows; + } + + /** + * Метод, предназначенный для востановления ревизии документа + * + */ + function documentRevissionRestore($document_id, $revision, $rubric_id) + { + + global $AVE_DB, $AVE_Template; + + $this->documentPermissionFetch($rubric_id); + + if ( (isset($_SESSION[$rubric_id . '_delrev']) && $_SESSION[$rubric_id . '_delrev'] == 1) + || (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1) + || (defined('UGROUP') && UGROUP == 1) ) + { + $run = true; + } + + if ($run === true) + { + $res = $AVE_DB->Query("SELECT doc_data FROM ".PREFIX."_document_rev WHERE doc_id='".$document_id."' AND doc_revision='".$revision."' LIMIT 1")->GetCell(); + + if (! $res) + return false; + + $data = @unserialize($res); + + foreach($data as $k => $v) + { + if ($k) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_document_fields + SET + field_value = '" . mb_substr($v,0,499) . "', + field_number_value = '" . preg_replace('/[^\d.]/', '', $v) . "' + WHERE + document_id = '" . $document_id . "' + AND + rubric_field_id = '" . $k . "' + "); + + if (mb_strlen($v) > 500) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_document_fields_text + SET + field_value = '" . mb_substr($v,500) . "' + WHERE + document_id = '" . $document_id . "' + AND + rubric_field_id = '" . $k . "' + "); + } + else + { + $AVE_DB->Query("DELETE FROM ". PREFIX . "_document_fields_text ".'WHERE document_id='.$document_id.' AND rubric_field_id='.$k); + } + } + } + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('DOC_REVISION_RECOVER')." (Doc: $document_id Rev: $revision)"); + header('Location:index.php?do=docs&action=edit&Id=' . (int)$_REQUEST['doc_id'] . '&rubric_id=' . (int)$_REQUEST['rubric_id'] . '&cp=' . SESSION); + } + else + { + $AVE_Template->assign('content', $AVE_Template->get_config_vars('DOC_NO_RES_REVISION')); + } + } + + /** + * Метод, предназначенный для удаления ревизии документа + * + */ + function documentRevissionDelete($document_id, $revision, $rubric_id){ + + global $AVE_DB, $AVE_Template; + + $this->documentPermissionFetch($rubric_id); + + if ( (isset($_SESSION[$rubric_id . '_delrev']) && $_SESSION[$rubric_id . '_delrev'] == 1) + || (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1) + || (defined('UGROUP') && UGROUP == 1) ){ $run = true; } + + if ($run === true) + { + + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_document_rev + WHERE doc_id = '" . $document_id . "' AND doc_revision='".$revision."' + "); + + reportLog($AVE_Template->get_config_vars('DOC_REVISION_DELETE')." (Doc: $document_id Rev: $revision)"); + + if(!isset($_REQUEST['ajax'])){ + header('Location:index.php?do=docs&action=edit&rubric_id=' . $rubric_id . '&Id=' . $document_id . '&cp=' . SESSION); + } + + } else { + $AVE_Template->assign('content', $AVE_Template->get_config_vars('DOC_NO_DEL_REVISION')); + } + + } + + + /** + * Метод, предназначенный для сохранения документа в БД + * + * @param int $rubric_id идентификатор Рубрики + * @param int $document_id идентификатор Документа + * @param array $data Документ в массиве структура - хитрая + * @param bool $update_non_exists_fields Изменять поля на пустые + * значения у не переданных полей или не надо + * @param bool $rubric_cod Использовать код рубрики или не надо + * возвращает номер документа если все удачно и false если все плохо + */ + + function documentSave($rubric_id, $document_id, $data, $update_non_exists_fields = false, $rubric_code = true, $revisions = true, $logs = true, $generate = true) + { + + global $AVE_DB, $AVE_Template; + + //-- Проверяем входящие данные -- // + + $rubric_id = (int)$rubric_id; + $document_id = (int)$document_id; + + // Если отсутсвуют данные, ничего не делаем + if(! isset($data)) + return false; + + // Если отсутсвуют данные полей, ничего не делаем + if(! isset($data['feld'])) + return false; + + // Определяем тип опреации + $oper = 'INSERT'; + + // Забираем параметры рубрики + $_rubric = $AVE_DB->Query(" + SELECT + rubric_alias, + rubric_alias_history, + rubric_code_start, + rubric_code_end + FROM + " . PREFIX . "_rubrics + WHERE + Id = '" . $rubric_id . "' + ")->FetchRow(); + + // Выполняем стартовый код рубрики + if ($rubric_code) + { + eval ('?>' . $_rubric->rubric_code_start . ' 0) + $oper = 'UPDATE'; + + // Если пользователь имеет права на добавление документов в указанную рубрику, тогда + if ($oper == 'INSERT' && !( (isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1) + || (isset($_SESSION[$rubric_id . '_new']) && $_SESSION[$rubric_id . '_new'] == 1) + || (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1) + || (defined('UGROUP') && UGROUP == 1) )) + return false; + + $data['document_title'] = $_url = empty($data['document_title']) + ? $AVE_Template->get_config_vars('DOC_WITHOUT_TITLE') + : $data['document_title']; + + // Если оператор равен UPDATE + if ($oper == 'UPDATE') + { + // Выполняем запрос к БД на получение автора документа и id Рубрики + $row = $AVE_DB->Query(" + SELECT + rubric_id, + document_author_id + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $document_id . "' + ")->FetchRow(); + + // Присваиваем значение переменной $rubric_id + $rubric_id = $row->rubric_id; + + // Запрещаем редактирвание + $row->cantEdit = 0; + + // Определяем права доступа к документам в данной рубрики + $this->documentPermissionFetch($row->rubric_id); + + // Разрешаем редактирование + // если автор имеет право изменять свои документы в рубрике + // или пользователю разрешено изменять все документы в рубрике + if ( (isset($_SESSION['user_id']) && $row->document_author_id == $_SESSION['user_id'] && + isset($_SESSION[$row->rubric_id . '_editown']) && $_SESSION[$row->rubric_id . '_editown'] == 1) + || (isset($_SESSION[$row->rubric_id . '_editall']) && @$_SESSION[$row->rubric_id . '_editall'] == 1) ) + { + // Разрешаем редактирование + $row->cantEdit = 1; + } + + // Запрещаем редактирование главной страницы и страницы ошибки 404 если требуется одобрение Администратора + if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) && @$_SESSION[$row->rubric_id . '_editall'] != 1 ) + { + // Запрещаем редактирвание + $row->cantEdit = 0; + } + + // Разрешаем редактирование, если пользователь принадлежит группе Администраторов или имеет все права на рубрику + if ( (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$row->rubric_id . '_alles']) && $_SESSION[$row->rubric_id . '_alles'] == 1) ) + { + // Разрешаем редактирование + $row->cantEdit = 1; + } + + // выходим если нельзя редактировать + if(! $row->cantEdit==1 ) + return false; + + //-- Обрабатываем все данные, пришедшие в запросе --// + + + // Поиск по документу 1 - Да / 0 - Нет + $search = (isset($data['document_in_search']) && $data['document_in_search'] == 1) + ? '1' + : '0'; + + // Если пользователь имеет права на добавление/редактирование документов в указанную рубрику, тогда + if ( + (isset($_SESSION[$row->rubric_id . '_newnow']) && $_SESSION[$row->rubric_id . '_newnow'] == 1) + || + (isset($_SESSION[$row->rubric_id . '_editall']) && $_SESSION[$row->rubric_id . '_editall'] == 1) + || + (isset($_SESSION[$row->rubric_id . '_alles']) && $_SESSION[$row->rubric_id . '_alles'] == 1) + || + (defined('UGROUP') && UGROUP == 1) + ) + { + // Статус документа 1 - Опубликован / 0 - Нет + $document_status = (isset($data['document_status']) + ? $data['document_status'] + : '0'); + } + else + { + // Не опубликован + $document_status = '0'; + } + + // Если ID документа равно 1 или ID равно Документа 404 + // то стату всегда будет 1 + $document_status = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) + ? '1' + : $document_status; + + // Формируем/проверяем адрес на уникальность + if ($document_id != 1) + { + $data['document_alias'] = $_url = prepare_url(empty($data['document_alias']) + ? trim($_POST['prefix'] . '/' . $data['document_title'], '/') + : $data['document_alias']); + } + // Если ID документа = 1, то алиас не меняем + else + { + $data['document_alias'] = "/"; + } + + $cnt = 1; + + // Проверяем адрес на уникальность, если не уникален + // добавляем число к адресу + while ($AVE_DB->Query(" + SELECT 1 + FROM + " . PREFIX . "_documents + WHERE + Id != '" . $document_id . "' + AND + document_alias = '" . $data['document_alias'] . "' + LIMIT 1 + ")->NumRows() == 1) + { + $data['document_alias'] = $_url . '-' . $cnt; + $cnt++; + } + } + // Если оператор INSERT + else + { + // Поиск по документу 1 - Да / 0 - Нет + $search = (isset($data['document_in_search']) && $data['document_in_search'] == 1) + ? '1' + : '0'; + + // Статус документа 1 - Опубликован / 0 - Нет + $document_status = ! empty($data['document_status']) + ? (int)$data['document_status'] + : '0'; + + // Формируем/проверяем адрес на уникальность + $data['document_alias'] = $_url = prepare_url(empty($data['document_alias']) + ? trim($data['prefix'] . '/' . $data['document_title'], '/') + : $data['document_alias']); + + $cnt = 1; + + // Проверяем адрес на уникальность, если не уникален + // добавляем число к адресу + while ( + $AVE_DB->Query(" + SELECT 1 + FROM + " . PREFIX . "_documents + WHERE + document_alias = '" . $data['document_alias'] . "' + LIMIT 1 + ")->NumRows()) + { + $data['document_alias'] = $_url . '-' . $cnt; + $cnt++; + } + } + + // Если оператор UPDATE, забираем перед сохранением старый алиас документа + if ($oper == 'UPDATE') + { + $data['document_alias_old'] = $AVE_DB->Query("SELECT document_alias FROM " . PREFIX . "_documents WHERE Id = '" . $document_id . "' ")->GetCell(); + } + else + { + // Если оператор INSERT + // Если новый алиас документа, сопадает с алиасом в истории, просто стираем историю + $AVE_DB->Query("DELETE FROM ". PREFIX . "_document_alias_history WHERE document_alias = '" . $data['document_alias'] . "'"); + } + + // Дата публикации документа + // Для документов с ID = 1 и Ошибки 404, дата не пишется + $data["document_published"] = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) + ? '0' + : $this->_documentStart($data['document_published']); + + // Дата окончания публикации документа + // Для документов с ID = 1 и Ошибки 404, дата не пишется + $data["document_expire"] = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) + ? '0' + : $this->_documentEnd($data['document_expire']); + + // Дата изменения документа + $data["document_changed"] = time(); + + // Использовать ли историю алиасов + $data['document_alias_history'] = (empty($data['document_alias_history'])) + ? '0' + : $data['document_alias_history']; + + // Sitemap + $data['document_sitemap_freq'] = ($data['document_sitemap_freq'] != '' + ? (int)$data['document_sitemap_freq'] + : 3); + + // Sitemap + $data['document_sitemap_pr'] = ($data['document_sitemap_pr'] != '' + ? $data['document_sitemap_pr'] + : '0.5'); + + $data['document_linked_navi_id'] = ($data['document_linked_navi_id'] != '' + ? $data['document_linked_navi_id'] + : 0); + + $fields = array(); + + // Получаем структуру документа + if($oper == 'INSERT') + { + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields + WHERE + rubric_id = '" . $rubric_id . "' + ORDER BY + rubric_field_position ASC + "); + } + else + { + $sql = $AVE_DB->Query(" + SELECT + doc.Id AS df_id, + rub.*, + rubric_field_default, + doc.field_value + FROM + " . PREFIX . "_rubric_fields AS rub + LEFT JOIN + " . PREFIX . "_document_fields AS doc + ON rubric_field_id = rub.Id + WHERE + document_id = '" . $document_id . "' + ORDER BY + rubric_field_position ASC + "); + } + + // Если пришел вызов поля, который связан с модулем + if (isset($_REQUEST['field_module'])) + { + while(list($mod_key, $mod_val) = each($_REQUEST['field_module'])) + { + require_once(BASE_DIR . '/modules/' . $mod_val . '/document.php'); + + $mod_function = (string)$mod_val . '_document_save'; + + $fields = $mod_function($mod_key, $mod_val, $sql, $data['feld'][$mod_key], $mod_key, $rubric_id); + } + } + else + { + while ($row = $sql->FetchRow()) + { + array_push($fields, $row); + } + } + + unset($sql); + + $where = ($oper == 'UPDATE' ? 'WHERE Id = ' . $document_id : ''); + $author = ($oper != 'UPDATE' ? 'document_author_id = ' . $_SESSION['user_id'] . ',' : ''); + $operator = ($oper == 'UPDATE' ? "UPDATE " . PREFIX . "_documents" : "INSERT INTO " . PREFIX . "_documents"); + + $breadcrumb_title = (isset($data['document_breadcrum_title']) && $data['document_breadcrum_title'] != '') + ? $data['document_breadcrum_title'] + : ''; + + // Сохраняем все параметры документа + $sql=" + $operator + SET + rubric_id = '" . $rubric_id . "', + rubric_tmpl_id = '" . (int)$data['rubric_tmpl_id'] . "', + document_parent = '" . (int)$data['document_parent'] . "', + document_title = '" . htmlspecialchars(clean_no_print_char($data['document_title']), ENT_QUOTES) . "', + document_breadcrum_title = '" . htmlspecialchars(clean_no_print_char($breadcrumb_title), ENT_QUOTES) . "', + document_alias = '" . $data['document_alias'] . "', + document_alias_history = '" . $data['document_alias_log'] . "', + document_published = '" . $data["document_published"] . "', + document_expire = '" . $data["document_expire"] . "', + document_changed = '" . $data["document_changed"] . "', + $author + document_in_search = '" . $search . "', + document_meta_keywords = '" . htmlspecialchars(clean_no_print_char($data['document_meta_keywords']), ENT_QUOTES) . "', + document_meta_description = '" . htmlspecialchars(clean_no_print_char($data['document_meta_description']), ENT_QUOTES) . "', + document_meta_robots = '" . $data['document_meta_robots'] . "', + document_sitemap_freq = '" . $data['document_sitemap_freq'] . "', + document_sitemap_pr = '" . $data['document_sitemap_pr'] . "', + document_status = '" . $data['document_status'] . "', + document_linked_navi_id = '" . (int)$data['document_linked_navi_id'] . "', + document_tags = '" . addslashes(htmlspecialchars(clean_no_print_char($data['document_tags']))). "', + document_lang = '" . (empty($data['document_lang']) ? DEFAULT_LANGUAGE : $data['document_lang']). "', + document_lang_group = '" . (empty($data['document_lang_group']) ? '0' : (int)$data['document_lang_group']). "', + document_property = '" . (empty($data['document_property']) ? '' : $data['document_property']). "' + $where + "; + + $AVE_DB->Query($sql); + + // Получаем id добавленной записи + $iid = $AVE_DB->InsertId(); + + // Сохраняем ревизию документа + if ($oper == 'UPDATE' && $revisions) + $this->SaveRevission($document_id); + + // Переназначаем $document_id + $document_id = $_REQUEST['Id'] = ($oper == "INSERT" ? $iid : $document_id); + + //Проверяем алиас на изменения (Старый/Новый) + if ( + $oper == 'UPDATE' + AND $data['document_alias'] != $data['document_alias_old'] + AND ( + ($data['document_alias_history'] == '0' AND $_rubric->rubric_alias_history == '1') + OR + ($data['document_alias_history'] == '1') + ) + AND + ($AVE_DB->Query("SELECT 1 FROM " . PREFIX . "_document_alias_history WHERE document_alias = '" . $data['document_alias_old'] . "' LIMIT 1 ")->NumRows() == 0) + ) + { + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_document_alias_history + SET + document_id = '" . $document_id . "', + document_alias = '" . $data['document_alias_old'] . "', + document_alias_author = '" . $_SESSION['user_id'] . "', + document_alias_changed = '" . time() . "' + "); + } + + // Сохраняем системное сообщение в журнал + if ($logs) + reportLog(($oper=='INSERT' + ? $AVE_Template->get_config_vars('DOC_SAVE_ADD') + : $AVE_Template->get_config_vars('DOC_SAVE_EDIT')) + . $AVE_Template->get_config_vars('DOC_SAVE_LOG_DOC') .' (' . $data['document_title'] . ' Id: ' . $document_id . ')'); + + // Циклически обрабатываем поля документа + foreach ($fields as $k => $v) + { + $fld_id = $v->Id; + + // Если в данных нет поля и мы редактируем документ - изменять ли это поле на пустое значение + if ($oper == 'UPDATE' && (! (isset($data['feld'][$fld_id]))) && ! $update_non_exists_fields) + continue; + + $fld_val = (isset($data['feld'][$fld_id]) + ? $data['feld'][$fld_id] + : $v->rubric_field_default); + + if (! $AVE_DB->Query(" + SELECT 1 + FROM + " . PREFIX . "_rubric_fields + WHERE + Id = '" . $fld_id . "' + AND + rubric_id = '" . $rubric_id . "' + LIMIT 1 + ")->NumRows()) + { + continue; + } + + /* ------------------------------------------------------------------- */ + + if(! is_array($fld_val)) + { + // Если запрещено использование php кода, тогда обнуляем данные поля + if (! check_permission('document_php')) + { + if (is_php_code($fld_val)) + $fld_val = ''; + } + + // Убираем из текста непечатабельные символы + $fld_val = clean_no_print_char($fld_val); + $fld_val = pretty_chars($fld_val); + } + + $field_rubric = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields + WHERE + Id = '" . $fld_id . "' + ")->FetchRow(); + + // Отправляем полученные данные в функцию поля, в раздел "Save" + // для преобразования перед сохранением + $func = 'get_field_' . $field_rubric->rubric_field_type; + + if(is_callable($func)) + { + $fld_val = $func($fld_val, 'save', $fld_id, '', 0, $x, 0, 0, 0); + } + + //-- Собираем запрос к БД на добавление нового поля с его содержимым --// + + $where = ($oper == 'UPDATE' + ? "WHERE document_id = '" . $document_id . "' AND rubric_field_id = '" . $fld_id . "'" + : ''); + + $operator = ($oper == 'UPDATE' + ? "UPDATE " . PREFIX . "_document_fields" + : "INSERT INTO " . PREFIX . "_document_fields"); + + $insert = ($oper == 'UPDATE' + ? '' + : "rubric_field_id = '" . $fld_id . "', document_id = '" . $document_id . "',"); + + $fval = (is_array($fld_val) + ? serialize($fld_val) + : ($fld_val)); + + $substr = 500; + + if (mb_substr($fval, 501, 1)) + $substr = 499; + + // Сохраняем первые 500 символов + $f_val_500 = mb_substr($fval, 0, $substr); + + $sql = " + $operator + SET + $insert + field_value = '" . $f_val_500 . "', + field_number_value = '" . (($field_rubric->rubric_field_numeric) + ? preg_replace('/[^\d.]/', '', $fld_val) + : 0) . "', + document_in_search = '" . $search . "' + $where + "; + + $AVE_DB->Query($sql); + + unset($sql, $f_val_500, $fld_val); + + // Если символов больше 500, то сохраняем их в другой таблице + if (mb_strlen($fval) > $substr) + { + // Проверяем есть ли запись о поле в БД + $check_field = $AVE_DB->Query(" + SELECT + Id + FROM + " .PREFIX . "_document_fields_text + WHERE + document_id = '" . $document_id . "' + AND + rubric_field_id='" . $fld_id . "' + ")->GetCell(); + + $operator = ($check_field > 0 + ? "UPDATE " . PREFIX . "_document_fields_text" + : "INSERT INTO " . PREFIX . "_document_fields_text" + ); + + $where = ($check_field > 0 + ? "WHERE document_id = '" . $document_id . "' AND rubric_field_id = '" . $fld_id . "'" + : ''); + + $insert = ($check_field > 0 + ? '' + : "rubric_field_id = '" . $fld_id . "', document_id = '" . $document_id . "',"); + + $f_val_unlim = mb_substr($fval, $substr); + + $sql = " + $operator + SET + $insert + field_value = '" . $f_val_unlim . "' + $where + "; + + $AVE_DB->Query($sql); + + unset($sql, $f_val_unlim); + } + // Если символов меньше 500, то чистим поле в другой таблице + else + { + $AVE_DB->Query(" + DELETE + FROM + ". PREFIX . "_document_fields_text + WHERE + document_id = '" . $document_id . "' + AND + rubric_field_id='" . $fld_id . "' + "); + } + } + + // Очищаем кэш шаблона + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_rubric_template_cache + WHERE + doc_id = '" . $document_id . "' + "); + + // Выполняем код рубрики, после сохранения + if ($rubric_code) + { + eval ('?>' . $_rubric->rubric_code_end . ' $rubric_id, 'document_id' => $document_id, 'data' => $data, 'field_module' => $_REQUEST['field_module'])); + + // Чистим кеш + $AVE_DB->clearcache('rub_' . $rubric_id); + $AVE_DB->clearcache('doc_' . $document_id); + $AVE_DB->clearcompile('doc_' . $document_id); + $AVE_DB->clearcacherequest('doc_' . $document_id); + + unset($_rubric); + + // Дополнительные обработки + if ($generate) + { + $this->generateKeywords($document_id); + $this->generateTags($document_id); + } + + return $document_id; + } + + /** + * Метод, предназначенный для добавления нового документа в БД + * + * @param int $rubric_id идентификатор Рубрики + */ + function documentNew($rubric_id) + { + global $AVE_DB, $AVE_Rubric, $AVE_Template; + + $this->documentPermissionFetch($rubric_id); + + // Если пользователь имеет права на добавление документов в указанную рубрику, тогда + if ( (isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1) + || (isset($_SESSION[$rubric_id . '_new']) && $_SESSION[$rubric_id . '_new'] == 1) + || (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1) + || (defined('UGROUP') && UGROUP == 1) ) + { + + // Поля + $sql = $AVE_DB->Query(" + SELECT + a.*, + b.Id AS group_id, + b.group_title, + b.group_description, + b.group_position + FROM + " . PREFIX . "_rubric_fields AS a + LEFT JOIN + " . PREFIX . "_rubric_fields_group AS b + ON a.rubric_field_group = b.Id + WHERE + a.rubric_id = '" . $rubric_id . "' + ORDER BY + b.group_position ASC, + a.rubric_field_position ASC + "); + + $fields_list = array(); + + while ($row = $sql->FetchRow()) + { + $group_id = ($row->rubric_field_group) ? $row->rubric_field_group : 0; + + $fields_list[$group_id]['group_id'] = $row->group_id; + $fields_list[$group_id]['group_position'] = ($row->group_position) ? $row->group_position : 100; + $fields_list[$group_id]['group_title'] = $row->group_title; + $fields_list[$group_id]['group_description'] = $row->group_description; + $fields_list[$group_id]['fields'][$row->Id]['Id'] = $row->Id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_id'] = $row->rubric_id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_title'] = $row->rubric_field_title; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_description'] = $row->rubric_field_description; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_default'] = $row->rubric_field_default; + $fields_list[$group_id]['fields'][$row->Id]['result'] = $this->_documentFieldGet($row->rubric_field_type, $row->rubric_field_default, $row->Id, $row->rubric_field_default); + } + + $fields_list = msort($fields_list, 'group_position'); + + $AVE_Template->assign('groups_count', count($fields_list)); + $AVE_Template->assign('fields_list', $fields_list); + + // Группы полей + $fields_groups = array(); + + $sql = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_rubric_fields_group + WHERE + rubric_id = '" . $rubric_id . "' + ORDER BY + group_position ASC + "); + + while ($row = $sql->FetchRow()) + { + array_push($fields_groups, $row); + } + + $AVE_Template->assign('fields_groups', $fields_groups); + + // Определяем вид действия, переданный в параметре sub + switch ($_REQUEST['sub']) + { + case 'save': // Сохранение документа в БД + + $public_start = $this->_documentStart(); // Дата/время начала публикации документа + $public_end = $this->_documentEnd(); // Дата/время окончания публикации документа + + $innavi = check_permission_acp('navigation_new') ? '&innavi=1' : ''; + + // Определяем статус документа + $document_status = !empty($_REQUEST['document_status']) ? (int)$_REQUEST['document_status'] : '0'; + + // Если статус документа не определен + if (empty($document_status) && $_SESSION['user_group'] != 1) + { + $innavi = ''; + @reset($_POST); + $newtext = "\n\n"; + + // Формируем текст сообщения, состоящий из данных, + // которые пользователь ввел в поля документа + foreach ($_POST['feld'] as $val) + { + if (!empty($val)) + { + $newtext .= $val; + $newtext .= "\n---------------------\n"; + } + } + + $text = strip_tags($newtext); + + // Получаем e-mail адрес из общих настроек системы + $system_mail = get_settings('mail_from'); + $system_mail_name = get_settings('mail_from_name'); + + // Отправляем администартору уведомление, о том что необходимо проверить документ + $body_to_admin = $AVE_Template->get_config_vars('DOC_MAIL_BODY_CHECK'); + $body_to_admin = str_replace('%N%', "\n", $body_to_admin); + $body_to_admin = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_admin); + $body_to_admin = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_admin); + send_mail( + $system_mail, + $body_to_admin . $text, + $AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_CHECK'), + $system_mail, + $system_mail_name, + 'text' + ); + + // Отправляем уведомление автору, о том что документ находится на проверке + $body_to_author = str_replace('%N%', "\n", $AVE_Template->get_config_vars('DOC_MAIL_BODY_USER')); + $body_to_author = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_author); + $body_to_author = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_author); + send_mail( + $_SESSION['user_email'], + $body_to_author, + $AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_USER'), + $system_mail, + $system_mail_name, + 'text' + ); + } + + if (! ((isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1) + || (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1) + || (defined('UGROUP') && UGROUP == 1)) ) + { + $document_status = 0; + } + + $_POST['document_status'] = $document_status; + + $iid = $this->documentSave($rubric_id, null, $_POST, true); + + if ($_REQUEST['doc_after']) + header('Location:index.php?do=docs&action=after&document_id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION . $innavi); + else + header('Location:index.php?do=docs&action=edit&Id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION); + exit; + + case '': // Действия по умолчанию, если не задано + $document = new stdClass(); + + // Получаем список прав доступа на добавление документов в определенную рубрику + $this->documentPermissionFetch($rubric_id); + + // Определяем флаг, который будет активировать или запрещать смену статуса у документа + if ( (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1) + || (isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1) ) + { + $document->dontChangeStatus = 0; + } + else + { + $document->dontChangeStatus = 1; + } + + $maxId = $AVE_DB->Query(" + SELECT MAX(Id) + FROM " . PREFIX . "_documents + ")->GetCell(); + + // получения списка документов из связанной рубрики + $linked_id = $AVE_DB->Query(" + SELECT + rubric_linked_rubric + FROM + " . PREFIX . "_rubrics + WHERE + Id = '".$rubric_id."' + ")->GetCell(); + + $linked_id = @unserialize($linked_id); + + $document_alias = array(); + + if ($linked_id) + { + foreach ($linked_id as $linked_id) + { + $sql = $AVE_DB->Query(" + SELECT + doc.document_alias, + doc.document_title, + doc.document_breadcrum_title, + doc.Id, + rub.rubric_title + FROM + " . PREFIX . "_documents as doc + JOIN + " . PREFIX . "_rubrics as rub + ON rub.Id = doc.rubric_id + WHERE + doc.rubric_id = '".$linked_id."' + "); + + while ($row = $sql->FetchRow()) + { + $document_alias[$row->rubric_title][] = array( + 'document_alias' => $row->document_alias, + 'document_title' => $row->document_title, + 'document_breadcrum_title' => $row->document_breadcrum_title, + 'Id' => $row->Id + ); + } + } + } + + // получения списка документов из связанной рубрики + $AVE_Template->assign('document_alias', $document_alias); + + $lang_pack=array(); + + if(! empty($_REQUEST['lang_pack'])) + { + $sql1 = $AVE_DB->Query(" + SELECT + Id, + rubric_id, + document_alias, + document_lang, + document_status + FROM + ".PREFIX."_documents + WHERE + document_lang_group=".intval($_REQUEST['lang_pack'])." OR Id=".intval($_REQUEST['lang_pack'])); + + while ($row1 = $sql1->FetchAssocArray()) + { + $lang_pack[$row1['document_lang']] = $row1; + + if ($row1['Id'] == intval($_REQUEST['lang_pack'])) + $document->document_alias=$_REQUEST['lang'].'/'.trim(ltrim($row1['document_alias'], $row1['document_lang']), '/'); + } + } + + // Формируем данные и передаем в шаблон + $document->lang_pack=$lang_pack; + $document->fields = $fields_list; + $document->rubric_title = $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_title; + $document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($rubric_id)->rubric_alias)); + $document->formaction = 'index.php?do=docs&action=new&sub=save&rubric_id=' . $rubric_id . ((isset($_REQUEST['pop']) && $_REQUEST['pop']==1) ? 'pop=1' : '') . '&cp=' . SESSION; + $document->count_groups = count($fields_list); + $document->document_published = time(); + $document->document_expire = mktime(date("H"), date("i"), 0, date("m"), date("d"), date("Y") + 10); + + $rubric_tmpls = array(); + + $sql = $AVE_DB->Query(" + SELECT + id, + title + FROM + " . PREFIX . "_rubric_templates + WHERE + rubric_id = '" . $rubric_id . "' + "); + + while ($row = $sql->FetchRow()) + { + array_push($rubric_tmpls, $row); + } + + // Доступные шаблоны рубрики + $AVE_Template->assign('rubric_tmpls', $rubric_tmpls); + + $AVE_Template->assign('document', $document); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/form.tpl')); + break; + } + } + else + { // Пользователь не имеет прав на создание документа, формируем сообщение с ошибкой + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('DOC_NO_PERMISSION_RUB')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + } + + /** + * Метод, предназначенный для редактирования документа + * + * @param int $document_id идентификатор Документа + */ + function documentEdit($document_id) + { + global $AVE_DB, $AVE_Rubric, $AVE_Template; + + // Определяем действие, выбранное пользователем + switch ($_REQUEST['sub']) + { + // Если была нажата кнопка Сохранить изменения + case 'save': + $row = $AVE_DB->Query(" + SELECT + rubric_id, + document_author_id + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $document_id . "' + ")->FetchRow(); + + $this->documentSave($row->rubric_id, $document_id, $_POST, true); + + if (isset($_REQUEST['closeafter']) && $_REQUEST['closeafter'] == 1) + { + if (! isAjax()) + { + echo ""; + } + else + { + $message = $AVE_Template->get_config_vars('DOCUMENT_SAVED'); + $header = $AVE_Template->get_config_vars('DOC_REV_SUCCESS'); + $theme = 'accept'; + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + } + else + { + + if (! isAjax()) + { + header('Location:index.php?do=docs&action=after&document_id=' . $document_id . '&rubric_id=' . $row->rubric_id . '&cp=' . SESSION); + } + else + { + $message = $AVE_Template->get_config_vars('DOCUMENT_SAVED'); + $header = $AVE_Template->get_config_vars('DOC_REV_SUCCESS'); + $theme = 'accept'; + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + } + exit; + + // Если пользователь не выполнял никаких действий, а просто открыл документ для редактирования + case '': + // Выполняем запрос к БД на получение данных о документе + $document = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $document_id . "' + ")->FetchRow(); + + $lang_pack = array(); + + $sql = $AVE_DB->Query(" + SELECT + Id, + document_alias, + document_lang, + document_lang_group, + document_status + FROM + ".PREFIX."_documents + WHERE + ". ($document->document_lang_group > 0 + ? "document_lang_group = ".$document->document_lang_group." OR Id = ".$document->document_lang_group." OR " + : "")."document_lang_group = ".$document_id." OR Id = ".$document_id + ); + + while ($row = $sql->FetchAssocArray()) + { + $lang_pack[$row['document_lang']] = $row; + } + + $document->lang_pack = $lang_pack; + + $show = true; + + // Проверяем права доступа к документу + $this->documentPermissionFetch($document->rubric_id); + + // запрещаем доступ, + // если автору документа не разрешено изменять свои документы в рубрике + // или пользователю не разрешено изменять все документы в рубрике + if (!( (isset($_SESSION['user_id']) && $document->document_author_id == $_SESSION['user_id'] + && isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1) + || (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1))) + { + $show = false; + } + + // запрещаем доступ к главной странице и странице ошибки 404, если требуется одобрение Администратора + if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) && + !(isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1) ) + { + $show = false; + } + + // разрешаем доступ, если пользователь принадлежит группе Администраторов или имеет все права на рубрику + if ( (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) ) + { + $show = true; + } + + if ($show) + { + $fields = array(); + + if ( + (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1) + || (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1) + || (isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1) + || (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) + ) + { + $document->dontChangeStatus = 0; + } + else + { + $document->dontChangeStatus = 1; + } + + // Выполняем запрос к БД на получение списка полей, которые относятся к данному документу + $sql = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_rubric_fields + WHERE + rubric_id = '" . $document->rubric_id . "' + ORDER BY + rubric_field_position ASC + "); + + // не парсим поля, просто создаём контрольный массив полей + while ($row = $sql->FetchRow()) + { + $fields[$row->Id] = $row; + } + + $doc_fields = array(); + + // Выполняем запрос к БД и получаем все данные для полей документа + $sql = $AVE_DB->Query(" + SELECT + doc.Id AS df_id, + groups.*, + groups.Id AS group_id, + rub.*, + rubric_field_default, + doc.field_value, + field_more.field_value as field_value_more + FROM + " . PREFIX . "_rubric_fields AS rub + LEFT JOIN + " . PREFIX . "_rubric_fields_group AS groups + ON rub.rubric_field_group = groups.Id + LEFT JOIN + " . PREFIX . "_document_fields AS doc + ON (rubric_field_id = rub.Id) + LEFT JOIN + " . PREFIX . "_document_fields_text AS field_more + ON (field_more.rubric_field_id = doc.rubric_field_id AND doc.document_id=field_more.document_id) + WHERE + doc.document_id = '" . $document_id . "' + ORDER BY + groups.group_position ASC, rub.rubric_field_position ASC + "); + + // записываем массив с полями документа + while ($row = $sql->FetchRow()) + { + $row->field_value = (string)$row->field_value . (string)$row->field_value_more; + $row->field = $this->_documentFieldGet($row->rubric_field_type, $row->field_value, $row->Id, $row->rubric_field_default); + + $doc_fields[$row->Id] = $row; + } + + // для каждого поля из контрольного массива... + foreach ($fields as $field_id => $row) + { + // если в документе поле есть, то записываем его + if ($doc_fields[$field_id]) + { + $fields[$field_id] = $doc_fields[$field_id]; + } + + // если нет, парсим чистое поле и добавляем в бд + else + { + $row->field = $this->_documentFieldGet($row->rubric_field_type, $row->rubric_field_default, $row->Id, $row->rubric_field_default); + + $fields[$field_id] = $row; + + $AVE_DB->Query(" + INSERT INTO " . PREFIX . "_document_fields + SET + rubric_field_id = '" . $field_id . "', + document_id = '" . $document->Id . "' + "); + } + } + + foreach ($fields as $field) + { + $group_id = ($field->rubric_field_group) ? $field->rubric_field_group : 0; + $fields_list[$group_id]['group_id'] = $field->group_id; + $fields_list[$group_id]['group_position'] = ($field->group_position) ? $field->group_position : 100; + $fields_list[$group_id]['group_title'] = $field->group_title; + $fields_list[$group_id]['fields'][$field->Id]['Id'] = $field->Id; + $fields_list[$group_id]['fields'][$field->Id]['rubric_id'] = $row->rubric_id; + $fields_list[$group_id]['fields'][$field->Id]['rubric_field_title'] = $field->rubric_field_title; + $fields_list[$group_id]['fields'][$field->Id]['rubric_field_description'] = $field->rubric_field_description; + $fields_list[$group_id]['fields'][$field->Id]['result'] = $field->field; + } + + $fields_list = msort($fields_list, 'group_position'); + + unset($doc_fields); + unset($fields); + + // Заглушка на время публикации + $document->document_published = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) ? '0' : $document->document_published = $document->document_published == 0 ? time() : $document->document_published; + $document->document_expire = ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) ? '0' : $document->document_expire = $document->document_expire == 0 ? mktime(date("H"), date("i"), 0, date("m"), date("d"), date("Y") + 10) : $document->document_expire; + + // Формируем ряд переменных и передаем их в шаблон для вывода + $document->fields = $fields_list; + $document->count_groups = count($fields_list); + $document->document_title = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_title))); + $document->document_meta_keywords = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_meta_keywords))); + $document->document_meta_description = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_meta_description))); + $document->document_breadcrum_title = htmlspecialchars_decode(stripslashes(html_entity_decode($document->document_breadcrum_title))); + $document->document_alias_breadcrumb = rewrite_link('index.php?id=' . $document->Id . '&doc=' . (empty($document->document_alias) ? prepare_url($document->document_title) : $document->document_alias)); + $document->rubric_title = $AVE_Rubric->rubricNameByIdGet($document->rubric_id)->rubric_title; + $document->rubric_url_prefix = $AVE_Rubric->rubricNameByIdGet($document->rubric_id)->rubric_alias; + $document->formaction = 'index.php?do=docs&action=edit&sub=save&Id=' . $document_id . '&cp=' . SESSION; + + if ($document->document_parent != 0) $document->parent = $AVE_DB->Query("SELECT document_alias, document_title, Id FROM " . PREFIX . "_documents WHERE Id = '".$document->document_parent."' ")->FetchRow(); + + $document_rev = array(); + + if ( (isset($_SESSION[$document->rubric_id . '_delrev']) && $_SESSION[$document->rubric_id . '_delrev'] == 1) + || (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) + || (defined('UGROUP') && UGROUP == 1) ) + { + $document->canDelRev = 1; + } + + $sql_rev = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_document_rev + WHERE + doc_id = '" . $document_id . "' + ORDER BY + doc_revision DESC + LIMIT 7 + "); + + // Формируем массив из полученных данных + while ($result = $sql_rev->FetchRow()) + { + $result->user_id = get_username_by_id($result->user_id); + array_push($document_rev, $result); + } + + $AVE_Template->assign('document_rev', $document_rev); + + // получения списка документов из связанной рубрики + $linked_id = $AVE_DB->Query(" + SELECT + rubric_linked_rubric + FROM + " . PREFIX . "_rubrics + WHERE + Id = '".$document->rubric_id."' + ")->GetCell(); + + @$linked_id = unserialize($linked_id); + + $document_alias = array(); + + if ($linked_id) + { + foreach ($linked_id as $linked_id) + { + $sql = $AVE_DB->Query(" + SELECT + doc.document_alias, + doc.document_title, + doc.document_breadcrum_title, + doc.Id, + rub.rubric_title + FROM + " . PREFIX . "_documents as doc + JOIN + " . PREFIX . "_rubrics as rub + ON rub.Id = doc.rubric_id + WHERE + doc.rubric_id = '" . $linked_id . "' + "); + + while ($row = $sql->FetchRow()) + { + $document_alias[$row->rubric_title][] = array( + 'document_alias'=>$row->document_alias, + 'document_title'=>htmlspecialchars_decode(stripslashes(html_entity_decode($row->document_title))), + 'document_breadcrum_title'=>htmlspecialchars_decode(stripslashes(html_entity_decode($row->document_breadcrum_title))), + 'Id'=>$row->Id + ); + } + } + } + + $rubric_tmpls = array(); + + $sql = $AVE_DB->Query(" + SELECT + id, + title + FROM + " . PREFIX . "_rubric_templates + WHERE + rubric_id = '" . $document->rubric_id . "' + "); + + while ($row = $sql->FetchRow()) + { + array_push($rubric_tmpls, $row); + } + + // Доступные шаблоны рубрики + $AVE_Template->assign('rubric_tmpls', $rubric_tmpls); + + // получения списка документов из связанной рубрики + $AVE_Template->assign('document_alias', $document_alias); + + $AVE_Template->assign('document', $document); + + // Отображаем страницу для редактирования + $AVE_Template->assign('content', $AVE_Template->fetch('documents/form.tpl')); + } + else // Если пользователь не имеет прав на редактирование, формируем сообщение об ошибке + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('DOC_NO_PERMISSION')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + } + } + + + /** + * Метод, предназначенный для копирования документа + * + * @param int $document_id идентификатор Документа + */ + function documentCopy($document_id) + { + global $AVE_DB, $AVE_Rubric, $AVE_Template; + + // Определяем действие, выбранное пользователем + switch ($_REQUEST['sub']) + { + // Если была нажата кнопка Сохранить изменения + case 'save': // Сохранение документа в БД + $public_start = $this->_documentStart(); // Дата/время начала публикации документа + $public_end = $this->_documentEnd(); // Дата/время окончания публикации документа + $innavi = check_permission_acp('navigation_new') ? '&innavi=1' : ''; + + // Определяем статус документа + $document_status = !empty($_REQUEST['document_status']) ? (int)$_REQUEST['document_status'] : '0'; + + // Если статус документа не определен + if (empty($document_status) && $_SESSION['user_group'] != 1) + { + $innavi = ''; + @reset($_POST); + $newtext = "\n\n"; + + // Формируем текст сообщения, состоящий из данных, + // которые пользователь ввел в поля документа + foreach ($_POST['feld'] as $val) + { + if (!empty($val)) + { + $newtext .= $val; + $newtext .= "\n---------------------\n"; + } + } + $text = strip_tags($newtext); + + // Получаем e-mail адрес из общих настроек системы + $system_mail = get_settings('mail_from'); + $system_mail_name = get_settings('mail_from_name'); + + // Отправляем администартору уведомление, о том что необходимо проверить документ + $body_to_admin = $AVE_Template->get_config_vars('DOC_MAIL_BODY_CHECK'); + $body_to_admin = str_replace('%N%', "\n", $body_to_admin); + $body_to_admin = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_admin); + $body_to_admin = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_admin); + send_mail( + $system_mail, + $body_to_admin . $text, + $AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_CHECK'), + $system_mail, + $system_mail_name, + 'text' + ); + + // Отправляем уведомление автору, о том что документ находится на проверке + $body_to_author = str_replace('%N%', "\n", $AVE_Template->get_config_vars('DOC_MAIL_BODY_USER')); + $body_to_author = str_replace('%TITLE%', stripslashes($_POST['document_title']), $body_to_author); + $body_to_author = str_replace('%USER%', "'" . $_SESSION['user_name'] . "'", $body_to_author); + send_mail( + $_SESSION['user_email'], + $body_to_author, + $AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_USER'), + $system_mail, + $system_mail_name, + 'text' + ); + } + + if (! ((isset($_SESSION[$rubric_id . '_newnow']) && $_SESSION[$rubric_id . '_newnow'] == 1) + || (isset($_SESSION[$rubric_id . '_alles']) && $_SESSION[$rubric_id . '_alles'] == 1) + || (defined('UGROUP') && UGROUP == 1)) ) + { + $document_status = 0; + } + + $_POST['document_status']=$document_status; + + $iid = $this->documentSave($_REQUEST['rubric_id'],null,$_POST,true); + + if (! $_REQUEST['next_edit']) + { + header('Location:index.php?do=docs&action=after&document_id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION . $innavi); + } + else + { + header('Location:index.php?do=docs&action=edit&Id=' . $iid . '&rubric_id=' . $rubric_id . '&cp=' . SESSION); + } + + exit; + + // Если пользователь не выполнял никаких действий, а просто открыл документ для копирования + // Если пользователь не выполнял никаких действий, а просто открыл документ для редактирования + case '': + // Выполняем запрос к БД на получение данных о документе + $document = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_documents + WHERE Id = '" . $document_id . "' + ")->FetchRow(); + + $show = true; + + // Проверяем права доступа к документу + $this->documentPermissionFetch($document->rubric_id); + + // запрещаем доступ, + // если автору документа не разрешено изменять свои документы в рубрике + // или пользователю не разрешено изменять все документы в рубрике + if (!( (isset($_SESSION['user_id']) && $document->document_author_id == $_SESSION['user_id'] + && isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1) + || (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1))) + { + $show = false; + } + + // запрещаем доступ к главной странице и странице ошибки 404, если требуется одобрение Администратора + if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) && + !(isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1) ) + { + $show = false; + } + + // разрешаем доступ, если пользователь принадлежит группе Администраторов или имеет все права на рубрику + if ( (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) ) + { + $show = true; + } + + if ($show) + { + $fields = array(); + + if ( (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1) ) + { + $document->dontChangeStatus = 0; + } + else + { + $document->dontChangeStatus = 1; + } + + // Выполняем запрос к БД и получаем все данные для полей документа + $sql = $AVE_DB->Query(" + SELECT + doc.Id AS df_id, + groups.*, + rub.*, + rubric_field_default, + doc.field_value, + field_more.field_value as field_value_more + FROM + " . PREFIX . "_rubric_fields AS rub + LEFT JOIN + " . PREFIX . "_rubric_fields_group AS groups + ON rub.rubric_field_group = groups.Id + LEFT JOIN + " . PREFIX . "_document_fields AS doc + ON (rubric_field_id = rub.Id) + LEFT JOIN + " . PREFIX . "_document_fields_text AS field_more + ON (field_more.rubric_field_id = doc.rubric_field_id AND doc.document_id=field_more.document_id) + WHERE + doc.document_id = '" . $document_id . "' + ORDER BY + groups.group_position ASC, rub.rubric_field_position ASC + "); + + + while ($row = $sql->FetchRow()) + { + //$row->Feld = $this->_documentFieldGet($row->rubric_field_type, (string)$row->field_value.(string)$row->more, $row->Id, $row->rubric_field_default); + $row->field_value = (string)$row->field_value . (string)$row->field_value_more; + $row->field = $this->_documentFieldGet($row->rubric_field_type, $row->field_value, $row->Id, $row->rubric_field_default); + array_push($fields, $row); + } + + $maxId = $AVE_DB->Query(" + SELECT MAX(Id) + FROM " . PREFIX . "_documents + ")->GetCell(); + + foreach ($fields as $field) + { + $group_id = ($field->rubric_field_group) ? $field->rubric_field_group : 0; + + $fields_list[$group_id]['group_position'] = ($field->group_position) ? $field->group_position : 100; + $fields_list[$group_id]['group_title'] = $field->group_title; + $fields_list[$group_id]['fields'][$field->Id]['Id'] = $field->Id; + $fields_list[$group_id]['fields'][$field->Id]['rubric_id'] = $row->rubric_id; + $fields_list[$group_id]['fields'][$field->Id]['rubric_field_title'] = $field->rubric_field_title; + $fields_list[$group_id]['fields'][$field->Id]['rubric_field_description'] = $field->rubric_field_description; + $fields_list[$group_id]['fields'][$field->Id]['result'] = $field->field; + } + + $fields_list = msort($fields_list, 'group_position'); + + unset($doc_fields); + unset($fields); + + // Формируем ряд переменных и передаем их в шаблон для вывода + $document->fields = $fields_list; + $document->count_groups = count($fields_list); + $document->document_alias = ''; + $document->rubric_title = $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_title; + $document->rubric_url_prefix = strftime(str_ireplace("%id", $maxId+1, $AVE_Rubric->rubricNameByIdGet($_REQUEST['rubric_id'])->rubric_alias)); + $document->formaction = 'index.php?do=docs&action=copy&sub=save&rubric_id=' . $_REQUEST['rubric_id'] . ((isset($_REQUEST['pop']) && $_REQUEST['pop']==1) ? 'pop=1' : '') . '&cp=' . SESSION; + $document->document_published = time(); + $document->document_expire = mktime(date("H"), date("i"), 0, date("m"), date("d"), date("Y") + 10); + + if ($document->document_parent != 0) $document->parent = $AVE_DB->Query("SELECT document_title, Id FROM " . PREFIX . "_documents WHERE Id = '".$document->document_parent."' ")->FetchRow(); + + $AVE_Template->assign('document', $document); + + // Отображаем страницу для редактирования + $AVE_Template->assign('content', $AVE_Template->fetch('documents/form.tpl')); + } + else // Если пользователь не имеет прав на редактирование, формируем сообщение об ошибке + { + $AVE_Template->assign('erorr', $AVE_Template->get_config_vars('DOC_NO_PERMISSION')); + $AVE_Template->assign('content', $AVE_Template->fetch('error.tpl')); + } + break; + } + } + + /** + * Метод, предназначенный для пометки документа к удалению + * + * @param int $document_id идентификатор Документа + */ + function documentMarkDelete($document_id) + { + global $AVE_DB; + + // Выполняем запрос к БД на получение информации о документе (id, id рубрики, автор) + $row = $AVE_DB->Query(" + SELECT + Id, + rubric_id, + document_author_id + FROM " . PREFIX . "_documents + WHERE Id = '" . $document_id . "' + ")->FetchRow(); + + // Если у пользователя достаточно прав на выполнение данной операции + if ( + (isset($_SESSION[$row->rubric_id . '_editall']) && $_SESSION[$row->rubric_id . '_editall'] == 1) + || + (isset($_SESSION[$row->rubric_id . '_editown']) && $_SESSION[$row->rubric_id . '_editown'] == 1) + || + (isset($_SESSION[$row->rubric_id . '_alles']) && $_SESSION[$row->rubric_id . '_alles'] == 1) + || + (defined('UGROUP') && UGROUP == 1) + ) + { + // и это не главная страница и не страница с ошибкой 404 + if ($document_id != 1 && $document_id != PAGE_NOT_FOUND_ID) + { + // Выполняем запрос к БД на обновление данных (пометка на удаление) + $AVE_DB->Query(" + UPDATE " . PREFIX . "_documents + SET document_deleted = '1' + WHERE Id = '" . $document_id . "' + "); + + $AVE_DB->clearcache('rub_'.$row->rubric_id); + $AVE_DB->clearcache('doc_'.$document_id); + $AVE_DB->clearcompile('doc_'.$document_id); + + // Сохраняем системное сообщение в журнал + reportLog('Положил документ в корзину (' . $document_id . ')'); + } + } + + // Выполняем обновление страницы + header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION); + } + + /** + * Метод, предназначенный для снятия отметки об удаления + * + * @param int $document_id идентификатор Документа + */ + function documentUnmarkDelete($document_id) + { + global $AVE_DB; + + // Выполняем запрос к БД на обновление информации (снятие отметки об удалении) + $row = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_documents + WHERE Id = '" . $document_id . "' + ")->FetchRow(); + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_documents + SET document_deleted = '0' + WHERE Id = '" . $document_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog('Восстановил удаленный документ (' . $document_id . ')'); + + $AVE_DB->clearcache('rub_'.$row->rubric_id); + $AVE_DB->clearcache('doc_'.$document_id); + $AVE_DB->clearcompile('doc_'.$document_id); + + // Выполняем обновление страницы + header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION); + } + + /** + * Метод, предназначенный для полного удаления документа без возможности восстановления + * + * @param int $document_id идентификатор Документа + */ + function documentDelete($document_id) + { + global $AVE_DB; + + // Проверяем, чтобы удаляемый документ не являлся главной страницей и не страницей с 404 ощибкой + if ($document_id != 1 && $document_id != PAGE_NOT_FOUND_ID) + { + $row = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_documents + WHERE Id = '" . $document_id . "' + ")->FetchRow(); + + // Выполняем запрос к БД на удаление информации о документе + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $document_id . "' + "); + + // Выполняем запрос к БД на удаление полей, которые относились к документу + $AVE_DB->Query(" + DELETE + f1.*, + f2.* + FROM + " . PREFIX . "_document_fields AS f1 + INNER JOIN + " . PREFIX . "_document_fields_text AS f2 + WHERE + f1.document_id = '" . $document_id . "' + AND + f2.document_id = f1.document_id + "); + + // Очищаем кэш шаблона + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_rubric_template_cache + WHERE + doc_id = '" . $document_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog('Удалил документ '. $row->document_title . ' (ID: ' . $document_id . ')'); + } + + // Удаляем кеш докеумента + $AVE_DB->clearcache('rub_' . $row->rubric_id); + $AVE_DB->clearcache('doc_' . $document_id); + $AVE_DB->clearcompile('doc_'.$document_id); + + // Выполняем обновление страницы + header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) + ? '' + : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION); + } + + /** + * Метод, предназначенный для публикации или отмены публикации документа + * + * @param int $document_id идентификатор Документа + * @param string $openclose статус Документа {open|close} + */ + function documentStatusSet($document_id, $openclose = 0) + { + global $AVE_DB, $AVE_Template; + + $errors = array(); + + $show = true; + + // Выполняем запрос к БД на получение информации о документе (id, id рубрики, автор) + $document = $AVE_DB->Query(" + SELECT + Id, + rubric_id, + document_author_id + FROM " . PREFIX . "_documents + WHERE Id = '" . $document_id . "' + ")->FetchRow(); + + // Проверяем права доступа к документу + $this->documentPermissionFetch($document->rubric_id); + + // запрещаем доступ, + // если автору документа не разрешено изменять свои документы в рубрике + // или пользователю не разрешено изменять все документы в рубрике + if (! + ( + (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1) + || + (isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1) + || + (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) + || + (defined('UGROUP') && UGROUP == 1) + ) + ) + { + $show = false; + } + + // запрещаем доступ к главной странице и странице ошибки 404, если требуется одобрение Администратора + if ( ($document_id == 1 || $document_id == PAGE_NOT_FOUND_ID) && + !(isset($_SESSION[$document->rubric_id . '_newnow']) && $_SESSION[$document->rubric_id . '_newnow'] == 1) ) + { + $show = false; + } + + // разрешаем доступ, если пользователь принадлежит группе Администраторов или имеет все права на рубрику + if ( (defined('UGROUP') && UGROUP == 1) + || (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) ) + { + $show = true; + } + + if ($show) + { + // Выполняем запрос к БД на получение id автора документа, чтобы проверить уровень прав доступа + + // Проверем, чтобы у пользователя было достаточно прав на выполнение данной операции + if ( + ( + ($document->document_author_id == @$_SESSION['user_id']) + && + (isset($_SESSION[$document->rubric_id . '_newnow']) && @$_SESSION[$row->rubric_id . '_newnow'] == 1) + || + @$_SESSION[$row->rubric_id . '_alles'] == 1 + || + (defined('UGROUP') && UGROUP == 1) + ) + || + (isset($_SESSION[$document->rubric_id . '_editall']) && $_SESSION[$document->rubric_id . '_editall'] == 1) + || + (isset($_SESSION[$document->rubric_id . '_editown']) && $_SESSION[$document->rubric_id . '_editown'] == 1) + || + (isset($_SESSION[$document->rubric_id . '_alles']) && $_SESSION[$document->rubric_id . '_alles'] == 1) + || + (defined('UGROUP') && UGROUP == 1) + ) + { + // Если это не главная страница и не страница с 404 ошибкой + if ($document_id != 1 && $document_id != PAGE_NOT_FOUND_ID) + { + // Выполянем запрос к БД на смену статуса у документа + $AVE_DB->Query(" + UPDATE " . PREFIX . "_documents + SET document_status = '" . $openclose . "' + WHERE Id = '" . $document_id . "' + "); + + $AVE_DB->clearcache('rub_'.$row->rubric_id); + $AVE_DB->clearcache('doc_'.$document_id); + $AVE_DB->clearcompile('doc_'.$document_id); + + // Сохраняем системное сообщение в журнал + reportLog($_SESSION['user_name'] . ' - ' . (($openclose==1) ? $AVE_Template->get_config_vars('DOC_DOCUMENT_ACT') : $AVE_Template->get_config_vars('DOC_DOCUMENT_DISACT')) . ' ' . $AVE_Template->get_config_vars('DOC_DOCUMENT_DOC') . ' (' . $document_id . ')', 2, 2); + + }else{ + + $errors[] = $AVE_Template->get_config_vars('DOC_DOCUMENT_OPEN_ERR'); + } + + }else{ + + $errors[] = $AVE_Template->get_config_vars('DOC_DOCUMENT_OPEN_PRIVE'); + } + + if (isset($_REQUEST['ajax'])) { + + if (empty($errors)) + { + // Если ошибок не найдено, формируем сообщение об успешной операции + echo json_encode(array((($openclose==1) ? $AVE_Template->get_config_vars('DOC_DOCUMENT_OPEN') : $AVE_Template->get_config_vars('DOC_DOCUMENT_CLOSE')) . implode(',
      ', $errors), 'accept')); + }else{ + + // В противном случае формируем сообщение с ошибкой + echo json_encode(array($AVE_Template->get_config_vars('DOC_URL_CHECK_ER') . implode(',
      ', $errors), 'error')); + + } + + $AVE_DB->clearcache('rub_'.$row->rubric_id); + $AVE_DB->clearcache('doc_'.$document_id); + $AVE_DB->clearcompile('doc_'.$document_id); + exit; + + }else{ + + $AVE_DB->clearcache('rub_'.$row->rubric_id); + $AVE_DB->clearcache('doc_'.$document_id); + $AVE_DB->clearcompile('doc_'.$document_id); + // Выполняем обновление страницы + header('Location:index.php?do=docs'.(empty($_REQUEST['rubric_id']) ? '' : '&rubric_id='.$_REQUEST['rubric_id']).'&cp=' . SESSION); + exit; + } + } else { + header('Location:index.php?do=docs&cp=' . SESSION); + exit; + } + } + + /** + * Метод, предназначенный для передачи в Smarty шаблонизатор меток периода времени отображаемых + * в списке документов + * + */ + function documentTemplateTimeAssign() + { + global $AVE_Template; + + if (!empty($_REQUEST['TimeSelect'])) + { + $AVE_Template->assign('sel_start', $this->_documentListStart()); + $AVE_Template->assign('sel_end', $this->_documentListEnd()); + } + } + + /** + * Метод, предназначенный для переноса документа в другую рубрику + * + */ + function documentRubricChange() + { + global $AVE_DB, $AVE_Template; + + $document_id = (int)$_REQUEST['Id']; // идентификатор документа + $rubric_id = (int)$_REQUEST['rubric_id']; // идентификатор текущей рубрики + + // Если в запросе пришел идентификатор новой рубрики и id документа, тогда + // выполняем автоматический перенос документа из одной рубрики в другую + if ((!empty($_POST['NewRubr'])) and (!empty($_GET['Id']))) + { + $new_rubric_id = (int)$_POST['NewRubr']; // идентификатор целевой рубрики + + // Циклически обрабатываем данные, пришедшие в запросе методо POST + foreach ($_POST as $key => $value) + { + if (is_integer($key)) + { + // Определяем флаг поля + switch ($value) + { + // Если 0, тогда + case 0: + // Выполняем запрос к БД на удаление старого поля (лишнее или не требует переноса) + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_document_fields + WHERE document_id = '" . $document_id . "' + AND rubric_field_id = '" . $key . "' + "); + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_document_fields_text + WHERE document_id = '" . $document_id . "' + AND rubric_field_id = '" . $key . "' + "); + break; + + // Если -1, тогда + case -1: + // Выполняем запрос на получение данных для этого (старого) поля + $row_fd = $AVE_DB->Query(" + SELECT + rubric_field_title, + rubric_field_type + FROM " . PREFIX . "_rubric_fields + WHERE Id = '" . $key . "' + ")->FetchRow(); + + // Выполняем запрос к БД и получаем последнюю позицию полей в рубрики КУДА переносим + $new_pos = $AVE_DB->Query(" + SELECT rubric_field_position + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . $new_rubric_id . "' + ORDER BY rubric_field_position DESC + LIMIT 1 + ")->GetCell(); + ++$new_pos; + + // Выполняем запрос к БД и добавляем новое поле в новую рубрику + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_rubric_fields + SET + rubric_id = '" . $new_rubric_id . "', + rubric_field_title = '" . addslashes($row_fd->rubric_field_title) . "', + rubric_field_type = '" . addslashes($row_fd->rubric_field_type) . "', + rubric_field_position = '" . $new_pos . "' + "); + + $lastid = $AVE_DB->InsertId(); + + // Выполняем запрос к БД и добавляем запись о поле в таблицу с полями документов + $sql_docs = $AVE_DB->Query(" + SELECT Id + FROM " . PREFIX . "_documents + WHERE rubric_id = '" . $new_rubric_id . "' + "); + + while ($row_docs = $sql_docs->FetchRow()) + { + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_document_fields + SET + rubric_field_id = '" . $lastid . "', + document_id = '" . $row_docs->Id . "', + field_value = '', + document_in_search = '1' + "); + } + + // Выполняем запрос к БД и создаем новое поле для изменяемого документа + $AVE_DB->Query(" + UPDATE " . PREFIX . "_document_fields + SET rubric_field_id = '" . $lastid . "' + WHERE rubric_field_id = '" . $key . "' + AND document_id = '" . $document_id . "' + "); + $AVE_DB->Query(" + UPDATE " . PREFIX . "_document_fields_text + SET rubric_field_id = '" . $lastid . "' + WHERE rubric_field_id = '" . $key . "' + AND document_id = '" . $document_id . "' + "); + break; + + // По умолчанию + default: + // Выполняем запрос к БД и просто обновляем имеющиеся данные + $AVE_DB->Query(" + UPDATE " . PREFIX . "_document_fields + SET rubric_field_id = '" . $value . "' + WHERE rubric_field_id = '" . $key . "' + AND document_id = '" . $document_id . "' + "); + $AVE_DB->Query(" + UPDATE " . PREFIX . "_document_fields_text + SET rubric_field_id = '" . $value . "' + WHERE rubric_field_id = '" . $key . "' + AND document_id = '" . $document_id . "' + "); + break; + } + } + } + + // Выполняем запрос к БД и получаем список всех полей у новой рубрики + $sql_rub = $AVE_DB->Query(" + SELECT Id + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . $new_rubric_id . "' + ORDER BY Id ASC + "); + + // Выполняем запросы к БД на проверку наличия нужных полей. + while ($row_rub = $sql_rub->FetchRow()) + { + $num = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_document_fields + WHERE rubric_field_id = '" . $row_rub->Id . "' + AND document_id = '" . $document_id . "' + LIMIT 1 + ")->NumRows(); + + // Если в новой рубрики требуемого поля нет, выполняем запрос к БД на добавление нового типа поля + if ($num != 1) + { + $AVE_DB->Query(" + INSERT " . PREFIX . "_document_fields + SET + rubric_field_id = '" . $row_rub->Id . "', + document_id = '" . $document_id . "', + field_value = '', + document_in_search = '1' + "); + } + } + + // Выполянем запрос к БД на обновление информации, в котором устанавливаем для перенесенного документа + // новое значение id рубрики + $AVE_DB->Query(" + UPDATE " . PREFIX . "_documents + SET rubric_id = '" . $new_rubric_id . "' + WHERE Id = '" . $document_id . "' + "); + + // Выполняем запрос к БД и очищаем кэш шаблона документа + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_template_cache + WHERE doc_id = '" . $document_id . "' + "); + + echo ''; + } + else // Если в запросе не был указан id рубрики и id документа + { + // Формируем и отображаем форму, где пользователь самостоятельно определяет перенос + $fields = array(); + + if ((!empty($_GET['NewRubr'])) and ($rubric_id != (int)$_GET['NewRubr'])) + { + // Выполняем запрос к БД и выбираем все поля новой рубрики + $sql_rub = $AVE_DB->Query(" + SELECT + Id, + rubric_field_title, + rubric_field_type + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . (int)$_GET['NewRubr'] . "' + ORDER BY Id ASC + "); + $mass_new_rubr = array(); + while ($row_rub = $sql_rub->FetchRow()) + { + $mass_new_rubr[] = array('Id' => $row_rub->Id, + 'title' => $row_rub->rubric_field_title, + 'rubric_field_type' => $row_rub->rubric_field_type + ); + } + + // Выполняем запрос к БД и выбираем все поля старой рубрики + $sql_old_rub = $AVE_DB->Query(" + SELECT + Id, + rubric_field_title, + rubric_field_type + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . $rubric_id . "' + ORDER BY Id ASC + "); + + // Циклически обрабатываем полученные данные + while ($row_nr = $sql_old_rub->FetchRow()) { + $type = $row_nr->rubric_field_type; + $option_arr = array('0' => $AVE_Template->get_config_vars('DOC_CHANGE_DROP_FIELD'), + '-1' => $AVE_Template->get_config_vars('DOC_CHANGE_CREATE_FIELD') + ); + $selected = -1; + foreach ($mass_new_rubr as $row) + { + if ($row['rubric_field_type'] == $type) + { + $option_arr[$row['Id']] = $row['title']; + if ($row_nr->rubric_field_title == $row['title']) $selected = $row['Id']; + } + } + $fields[$row_nr->Id] = array('title' => $row_nr->rubric_field_title, + 'Options' => $option_arr, + 'Selected' => $selected + ); + } + } + + // Формируем ряд переменых и отображаем страницу с выбором рубрики + $AVE_Template->assign('fields', $fields); + $AVE_Template->assign('formaction', 'index.php?do=docs&action=change&Id=' . $document_id . '&rubric_id=' . $rubric_id . '&pop=1&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/change.tpl')); + } + } + + /** + * Метод, предназначенный для формирования прав доступа Группы пользователей на Документы определённой Рубрики + * + * @param int $rubric_id идентификатор Рубрики + */ + function documentPermissionFetch($rubric_id) + { + global $AVE_DB; + + // Массив прав пользователей + static $rubric_permissions = array(); + + // Если у нас уже имеются полученные права для данной рубрики, просто прерываем проверку + if (isset($rubric_permissions[$rubric_id])) return; + + // Выполняем запрос к БД на получение прав для данной рубрики + $sql = $AVE_DB->Query(" + SELECT + rubric_id, + rubric_permission + FROM " . PREFIX . "_rubric_permissions + WHERE user_group_id = '" . UGROUP . "' + "); + + // Циклически обрабатываем полученные данные и формируем массив прав + while ($row = $sql->FetchRow()) + { + $rubric_permissions[$row->rubric_id] = 1; + + $permissions = explode('|', $row->rubric_permission); + + foreach ($permissions as $rubric_permission) + { + if (!empty($rubric_permission)) + { + $_SESSION[$row->rubric_id . '_' . $rubric_permission] = 1; + } + } + } + } + + /** + * Метод, предназначенный для просмотра и добавления Заметок к Документу + * + * @param int $reply признак ответа на Заметку + */ + function documentRemarkNew($document_id = 0, $reply = 0) + { + global $AVE_DB, $AVE_Template, $AVE_Core; + + // Если id документа не число или 0, прерываем выполнение + if (!(is_numeric($document_id) && $document_id > 0)) exit; + + $document_title = get_document($document_id, 'document_title'); + $AVE_Template->assign('document_title', $document_title); + + // Если в запросе пришел параметр на Сохранение + if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save') + { + // Если пользователь оставил комментарий и у него имеются права и это не ответ, а новая заметка, тогда + if (!empty($_REQUEST['remark_text']) && check_permission('remarks') && empty($_REQUEST['reply'])) + { + // Выполняем запрос к БД на добавление новой заметки для документа + $AVE_DB->Query(" + INSERT " . PREFIX . "_document_remarks + SET + document_id = '" . $document_id . "', + remark_title = '" . clean_no_print_char($_REQUEST['remark_title']) . "', + remark_text = '" . substr(clean_no_print_char($_REQUEST['remark_text']), 0, $this->_max_remark_length) . "', + remark_author_id = '" . $_SESSION['user_id'] . "', + remark_published = '" . time() . "', + remark_first = '1', + remark_author_email = '" . $_SESSION['user_email'] . "' + "); + } + + // Выполняем обновление страницы + header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION); + } + + // Если это ответ на уже существующую заметку + if ($reply == 1) + { + if (isset($_REQUEST['sub']) && $_REQUEST['sub'] == 'save') + { + // Если пользователь оставил ответ и имеет на это права + if (!empty($_REQUEST['remark_text']) && check_permission('remarks')) + { + // Выполняем запрос на получение e-mail адреса автора заметки + $remark_author_email = $AVE_DB->Query(" + SELECT remark_author_email + FROM " . PREFIX . "_document_remarks + WHERE remark_first = '1' + AND document_id = '" . $document_id . "' + ")->GetCell(); + + // Выполняем запрос к БД на добавление заметки в БД + $AVE_DB->Query(" + INSERT " . PREFIX . "_document_remarks + SET + document_id = '" . $document_id . "', + remark_title = '" . clean_no_print_char($_REQUEST['remark_title']) . "', + remark_text = '" . substr(clean_no_print_char($_REQUEST['remark_text']), 0, $this->_max_remark_length) . "', + remark_author_id = '" . $_SESSION['user_id'] . "', + remark_published = '" . time() . "', + remark_first = '0', + remark_author_email = '" . $_SESSION['user_email'] . "' + "); + } + + // Формируем сообщение и отправляем письмо автору, с информацией о том, что на его заметку есть ответ + $system_mail = get_settings('mail_from'); + $system_mail_name = get_settings('mail_from_name'); + $link = get_home_link() . 'index.php?do=docs&doc_id=' . $document_id; + + $body_to_admin = $AVE_Template->get_config_vars('DOC_MAIL_BODY_NOTICE'); + $body_to_admin = str_replace('%N%', "\n", $body_to_admin); + $body_to_admin = str_replace('%TITLE%', stripslashes($_POST['remark_title']), $body_to_admin); + $body_to_admin = str_replace('%USER%', get_username_by_id($_SESSION['user_id']), $body_to_admin); + $body_to_admin = str_replace('%LINK%', $link, $body_to_admin); + send_mail( + $remark_author_email, + $body_to_admin, + $AVE_Template->get_config_vars('DOC_MAIL_SUBJECT_NOTICE'), + $system_mail, + $system_mail_name, + 'text' + ); + + // Выполняем обновление страницы + header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION); + } + + // Получаем общее количество заметок для документа + $num = $AVE_DB->Query(" + SELECT COUNT(*) + FROM " . PREFIX . "_document_remarks + WHERE document_id = '" . $document_id . "' + ")->GetCell(); + + // Определяыем лимит заметок на 1 странице и подсчитываем количество страниц + $limit = 10; + $seiten = ceil($num / $limit); + $start = get_current_page() * $limit - $limit; + + $answers = array(); + + // Выполняем запрос к БД на получение заметок с учетом количества на 1 странцу + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_document_remarks + WHERE document_id = '" . $document_id . "' + ORDER BY Id DESC + LIMIT " . $start . "," . $limit + ); + while ($row = $sql->FetchAssocArray()) + { + $row['remark_author'] = get_username_by_id($row['remark_author_id']); + $row['remark_text'] = nl2br($row['remark_text']); + $row['remark_avatar'] = getAvatar($row['remark_author_id'],40); + array_push($answers, $row); + } + + $remark_status = $AVE_DB->Query(" + SELECT remark_status + FROM " . PREFIX . "_document_remarks + WHERE document_id = '" . $document_id . "' + AND remark_first = '1' + ")->GetCell(); + + // Если количество заметок превышает допустимое значение, определенное в переменной $limit, тогда + // формируем постраничную навигацию + if ($num > $limit) + { + $page_nav = "
    30. {t}
    31. "; + $page_nav = get_pagination($seiten, 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + // Передаем данные в шаблон и отображаем страницу со списком заметок + $AVE_Template->assign('document_title', $document_title); + $AVE_Template->assign('remark_status', $remark_status); + $AVE_Template->assign('answers', $answers); + $AVE_Template->assign('reply', 1); + $AVE_Template->assign('formaction', 'index.php?do=docs&action=remark_reply&sub=save&Id=' . $document_id . '&reply=1&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/newremark.tpl')); + } + else + { // В противном случае, если заметок еще нет, открываем форму для добавление заметки + $AVE_Template->assign('reply', 1); + $AVE_Template->assign('new', 1); + $AVE_Template->assign('formaction', 'index.php?do=docs&action=remark&sub=save&Id=' . $document_id . '&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/newremark.tpl')); + } + } + + /** + * Метод, предназначенный для управления статусами дискусии (разрешить или запретить оставлять + * ответы на заметки для других пользователей) + * + * @param int $document_id идентификатор документа + * @param int $status статус дискусии + */ + function documentRemarkStatus($document_id = 0, $status = 0) + { + global $AVE_DB; + + // Если id документа число и оно больше 0, тогда + if (is_numeric($document_id) && $document_id > 0) + { + // Выполняем запрос к БД на обновление статуса у заметок + $AVE_DB->Query(" + UPDATE " . PREFIX . "_document_remarks + SET remark_status = '" . ($status != 1 ? 0 : 1) . "' + WHERE remark_first = '1' + AND document_id = '" . $document_id . "' + "); + } + + // Выполняем обновление данных + header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для удаление заметок + * + * @param int $all признак удаления всех Заметок (1 - удалить все) + */ + function documentRemarkDelete($document_id = 0, $all = 0) + { + global $AVE_DB; + + // Если id документа не число или 0, прерываем выполнение + if (!(is_numeric($document_id) && $document_id > 0)) exit; + + // Если в запросе пришел параметр на удаление всех заметок + if ($all == 1) + { + // Выполянем запрос к БД и удалаем заметки + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_document_remarks + WHERE + document_id = '" . $document_id . "' + "); + + // Выполняем обновление страницы + header('Location:index.php?do=docs&action=remark&Id=' . $document_id . '&pop=1&cp=' . SESSION); + exit; + } + else + { + if (!(isset($_REQUEST['CId']) && is_numeric($_REQUEST['CId']) && $_REQUEST['CId'] > 0)) + exit; + + // В противном случае, выполняем запрос к БД и удаляем только ту заметку, которая была выбрана + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_document_remarks + WHERE + document_id = '" . $document_id . "' + AND + Id = '" . $_REQUEST['CId'] . "' + "); + + // Выполняем обновление страницы + header('Location:index.php?do=docs&action=remark_reply&Id=' . $document_id . '&pop=1&cp=' . SESSION); + exit; + } + } + + /** + * Добавить в навигацию пункт ссылающийся на документ + * + */ + function documentInNavi() + { + global $AVE_DB; + + $document_id = isset($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : 0; + $rubric_id = isset($_REQUEST['rubric_id']) ? (int)$_REQUEST['rubric_id'] : 0; + $title = isset($_REQUEST['navi_title']) ? clean_no_print_char($_REQUEST['navi_title']) : ''; + + if ($document_id > 0 && $rubric_id > 0 && $title != '' && check_permission_acp('navigation_new')) + { + $document_alias = $AVE_DB->Query(" + SELECT + document_alias + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $document_id . "' + AND + rubric_id = '" . $rubric_id . "' + LIMIT 1 + ")->GetCell(); + } + + + if (isset($document_alias) && $document_alias !== false) + { + // Получаем id пункта меню из запроса + $parent_id = isset($_REQUEST['parent_id']) ? (int)$_REQUEST['parent_id'] : 0; + + // Если пункт не родительский, а какой-либо дочерний + if ($parent_id > 0) + { + // Выполняем запрос к БД на получение id меню навигации и уровня + list($navigation_id, $status, $level) = $AVE_DB->Query(" + SELECT + navigation_id, + status, + level+1 + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $parent_id . "' + LIMIT 1 + ")->FetchArray(); + } + else + { + $navigation_id = (isset($_REQUEST['navi_id']) && (int)$_REQUEST['navi_id'] > 0) ? (int)$_REQUEST['navi_id'] : 1; + $status = 1; + $level = 1; + } + + $target = (isset($_REQUEST['navi_item_target']) && $_REQUEST['navi_item_target'] == '_blank') ? '_blank' : '_self'; + + $position = empty($_REQUEST['navi_item_position']) ? 1 : (int)$_REQUEST['navi_item_position']; + + + if ($level > 3) + $level = '3'; + + // Добавляем информации о новой связке Документ<->Пункт меню + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_navigation_items + SET + title = '" . $title . "', + document_id = '" . $document_id . "', + alias = '" . $document_alias . "', + parent_id = '" . $parent_id . "', + navigation_id = '" . $navigation_id . "', + level = '" . $level . "', + target = '" . $target . "', + position = '" . $position . "', + status = '" . $status . "' + "); + } + + header('Location:index.php?do=docs&action=after&document_id=' . $document_id . '&rubric_id=' . $rubric_id . '&cp=' . SESSION); + exit; + } + + /** + * Вывод формы дополнительных действий с новым или отредактированным документом + * + */ + function documentFormAfter() + { + global $AVE_DB, $AVE_Template; + + $document_id = isset($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : 0; + $rubric_id = isset($_REQUEST['rubric_id']) ? (int)$_REQUEST['rubric_id'] : 0; + $innavi = (isset($_REQUEST['innavi']) && check_permission_acp('navigation_new')) ? 1 : 0; + + if ($document_id > 0 && $rubric_id > 0) + { + $document = $AVE_DB->Query(" + SELECT + Id AS document_id, + rubric_id, + document_title AS document_title, + '" . $innavi . "' AS innavi + FROM " . PREFIX . "_documents + WHERE Id = '" . $document_id . "' + AND rubric_id = '" . $rubric_id . "' + LIMIT 1 + ")->FetchAssocArray(); + } + + if (empty($document)) + { + header('Location:index.php?do=docs&cp=' . SESSION); + exit; + } + + $AVE_Template->assign($document); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/form_after.tpl')); + } + + /** + * Метод, предназначенный для смены автора документа + * + * @param int $doc_id идентификатор документа + * @param int $user_id идентификатор пользователя + */ + function changeAutorSave() + { + global $AVE_DB; + + // Если id документа число и оно больше 0, тогда + if (is_numeric($_REQUEST['doc_id']) && $_REQUEST['doc_id'] > 0) + { + // Выполняем запрос к БД на обновление статуса у заметок + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_documents + SET + document_author_id = '" . $_REQUEST['user_id'] . "' + WHERE + Id = '" . $_REQUEST['doc_id'] . "' + "); + + $username = get_username_by_id($_REQUEST['user_id']); + echo " + + "; + } + exit; + } + + /** + * Метод, предназначенный для удаления ревизий документов + * + */ + function documentsRevisionsClear() + { + global $AVE_DB, $AVE_Template; + + if(check_permission('document_php')){ + + $sql = $AVE_DB->Query(" + TRUNCATE TABLE " . PREFIX . "_document_rev + "); + + if ($sql->_result === false) { + $message = $AVE_Template->get_config_vars('SETTINGS_REV_DELETED_ERR'); + $header = $AVE_Template->get_config_vars('SETTINGS_ERROR'); + $theme = 'error'; + } else { + $message = $AVE_Template->get_config_vars('SETTINGS_REV_DELETED'); + $header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('SETTINGS_REV_UPDATE')); + } + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = 'run') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + header('Location:index.php?do=settings&cp=' . SESSION); + } + } + exit; + } + + /** + * Метод, предназначенный для удаления ревизий документов + * + */ + function documentCounterClear() + { + global $AVE_DB, $AVE_Template; + + if(check_permission('gen_settings')){ + + $sql = $AVE_DB->Query(" + TRUNCATE TABLE " . PREFIX . "_view_count + "); + + if ($sql->_result === false) { + $message = $AVE_Template->get_config_vars('SETTINGS_COUNT_DELETED_ERR'); + $header = $AVE_Template->get_config_vars('SETTINGS_ERROR'); + $theme = 'error'; + }else{ + $message = $AVE_Template->get_config_vars('SETTINGS_COUNT_DELETED'); + $header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('SETTINGS_COUNT_UPDATE')); + } + + if (isAjax()) { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + header('Location:index.php?do=settings&cp=' . SESSION); + } + } + exit; + } + + + /** + * Метод, предназначенный для формирования URL + * + */ + function documentAliasCreate() + { + $alias = empty($_REQUEST['alias']) ? '' : prepare_url($_REQUEST['alias']); + $prefix = empty($_REQUEST['prefix']) ? '' : prepare_url($_REQUEST['prefix']); + $title = empty($_REQUEST['title']) ? '' : $_REQUEST['title']; + $title = (URL_YANDEX==true) ? y_translate($title) : prepare_url($title); + + if ($alias != $title && $alias != trim($prefix . '/' . $title, '/')) $alias = trim($alias . '/' . $title, '/'); + + return $alias; + } + + /** + * Метод, предназначенный для контроля уникальности URL + * + */ + function documentAliasCheck() + { + global $AVE_DB, $AVE_Template; + + $document_id = (isset($_REQUEST['id']) && is_numeric($_REQUEST['id'])) ? $_REQUEST['id'] : 0; + $document_alias = (isset($_REQUEST['alias'])) ? $_REQUEST['alias'] : ''; + + $check = (isset($_REQUEST['check']) && (bool)$_REQUEST['check'] === true) ? true : false; + $alias_id = (isset($_REQUEST['alias_id'])) ? (int)$_REQUEST['alias_id'] : 0; + + $errors = array(); + + // Если указанный URL пользователем не пустой + if (!empty($document_alias)) + { + // Проверяем, чтобы данный URL соответствовал требованиям + if (preg_match(TRANSLIT_URL ? '/[^\.a-z0-9\/_-]+/' : '/^[^0-9A-Za-zА-Яа-яЁё]+$/u', $document_alias)) + { + $errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_SYMBOL'); + } + + // Если URL начинается с "/" - фиксируем ошибку + if ($document_alias[0] == '/') $errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_START'); + + // Если суффикс URL заканчивается на "/" и URL заканчивается на "/" - фиксируем ошибку + if (substr(URL_SUFF, 0, 1) == '/' && substr($document_alias, -1) == '/') $errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_END'); + + // Если в URL используются слова apage-XX, artpage-XX,page-XX,print, фиксируем ошибку, где ХХ - число + $matches = preg_grep('/^(apage-\d+|artpage-\d+|page-\d+|print)$/i', explode('/', $document_alias)); + if (!empty($matches)) $errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_SEGMENT') . implode(', ', $matches); + + $and_docs = (($check === false) ? "AND Id != '" . $document_id . "'" : ''); + //$and_aliace = (($check === true) ? "AND document_id != '" . $document_id . "'" : ''); + $and_alias_id = (isset($alias_id) ? "AND id != '" . $alias_id . "'" : ''); + + // Выполняем запрос к БД на получение всех URL и проверку на уникальность + if (empty($errors)) + { + $alias_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_documents + WHERE document_alias = '" . $document_alias . "' + $and_docs + LIMIT 1 + ")->NumRows(); + + if ($alias_exist) $errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_DUPLICATES'); + + $alias_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_document_alias_history + WHERE document_alias = '" . $document_alias . "' + $and_alias_id + LIMIT 1 + ")->NumRows(); + + if ($alias_exist) $errors[] = $AVE_Template->get_config_vars('DOC_URL_H_ERROR_DUPLICATES'); + + } + } + else + { // В противном случае, если URL пустой, формируем сообщение об ошибке + $errors[] = $AVE_Template->get_config_vars('DOC_URL_ERROR_EMTY'); + } + + // Если ошибок не найдено, формируем сообщение об успешной операции + if (empty($errors)) + { + return json_encode(array($AVE_Template->get_config_vars('DOC_URL_CHECK_OK') . implode(',
      ', $errors), 'accept', $check)); + } + else + { // В противном случае формируем сообщение с ошибкой + return json_encode(array($AVE_Template->get_config_vars('DOC_URL_CHECK_ER') . implode(',
      ', $errors), 'error')); + } + } + + /** + * Метод, предназначенный для + * + */ + function documentAliasHistoryList() + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT + h.id, + h.document_id, + h.document_alias_changed, + COUNT(h.document_id) as count, + d.rubric_id, + d.document_title, + d.document_alias, + r.rubric_title + FROM " . PREFIX . "_document_alias_history AS h + LEFT JOIN " . PREFIX . "_documents AS d + ON h.document_id = d.Id + LEFT JOIN " . PREFIX . "_rubrics AS r + ON d.rubric_id = r.Id + WHERE h.document_id = d.Id + GROUP BY h.document_id + ORDER BY h.document_alias_changed DESC + "); + + $documents = array(); + + while ($row = $sql->FetchAssocArray()) + { + array_push($documents, $row); + } + + $AVE_Template->assign('documents', $documents); + $AVE_Template->assign('content', $AVE_Template->fetch('documents/alias_list.tpl')); + } + + /** + * Метод, предназначенный для + * + */ + function documentAliasListDoc($id) + { + global $AVE_DB, $AVE_Template, $AVE_Rubric; + + $document = $AVE_DB->Query(" + SELECT + d.rubric_id, + d.document_title, + d.document_alias, + r.rubric_title + FROM " . PREFIX . "_documents AS d + LEFT JOIN " . PREFIX . "_rubrics AS r + ON d.rubric_id = r.Id + WHERE d.Id = " . $id . " + ")->FetchRow(); + + $sql = $AVE_DB->Query(" + SELECT * + FROM ".PREFIX."_document_alias_history + WHERE document_id = '". $id ."' + "); + + $aliases = array(); + + while ($row = $sql->FetchRow()) + { + $row->document_alias_author_name = get_username_by_id($row->document_alias_author); + array_push($aliases, $row); + } + + $AVE_Template->assign('document', $document); + $AVE_Template->assign('aliases', $aliases); + + switch($_REQUEST['sub']) + { + case 'list': + $AVE_Template->assign('content', $AVE_Template->fetch('documents/alias_doc_list.tpl')); + break; + + default: + $AVE_Template->assign('content', $AVE_Template->fetch('documents/alias_doc.tpl')); + break; + } + } + + /** + * Метод, предназначенный для + * + */ + function documentAliasNew() + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_document_alias_history + SET + document_id = '" . (int)$_REQUEST['doc_id'] . "', + document_alias = '" . trim($_REQUEST['alias']) . "', + document_alias_author = '" . (int)UID . "', + document_alias_changed = '" . time() . "' + "); + + if ($sql === false) { + $message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER_T'); + $header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK_T'); + $header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK'); + $theme = 'accept'; + //reportLog($AVE_Template->get_config_vars('RUBRIK_CODE_UPDATE') . " (" . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title, ENT_QUOTES)) . ") (id: $rubric_id)"); + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + else + { + header('Location:index.php?do=docs&action=aliases_doc&cp=' . SESSION); + } + exit; + } + + /** + * Метод, предназначенный для + * + */ + function documentAliasEdit() + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_document_alias_history + SET document_alias = '" . $_REQUEST['alias'] . "' + WHERE id = '" . $_REQUEST['id'] . "' + "); + + if ($sql === false) { + $message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER_T_E'); + $header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_ER'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK_T_E'); + $header = $AVE_Template->get_config_vars('DOC_ALIASES_REP_OK'); + $theme = 'accept'; + } + + if (isAjax()) { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + header('Location:index.php?do=docs&action=aliases_doc&cp=' . SESSION); + } + + exit; + } + + /** + * Метод, предназначенный для + * + */ + function documentAliasSave() + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['alias_del'])) { + foreach ($_REQUEST['alias_del'] as $id => $val) { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_document_alias_history + WHERE id = '" . $id . "' + "); + } + } + + exit; + } + + /** + * Метод, предназначенный для + * + */ + function documentAliasDel() + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['alias_id'])) { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_document_alias_history + WHERE id = '" . $_REQUEST['alias_id'] . "' + "); + } + + exit; + } +} +?> diff --git a/class/class.hooks.php b/class/class.hooks.php new file mode 100644 index 0000000..da62262 --- /dev/null +++ b/class/class.hooks.php @@ -0,0 +1,174 @@ + $function + ); + } + } + else + { + // Store the action hook in the $hooks array + self::$hooks[$name][$priority][$function] = array( + "function" => $function + ); + } + + return true; + } + + /** + * Do Hook + */ + public static function trigger($name, $arguments = "") + { + // Oh, no you didn't. Are you trying to run an action hook that doesn't exist? + if (! isset(self::$hooks[$name])) + { + return $arguments; + } + + // Set the current running hook to this + self::$current_hook = $name; + + // Key sort our action hooks + ksort(self::$hooks[$name]); + foreach (self::$hooks[$name] AS $priority => $names) + { + if (is_array($names)) + { + foreach ($names AS $name) + { + $return = call_user_func_array($name['function'], array( + &$arguments + )); + + if ($return) + { + $arguments = $return; + } + + self::$run_hooks[$name][$priority]; + } + } + } + + self::$current_hook = ''; + + return $arguments; + } + + /** + * Remove Hook + */ + public static function unregister($name, $function, $priority = 10) + { + // If the action hook doesn't, just return true + if (!isset(self::$hooks[$name][$priority][$function])) + { + return true; + } + // Remove the action hook from our hooks array + unset(self::$hooks[$name][$priority][$function]); + + return ''; + } + + + /** + * Current Hook + * + * Get the currently running action hook + * + */ + public static function current() + { + return self::$current_hook; + } + + + /** + * Has Run + */ + public static function has($hook, $priority = 10) + { + if (isset(self::$hooks[$hook][$priority])) + { + return true; + } + else + { + return false; + } + } + + + /** + * Hook Exists + */ + public static function exists($name) + { + if (isset(self::$hooks[$name])) + { + return true; + } + else + { + return false; + } + } +} diff --git a/class/class.logs.php b/class/class.logs.php new file mode 100644 index 0000000..227fe4d --- /dev/null +++ b/class/class.logs.php @@ -0,0 +1,350 @@ +_logdir; + + if(file_exists($logfile)) + @eval('?>'.file_get_contents($logfile).'assign('logs', $logdata); + $AVE_Template->assign('content', $AVE_Template->fetch('logs/logs.tpl')); + } + + /** + * Метод, предназначенный для отображения всех записей Журнала событий 404 + * + */ + function List404() + { + global $AVE_Template; + + $log404 = array(); + + $logfile = BASE_DIR . $this->_404dir; + + if(file_exists($logfile)) + include($logfile); + + arsort($log404); + + // Передаем данные в шаблон для вывода и отображаем страницу + $AVE_Template->assign('logs', $log404); + $AVE_Template->assign('content', $AVE_Template->fetch('logs/404.tpl')); + } + + /** + * Метод, предназначенный для отображения всех записей Журнала событий 404 + * + */ + function ListSql() + { + global $AVE_Template; + + $logsql = array(); + + $logfile = BASE_DIR . $this->_sqldir; + + if(file_exists($logfile)) + include($logfile); + + arsort($logsql); + + // Передаем данные в шаблон для вывода и отображаем страницу + $AVE_Template->assign('logs', $logsql); + $AVE_Template->assign('content', $AVE_Template->fetch('logs/sql.tpl')); + } + + /** + * Метод, предназначенный для удаление записей Журнала событий + * + */ + function logDelete() + { + global $AVE_Template; + + $logfile = BASE_DIR . $this->_logdir; + + if(file_exists($logfile)) + unlink($logfile); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('LOGS_CLEAN')); + + header('Location:index.php?do=logs&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для удаление записей Журнала событий 404 + * + */ + function DeleteSql() + { + global $AVE_Template; + + $logfile = BASE_DIR . $this->_sqldir; + + if(file_exists($logfile)) + unlink($logfile); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('LOGS_SQL_CLEAN')); + + header('Location:index.php?do=logs&action=logsql&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для удаление записей Журнала событий 404 + * + */ + function Delete404() + { + global $AVE_Template; + + $logfile = BASE_DIR . $this->_404dir; + + if(file_exists($logfile)) + unlink($logfile); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('LOGS_404_CLEAN')); + + header('Location:index.php?do=logs&action=log404&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для экспорта системных сообщений + * + */ + function logExport() + { + global $AVE_Template; + + // Определяем тип файла (CSV), формат имени файла, разделители и т.д. + $datstring = ''; + $dattype = 'text/csv'; + $datname = 'system_log_' . date('dmyhis', time()) . '.csv'; + + $separator = ';'; + $enclosed = '"'; + + // Выполняем запрос к БД на получение списка всех системных сообщений + $logdata=array(); + $logfile = BASE_DIR.$this->_logdir; + if(file_exists($logfile)) + @eval('?>'.file_get_contents($logfile).'$v) + $datstring .= $enclosed . $k . $enclosed . $separator; + $datstring .= PHP_EOL; + + // Циклически обрабатываем данные и формируем CSV файл с учетом указаны выше параметров + foreach($logdata as $k=>$v) + { + foreach ($v as $key => $val) + { + $val = ($key=='log_time') ? date('d-m-Y, H:i:s', $val) : $val; + $datstring .= ($val == '') ? $separator : $enclosed . stripslashes($val) . $enclosed . $separator; + } + $datstring .= PHP_EOL; + } + + // Определяем заголовки документа + header('Content-Encoding: windows-1251'); + header('Content-type: text/csv; charset=windows-1251'); + header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + header('Content-Disposition: attachment; filename="' . $datname . '"'); + header('Content-Length: ' . strlen($datstring)); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + + // Выводим данные + echo mb_convert_encoding($datstring, 'windows-1251', 'UTF-8'); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('LOGS_EXPORT')); + + exit; + } + + /** + * Метод, предназначенный для экспорта сообщений 404 + * + */ + function Export404() + { + global $AVE_Template; + + // Определяем тип файла (CSV), формат имени файла, разделители и т.д. + $datstring = ''; + $dattype = 'text/csv'; + $datname = 'system_log_' . date('dmyhis', time()) . '.csv'; + + $separator = ';'; + $enclosed = '"'; + + // Выполняем запрос к БД на получение списка всех системных сообщений + $log404 = array(); + + $logfile = BASE_DIR.$this->_404dir; + + if(file_exists($logfile)) + include($logfile); + + arsort($log404); + + $fieldcount = count($log404[0]); + + foreach($log404[0] as $k=>$v) + $datstring .= $enclosed . $k . $enclosed . $separator; + + $datstring .= PHP_EOL; + + // Циклически обрабатываем данные и формируем CSV файл с учетом указаны выше параметров + foreach($log404 as $k=>$v) + { + foreach ($v as $key => $val) + { + $val = ($key=='log_time') ? date('d-m-Y, H:i:s', $val) : $val; + $datstring .= ($val == '') ? $separator : $enclosed . stripslashes($val) . $enclosed . $separator; + } + $datstring .= PHP_EOL; + } + + // Определяем заголовки документа + header('Content-Encoding: windows-1251'); + header('Content-type: text/csv; charset=windows-1251'); + header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + header('Content-Disposition: attachment; filename="' . $datname . '"'); + header('Content-Length: ' . strlen($datstring)); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + + // Выводим данные + echo mb_convert_encoding(strip_tags($datstring), 'windows-1251', 'UTF-8'); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('LOGS_404_EXPORT')); + + exit; + } + + /** + * Метод, предназначенный для экспорта сообщений 404 + * + */ + function ExportSql() + { + global $AVE_Template; + + // Определяем тип файла (CSV), формат имени файла, разделители и т.д. + $datstring = ''; + $dattype = 'text/csv'; + $datname = 'system_log_' . date('dmyhis', time()) . '.csv'; + + $separator = ';'; + $enclosed = '"'; + + // Выполняем запрос к БД на получение списка всех системных сообщений + $logsql = array(); + + $logfile = BASE_DIR . $this->_sqldir; + + if(file_exists($logfile)) + include($logfile); + + arsort($logsql); + + $fieldcount = count($logsql[0]); + + foreach($logsql[0] as $k=>$v) + $datstring .= $enclosed . $k . $enclosed . $separator; + + $datstring .= PHP_EOL; + + // Циклически обрабатываем данные и формируем CSV файл с учетом указаны выше параметров + foreach($logsql as $k => $v) + { + foreach ($v as $key => $val) + { + $val = ($key == 'log_time') ? date('d-m-Y, H:i:s', $val) : $val; + $val = ($key == 'log_text') ? serialize($val) : $val; + $datstring .= ($val == '') ? $separator : $enclosed . stripslashes($val) . $enclosed . $separator; + } + $datstring .= PHP_EOL; + } + + // Определяем заголовки документа + header('Content-Encoding: windows-1251'); + header('Content-type: text/csv; charset=windows-1251'); + header('Expires: ' . gmdate('D, d M Y H:i:s') . ' GMT'); + header('Content-Disposition: attachment; filename="' . $datname . '"'); + header('Content-Length: ' . strlen($datstring)); + header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); + header('Pragma: public'); + + // Выводим данные + echo mb_convert_encoding(strip_tags($datstring), 'windows-1251', 'UTF-8'); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('LOGS_SQL_EXPORT')); + + exit; + } + +} + +?> \ No newline at end of file diff --git a/class/class.meta.php b/class/class.meta.php new file mode 100644 index 0000000..bbdbf49 --- /dev/null +++ b/class/class.meta.php @@ -0,0 +1,72 @@ +_keyword_count = $keyword_count; + } + + public function setKeywordCount( $keyword_count ) + { + if( (int) $keyword_count ) $this->_keyword_count = $keyword_count; + } + + public function generateMeta( $text ) + { + $newarr = array (); + + $quotes = array ("\x22", "\x60", "\t", "\n", "\r", ",", "/", "¬", "#", ";", ":", "@", "~", "[", "]", "{", "}", "=", "+", ")", "(", "*", "^", "%", "$", "<", ">", "?", "!", '"'); + $fastquotes = array ("\x22", "\x60", "\t", "\n", "\r", '"', "\\", '\r', '\n', "/", "{", "}", "[", "]" ); + + $text = str_replace( chr(9), ' ', $text ); + $text = str_replace( chr(10), ' ', $text ); + $text = str_replace( chr(13), ' ', $text ); + $text = str_replace( " ", " ", $text ); + $text = str_replace( '
      ', ' ', $text ); + $text = strip_tags( $text ); + $text = preg_replace('/ {2,}/',' ',$text); + $text = preg_replace( "#&(.+?);#", "", $text ); + //$text = trim(str_replace( " ,", "", stripslashes( $text ))); + $text = preg_replace('/\[tag:(.+?)\]/', '', $text); + $text = preg_replace('/\[mod_(.+?)\]/', '', $text); + + $text = str_replace( $fastquotes, '', $text ); + + $text = str_replace( $quotes, ' ', $text ); + + $arr = explode( " ", $text ); + + foreach ( $arr as $word ) { + if( mb_strlen( ($word) ) > 4 OR (mb_strtoupper($word)==$word) and mb_strlen( ($word) ) > 1) $newarr[] = $word; + } + + $arr = array_count_values( $newarr ); + arsort( $arr ); + + $arr = array_keys( $arr ); + + $total = count( $arr ); + + $offset = 0; + + $arr = array_slice( $arr, $offset, $this->_keyword_count ); + + $return['keywords'] = implode( ", ", $arr ); + $return['description'] = trim(mb_substr( trim($text), 0, 220 ),'.').'.'; + + return $return; + } +} diff --git a/class/class.modules.php b/class/class.modules.php new file mode 100644 index 0000000..d4b285f --- /dev/null +++ b/class/class.modules.php @@ -0,0 +1,406 @@ +moduleListGet(); + + // Определяем директорию, где хранятся модули + $d = dir(BASE_DIR . '/modules'); + + // Циклически обрабатываем директории + while (false !== ($entry = $d->read())) + { + if (substr($entry, 0, 1) == '.') continue; + + $module_dir = $d->path . '/' . $entry; + if (!is_dir($module_dir)) continue; + + $modul = array(); + if (!(is_file($module_dir . '/module.php') && @include($module_dir . '/module.php'))) + { + // Если не удалось подключить основной файл модуля module.php - Фиксируем ошибку + $modules['errors'][] = $entry; + continue; + } + + // Дополняем массив с данными модуля + $modul['permission'] = check_permission('mod_'. $modul['ModuleSysName']); + $row = isset($modules_db[$modul['ModuleName']]) ? $modules_db[$modul['ModuleName']] : false; + + // установленные модули + if ($row) + { + $modul['status'] = $row->ModuleStatus; + $modul['id'] = $row->Id; + $modul['need_update'] = ($row->ModuleVersion != $modul['ModuleVersion']); + $modul['ModuleVersion'] = $row->ModuleVersion; + $modul['template'] = ($row->ModuleTemplate ? $row->ModuleTemplate : 0); + } + // неустановленные модули + else + { + $modul['status'] = false; + $modul['id'] = $modul['ModuleSysName']; + $modul['template'] = (!empty($modul['ModuleTemplate']) ? $modul['ModuleTemplate'] : ''); + } + // записываем в массив + $modules[$modul['ModuleSysName']] = $modul; + } + $d->Close(); + return $modules; + } + +/** + * Внешние методы +*/ + + /** + * Метод, преданзначеный для выода модулей + * + */ + function moduleList() + { + global $AVE_DB, $AVE_Template; + + $assign = array(); // Массив для передачи в Smarty + $errors = array(); // Массив с ошибками + + // Получаем список всех шаблонов + $sql = $AVE_DB->Query(" + SELECT Id, template_title + FROM " . PREFIX . "_templates + "); + while ($row = $sql->FetchRow()) + { + $assign['all_templates'][$row->Id] = htmlspecialchars($row->template_title, ENT_QUOTES); + } + + $author_title = $AVE_Template->get_config_vars('MODULES_AUTHOR'); + $modules = $this->getModules(); + foreach ($modules as $module) + { + $module['info'] = $module['ModuleDescription'] . (!$module['ModuleAutor'] ? '

      ' : "

      $author_title
      " . $module['ModuleAutor'] . "
      ") . '
      ' . $module['ModuleCopyright'] . ''; + // установленные модули + if ($module['status'] !== false) + { + $installed_modules[$module['ModuleName']] = $module; + } + // неустановленные модули + else + { + $not_installed_modules[$module['ModuleName']] = $module; + } + } + !empty($installed_modules) ? ksort($installed_modules) : $installed_modules = ''; + !empty($not_installed_modules) ? ksort($not_installed_modules) : $not_installed_modules = ''; + + $assign['installed_modules'] = $installed_modules; + $assign['not_installed_modules'] = $not_installed_modules; + + // Массив с ошибками + if(!empty($modules['errors'])){ + foreach ($modules['errors'] as $error) + { + $assign['errors'][] = $AVE_Template->get_config_vars('MODULES_ERROR') . $error; + } + } + // Передаем данные в шаблон и отображаем страницу со списком модулей + $AVE_Template->assign($assign); + $AVE_Template->assign('content', $AVE_Template->fetch('modules/modules.tpl')); + } + + /** + * Метод, предназначенный для обновления в БД информации о шаблонах модулей + * + */ + function moduleOptionsSave() + { + global $AVE_DB; + + // Циклически обрабатываем массив с информацией о шаблонах модулей + foreach ($_POST['Template'] as $id => $template_id) + { + // Обновление информации о шаблоне модуля + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module + SET ModuleTemplate = '" . (int)$template_id . "' + WHERE Id = '" . (int)$id . "' + "); + } + + // Выполянем обновление страницы со списком модулей + header('Location:index.php?do=modules&cp=' . SESSION); + exit; + } + + /** + * Метод, предназанченный для установки или переустановки модуля + * + */ + function moduleInstall() + { + global $AVE_DB, $AVE_Template; + + // Получаем данные модуля + $modules = $this->getModules(); + $modul = $modules[MODULE_PATH]; + + // Удаляем информацию о модуле в таблице module + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module + WHERE ModuleSysName = '" . MODULE_PATH . "' + "); + + // Определяем, имеет ли модуль возможность настройки в Панели управления + $modul['ModuleAdminEdit'] = (!empty($modul['ModuleAdminEdit'])) ? $modul['ModuleAdminEdit'] : 0; + + // Определяем, имеет ли модуль возможность смены шаблона + $modul['ModuleTemplate'] = ($modul['ModuleTemplate']) ? $modul['ModuleTemplate'] : 0; + + // Добавляем информацию о модуле в таблицу module + $AVE_DB->Query(" + INSERT " . PREFIX . "_module + SET + ModuleName = '" . $modul['ModuleName'] . "', + ModuleStatus = '1', + ModuleAveTag = '" . $modul['ModuleAveTag'] . "', + ModulePHPTag = '" . $modul['ModulePHPTag'] . "', + ModuleFunction = '" . $modul['ModuleFunction'] . "', + ModuleIsFunction = '" . $modul['ModuleIsFunction'] . "', + ModuleSysName = '" . MODULE_PATH . "', + ModuleVersion = '" . $modul['ModuleVersion'] . "', + ModuleTemplate = '" . $modul['ModuleTemplate'] . "', + ModuleAdminEdit = '" . $modul['ModuleAdminEdit'] . "' + "); + + // Подключаем файл с запросами к БД для данного модуля + $module_sql_deinstall = array(); + $module_sql_install = array(); + $sql_file = BASE_DIR . '/modules/' . MODULE_PATH . '/sql.php'; + if (is_file($sql_file) && @include($sql_file)) + { + // Выполняем запросы удаления таблиц модуля + // из массива $module_sql_deinstall файла sql.php + foreach ($module_sql_deinstall as $sql) + { + $AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql)); + } + + // Выполняем запросы создания таблиц и данных модуля + // из массива $module_sql_install файла sql.php + foreach ($module_sql_install as $sql) + { + $AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql)); + } + } + // Сохраняем системное сообщение в журнал + ($_REQUEST['action'] == "reinstall") ? reportLog($AVE_Template->get_config_vars('MODULES_ACTION_REINSTALL') . ' (' . $modul['ModuleName'] . ')') : reportLog($AVE_Template->get_config_vars('MODULES_ACTION_INSTALL') . ' (' . $modul['ModuleName'] . ')'); + + // Выполняем обновление страницы со списком модулей + header('Location:index.php?do=modules&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для обновления модуля при увеличении номера версии модуля + * + */ + function moduleUpdate() + { + global $AVE_DB, $AVE_Template; + + // Подключаем файл с запросами к БД для данного модуля + $module_sql_update = array(); + $sql_file = BASE_DIR . '/modules/' . MODULE_PATH . '/sql.php'; + $mod_file = BASE_DIR . '/modules/' . MODULE_PATH . '/module.php'; + if (file_exists($mod_file) && file_exists($sql_file)) + { + include($mod_file); + include($sql_file); + // Выполняем запросы обновления модуля + // из массива $module_sql_update файла sql.php + foreach ($module_sql_update as $sql) + { + $AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql)); + } + } + // Обновляем модуль, если в нем не применяется (отсутствует) файл sql.php + elseif (file_exists($mod_file) && file_exists($sql_file) === false) + { + include($mod_file); + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module + SET + ModuleName = '" . $modul['ModuleName'] . "', + ModuleStatus = '1', + ModuleAveTag = '" . $modul['ModuleAveTag'] . "', + ModulePHPTag = '" . $modul['ModulePHPTag'] . "', + ModuleFunction = '" . $modul['ModuleFunction'] . "', + ModuleIsFunction = '" . $modul['ModuleIsFunction'] . "', + ModuleSysName = '" . MODULE_PATH . "', + ModuleVersion = '" . $modul['ModuleVersion'] . "', + ModuleTemplate = '" . $modul['ModuleTemplate'] . "', + ModuleAdminEdit = '" . $modul['ModuleAdminEdit'] . "' + WHERE + ModuleSysName = '" . MODULE_PATH . "' + "); + } + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('MODULES_ACTION_UPDATE') . ' (' . MODULE_PATH . ')'); + + // Выполянем обновление страницы со списком модулей + header('Location:index.php?do=modules&cp=' . SESSION); + exit; + } + + /** + * Метод, предназанченный для удаление модуля + * + */ + function moduleDelete() + { + global $AVE_DB, $AVE_Template; + + // Подключаем файл с запросами к БД для данного модуля + $module_sql_deinstall = array(); + $sql_file = BASE_DIR . '/modules/' . MODULE_PATH . '/sql.php'; + if (is_file($sql_file) && @include($sql_file)) + { + // Выполняем запросы удаления таблиц модуля + // из массива $module_sql_deinstall файла sql.php + foreach ($module_sql_deinstall as $sql) + { + $AVE_DB->Query(str_replace('CPPREFIX', PREFIX, $sql)); + } + } + + // Удаляем информацию о модуле в таблице module + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_module + WHERE ModuleSysName = '" . MODULE_PATH . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('MODULES_ACTION_DELETE') .' (' . MODULE_PATH . ')'); + + // Выполянем обновление страницы со списком модулей + header('Location:index.php?do=modules&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для отключения/включение модуля в Панели управления + * + */ + function moduleStatusChange() + { + global $AVE_DB, $AVE_Template; + + $status = $AVE_DB->Query(" + SELECT ModuleName, ModuleStatus FROM " . PREFIX . "_module + WHERE ModuleSysName = '" . MODULE_PATH . "' + ")->FetchRow(); + + $ModuleStatus = ($status->ModuleStatus == "0" || $status->ModuleStatus == NULL) ? "1" : "0"; + + // Выполняем запрос к БД на смену статуса модуля + $AVE_DB->Query(" + UPDATE " . PREFIX . "_module + SET + ModuleStatus = '".$ModuleStatus."' + WHERE + ModuleSysName = '" . MODULE_PATH . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog((($ModuleStatus == "0") ? $AVE_Template->get_config_vars('MODULES_ACTION_OFFLINE') : $AVE_Template->get_config_vars('MODULES_ACTION_ONLINE')) . ' (' . $status->ModuleName . ')'); + + // Выполняем обновление страницы со списком модулей + header('Location:index.php?do=modules&cp=' . SESSION); + exit; + } + + /** + * Метод получения списка модулей + * + * @param int $status статус возвращаемых модулей + * 1 - активные модули + * 0 - неактивные модули + * если не указано возвращает модули без учета статуса + * @return array + */ + function moduleListGet($status = null) + { + global $AVE_DB; + + $modules = array(); + + // Условие, определяющее статус документа для запроса к БД + $where_status = ($status !== null) ? "WHERE ModuleStatus = '" . (int)$status . "'" : ''; + + // Выполняем запрос к БД и получаем список документов, + // согласно статусу, либо все модули, если статус не указан + $sql = $AVE_DB->Query(" + SELECT * FROM " . PREFIX . "_module + " . $where_status . " + ORDER BY ModuleName ASC + "); + while ($row = $sql->FetchRow()) + { + $modules[$row->ModuleName] = $row; + } + // Возвращаем список модулей + return $modules; + } + + function moduleRemove($dir) + { + global $AVE_DB, $AVE_Template; + + $directory = BASE_DIR . '/modules/' . $dir; + + $files = glob($directory . '*', GLOB_MARK); + foreach($files as $file){ + if(substr($file, -1) == '/') + moduleRemove($file); + else + unlink($file); + } + rrmdir($directory); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('MODULES_ACTION_REMOVE') . ' (' . $dir . ')'); + + // Выполянем обновление страницы со списком модулей + header('Location:index.php?do=modules&cp=' . SESSION); + exit; + } +} + +?> \ No newline at end of file diff --git a/class/class.navigation.php b/class/class.navigation.php new file mode 100644 index 0000000..93d7a88 --- /dev/null +++ b/class/class.navigation.php @@ -0,0 +1,1279 @@ +<\''); + return $text; + } + + /** + * Внутренние методы + */ + + /** + * Проверка алиаса тега на валидность и уникальность + */ + function navigationValidate ($alias = '', $id = 0) + { + global $AVE_DB; + + //-- Соответствие требованиям + if (empty ($alias) || preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $alias) !== 1 || is_numeric($alias)) + return 'syn'; + + //-- Уникальность + return !(bool)$AVE_DB->Query(" + SELECT 1 + FROM + " . PREFIX . "_navigation + WHERE + alias = '" . $alias . "' + AND + navigation_id != '" . $id . "' + ")->GetCell(); + } + + + /** + * Метод, предназначенный для вывода списка всех существующих меню навигаций в Паели управления + * + */ + function navigationList() + { + global $AVE_DB, $AVE_Template; + + $navigations = array(); + + // Выполняем запрос к БД на получение списка всех меню навигаций + $sql = $AVE_DB->Query(" + SELECT + navigation_id, + alias, + title + FROM + " . PREFIX . "_navigation + ORDER BY + navigation_id ASC + "); + + // Формируем данные в массив + while ($row = $sql->FetchRow()) + { + array_push($navigations, $row); + } + + // Передаем данные в шаблон для вывода и отображаем страницу со списком меню + $AVE_Template->assign('nid', 0); + $AVE_Template->assign('navigations', $navigations); + $AVE_Template->assign('content', $AVE_Template->fetch('navigation/list.tpl')); + } + + + + /** + * Метод, предназначенный для добавления нового меню + * + */ + function navigationNew() + { + global $AVE_DB, $AVE_Template, $AVE_User; + + // Определяем действие пользователя + switch($_REQUEST['sub']) + { + // Если действие не определено, отображаем чистую форму для создания шаблона навигации + case '': + + // Передаем данные в шаблон и отображаем страницу для добавления нового шаблона меню + $AVE_Template->assign('groups', $AVE_User->userGroupListGet()); + $AVE_Template->assign('form_action', 'index.php?do=navigation&action=new&sub=save&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('navigation/template.tpl')); + break; + + + // Если пользователь нажал на кнопку Добавить (Сохранить) + case 'save': + + // Определяем название меню навигации + $navigation_title = (empty($_REQUEST['title'])) ? 'title' : $_REQUEST['title']; + + // Определяем шаблон оформления 1-го уровня ссылок + // в меню. Если шаблон не указан пользователем,тогда + // используем вариант "по умолчанию" + $navigation_level1 = (empty($_REQUEST['level1'])) ? "[tag:linkname]" : $_REQUEST['level1']; + $navigation_level1_active = (empty($_REQUEST['level1_active'])) ? "[tag:linkname]" : $_REQUEST['level1_active']; + + // Выполняем запрос к БД на добавление нового меню + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_navigation + SET + navigation_id = '', + alias = '" . $_REQUEST['alias'] . "', + title = '" . $navigation_title . "', + level1 = '" . $navigation_level1 . "', + level1_active = '" . $navigation_level1_active . "', + level2 = '" . $_REQUEST['level2'] . "', + level2_active = '" . $_REQUEST['level2_active'] . "', + level3 = '" . $_REQUEST['level3'] . "', + level3_active = '" . $_REQUEST['level3_active'] . "', + level1_begin = '" . $_REQUEST['level1_begin'] . "', + level2_begin = '" . $_REQUEST['level2_begin'] . "', + level3_begin = '" . $_REQUEST['level3_begin'] . "', + level1_end = '" . $_REQUEST['level1_end'] . "', + level2_end = '" . $_REQUEST['level2_end'] . "', + level3_end = '" . $_REQUEST['level3_end'] . "', + begin = '" . $_REQUEST['begin'] . "', + end = '" . $_REQUEST['end'] . "', + user_group = '" . (empty($_REQUEST['user_group']) ? '' : implode(',', $_REQUEST['user_group'])) . "', + expand_ext = '" . $_REQUEST['expand_ext'] . "' + "); + + $navigation_id = $AVE_DB->getLastInsertId(); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_NEW') . " (" . stripslashes($navigation_title) . ") (ID: $navigation_id)"); + + // Выполянем переход к списку меню навигаций + header('Location:index.php?do=navigation&cp=' . SESSION); + break; + } + } + + + + /** + * Метод, предназначенный для редактирования шаблона навигации + * + * @param int $navigation_id идентификатор меню навигации + */ + function navigationEdit($navigation_id) + { + global $AVE_DB, $AVE_Template, $AVE_User; + + // Определяем действие пользователя + switch ($_REQUEST['sub']) + { + // Если действие не определено, отображаем форму с данными для редактирования + case '': + + // Выполняем запрос к БД и получаем всю информацию о данном меню + $row = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = '" . $navigation_id . "' + ")->FetchRow(); + + // Формируем список групп пользователей + $row->user_group = explode(',', $row->user_group); + + // Формируем ряд переменных для использования в шаблоне и отображаем форм с данными для редактирования + $AVE_Template->assign('nid', $navigation_id); + $AVE_Template->assign('navigation', $row); + $AVE_Template->assign('groups', $AVE_User->userGroupListGet()); + $AVE_Template->assign('form_action', 'index.php?do=navigation&action=templates&sub=save&navigation_id=' . $navigation_id . '&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('navigation/template.tpl')); + break; + + // Если пользователь нажал на кнопку Сохранить изменения + case 'save': + + // Выполняем запрос к БД и обновляем информацию в таблице для данного меню + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_navigation + SET + title = '" . $_REQUEST['title'] . "', + alias = '" . $_REQUEST['alias'] . "', + level1 = '" . $_REQUEST['level1'] . "', + level1_active = '" . $_REQUEST['level1_active'] . "', + level2 = '" . $_REQUEST['level2'] . "', + level2_active = '" . $_REQUEST['level2_active'] . "', + level3 = '" . $_REQUEST['level3'] . "', + level3_active = '" . $_REQUEST['level3_active'] . "', + level1_begin = '" . $_REQUEST['level1_begin'] . "', + level2_begin = '" . $_REQUEST['level2_begin'] . "', + level3_begin = '" . $_REQUEST['level3_begin'] . "', + level1_end = '" . $_REQUEST['level1_end'] . "', + level2_end = '" . $_REQUEST['level2_end'] . "', + level3_end = '" . $_REQUEST['level3_end'] . "', + begin = '" . $_REQUEST['begin'] . "', + end = '" . $_REQUEST['end'] . "', + user_group = '" . (empty($_REQUEST['user_group']) ? '' : implode(',', $_REQUEST['user_group'])) . "', + expand_ext = '" . $_REQUEST['expand_ext'] . "' + WHERE + navigation_id = '" . $navigation_id . "' + "); + + //-- Стираем кеш навигации + $this->clearCahe($navigation_id, $_REQUEST['alias']); + + if ($sql === false) + { + $message = $AVE_Template->get_config_vars('NAVI_REPORT_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('NAVI_REPORT_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('NAVI_REPORT_SAVED'); + $header = $AVE_Template->get_config_vars('NAVI_REPORT_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_EDIT') . " (" . stripslashes($_REQUEST['title']) . ") (ID: $navigation_id)"); + } + + if (isAjax()) + { + echo json_encode( + array( + 'message' => $message, + 'header' => $header, + 'theme' => $theme + ) + ); + } + else + { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=navigation&cp=' . SESSION); + } + exit; + } + } + + + + /** + * Метод, предназначенный для копирования шаблона меню + * + * @param int $navigation_id идентификатор меню навигации источника + */ + function navigationCopy($navigation_id) + { + global $AVE_DB, $AVE_Template; + + // Если в запросе указано числовое значение id меню + if (is_numeric($navigation_id)) + { + // Выполняем запрос к БД на получение информации о копируемом меню + $row = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = '" . $navigation_id . "' + ")->FetchRow(); + + // Если данные получены, тогда + if ($row) + { + // Выполняем запрос к БД на добавление нового меню и сохраняем информацию с учетом данных, + // полученных в предыдущем запросе к БД + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_navigation + SET + navigation_id = '', + title = '" . addslashes((empty($_REQUEST['title']) ? $row->title : $_REQUEST['title'])) . "', + alias = '', + level1 = '" . addslashes($row->level1) . "', + level1_active = '" . addslashes($row->level1_active) . "', + level2 = '" . addslashes($row->level2) . "', + level2_active = '" . addslashes($row->level2_active) . "', + level3 = '" . addslashes($row->level3) . "', + level3_active = '" . addslashes($row->level3_active) . "', + level1_begin = '" . addslashes($row->level1_begin) . "', + level2_begin = '" . addslashes($row->level2_begin) . "', + level3_begin = '" . addslashes($row->level3_begin) . "', + level1_end = '" . addslashes($row->level1_end) . "', + level2_end = '" . addslashes($row->level2_end) . "', + level3_end = '" . addslashes($row->level3_end) . "', + begin = '" . addslashes($row->begin) . "', + end = '" . addslashes($row->end) . "', + user_group = '" . addslashes($row->user_group) . "', + expand_ext = '" . $row->expand_ext . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_COPY') . " (" . (empty($_REQUEST['title']) ? $row->title : $_REQUEST['title']) . ") (ID: $navigation_id)"); + } + } + + // Выполянем переход к списку меню навигаций + header('Location:index.php?do=navigation&cp=' . SESSION); + } + + + + /** + * Метод, предназначенный для удаления меню навигации и всех пунктов относящихся к нему + * + * @param int $navigation_id идентификатор меню навигации + */ + function navigationDelete($navigation_id) + { + global $AVE_DB, $AVE_Template; + + // Если id меню числовой и это не первое меню (id не 1) + if (is_numeric($navigation_id) && $navigation_id != 1) + { + + $sql= $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = '" . $navigation_id . "' + ")->FetchRow(); + + //-- Стираем кеш навигации + $this->clearCahe($navigation_id, $sql->alias); + + //-- Выполняем запрос к БД на удаление общей информации и шаблона оформления меню + $AVE_DB->Query("DELETE FROM " . PREFIX . "_navigation WHERE navigation_id = '" . $navigation_id . "'"); + //-- Выполняем запрос к БД на удаление всех пунктов для данного меню + $AVE_DB->Query("DELETE FROM " . PREFIX . "_navigation_items WHERE navigation_id = '" . $navigation_id . "'"); + + //-- Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEL') . " (" . stripslashes($sql->title) . ") (ID: $navigation_id)"); + } + + //-- Выполянем переход к списку меню навигаций + header('Location:index.php?do=navigation&cp=' . SESSION); + } + + + + /** + * Метод, предназначенный для получения списка всех пунктов у всех меню навигации + * + */ + function navigationAllItemList() + { + global $AVE_DB, $AVE_Template; + + $navigations = array(); + + //-- Выполняем запрос к БД на получение id и названия меню навигации + $sql = $AVE_DB->Query(" + SELECT + navigation_id, + title + FROM + " . PREFIX . "_navigation + "); + + //-- Циклически обрабатываем полученные данные + while ($navigation = $sql->FetchRow()) + { + //-- Выполняем запрос к БД на получение всех пунктов для каждого меню. + $sql_items = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_id = " . (int)$navigation->navigation_id . " + AND + parent_id = 0 + ORDER BY + position ASC + "); + + while ($row = $sql_items->FetchAssocArray()) + { + //-- имя связанного документа + if ($row['document_id'] > 0) + { + $doc_info = get_document((int)$row['document_id']); + $row['document_title'] = (($doc_info['document_breadcrum_title']) ? $doc_info['document_breadcrum_title'] : $doc_info['document_title']); + } + else + { + $row['document_title'] = ''; + } + + $row['children'] = $this->getChildrenById($row['navigation_item_id'], 0, true); + + if (! empty($item_id)) + $items = $row; + else + $items[] = $row; + } + + $navigation->navigation_items = $items; + + unset($items); + + array_push($navigations, $navigation); + } + + //-- Передаем полученные данные в шаблон для вывода + $AVE_Template->assign('navigations', $navigations); + $AVE_Template->assign('select_tpl', 'navigation/select.tpl'); + } + + + /** + * Метод, предназначенный для вывода пунктов меню навигации в Панели управления + * + * @param int $id идентификатор меню навигации + */ + function navigationItemList($navigation_id) + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_id = " . (int)$navigation_id . " + AND + parent_id = 0 + ORDER BY + position ASC + "); + + $items = array(); + + while ($row = $sql->FetchAssocArray()) + { + // имя связанного документа + if ($row['document_id'] > 0) + { + $doc_info = get_document((int)$row['document_id']); + $row['document_title'] = (($doc_info['document_breadcrum_title']) + ? $doc_info['document_breadcrum_title'] + : $doc_info['document_title']); + } + else + { + $row['document_title'] = ''; + } + + $row['children'] = $this->getChildrenById($row['navigation_item_id'], 0, true); + + if (! empty($item_id)) + $items = $row; + else + $items[] = $row; + } + + $navigation = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = '" . $navigation_id . "' + ")->FetchRow(); + + $AVE_Template->assign('navigation', $navigation); + $AVE_Template->assign('items', $items); + $AVE_Template->assign('level', 1); + + $AVE_Template->assign('nestable_tpl', 'navigation/nestable.tpl'); + $AVE_Template->assign('content', $AVE_Template->fetch('navigation/items.tpl')); + } + + + /** + * Метод для рекурсивного получения + * пунктов меню навигации в Панели управления + */ + public function getChildrenById($navigation_item_id, $rec_status = 1, $recurse = false) + { + global $AVE_DB; + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation_items + WHERE + parent_id = " . $navigation_item_id . " + ORDER BY + position ASC + "); + + $children = array(); + + while($row = $sql->FetchAssocArray()) + { + if($recurse) + { + // имя связанного документа + if ($row['document_id'] > 0) + { + $doc_info = get_document((int)$row['document_id']); + $row['document_title'] = (($doc_info['document_breadcrum_title']) + ? $doc_info['document_breadcrum_title'] + : $doc_info['document_title']); + } + else + { + $row['document_title'] = ''; + } + + $row['children'] = $this->getChildrenById($row['navigation_item_id'], $rec_status,$recurse); + } + + $children[] = $row; + } + + return ((count($children) > 0) + ? $children + : false + ); + } + + + /** + * Метод, предназначенный для управления пунктами меню навигации в Панели управления + * + * @param int $id идентификатор меню навигации + */ + function navigationItemEdit($navigation_item_id = null) + { + global $AVE_DB, $AVE_Template; + + // Определяем действие пользователя + switch ($_REQUEST['sub']) + { + // Если действие не определено, отображаем форму с данными для редактирования + case 'new': + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_id = " . (int)$_REQUEST['navigation_id'] . " + AND + parent_id = 0 + ORDER BY + position ASC + "); + + $items = array(); + + while ($row = $sql->FetchAssocArray()) + { + $row['css_style'] = stripslashes($row['css_style']); + + // имя связанного документа + if ($row['document_id'] > 0) + { + $doc_info = get_document((int)$row['document_id']); + + $row['document_title'] = (($doc_info['document_breadcrum_title']) + ? $doc_info['document_breadcrum_title'] + : $doc_info['document_title']); + } + else + { + $row['document_title'] = ''; + } + + $row['children'] = $this->getChildrenById($row['navigation_item_id'], 0, true); + + if (! empty($item_id)) + $items = $row; + else + $items[] = $row; + } + + $alias = $AVE_DB->Query(" + SELECT + alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $_REQUEST['navigation_id'] . " + ")->GetCell(); + + //-- Стираем кеш навигации + $this->clearCahe($_REQUEST['navigation_id'], $alias); + + $AVE_Template->assign('select_tpl', 'navigation/select.tpl'); + $AVE_Template->assign('items', $items); + $AVE_Template->assign('content', $AVE_Template->fetch('navigation/item_new.tpl')); + break; + + case 'edit': + + $item = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = " . $navigation_item_id . " + ")->FetchRow(); + + $item->css_style = stripslashes($item->css_style); + + if ($item->document_id) + $doc_info = get_document((int)$item->document_id); + + $item->document_title = (($doc_info['document_breadcrum_title']) + ? $doc_info['document_breadcrum_title'] + : $doc_info['document_title']); + + $item->document_alias = $doc_info['document_alias']; + + $AVE_Template->assign('item', $item); + $AVE_Template->assign('content', $AVE_Template->fetch('navigation/item_edit.tpl')); + break; + + case 'save': + + $_REQUEST['alias'] = (strpos($_REQUEST['alias'], 'javascript') !== false) + ? str_replace(array(' ', '%'), '-', $_REQUEST['alias']) + : $_REQUEST['alias']; + + // Определяем флаг статуса пункта меню (активен/неактивен) + $status = (empty($_REQUEST['alias'])) + ? 0 + : 1; + + if ($navigation_item_id) + { + // Выполняем запрос к БД и обновляем информацию в таблице для данного меню + $sql = $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + document_id = '" . (($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : '') . "', + title = '" . $this->_replace_wildcode($_REQUEST['title']) . "', + alias = '" . $_REQUEST['alias'] . "', + description = '" . $this->_replace_wildcode($_REQUEST['description']) . "', + image = '" . $_REQUEST['image'] . "', + css_style = '" . addslashes($_REQUEST['css_style']) . "', + css_class = '" . $_REQUEST['css_class'] . "', + css_id = '" . $_REQUEST['css_id'] . "', + target = '" . $_REQUEST['target'] . "', + status = '" . $status . "' + WHERE + navigation_item_id = '" . $navigation_item_id . "' + "); + + $navigation_id = $AVE_DB->Query(" + SELECT + navigation_id + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $navigation_item_id . "' + ")->GetCell(); + + $alias = $AVE_DB->Query(" + SELECT + alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $navigation_id . " + ")->GetCell(); + + //-- Стираем кеш навигации + $this->clearCahe($_REQUEST['navigation_id'], $alias); + } + else + { + if ($_REQUEST['after']) + $after = $AVE_DB->Query("SELECT * FROM ".PREFIX."_navigation_items WHERE navigation_item_id = '" . $_REQUEST['after'] . "' ")->FetchArray(); + else + $after = array('parent_id' => 0, 'level' => 1, 'position' => 0); + + // Выполняем запрос к БД и обновляем информацию в таблице для данного меню + $sql = $AVE_DB->Query(" + INSERT + " . PREFIX . "_navigation_items + SET + navigation_id = '" . $_REQUEST['navigation_id'] . "', + document_id = '" . (($_REQUEST['document_id']) ? (int)$_REQUEST['document_id'] : '') . "', + title = '" . $this->_replace_wildcode($_REQUEST['title']) . "', + alias = '" . $_REQUEST['alias'] . "', + description = '" . $this->_replace_wildcode($_REQUEST['description']) . "', + image = '" . $_REQUEST['image'] . "', + css_style = '" . addslashes($_REQUEST['css_style']) . "', + css_class = '" . $_REQUEST['css_class'] . "', + css_id = '" . $_REQUEST['css_id'] . "', + target = '" . $_REQUEST['target'] . "', + parent_id = '" . $after['parent_id'] . "', + level = '" . $after['level'] . "', + position = '" . $after['position'] . "', + status = '" . $status . "' + "); + + $navigation_item_id = $AVE_DB->getLastInsertId(); + + $alias = $AVE_DB->Query(" + SELECT + alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $_REQUEST['navigation_id'] . " + ")->GetCell(); + + //-- Стираем кеш навигации + $this->clearCahe($_REQUEST['navigation_id'], $alias); + } + + $message = 'Пункт меню успешно сохранен'; + $header = 'Выполнено'; + $theme = 'accept'; + + echo json_encode( + array( + 'message' => $message, + 'header' => $header, + 'theme' => $theme, + 'after' => $_REQUEST['after'], + 'item_id' => $navigation_item_id) + ); + exit; + } + /* + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_ADDIT') . " (" . $this->_replace_wildcode($title) . ") - ". $AVE_Template->get_config_vars('NAVI_REPORT_TLEV')); + + // Выполняем обновление страницы + header('Location:index.php?do=navigation&action=entries&id=' . $nav_id . '&cp=' . SESSION); + exit; + */ + } + + + + /** + * Метод, предназначенный для удаления пунктов меню навигации связанных с удаляемым документом. + * Данный метод вызывается при удалении документа с идентификатором $document_id. + * Если у пункта меню нет потомков - пункт удаляется, в противном случае пункт деактивируется + * + * @param int $document_id идентификатор удаляемого документа + */ + function navigationItemDeleteFromDoc($document_id) + { + global $AVE_DB, $AVE_Template; + + if (! is_numeric($document_id)) + return; + + // Выполняем запрос к БД и получаем ID пункта меню, с которым связан документ + $sql = $AVE_DB->Query(" + SELECT + navigation_item_id + FROM + " . PREFIX . "_navigation_items + WHERE + document_id = '" . $document_id . "' + "); + + while ($row = $sql->FetchRow()) + { + // Выполняем запрос к БД для определения у удаляемого пункта подпунктов + $num = $AVE_DB->Query(" + SELECT + COUNT(1) + FROM + " . PREFIX . "_navigation_items + WHERE + parent_id = '" . $row->navigation_item_id . "' + ")->GetCell(); + + // Если данный пункт имеет подпункты, тогда + if ($num > 0) + { + // Выполняем запрос к БД и деактивируем пункт меню + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + status = '0' + WHERE + navigation_item_id = '" . $row->navigation_item_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEACT') . " (id: $row->navigation_item_id)"); + } + else + { // В противном случае, если данный пункт не имеет подпунктов, тогда + + // Выполняем запрос к БД и удаляем помеченный пункт + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $row->navigation_item_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DELIT') . " (id: $row->navigation_item_id)"); + } + } + } + + + /** + * Метод, предназначенный для удаления пункта меню навигации в Панели управления + * + * @param int $navigation_item_id идентификатор меню навигации + */ + function navigationItemDelete($navigation_item_id) + { + global $AVE_DB, $AVE_Template; + + if (!is_numeric($navigation_item_id)) + return; + + // Выполняем запрос к БД для определения у удаляемого пункта подпунктов + $num = $AVE_DB->Query(" + SELECT + COUNT(1) + FROM + " . PREFIX . "_navigation_items + WHERE + parent_id = '" . $navigation_item_id . "' + ")->GetCell(); + + // Если данный пункт имеет подпункты, тогда + if ($num > 0) + { + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $navigation_item_id . "' + LIMIT 1 + ")->FetchRow(); + + // Выполняем запрос к БД и деактивируем пункт меню + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + status = '0' + WHERE + navigation_item_id = '" . $navigation_item_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEACT') . " (" . stripslashes($sql->title) . ") (id: $navigation_item_id)"); + } + else + { + // В противном случае, если данный пункт не имеет подпунктов, тогда + $sql = $AVE_DB->Query(" + SELECT * + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $navigation_item_id . "' + LIMIT 1 + ")->FetchRow(); + + // Выполняем запрос к БД и удаляем помеченный пункт + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $navigation_item_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DELIT') . " (" . stripslashes($sql->title) . ") (id: $navigation_item_id)"); + } + + $nav = $AVE_DB->Query(" + SELECT + navigation_id, alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $sql->navigation_id . " + ")->FetchRow(); + + //-- Стираем кеш навигации + $this->clearCahe($nav->navigation_id, $nav->alias); + + // Выполняем обновление страницы + header('Location:' . get_referer_admin_link()); + exit; + } + + + /** + * Метод, предназначенный для активации пункта меню навигации. + * Данный метод используется при изменении статуса документа с идентификатором $document_id + * + * @param int $document_id идентификатор документа на который ссылается пункт меню + */ + function navigationItemStatusOn($document_id) + { + global $AVE_DB, $AVE_Template; + + if (!is_numeric($document_id)) + return; + + // Выполняем запрос к БД и получаем id пункта меню, который соответствует идентификатору документа в ссылке + $sql = $AVE_DB->Query(" + SELECT + navigation_id, + navigation_item_id + FROM + " . PREFIX . "_navigation_items + WHERE + document_id = '" . $document_id . "' + AND + status = '0' + "); + + while ($row = $sql->FetchRow()) + { + // Выполняем запрос к БД изменяем статус пункта меню на активный (1) + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + status = '1' + WHERE + navigation_item_id = '" . $row->navigation_item_id . "' + "); + + $nav = $AVE_DB->Query(" + SELECT + navigation_id, alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $row->navigation_id . " + ")->FetchRow(); + + //-- Стираем кеш навигации + $this->clearCahe($nav->navigation_id, $nav->alias); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_ACT') . " (id: $row->navigation_item_id)"); + } + + + } + + /** + * Метод, предназначенный для деактивации пункта меню навигации. + * Данный метод используется при изменении статуса документа с идентификатором $document_id + * + * @param int $document_id идентификатор документа на который ссылается пункт меню + */ + function navigationItemStatusOff($document_id) + { + global $AVE_DB, $AVE_Template; + + if (! is_numeric($document_id)) + return; + + // Выполняем запрос к БД и получаем id пункта меню, + // который соответствует идентификатору документа в ссылке + $sql = $AVE_DB->Query(" + SELECT + navigation_id, + navigation_item_id + FROM + " . PREFIX . "_navigation_items + WHERE + document_id = '" . $document_id . "' + AND + status = '1' + "); + + while ($row = $sql->fetchrow()) + { + // Выполняем запрос к БД изменяем статус пункта меню на неактивный (0) + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + status = '0' + WHERE + navigation_item_id = '" . $row->navigation_item_id . "' + "); + + + $nav = $AVE_DB->Query(" + SELECT + navigation_id, alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $row->navigation_id . " + ")->FetchRow(); + + //-- Стираем кеш навигации + $this->clearCahe($nav->navigation_id, $nav->alias); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('NAVI_REPORT_DEACT') . " (id: $row->navigation_item_id)"); + } + } + + /** + * Метод, предназначенный для активации пункта меню навигации. + * Данный метод используется при изменении статуса документа с идентификатором $document_id + * + * @param int $document_id идентификатор документа на который ссылается пункт меню + */ + function navigationItemGet($navigation_item_id) + { + global $AVE_DB, $AVE_Template; + + if (! is_numeric($navigation_item_id)) + return; + + // Выполняем запрос к БД и получаем id пункта меню, который соответствует идентификатору документа в ссылке + $item = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $navigation_item_id . "' + ")->FetchAssocArray(); + + if ($item['document_id']) + $doc_info = get_document((int)$item['document_id']); + + $item['document_title'] = (($doc_info['document_breadcrum_title']) + ? $doc_info['document_breadcrum_title'] + : $doc_info['document_title']); + + $item['document_alias'] = $doc_info['document_alias']; + + $nav = $AVE_DB->Query(" + SELECT + navigation_id, alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $item['navigation_id'] . " + ")->FetchRow(); + + //-- Стираем кеш навигации + $this->clearCahe($nav->navigation_id, $nav->alias); + + $AVE_Template->assign('item', $item); + $AVE_Template->assign('content', $AVE_Template->fetch('navigation/item.tpl')); + } + + /** + * Метод, предназначенный для рекурсивоной + * сортировки пунктов меню навигации. + */ + function navigationSort() + { + global $AVE_DB, $AVE_Template; + + $level = 1; + + $navigation_id = (int)$_REQUEST['navigation_id']; + + foreach ($_REQUEST['data'] as $item_id => $item) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + level = '" . $level . "', + parent_id = '0', + position = '" . (int)$item_id . "' + WHERE + navigation_item_id = " . $item['id'] ." + AND + navigation_id = " . $navigation_id . " + "); + + if (is_array($item['children'])) + { + $this->navigationSortNested($item['children'], $item['id'], $level, $navigation_id); + } + } + + $nav = $AVE_DB->Query(" + SELECT + navigation_id, alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $navigation_id . " + ")->FetchRow(); + + //-- Стираем кеш навигации + $this->clearCahe($nav->navigation_id, $nav->alias); + + if (isAjax()) + { + echo json_encode( + array( + 'message' => $AVE_Template->get_config_vars('NAVI_SORTED'), + 'header' => $AVE_Template->get_config_vars('NAVI_REPORT_SUCCESS'), + 'theme' => 'accept' + ) + ); + } + + exit; + } + + /** + * Метод, предназначенный для рекурсивоной + * сортировки пунктов меню навигации. + */ + function navigationSortNested($array = array(), $parent_id = null, $level = null, $navigation_id = null) + { + global $AVE_DB; + + $level++; + + foreach($array as $key => $value) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + level = '" . $level . "', + parent_id = '" . (int)$parent_id . "', + position = '" . $key . "' + WHERE + navigation_item_id = " . $value['id'] . " + AND + navigation_id = " . $navigation_id . " + "); + + if (is_array($value['children'])) + { + $this->navigationSortNested($value['children'], $value['id'], $level, $navigation_id); + } + } + } + + + function getDocumentById($doc_id = null) + { + $document = get_document($doc_id); + + echo json_encode( + array( + 'doc_id' => $doc_id, + 'document_title' => $document['document_title'], + 'document_alias' => $document['document_alias'] + ) + ); + exit; + } + + + function navigationItemStatus($navigation_item_id, $status = 1) + { + global $AVE_DB; + + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_navigation_items + SET + status = '" . $status . "' + WHERE + navigation_item_id = '" . $navigation_item_id . "' + "); + + $navigation_id = $AVE_DB->Query(" + SELECT + navigation_id + FROM + " . PREFIX . "_navigation_items + WHERE + navigation_item_id = '" . $navigation_item_id . "' + ")->GetCell(); + + $nav = $AVE_DB->Query(" + SELECT + navigation_id, alias + FROM + " . PREFIX . "_navigation + WHERE + navigation_id = " . $navigation_id . " + ")->FetchRow(); + + //-- Стираем кеш навигации + $this->clearCahe($nav->navigation_id, $nav->alias); + + echo json_encode( + array( + 'status' => ($status == 0 ? 1 : 0) + ) + ); + + exit; + } + + + function clearCahe($id, $alias = '') + { + if (file_exists(BASE_DIR . '/cache/sql/nav/template-' . $id . '.cache')) + unlink(BASE_DIR . '/cache/sql/nav/template-' . $id . '.cache'); + + if (file_exists(BASE_DIR . '/cache/sql/nav/template-' . $alias . '.cache')) + unlink(BASE_DIR . '/cache/sql/nav/template-' . $alias . '.cache'); + + if (file_exists(BASE_DIR . '/cache/sql/nav/items-' . $id . '.cache')) + unlink(BASE_DIR . '/cache/sql/nav/items-' . $id . '.cache'); + + if (file_exists(BASE_DIR . '/cache/sql/nav/items-' . $alias . '.cache')) + unlink(BASE_DIR . '/cache/sql/nav/items-' . $alias . '.cache'); + } + + } +?> diff --git a/class/class.paginations.php b/class/class.paginations.php new file mode 100644 index 0000000..65e71aa --- /dev/null +++ b/class/class.paginations.php @@ -0,0 +1,233 @@ + 5 && $curent_page > 3) + { + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, 1, $pagination_start_label); + + $first = str_replace($search, $replace, $pagination_link_template); + + $pagination .= sprintf($pagination_link_box, str_replace(array('{s}', '{t}'), $pagination_start_label, str_replace(array('&'. $type .'={s}', '&' . $type .'={s}', '/' . $type . '-{s}'), '', $first))); + + // Если есть шаблон метки о наличии страниц, добавляем + if ($pagination_separator_label != '') + $pagination .= sprintf($pagination_separator_box, $pagination_separator_label); + } + + // Предыдущая + if ($curent_page > 1) + { + // Если равна 2 + if ($curent_page - 1 == 1) + { + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, $curent_page, $pagination_prev_label); + + $link = str_replace($search, $replace, $pagination_link_template); + + $pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_prev_label, str_replace(array('&' . $type . '={s}', '&' . $type . '={s}', '/' . $type . '-{s}'), '', $link))); + } + // Если больше 2х + else + { + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, $curent_page - 1, $pagination_prev_label); + + $link = str_replace($search, $replace, $pagination_link_template); + + $pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_prev_label, str_replace('{s}', ($curent_page - 1), $link))); + } + } + + foreach($pages as $page) + { + if ($page >= 1 && $page <= $total_pages) + { + // Текущий номер страницы (активная страница) + if ($curent_page == $page) + { + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, $curent_page, $curent_page); + + $link = str_replace($search, $replace, $pagination_link_active_template); + + $pagination .= sprintf($pagination_active_link_box, str_replace('{s}', ($curent_page), $link)); + } + else + { + // Страница номер 1 + if ($page == 1) + { + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, $page, $page); + + $link = str_replace($search, $replace, $pagination_link_template); + + $pagination .= sprintf($pagination_link_box, str_replace(array('{s}', '{t}'), $page, str_replace(array('&' . $type . '={s}', '&' . $type . '={s}', '/' . $type . '-{s}'), '', $link))); + } + // Остальные неактивные номера страниц + else + { + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, $page, $page); + + $link = str_replace($search, $replace, $pagination_link_template); + + $pagination .= sprintf($pagination_link_box, str_replace(array('{s}', '{t}'), $page, $link)); + } + } + } + } + + // Следующая + if ($curent_page < $total_pages) + { + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, $curent_page + 1, $pagination_next_label); + + $link = str_replace($search, $replace, $pagination_link_template); + + $pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_next_label, str_replace('{s}', ($curent_page + 1), $link))); + } + + // Последняя + if ($total_pages > 5 && ($curent_page < $total_pages - 2)) + { + // Если есть шаблон метки о наличии страниц, добавляем + if ($pagination_separator_label != '') + $pagination .= sprintf($pagination_separator_box, $pagination_separator_label); + + $search = array('[link]', '[page]', '[name]'); + $replace = array($template_label, $total_pages, $pagination_end_label); + + $last = str_replace($search, $replace, $pagination_link_template); + + $pagination .= sprintf($pagination_link_box, str_replace('{t}', $pagination_end_label, str_replace('{s}', $total_pages, $last))); + } + + // Общий контейнер + if ($pagination != '') + { + // Если пришел внешний контейнер для + if ($pagination_box_ext != '') + $pagination = sprintf($pagination_box_ext, $pagination); + else if (pagination_box != '') + $pagination = sprintf($pagination_box, $pagination); + } + + return $pagination; + } + + + /** + * Текущая страница + * + * @param string $type тип постраничной навигации, + * допустимые значения: page, apage, artpage + * @return int номер текущей страницы + */ + public static function getCurrentPage($type = 'page') + { + if (! in_array($type, array('page', 'apage', 'artpage'))) + return 1; + + $page = (isset($_REQUEST[$type]) && is_numeric($_REQUEST[$type])) + ? $_REQUEST[$type] + : 1; + + return (int)$page; + } + + + /** + * Достаем всю информацию о данной пагинации + * + * @param int $id id постраничной навигации + * @return array информация + */ + public static function getContainers($id) + { + global $AVE_DB; + + $containers = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_paginations + WHERE + id = '" . $id . "' + ")->FetchAssocArray(); + + return $containers; + } + } \ No newline at end of file diff --git a/class/class.request.php b/class/class.request.php new file mode 100644 index 0000000..7479c20 --- /dev/null +++ b/class/class.request.php @@ -0,0 +1,863 @@ +_limit; + $start = get_current_page() * $limit - $limit; + + // Получаем общее количество запросов + $num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_request")->GetCell(); + + // Если количество больше, чем установленный лимит, тогда формируем постраничную навигацию + if ($num > $limit) + { + $page_nav = "
    32. {t}
    33. "; + $page_nav = get_pagination(ceil($num / $limit), 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + $limit = $pagination ? "LIMIT " . $start . "," . $limit : ''; + } + + // Выполняем запрос к БД на получение списка запросов с учетом лимита вывода на страницу (если необходимо) + $items = array(); + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_request + ORDER BY Id ASC + " . $limit . " + "); + + // Формируем массив из полученных данных + while ($row = $sql->FetchRow()) + { + $row->request_author = get_username_by_id($row->request_author_id); + array_push($items, $row); + } + + // Возвращаем массив + return $items; + } + + /** + * Получить наименование и описание Запроса по идентификатору + * + * @param int $request_id идентификатор Запроса + * @return object наименование Запроса + */ + function get_request_by_id($request_id = 0) + { + global $AVE_DB; + + static $requests = array(); + + if (!isset($requests[$request_id])) + { + $requests[$request_id] = $AVE_DB->Query(" + SELECT + rubric_id, + request_title, + request_description + FROM " . PREFIX . "_request + WHERE Id = '" . $request_id . "' + LIMIT 1 + ")->FetchRow(); + } + + return $requests[$request_id]; + } + + /** + * Проверка алиаса тега на валидность и уникальность + */ + function requestValidate ($alias = '', $id = 0) + { + global $AVE_DB; + + //-- Соответствие требованиям + if (empty ($alias) || preg_match('/^[A-Za-z0-9-_]{1,20}$/i', $alias) !== 1 || is_numeric($alias)) + return 'syn'; + + //-- Уникальность + return !(bool)$AVE_DB->Query(" + SELECT 1 + FROM + " . PREFIX . "_request + WHERE + request_alias = '" . $alias . "' + AND + Id != '" . $id . "' + ")->GetCell(); + } + +/** + * Внешние методы класса + */ + + /** + * Метод, предназначенный для формирования списка Запросов + * + */ + function requestListFetch() + { + global $AVE_Template; + + $AVE_Template->assign('conditions', $this->_requestListGet(false)); + } + + /** + * Метод, предназначенный для отображения списка Запросов + * + */ + function requestListShow() + { + global $AVE_Template; + + $AVE_Template->assign('rid', 0); + + // Получаем список запросов + $AVE_Template->assign('items', $this->_requestListGet()); + + // Передаем в шаблон и отображаем страницу со списком + $AVE_Template->assign('content', $AVE_Template->fetch('request/list.tpl')); + } + + /** + * Метод, предназначенный для создания нового Запроса + * + */ + function requestNew() + { + global $AVE_DB, $AVE_Template; + + // Определяем действие пользователя + switch ($_REQUEST['sub']) + { + // Действие не определено + case '': + $AVE_Template->assign('rid', 0); + // Отображаем пустую форму для создания нового запроса + $AVE_Template->assign('formaction', 'index.php?do=request&action=new&sub=save&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('request/form.tpl')); + break; + + // Нажата кнопка Сохранить запрос + case 'save': + $save = true; + $errors = array(); + + $row->request_template_item = pretty_chars($_REQUEST['request_template_item']); + $row->request_template_item = stripslashes($row->request_template_item); + $row->request_template_main = pretty_chars($_REQUEST['request_template_main']); + $row->request_template_main = stripslashes($row->request_template_main); + $row->request_title = stripslashes($_REQUEST['request_title']); + $row->rubric_id = stripslashes($_REQUEST['rubric_id']); + $row->request_items_per_page = stripslashes($_REQUEST['request_items_per_page']); + $row->request_order_by = stripslashes($_REQUEST['request_order_by']); + $row->request_order_by_nat = stripslashes($_REQUEST['request_order_by_nat']); + $row->request_asc_desc = stripslashes($_REQUEST['request_asc_desc']); + $row->request_description = stripslashes($_REQUEST['request_description']); + $row->request_show_pagination = (isset($_REQUEST['request_show_pagination']) ? (int)($_REQUEST['request_show_pagination']) : 0); + $row->request_pagination = (isset($_REQUEST['request_pagination']) ? (int)($_REQUEST['request_pagination']) : 1); + $row->request_only_owner = (isset($_REQUEST['request_only_owner']) ? (int)($_REQUEST['request_only_owner']) : 0); + $row->request_cache_lifetime = (int)($_REQUEST['request_cache_lifetime']); + $row->request_lang = (isset($_REQUEST['request_lang']) ? (int)$_REQUEST['request_lang'] : 0); + $row->request_cache_elements = (isset($_REQUEST['request_cache_elements']) ? (int)$_REQUEST['request_cache_elements'] : 0); + $row->request_external = (isset($_REQUEST['request_external']) ? (int)$_REQUEST['request_external'] : 0); + $row->request_ajax = (isset($_REQUEST['request_ajax']) ? (int)$_REQUEST['request_ajax'] : 0); + $row->request_show_sql = (isset($_REQUEST['request_show_sql']) ? (int)$_REQUEST['request_show_sql'] : 0); + + if (empty($_REQUEST['rubric_id'])) + { + $save = false; + $message = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_RUBRIC'); + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_RUBRIC'); + } + + if (empty($_REQUEST['request_title'])) + { + $save = false; + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_TITLE'); + } + + if (empty($_REQUEST['request_template_main'])) + { + $save = false; + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_TEXT'); + } + + $check_code_template_item = strtolower($_REQUEST['request_template_item']); + $check_code_template_main = strtolower($_REQUEST['request_template_main']); + + if ((is_php_code($check_code_template_item) || is_php_code($check_code_template_main)) && !check_permission('request_php')) + { + $save = false; + $message = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_PHP'); + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_PHP'); + reportLog($AVE_Template->get_config_vars('REQUEST_REPORT_ERR_PHP_N') . ' (' . stripslashes(htmlspecialchars($_REQUEST['request_title'], ENT_QUOTES)) . ')'); + } + + if ($save === false) + { + $AVE_Template->assign('row', $row); + $AVE_Template->assign('errors', $errors); + $AVE_Template->assign('formaction', 'index.php?do=request&action=new&sub=save&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('request/form.tpl')); + } + else + { + // Выполняем запрос к БД и сохраняем введенную пользователем информацию + $AVE_DB->Query(" + INSERT " . PREFIX . "_request + SET + rubric_id = '" . (int)$_REQUEST['rubric_id'] . "', + request_alias = '" . $_REQUEST['request_alias'] . "', + request_title = '" . $_REQUEST['request_title'] . "', + request_items_per_page = '" . $_REQUEST['request_items_per_page'] . "', + request_template_item = '" . $_REQUEST['request_template_item'] . "', + request_template_main = '" . $_REQUEST['request_template_main'] . "', + request_order_by = '" . $_REQUEST['request_order_by'] . "', + request_order_by_nat = '" . $_REQUEST['request_order_by_nat'] . "', + request_asc_desc = '" . $_REQUEST['request_asc_desc'] . "', + request_author_id = '" . (int)$_SESSION['user_id'] . "', + request_created = '" . time() . "', + request_description = '" . $_REQUEST['request_description'] . "', + request_show_pagination = '" . (isset($_REQUEST['request_show_pagination']) ? (int)$_REQUEST['request_show_pagination'] : 0) . "', + request_pagination = '" . (isset($_REQUEST['request_pagination']) ? (int)$_REQUEST['request_pagination'] : 1) . "', + request_use_query = '" . (isset($_REQUEST['request_use_query']) ? (int)$_REQUEST['request_use_query'] : 0) . "', + request_hide_current = '" . (int)$_REQUEST['request_hide_current'] . "', + request_only_owner = '" . (int)$_REQUEST['request_only_owner'] . "', + request_cache_lifetime = '" . (int)$_REQUEST['request_cache_lifetime'] . "', + request_lang = '" . (isset($_REQUEST['request_lang']) ? (int)$_REQUEST['request_lang'] : 0) . "', + request_cache_elements = '" . (isset($_REQUEST['request_cache_elements']) ? (int)$_REQUEST['request_cache_elements'] : 0). "', + request_show_statistic = '" . (isset($_REQUEST['request_show_statistic']) ? (int)$_REQUEST['request_show_statistic'] : 0). "', + request_external = '" . (isset($_REQUEST['request_external']) ? (int)$_REQUEST['request_external'] : 0). "', + request_ajax = '" . (isset($_REQUEST['request_ajax']) ? (int)$_REQUEST['request_ajax'] : 0). "', + request_show_sql = '" . (isset($_REQUEST['request_show_sql']) ? (int)$_REQUEST['request_show_sql'] : 0). "' + "); + + // Получаем id последней записи + $iid = $AVE_DB->InsertId(); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('REQUEST_ADD_NEW_SUC') . ' (' . stripslashes(htmlspecialchars($_REQUEST['request_title'], ENT_QUOTES)) . ') (' . $iid . ')'); + + // Если в запросе пришел параметр на продолжение редактирования запроса + if ($_REQUEST['reedit'] == 1) + { + // Выполняем переход на страницу с редактированием запроса + header('Location:index.php?do=request&action=edit&Id=' . $iid . '&rubric_id=' . $_REQUEST['rubric_id'] . '&cp=' . SESSION); + } + else + { + // В противном случае выполняем переход к списку запросов + if (!$_REQUEST['next_edit']) { + header('Location:index.php?do=request&cp=' . SESSION); + } else { + header('Location:index.php?do=request&action=edit&Id=' . $iid . '&rubric_id='.$_REQUEST['rubric_id'].'&cp=' . SESSION); + } + } + exit; + } + } + } + + /** + * Метод, предназначенный для редактирования Запроса + * + * @param int $request_id идентификатор запроса + */ + function requestEdit($request_id) + { + global $AVE_DB, $AVE_Template; + + // Определяем действие пользователя + switch ($_REQUEST['sub']) + { + // Если действие не определено + case '': + // Выполняем запрос к БД и получаем всю информацию о запросе + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_request + WHERE Id = '" . $request_id . "' + "); + + if ($sql->_result->num_rows == 0) + { + header('Location:index.php?do=request&cp=' . SESSION); + exit; + } + + $row = $sql->FetchRow(); + + // Получаем постраничную навигацию + $sql = $AVE_DB->Query(" + SELECT + id, + pagination_name + FROM + " . PREFIX . "_paginations + "); + + $paginations = array(); + + while ($pages = $sql->FetchRow()) + { + array_push($paginations, $pages); + } + + // Передаем данные в шаблон и отображаем страницу с редактированием запроса + $AVE_Template->assign('row', $row); + $AVE_Template->assign('rid', $request_id); + $AVE_Template->assign('paginations', $paginations); + $AVE_Template->assign('formaction', 'index.php?do=request&action=edit&sub=save&Id=' . $request_id . '&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('request/form.tpl')); + + break; + + // Пользователь нажал кнопку Сохранить изменения + case 'save': + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_request + WHERE Id = '" . $request_id . "' + "); + + if($sql->_result->num_rows == 0) { + header('Location:index.php?do=request&cp=' . SESSION); + exit; + } + + $save = true; + $errors = array(); + $row = new stdClass(); + $row->request_template_item = (isset($_REQUEST['request_template_item']) ? stripslashes(pretty_chars($_REQUEST['request_template_item'])) : ''); + $row->request_template_main = (isset($_REQUEST['request_template_main']) ? stripslashes(pretty_chars($_REQUEST['request_template_main'])) : ''); + $row->request_title = (isset($_REQUEST['request_title']) ? stripslashes($_REQUEST['request_title']) : ''); + $row->rubric_id = (isset($_REQUEST['rubric_id']) ? stripslashes($_REQUEST['rubric_id']) : 0); + $row->request_items_per_page = (isset($_REQUEST['request_items_per_page']) ? stripslashes($_REQUEST['request_items_per_page']) : 0); + $row->request_order_by = (isset($_REQUEST['request_order_by']) ? stripslashes($_REQUEST['request_order_by']) : ''); + $row->request_order_by_nat = (isset($_REQUEST['request_order_by_nat']) ? stripslashes($_REQUEST['request_order_by_nat']) : ''); + $row->request_asc_desc = (isset($_REQUEST['request_asc_desc']) ? stripslashes($_REQUEST['request_asc_desc']) : 'DESC'); + $row->request_description = (isset($_REQUEST['request_description']) ? stripslashes($_REQUEST['request_description']) : ''); + $row->request_show_pagination = (isset($_REQUEST['request_show_pagination']) ? $_REQUEST['request_show_pagination'] : 0); + $row->request_pagination = (isset($_REQUEST['request_pagination']) ? (int)($_REQUEST['request_pagination']) : 1); + $row->request_use_query = (isset($_REQUEST['request_use_query']) ? $_REQUEST['request_use_query'] : 0); + $row->request_only_owner = (isset($_REQUEST['request_only_owner']) ? (int)($_REQUEST['request_only_owner']) : 0); + $row->request_cache_lifetime = (isset($_REQUEST['request_cache_lifetime']) ? (int)($_REQUEST['request_cache_lifetime']) : 0); + $row->request_lang = (isset($_REQUEST['request_lang']) ? (int)$_REQUEST['request_lang'] : 0); + $row->request_cache_elements = (isset($_REQUEST['request_cache_elements']) ? (int)$_REQUEST['request_cache_elements'] : 0); + $row->request_show_statistic = (isset($_REQUEST['request_show_statistic']) ? (int)$_REQUEST['request_show_statistic'] : 0); + $row->request_external = (isset($_REQUEST['request_external']) ? (int)$_REQUEST['request_external'] : 0); + $row->request_ajax = (isset($_REQUEST['request_ajax']) ? (int)$_REQUEST['request_ajax'] : 0); + $row->request_show_sql = (isset($_REQUEST['request_show_sql']) ? (int)$_REQUEST['request_show_sql'] : 0); + + if (empty($_REQUEST['rubric_id'])) + { + $save = false; + $message = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_RUBRIC'); + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_RUBRIC'); + } + + if (empty($_REQUEST['request_title'])) + { + $save = false; + $message = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_TITLE'); + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_TITLE'); + } + + if (empty($_REQUEST['request_template_main'])) + { + $save = false; + $message = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_TEXT'); + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_TEXT'); + } + + $check_code_template_item = strtolower($_REQUEST['request_template_item']); + $check_code_template_main = strtolower($_REQUEST['request_template_main']); + + if ((is_php_code($check_code_template_item) || is_php_code($check_code_template_main)) && !check_permission('request_php')) + { + $save = false; + $message = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_PHP'); + $errors[] = $AVE_Template->get_config_vars('REQUEST_REPORT_ERR_PHP'); + reportLog($AVE_Template->get_config_vars('REQUEST_REPORT_ERR_PHP_E') . ' (' . stripslashes(htmlspecialchars($_REQUEST['request_title'], ENT_QUOTES)) . ') (Id:' . $request_id . ')'); + } + + if ($save === false) + { + if(isAjax()) + { + $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => 'error')); + exit; + } + + $AVE_Template->assign('row', $row); + $AVE_Template->assign('errors', $errors); + $AVE_Template->assign('formaction', 'index.php?do=request&action=edit&sub=save&Id=' . $request_id . '&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('request/form.tpl')); + } + else + { + // Выполняем запрос к БД и обновляем имеющиеся данные + $AVE_DB->Query(" + UPDATE " . PREFIX . "_request + SET + rubric_id = '" . (int)$_REQUEST['rubric_id'] . "', + request_alias = '" . $_REQUEST['request_alias'] . "', + request_title = '" . $_REQUEST['request_title'] . "', + request_items_per_page = '" . $_REQUEST['request_items_per_page'] . "', + request_template_item = '" . $_REQUEST['request_template_item'] . "', + request_template_main = '" . $_REQUEST['request_template_main'] . "', + request_order_by = '" . $_REQUEST['request_order_by'] . "', + request_order_by_nat = '" . $_REQUEST['request_order_by_nat'] . "', + request_description = '" . $_REQUEST['request_description'] . "', + request_asc_desc = '" . $_REQUEST['request_asc_desc'] . "', + request_show_pagination = '" . (isset($_REQUEST['request_show_pagination']) ? (int)$_REQUEST['request_show_pagination'] : 0) . "', + request_pagination = '" . (isset($_REQUEST['request_pagination']) ? (int)$_REQUEST['request_pagination'] : 1) . "', + request_use_query = '" . (isset($_REQUEST['request_use_query']) ? (int)$_REQUEST['request_use_query'] : 0) . "', + request_hide_current = '" . @(int)$_REQUEST['request_hide_current'] . "', + request_only_owner = '" . @(int)$_REQUEST['request_only_owner'] . "', + request_cache_lifetime = '" . (int)($_REQUEST['request_cache_lifetime']>'' ? $_REQUEST['request_cache_lifetime'] : '-1') . "', + request_lang = '" . (isset($_REQUEST['request_lang']) ? (int)$_REQUEST['request_lang'] : 0). "', + request_cache_elements = '" . (isset($_REQUEST['request_cache_elements']) ? (int)$_REQUEST['request_cache_elements'] : 0). "', + request_show_statistic = '" . (isset($_REQUEST['request_show_statistic']) ? (int)$_REQUEST['request_show_statistic'] : 0). "', + request_external = '" . (isset($_REQUEST['request_external']) ? (int)$_REQUEST['request_external'] : 0). "', + request_ajax = '" . (isset($_REQUEST['request_ajax']) ? (int)$_REQUEST['request_ajax'] : 0). "', + request_show_sql = '" . (isset($_REQUEST['request_show_sql']) ? (int)$_REQUEST['request_show_sql'] : 0). "' + WHERE + Id = '" . $request_id . "' + "); + + $sql = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_documents WHERE rubric_id = ".$_REQUEST['rubric_id']); + + while ($row = $sql->FetchRow()) + { + $AVE_DB->clearcacherequest('doc_'.$row->Id); + } + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('REQUEST_SAVE_CHA_SUC') . ' (' . stripslashes(htmlspecialchars($_REQUEST['request_title'], ENT_QUOTES)) . ') (Id:' . $request_id . ')'); + + // В противном случае выполняем переход к списку запросов + if (! isAjax()) + { + header('Location:index.php?do=request&cp=' . SESSION); + exit; + } else { + $message = $AVE_Template->get_config_vars('REQUEST_TEMPLATE_SAVED'); + $header = $AVE_Template->get_config_vars('REQUEST_SUCCESS'); + $theme = 'accept'; + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + } + break; + } + } + + /** + * Метод, предназначенный для создания копии Запроса + * + * @param int $request_id идентификатор запроса + */ + function requestCopy($request_id) + { + global $AVE_DB, $AVE_Template; + + // Выполняем запрос к БД на получение информации о копиреумом запросе + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_request + WHERE Id = '" . $request_id . "' + "); + + if($sql->_result->num_rows == 0) { + header('Location:index.php?do=request&cp=' . SESSION); + exit; + } + + $row = $sql->FetchRow(); + + // Выполняем запрос к БД на добавление нового запроса на основании полученных ранее данных + $AVE_DB->Query(" + INSERT " . PREFIX . "_request + SET + rubric_id = '" . (int)$row->rubric_id . "', + request_items_per_page = '" . $row->request_items_per_page . "', + request_title = '" . $_REQUEST['cname'] . "', + request_template_item = '" . addslashes($row->request_template_item) . "', + request_template_main = '" . addslashes($row->request_template_main) . "', + request_order_by = '" . addslashes($row->request_order_by) . "', + request_order_by_nat = '" . addslashes($row->request_order_by_nat) . "', + request_author_id = '" . (int)$_SESSION['user_id'] . "', + request_created = '" . time() . "', + request_description = '" . addslashes($row->request_description) . "', + request_asc_desc = '" . $row->request_asc_desc . "', + request_show_pagination = '" . $row->request_show_pagination . "', + request_use_query = '" . $row->request_use_query . "', + request_hide_current = '" . $row->request_hide_current . "', + request_lang = '" . $row->request_lang . "', + request_cache_elements = '" . (isset($row->request_cache_elements) ? $row->request_cache_elements : 0) . "' + "); + + // Получаем id добавленной записи + $iid = $AVE_DB->InsertId(); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('REQUEST_COPY_SUC') . ' (' . stripslashes(htmlspecialchars($this->get_request_by_id($request_id)->request_title, ENT_QUOTES)) . ') ( Id:'.$iid.' )'); + + // Выполняем запрос к БД и получаем все условия запроса для копируемого запроса + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_request_conditions + WHERE request_id = '" . $request_id . "' + "); + + // Обрабатываем полученные данные и + while ($row_cond = $sql->FetchRow()) + { + // Выполняем запрос к БД на добавление условий для нового, скопированного запроса + $AVE_DB->Query(" + INSERT " . PREFIX . "_request_conditions + SET + request_id = '" . $iid . "', + condition_compare = '" . $row_cond->condition_compare . "', + condition_field_id = '" . $row_cond->condition_field_id . "', + condition_value = '" . $row_cond->condition_value . "', + condition_join = '" . $row_cond->condition_join . "' + "); + } + + // Выполянем переход к списку запросов + header('Location:index.php?do=request&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для удаления запроса + * + * @param int $request_id идентификатор запроса + */ + function requestDelete($request_id) + { + global $AVE_DB, $AVE_Template; + + $request_name = $this->get_request_by_id($request_id)->request_title; + + // Выполняем запрос к БД на удаление общей информации о запросе + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_request + WHERE Id = '" . $request_id . "' + "); + + // Выполняем запрос к БД на удаление условий запроса + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_request_conditions + WHERE request_id = '" . $request_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('REQUEST_DELETE_SUC') . ' (' . stripslashes(htmlspecialchars($request_name, ENT_QUOTES)) . ') ( Id:' . $request_id . ' )'); + + // Выполянем переход к списку запросов + header('Location:index.php?do=request&cp=' . SESSION); + exit; + } + + /** + * Метод, предназначенный для редактирования условий Запроса + * + * @param int $request_id идентификатор запроса + */ + function requestConditionEdit($request_id) + { + global $AVE_DB, $AVE_Template; + + // Определяем действие пользователя + switch ($_REQUEST['sub']) + { + // Если действие не определено + case '': + $fields = array(); + + // Выполняем запрос к БД и получаем список полей у той рубрики, к которой относится данный запрос + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . $_REQUEST['rubric_id'] . "' + ORDER BY rubric_field_position ASC + "); + + // Обрабатываем полученные данные и формируем массив + while ($row = $sql->FetchRow()) + { + array_push($fields, $row); + } + + $conditions = array(); + + // Выполняем запрос к БД и получаем условия запроса + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_request_conditions + WHERE request_id = '" . $request_id . "' + ORDER BY condition_position ASC + "); + + // Обрабатываем полученные данные и формируем массив + while ($row = $sql->FetchRow()) + { + array_push($conditions, $row); + } + + // Передаем данные в шаблон и отображаем страницу с редактированием условий + $AVE_Template->assign('request_title', $this->get_request_by_id($request_id)->request_title); + $AVE_Template->assign('fields', $fields); + $AVE_Template->assign('conditions', $conditions); + + if (isAjax() && (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] == 1)){ + $AVE_Template->assign('content', $AVE_Template->fetch('request/cond_list.tpl')); + } else { + $AVE_Template->assign('content', $AVE_Template->fetch('request/conditions.tpl')); + } + break; + + case 'sort': + + foreach ($_REQUEST['sort'] as $position => $cond_id) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_request_conditions + SET + condition_position = '" . (int)$position . "' + WHERE + Id = '" . (int)$cond_id . "' + "); + } + + if (isAjax()){ + $message = $AVE_Template->get_config_vars('REQUEST_SORTED'); + $header = $AVE_Template->get_config_vars('REQUEST_SUCCESS'); + $theme = 'accept'; + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + + exit; + + + // Если пользователь нажал кнопку Сохранить изменения + case 'save': + // Если существует хотя бы одно условие, тогда + + if (isset($_REQUEST['conditions']) && is_array($_POST['conditions'])) + { + $condition_edited = false; + + // Обрабатываем данные полей + foreach ($_REQUEST['conditions'] as $condition_id => $val) + { + // Выполняем запрос к БД на обновление информации об условиях + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_request_conditions + SET + request_id = '" . $request_id . "', + condition_compare = '" . $val['condition_compare'] . "', + condition_field_id = '" . $val['condition_field_id'] . "', + condition_value = '" . (! empty($val['condition_value']) ? $val['condition_value'] : '') . "', + condition_join = '" . $val['condition_join'] . "', + condition_status = '" . ((! empty($val['condition_value'])) ? (($val['condition_status'] == '1') ? '1' : '0') : ''). "' + WHERE + Id = '" . $condition_id . "' + "); + + $condition_edited = true; + } + + // Если изменения были, сохраняем системное сообщение в журнал + if ($condition_edited) + { + reportLog('' . $AVE_Template->get_config_vars('REQUEST_COND_CHA_SUC') . ' (' . stripslashes(htmlspecialchars($this->get_request_by_id($request_id)->request_title, ENT_QUOTES)) . ') - ( Id: '.$request_id.' )'); + + $message = $AVE_Template->get_config_vars('REQUEST_COND_POST_OK'); + $header = $AVE_Template->get_config_vars('REQUEST_SUCCESS'); + $theme = 'accept'; + } + else + { + + $message = $AVE_Template->get_config_vars('REQUEST_COND_POST_ERR'); + $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); + $theme = 'error'; + } + } + else + { + $message = $AVE_Template->get_config_vars('REQUEST_COND_NO_POST'); + $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); + $theme = 'error'; + } + + // Если некоторые из условий были помечены на удаление + if (isset($_POST['del']) && is_array($_POST['del'])) + { + // Обрабатываем все поля помеченные на удаление + foreach ($_POST['del'] as $condition_id => $val) + { + // Выполняем запрос к БД на удаление условий + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_request_conditions + WHERE Id = '" . $condition_id . "' + "); + } + + // Сохраняем системное сообщение в журнал + reportLog('' . $AVE_Template->get_config_vars('REQUEST_COND_DEL_SUC') . ' (' . stripslashes(htmlspecialchars($this->get_request_by_id($request_id)->request_title, ENT_QUOTES)) . ') - ( Id: '.$request_id.' )'); + } + + // Нет смысла каждый раз формировать SQL-запрос с условиями Запроса + // поэтому формируем SQL-запрос только при изменении условий + // require(BASE_DIR . '/functions/func.parserequest.php'); + request_get_condition_sql_string($request_id, true); + + if (!isAjax() && $_REQUEST['ajax'] != '1'){ + // Выполняем обновление страницы + header('Location:index.php?do=request&action=conditions&rubric_id=' . $_REQUEST['rubric_id'] . '&Id=' . $request_id . '&cp=' . SESSION . ($_REQUEST['pop'] ? '&pop=1' : '')); + exit; + } else { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + break; + + // Если пользователь добавил новое условие + case 'new': + if ($_POST['new_value'] !== '') + { + // Выполняем запрос к БД на добавление нового условия + $sql = $AVE_DB->Query(" + INSERT " . PREFIX . "_request_conditions + SET + request_id = '" . $request_id . "', + condition_compare = '" . $_POST['new_operator'] . "', + condition_field_id = '" . $_POST['field_new'] . "', + condition_value = '" . $_POST['new_value'] . "', + condition_join = '" . $_POST['oper_new'] . "' + "); + if ($sql->_result === false) { + $message = $AVE_Template->get_config_vars('REQUEST_COND_NEW_ERR'); + $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); + $theme = 'error'; + } else { + // Сохраняем системное сообщение в журнал + reportLog('' . $AVE_Template->get_config_vars('REQUEST_COND_ADD_SUC') . ' (' . stripslashes(htmlspecialchars($this->get_request_by_id($request_id)->request_title, ENT_QUOTES)) . ') - ( Id: '.$request_id.' )'); + } + + } else { + $message = $AVE_Template->get_config_vars('REQUEST_COND_VALUE_ERR'); + $header = $AVE_Template->get_config_vars('REQUEST_ERROR'); + $theme = 'error'; + } + + // Нет смысла каждый раз формировать SQL-запрос с условиями Запроса + // поэтому формируем SQL-запрос только при изменении условий + // require(BASE_DIR . '/functions/func.parserequest.php'); + request_get_condition_sql_string($request_id, true); + + if (! isAjax()){ + header('Location:index.php?do=request&action=conditions&rubric_id=' . $_REQUEST['rubric_id'] . '&Id=' . $request_id . '&cp=' . SESSION); + exit; + }else{ + if (!$message){ + $message = $AVE_Template->get_config_vars('REQUEST_COND_NEW_SUC'); + $header = $AVE_Template->get_config_vars('REQUEST_SUCCESS'); + $theme = 'accept'; + } + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + break; + } + } + + function conditionFieldChange($field_id, $cond_id) + { + global $AVE_DB, $AVE_Template; + + // Передаем данные в шаблон и отображаем страницу с редактированием условий + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('cond_id', $cond_id); + $AVE_Template->assign('content', $AVE_Template->fetch('request/change.tpl')); + } + + function conditionFieldChangeSave($field_id, $cond_id) + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_request_conditions + SET + condition_field_id = '" . $field_id . "' + WHERE + Id = '" . $cond_id . "' + "); + + request_get_condition_sql_string((int)$_REQUEST['req_id'], true); + + // Передаем данные в шаблон и отображаем страницу с редактированием условий + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('cond_id', $cond_id); + $AVE_Template->assign('content', $AVE_Template->fetch('request/change.tpl')); + } +} + +?> diff --git a/class/class.rubs.php b/class/class.rubs.php new file mode 100755 index 0000000..410de9a --- /dev/null +++ b/class/class.rubs.php @@ -0,0 +1,2026 @@ +Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields_group + WHERE + rubric_id = '" . $rubric_id . "' + ORDER BY + group_position ASC + "); + + $groups = array(); + + while($row = $sql->FetchRow()) + { + array_push($groups, $row); + } + + return $groups; + } + + +/** + * ВНЕШНИЕ МЕТОДЫ + */ + + /** + * Вывод списка рубрик + * + */ + function rubricList() + { + global $AVE_DB, $AVE_Template; + + $rubrics = array(); + $num = $AVE_DB->Query("SELECT COUNT(*) FROM " . PREFIX . "_rubrics")->GetCell(); + + $page_limit = $this->_limit; + $pages = ceil($num / $page_limit); + $set_start = get_current_page() * $page_limit - $page_limit; + + if ($num > $page_limit) + { + $page_nav = " {t} "; + $page_nav = get_pagination($pages, 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + $sql = $AVE_DB->Query(" + SELECT + rub.*, + COUNT(doc.Id) AS doc_count, + (SELECT count(*) FROM " . PREFIX . "_rubric_fields AS fld WHERE fld.rubric_id = rub.Id) AS fld_count, + (SELECT count(*) FROM " . PREFIX . "_rubric_templates AS tmpls WHERE tmpls.rubric_id = rub.Id) AS tmpls_count + FROM + " . PREFIX . "_rubrics AS rub + LEFT JOIN + " . PREFIX . "_documents AS doc + ON rubric_id = rub.Id + GROUP BY rub.Id + ORDER BY rub.rubric_position + LIMIT " . $set_start . "," . $page_limit + ); + + while ($row = $sql->FetchRow()) + { + array_push($rubrics, $row); + } + + $AVE_Template->assign('rubrics', $rubrics); + } + + /** + * создание рубрики + * + */ + function rubricNew() + { + global $AVE_DB, $AVE_Template; + + switch ($_REQUEST['sub']) + { + case '': + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/rubnew.tpl')); + break; + + case 'save': + $errors = array(); + + if (empty($_POST['rubric_title'])) + { + array_push($errors, $AVE_Template->get_config_vars('RUBRIK_NO_NAME')); + } + else + { + $name_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_rubrics + WHERE rubric_title = '" . $_POST['rubric_title'] . "' + LIMIT 1 + ")->NumRows(); + + if ($name_exist) array_push($errors, $AVE_Template->get_config_vars('RUBRIK_NAME_EXIST')); + + if (!empty($_POST['rubric_alias'])) + { + if (preg_match(TRANSLIT_URL ? '/[^\%HYa-z0-9\/_-]+/' : '/[^\%HYa-zа-яА-Яёїєі0-9\/_-]+/u', $_POST['rubric_alias'])) + { + array_push($errors, $AVE_Template->get_config_vars('RUBRIK_PREFIX_BAD_CHAR')); + } + else + { + $prefix_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_rubrics + WHERE rubric_alias = '" . $_POST['rubric_alias'] . "' + LIMIT 1 + ")->NumRows(); + + if ($prefix_exist) array_push($errors, $AVE_Template->get_config_vars('RUBRIK_PREFIX_EXIST')); + } + } + + if (!empty($errors)) + { + $AVE_Template->assign('errors', $errors); + $AVE_Template->assign('templates', get_all_templates()); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/rubnew.tpl')); + } + else + { + $position = (int)$AVE_DB->Query(" + SELECT MAX(rubric_position) + FROM " . PREFIX . "_rubrics + ")->GetCell() + 1; + + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubrics + SET + rubric_title = '" . $_POST['rubric_title'] . "', + rubric_alias = '" . $_POST['rubric_alias'] . "', + rubric_template_id = '" . intval($_POST['rubric_template_id']) . "', + rubric_author_id = '" . $_SESSION['user_id'] . "', + rubric_created = '" . time() . "', + rubric_position = '" . $position . "' + "); + + $iid = $AVE_DB->InsertId(); + + // Выставляем всем право на просмотр рубрики, админу - все права + $sql_user = $AVE_DB->Query(" + SELECT + grp.*, + COUNT(usr.Id) AS UserCount + FROM + " . PREFIX . "_user_groups AS grp + LEFT JOIN + " . PREFIX . "_users AS usr + ON usr.user_group = grp.user_group + GROUP BY grp.user_group + "); + while ($row = $sql_user->FetchRow()) + { + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubric_permissions + SET + rubric_id = '" . $iid . "', + user_group_id = '" . $row->user_group . "', + rubric_permission = '". (($row->user_group == 1) ? "alles|docread|new|newnow|editown|editall|delrev" : "docread")."' + "); + } + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('RUBRIK_LOG_NEW_RUBRIC') . ' - ' . stripslashes(htmlspecialchars($_POST['rubric_title'], ENT_QUOTES)) . ' (id: '.$iid.')'); + + header('Location:index.php?do=rubs&action=edit&Id=' . $iid . '&cp=' . SESSION); + exit; + } + } + break; + } + } + + /** + * Запись настроек рубрики + * + */ + function quickSave() + { + global $AVE_DB, $AVE_Template; + + if (check_permission_acp('rubric_edit')) + { + foreach ($_POST['rubric_title'] as $rubric_id => $rubric_title) + { + if (!empty($rubric_title)) + { + $set_rubric_title = ''; + $set_rubric_alias = ''; + + $name_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_rubrics + WHERE + rubric_title = '" . $rubric_title . "' + AND + Id != '" . $rubric_id . "' + LIMIT 1 + ")->NumRows(); + + if (!$name_exist) + { + $set_rubric_title = "rubric_title = '" . $rubric_title . "',"; + } + + if (isset($_POST['rubric_alias'][$rubric_id]) && $_POST['rubric_alias'][$rubric_id] != '') + { + $pattern = TRANSLIT_URL ? '/[^\%HYa-z0-9\/_-]+/' : '/[^\%HYa-zа-яА-Яёїєі0-9\/_-]+/u'; + if (!(preg_match($pattern, $_POST['rubric_alias'][$rubric_id]))) + { + $prefix_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_rubrics + WHERE + rubric_alias = '" . $_POST['rubric_alias'][$rubric_id] . "' + AND + Id != '" . $rubric_id . "' + LIMIT 1 + ")->NumRows(); + + if (!$prefix_exist) + { + $set_rubric_alias = "rubric_alias = '" . trim(preg_replace($pattern, '', $_POST['rubric_alias'][$rubric_id]), '/') . "',"; + } + } + } + else + { + $set_rubric_alias = "rubric_alias = '',"; + } + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubrics + SET + " . $set_rubric_title . " + " . $set_rubric_alias . " + rubric_meta_gen = '" . (isset($_POST['rubric_meta_gen'][$rubric_id]) ? $_POST['rubric_meta_gen'][$rubric_id] : '0') . "', + rubric_alias_history = '" . (isset($_POST['rubric_alias_history'][$rubric_id]) ? $_POST['rubric_alias_history'][$rubric_id] : '0') . "', + rubric_template_id = '" . (int)$_POST['rubric_template_id'][$rubric_id] . "', + rubric_docs_active = '" . (isset($_POST['rubric_docs_active'][$rubric_id]) ? $_POST['rubric_docs_active'][$rubric_id] : '0') . "' + WHERE + Id = '" . $rubric_id . "' + "); + } + } + + $message = $AVE_Template->get_config_vars('RUBRIK_REP_QUICKSAVE_T'); + $header = $AVE_Template->get_config_vars('RUBRIK_REP_QUICKSAVE_H'); + $theme = 'accept'; + + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_QUICKSAVE')); + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = 'run') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } else { + $page = !empty($_REQUEST['page']) ? '&page=' . $_REQUEST['page'] : '' ; + header('Location:index.php?do=rubs' . $page . '&cp=' . SESSION); + } + } + } + + /** + * Копирование рубрики + * + */ + function rubricCopy() + { + global $AVE_DB, $AVE_Template; + + $rubric_id = (int)$_REQUEST['Id']; + + $errors = array(); + + if (empty($_REQUEST['rubric_title'])) + { + array_push($errors, $AVE_Template->get_config_vars('RUBRIK_NO_NAME')); + } + else + { + $name_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_rubrics + WHERE rubric_title = '" . $_POST['rubric_title'] . "' + LIMIT 1 + ")->NumRows(); + + if ($name_exist) array_push($errors, $AVE_Template->get_config_vars('RUBRIK_NAME_EXIST')); + } + + if (!empty($_POST['rubric_alias'])) + { + if (preg_match(TRANSLIT_URL ? '/[^\%HYa-z0-9\/-]+/' : '/[^\%HYa-zа-яёїєі0-9\/_-]+/', $_POST['rubric_alias'])) + { + array_push($errors, $AVE_Template->get_config_vars('RUBRIK_PREFIX_BAD_CHAR')); + } + else + { + $prefix_exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_rubrics + WHERE rubric_alias = '" . $_POST['rubric_alias'] . "' + LIMIT 1 + ")->NumRows(); + + if ($prefix_exist) array_push($errors, $AVE_Template->get_config_vars('RUBRIK_PREFIX_EXIST')); + } + } + + $row = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_rubrics + WHERE Id = '" . $rubric_id . "' + ")->FetchRow(); + + if (!$row) array_push($errors, $AVE_Template->get_config_vars('RUBRIK_NO_RUBRIK')); + + if (!empty($errors)) + { + $AVE_Template->assign('errors', $errors); + } + else + { + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubrics + SET + rubric_title = '" . $_POST['rubric_title'] . "', + rubric_alias = '" . $_POST['rubric_alias'] . "', + rubric_template = '" . addslashes($row->rubric_template) . "', + rubric_template_id = '" . addslashes($row->rubric_template_id) . "', + rubric_author_id = '" . (int)$_SESSION['user_id'] . "', + rubric_created = '" . time() . "', + rubric_teaser_template = '" . addslashes($row->rubric_teaser_template) . "', + rubric_header_template = '" . addslashes($row->rubric_header_template) . "', + rubric_admin_teaser_template = '" . addslashes($row->rubric_admin_teaser_template) . "' + "); + $iid = $AVE_DB->InsertId(); + + $sql = $AVE_DB->Query(" + SELECT + user_group_id, + rubric_permission + FROM " . PREFIX . "_rubric_permissions + WHERE rubric_id = '" . $rubric_id . "' + "); + while ($row = $sql->FetchRow()) + { + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubric_permissions + SET + rubric_id = '" . $iid . "', + user_group_id = '" . (int)$row->user_group_id . "', + rubric_permission = '" . addslashes($row->rubric_permission) . "' + "); + } + + $sql = $AVE_DB->Query(" + SELECT + rubric_field_title, + rubric_field_alias, + rubric_field_type, + rubric_field_position, + rubric_field_default, + rubric_field_template, + rubric_field_template_request, + rubric_field_description + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . $rubric_id . "' + ORDER BY rubric_field_position ASC + "); + while ($row = $sql->FetchRow()) + { + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubric_fields + SET + rubric_id = '" . $iid . "', + rubric_field_title = '" . addslashes($row->rubric_field_title) . "', + rubric_field_alias = '" . addslashes($row->rubric_field_alias) . "', + rubric_field_type = '" . addslashes($row->rubric_field_type) . "', + rubric_field_position = '" . (int)$row->rubric_field_position . "', + rubric_field_default = '" . addslashes($row->rubric_field_default) . "', + rubric_field_template = '" . addslashes($row->rubric_field_template) . "', + rubric_field_template_request = '" . addslashes($row->rubric_field_template_request) . "', + rubric_field_description = '" . addslashes($row->rubric_field_description) . "' + "); + } + + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_COPY') . ' - ' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title, ENT_QUOTES)) . ' (id: '.$rubric_id.')'); + + echo ''; + } + } + + /** + * Удаление рубрики + * + */ + function rubricDelete() + { + global $AVE_DB, $AVE_Template; + + $rubric_id = (int)$_REQUEST['Id']; + + if ($rubric_id <= 1) + { + header('Location:index.php?do=rubs&cp=' . SESSION); + exit; + } + + $rubric_not_empty = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_documents + WHERE rubric_id = '" . $rubric_id . "' + LIMIT 1 + ")->GetCell(); + + if (!$rubric_not_empty) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubrics + WHERE Id = '" . $rubric_id . "' + "); + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . $rubric_id . "' + "); + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_permissions + WHERE rubric_id = '" . $rubric_id . "' + "); + // Очищаем кэш шаблона документов рубрики + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_template_cache + WHERE rub_id = '" . $rubric_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('RUBRIK_LOG_DEL_RUBRIC') . ' - ' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title, ENT_QUOTES)) . ' (id: '.$rubric_id.')'); + } + + header('Location:index.php?do=rubs&cp=' . SESSION); + exit; + } + + /** + * Вывод списка полей рубрики + * + * @param int $rubric_id идентификатор рубрики + */ + function rubricFieldShow($rubric_id = 0, $ajax) + { + global $AVE_DB, $AVE_Template; + + if(check_permission_acp('rubric_edit')) + { + // Поля + $sql = $AVE_DB->Query(" + SELECT + a.*, b.group_title, b.group_description, b.group_position + FROM + " . PREFIX . "_rubric_fields AS a + LEFT JOIN + " . PREFIX . "_rubric_fields_group AS b + ON a.rubric_field_group = b.Id + WHERE + a.rubric_id = '" . $rubric_id . "' + ORDER BY + b.group_position ASC, a.rubric_field_position ASC + "); + + $fields_list = array(); + + while ($row = $sql->FetchRow()) + { + $group_id = ($row->rubric_field_group) ? $row->rubric_field_group : 0; + + $fields_list[$group_id]['group_position'] = ($row->group_position) ? $row->group_position : 100; + $fields_list[$group_id]['group_title'] = $row->group_title; + $fields_list[$group_id]['group_description'] = $row->group_description; + $fields_list[$group_id]['fields'][$row->Id]['Id'] = $row->Id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_id'] = $row->rubric_id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_group'] = $row->rubric_field_group; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_alias'] = $row->rubric_field_alias; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_title'] = $row->rubric_field_title; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_type'] = $row->rubric_field_type; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_numeric'] = $row->rubric_field_numeric; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_default'] = $row->rubric_field_default; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_search'] = $row->rubric_field_search; + } + + $fields_list = msort($fields_list, 'group_position'); + + $AVE_Template->assign('groups_count', count($fields_list)); + $AVE_Template->assign('fields_list', $fields_list); + + // Группы полей + $fields_groups = array(); + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_rubric_fields_group + WHERE rubric_id = '" . $rubric_id . "' + ORDER BY group_position ASC + "); + + while ($row = $sql->FetchRow()) + { + array_push($fields_groups, $row); + } + + $AVE_Template->assign('fields_groups', $fields_groups); + + + // Права + $groups = array(); + + $sql = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_user_groups"); + + while ($row = $sql->FetchRow()) + { + $row->doall = ($row->user_group == 1) ? ' disabled="disabled" checked="checked"' : ''; + $row->doall_h = ($row->user_group == 1) ? 1 : ''; + + $rubric_permission = $AVE_DB->Query(" + SELECT rubric_permission + FROM " . PREFIX . "_rubric_permissions + WHERE user_group_id = '" . $row->user_group . "' + AND rubric_id = '" . $rubric_id . "' + ")->GetCell(); + + $row->permissions = @explode('|', $rubric_permission); + + array_push($groups,$row); + } + + $sql = $AVE_DB->Query(" + SELECT rubric_title, rubric_linked_rubric, rubric_description + FROM " . PREFIX . "_rubrics + WHERE id = '" . $rubric_id . "' + LIMIT 1 + "); + + $rubrik = $sql->FetchRow(); + + $rubrik->rubric_linked_rubric = ($rubrik->rubric_linked_rubric != '0') ? unserialize($rubrik->rubric_linked_rubric) : array(); + + $AVE_Template->assign('rubric', $rubrik); + $AVE_Template->assign('groups', $groups); + $AVE_Template->assign('fields', get_field_type()); + $AVE_Template->assign('rubs', $this->rubricShow()); + + if (isAjax()) + { + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/fields.tpl')); + } + else + { + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/fields_list.tpl')); + } + } + else + { + header('Location:index.php?do=rubs&cp=' . SESSION); + exit; + } + } + + /** + * Вывод списка рубрик + * + * @param int $rubric_id идентификатор текущей рубрики + */ + function rubricShow($RubLink=null) + { + global $AVE_DB; + + if ($RubLink!==null) { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubrics + SET + rubric_linked_rubric = '" . serialize($_REQUEST['rubric_linked']) . "' + WHERE + Id = '" . (int)$_REQUEST['Id'] . "' + "); + header('Location:index.php?do=rubs&action=edit&Id=' . (int)$_REQUEST['Id'] . '&cp=' . SESSION); + exit; + } + else + { + $rubs = array(); + $sql = $AVE_DB->Query(" + SELECT rubric_title, Id + FROM " . PREFIX . "_rubrics + ORDER BY rubric_position ASC + "); + + while ($row = $sql->FetchRow()) + { + array_push($rubs,$row); + } + return $rubs; + } + } + + /** + * Создание нового поля рубрики + * + * @param int $rubric_id идентификатор рубрики + */ + function rubricFieldNew($rubric_id = 0, $ajax) + { + global $AVE_DB, $AVE_Template; + + if (!empty($_POST['title_new'])) + { + $position = (int)$AVE_DB->Query(" + SELECT MAX(rubric_field_position) + FROM " . PREFIX . "_rubric_fields + WHERE rubric_id = '" . $rubric_id . "' + ")->GetCell() + 1; + + if ($_POST['rub_type_new'] == 'dropdown') + { + $rubric_field_default = trim($_POST['default_value']); + $rubric_field_default = preg_split('/\s*,\s*/', $rubric_field_default); + $rubric_field_default = implode(',', $rubric_field_default); + } + else + { + $rubric_field_default = $_POST['default_value']; + } + + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubric_fields + SET + rubric_id = '" . $rubric_id . "', + rubric_field_group = '" . (($_POST['group_new'] != '') ? (int)$_POST['group_new'] : '0') . "', + rubric_field_title = '" . $_POST['title_new'] . "', + rubric_field_type = '" . $_POST['rub_type_new'] . "', + rubric_field_position = '" . $position . "', + rubric_field_default = '" . $rubric_field_default . "', + rubric_field_numeric = '" . (($_POST['rubric_field_numeric'] == 1) ? $_POST['rubric_field_numeric'] : '0') . "', + rubric_field_search = '" . (($_POST['rubric_field_search'] == 1) ? $_POST['rubric_field_search'] : '0') . "' + "); + + $UpdateRubricField = $AVE_DB->InsertId(); + + $sql = $AVE_DB->Query(" + SELECT Id + FROM " . PREFIX . "_documents + WHERE rubric_id = '" . $rubric_id . "' + "); + + while ($row = $sql->FetchRow()) + { + $AVE_DB->Query(" + INSERT " . PREFIX . "_document_fields + SET + rubric_field_id = '" . $UpdateRubricField . "', + document_id = '" . $row->Id . "' + "); + } + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('RUBRIK_LOG_NEW_FIELD').' (' . stripslashes(htmlspecialchars($_POST['title_new'], ENT_QUOTES)) . ') '. stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title, ENT_QUOTES)). ' (id: '.$rubric_id.')'); + } else { + + if (!$ajax){ + + header('Location:index.php?do=rubs&action=edit&Id=' . $rubric_id . '&cp=' . SESSION); + exit; + + }else{ + + $message = $AVE_Template->get_config_vars('RUBRIK_EMPTY_MESSAGE'); + $header = $AVE_Template->get_config_vars('RUBRIK_FILDS_SUCCESS'); + $theme = 'error'; + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + } + if (!$ajax){ + + header('Location:index.php?do=rubs&action=edit&Id=' . $rubric_id . '&cp=' . SESSION); + exit; + + }else{ + + $message = $AVE_Template->get_config_vars('RUBRIK_FILD_SAVED'); + $header = $AVE_Template->get_config_vars('RUBRIK_FILDS_SUCCESS'); + $theme = 'accept'; + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + } + + + /** + * Редактирование кода для рубрики + * + * @param int $rubric_id идентификатор рубрики + */ + function rubricCodeEdit($rubric_id = 0) + { + global $AVE_DB, $AVE_Template; + + switch ($_REQUEST['sub']) { + + case '': + $code = $AVE_DB->Query(" + SELECT rubric_code_start, rubric_code_end, rubric_start_code + FROM " . PREFIX . "_rubrics + WHERE + Id = '" . $rubric_id . "' + ")->FetchRow(); + + $AVE_Template->assign('code', $code); + $AVE_Template->assign('rubric_title', $this->rubricNameByIdGet($rubric_id)->rubric_title); + $AVE_Template->assign('formaction', 'index.php?do=rubs&action=code&sub=save&Id=' . $rubric_id . '&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/code.tpl')); + break; + + case 'save': + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubrics + SET + rubric_start_code = '" . $_POST['rubric_start_code'] . "', + rubric_code_start = '" . $_POST['rubric_code_start'] . "', + rubric_code_end = '" . $_POST['rubric_code_end'] . "' + WHERE + Id = '" . $rubric_id . "' + "); + + if ($sql->_result === false) { + $message = $AVE_Template->get_config_vars('RUBRIK_CODE_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIK_CODE_ERROR'); + $theme = 'error'; + }else{ + $message = $AVE_Template->get_config_vars('RUBRIK_CODE_SAVED'); + $header = $AVE_Template->get_config_vars('RUBRIK_CODE_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('RUBRIK_CODE_UPDATE') . " (" . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title, ENT_QUOTES)) . ") (id: $rubric_id)"); + } + + if (isAjax()) { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + header('Location:index.php?do=rubs&action=code&Id=' . $rubric_id . '&cp=' . SESSION); + } + exit; + } + } + + /** + * Редактирование кода для рубрики + * + * @param int $rubric_id идентификатор рубрики + */ + function rubricCode($rubric_id = 0) + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubrics + SET + rubric_code_start = '" . $_POST['rubric_code_start'] . "', + rubric_code_end = '" . $_POST['rubric_code_end'] . "' + WHERE + Id = '" . $rubric_id . "' + "); + + if ($sql->_result === false) { + $message = $AVE_Template->get_config_vars('RUBRIK_CODE_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIK_CODE_ERROR'); + $theme = 'error'; + }else{ + $message = $AVE_Template->get_config_vars('RUBRIK_CODE_SAVED'); + $header = $AVE_Template->get_config_vars('RUBRIK_CODE_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('RUBRIK_CODE_UPDATE') . " (" . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title, ENT_QUOTES)) . ") (id: $rubric_id)"); + } + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + header('Location:index.php?do=rubs&action=edit&Id=' . $rubric_id . '&cp=' . SESSION); + } + exit; + } + + /** + * Редактирование описания рубрики + * + * @param int $rubric_id идентификатор рубрики + */ + function rubricDesc($rubric_id = 0) + { + global $AVE_DB; + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubrics + SET + rubric_description = '" . $_POST['rubric_description'] . "' + WHERE + Id = '" . $rubric_id . "' + "); + + header('Location:index.php?do=rubs&action=edit&Id=' . $rubric_id . '&cp=' . SESSION); + exit; + } + + /** + * Управление полями рубрики + * + * @param int $rubric_id идентификатор рубрики + */ + function rubricFieldSave($rubric_id = 0) + { + global $AVE_DB, $AVE_Template; + + foreach ($_POST['title'] as $id => $title) + { + if (!empty($title)) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubric_fields + SET + rubric_field_title = '" . $title . "', + rubric_field_numeric = '" . $_POST['rubric_field_numeric'][$id] . "', + rubric_field_search = '" . $_POST['rubric_field_search'][$id] . "' + WHERE + Id = '" . $id . "' + "); + // Очищаем кэш шаблона документов рубрики + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_template_cache + WHERE rub_id = '" . $rubric_id . "' + "); + + $sql = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_documents WHERE rubric_id = ".$rubric_id); + + while ($row = $sql->FetchRow()) + { + $AVE_DB->clearcache('doc_'.$row->Id); + $AVE_DB->clearcompile('doc_'.$row->Id); + $AVE_DB->clearcacherequest('doc_'.$row->Id); + } + + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_FIELD_EDIT') . ' (' . stripslashes($title) . ') '.$AVE_Template->get_config_vars('RUBRIK_REPORT_RUB').' (' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title)) . ') (Id:' . $rubric_id . ')'); + } + } + + foreach ($_POST['del'] as $id => $Del) + { + if (!empty($Del)) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_fields + WHERE Id = '" . $id . "' + AND rubric_id = '" . $rubric_id . "' + "); + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_document_fields + WHERE rubric_field_id = '" . $id . "' + "); + // Очищаем кэш шаблона документов рубрики + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_template_cache + WHERE rub_id = '" . $rubric_id . "' + "); + + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_FIELD_DEL') . ' (' . stripslashes($_POST['title'][$id]) . ') '.$AVE_Template->get_config_vars('RUBRIK_REPORT_RUB').' (' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title)) . ') (Id:' . $rubric_id . ')'); + } + } + + $AVE_DB->clearcache('rub_'.$rubric_id); + + $sql = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_documents WHERE rubric_id = ".$rubric_id); + + while ($row = $sql->FetchRow()) + { + $AVE_DB->clearcache('doc_'.$row->Id); + $AVE_DB->clearcompile('doc_'.$row->Id); + } + + $message = $AVE_Template->get_config_vars('RUBRIK_FILDS_SAVED'); + $header = $AVE_Template->get_config_vars('RUBRIK_FILDS_SUCCESS'); + $theme = 'accept'; + + reportLog($AVE_Template->get_config_vars('RUBRIK_FILDS_REPORT') . ' (' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title)) . ') (Id:' . $rubric_id . ')'); + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=rubs&action=edit&Id=' . $rubric_id . '&cp=' . SESSION); + } + exit; + } + + /** + * Сортировка полей рубрики + * + * @param array $sorted последовательность id полей + */ + function rubricFieldsSort() + { + global $AVE_DB, $AVE_Template; + + foreach ($_REQUEST['sort'] as $position => $field_id) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubric_fields + SET + rubric_field_position = '" . (int)$position . "' + WHERE + Id = '" . (int)$field_id . "' + "); + } + + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_SORTE_FIELDS')); + + if (isAjax()){ + $message = $AVE_Template->get_config_vars('RUBRIK_SORTED'); + $header = $AVE_Template->get_config_vars('RUBRIK_FILDS_SUCCESS'); + $theme = 'accept'; + + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + + } + + /** + * Сортировка рубрик + * + * @param array $sorted последовательность id полей + */ + function rubricsSort() + { + global $AVE_DB, $AVE_Template; + + foreach ($_REQUEST['sort'] as $position => $rub_id) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubrics + SET + rubric_position = '" . (int)$position . "' + WHERE + Id = '" . (int)$rub_id . "' + "); + } + + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_SORTE')); + + if (isAjax()){ + $message = $AVE_Template->get_config_vars('RUBRIK_SORTED'); + $header = $AVE_Template->get_config_vars('RUBRIK_FILDS_SUCCESS'); + $theme = 'accept'; + + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + + } + + /** + * Вывод шаблона рубрики + * + * @param int $show + * @param int $extern + */ + function rubricTemplateShow($show = '', $extern = '0') + { + global $AVE_DB, $AVE_Template; + + if ($extern == 1) + { + $fetchId = (isset($_REQUEST['rubric_id']) && is_numeric($_REQUEST['rubric_id'])) ? $_REQUEST['rubric_id'] : 0; + } + else + { + $fetchId = (isset($_REQUEST['Id']) && is_numeric($_REQUEST['Id'])) ? $_REQUEST['Id'] : 0; + } + + $rubric = $AVE_DB->Query(" + SELECT + rubric_title, + rubric_template, + rubric_header_template, + rubric_teaser_template, + rubric_admin_teaser_template, + rubric_description + FROM " . PREFIX . "_rubrics + WHERE Id = '" . $fetchId . "' + ") + ->FetchRow(); + + // Поля + $sql = $AVE_DB->Query(" + SELECT + a.*, b.group_title, b.group_description, b.group_position + FROM + " . PREFIX . "_rubric_fields AS a + LEFT JOIN + " . PREFIX . "_rubric_fields_group AS b + ON a.rubric_field_group = b.Id + WHERE + a.rubric_id = '" . $fetchId . "' + ORDER BY + b.group_position ASC, a.rubric_field_position ASC + "); + + $fields_list = array(); + $drop_down_fields = array(); + + while ($row = $sql->FetchRow()) + { + $group_id = ($row->rubric_field_group) ? $row->rubric_field_group : 0; + + if ($row->rubric_field_type == 'drop_down' || $row->rubric_field_type == 'drop_down_key') + array_push($drop_down_fields, $row->Id); + + $fields_list[$group_id]['group_position'] = ($row->group_position) ? $row->group_position : 100; + $fields_list[$group_id]['group_title'] = $row->group_title; + $fields_list[$group_id]['group_description'] = $row->group_description; + $fields_list[$group_id]['fields'][$row->Id]['Id'] = $row->Id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_id'] = $row->rubric_id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_group'] = $row->rubric_field_group; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_alias'] = $row->rubric_field_alias; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_title'] = $row->rubric_field_title; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_type'] = $row->rubric_field_type; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_numeric'] = $row->rubric_field_numeric; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_default'] = $row->rubric_field_default; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_search'] = $row->rubric_field_search; + } + + $fields_list = msort($fields_list, 'group_position'); + + $AVE_Template->assign('groups_count', count($fields_list)); + $AVE_Template->assign('fields_list', $fields_list); + + $AVE_Template->assign('field_array', get_field_type()); + + if ($show == 1 ) + $rubric->rubric_template = stripslashes($_POST['rubric_template']); + + if ($extern == 1) + { + $AVE_Template->assign('ddid', implode(',', $drop_down_fields)); + } + else + { + $AVE_Template->assign('rubric', $rubric); + $AVE_Template->assign('formaction', 'index.php?do=rubs&action=template&sub=save&Id=' . $fetchId . '&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/form.tpl')); + } + } + + /** + * Редактирование шаблона рубрики + * + * @param string $data + */ + function rubricTemplateSave($Rtemplate, $Htemplate = '', $Ttemplate = '', $Atemplate = '') + { + global $AVE_DB, $AVE_Template; + + $rubric_id = (int)$_REQUEST['Id']; + + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubrics + SET + rubric_template = '" . ($Rtemplate) . "', + rubric_header_template = '" . $Htemplate . "', + rubric_teaser_template = '" . $Ttemplate . "', + rubric_admin_teaser_template = '" . $Atemplate . "' + WHERE Id = '" . $rubric_id . "' + "); + + // Очищаем кэш шаблона документов рубрики + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_template_cache + WHERE rub_id = '" . $rubric_id . "' + "); + + if ($sql === false) { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_TPL_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIK_ERROR'); + $theme = 'error'; + } else { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_TPL'); + $header = $AVE_Template->get_config_vars('RUBRIC_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_TEMPL_RUB') . ' (' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title)) . ') (Id:' . $rubric_id . ')'); + } + + $sql = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_documents WHERE rubric_id = ".$rubric_id); + + while ($row = $sql->FetchRow()) + { + $AVE_DB->clearcache('doc_'.$row->Id); + $AVE_DB->clearcompile('doc_'.$row->Id); + } + + if (isAjax()) { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } else { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=rubs&cp=' . SESSION); + exit; + } + + } + + /** + * Управление правами доступа к документам рубрик + * + * @param int $rubric_id идентификатор рубрики + */ + function rubricPermissionSave($rubric_id = 0) + { + global $AVE_DB, $AVE_Template; + + if (check_permission_acp('rubric_perms') && is_numeric($rubric_id) && $rubric_id > 0) + { + foreach ($_POST['user_group'] as $key => $user_group_id) + { + $exist = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_rubric_permissions + WHERE user_group_id = '" . $user_group_id . "' + AND rubric_id = '" . $rubric_id . "' + LIMIT 1 + ")->NumRows(); + + $rubric_permission = @implode('|', $_POST['perm'][$key]); + if ($exist) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubric_permissions + SET rubric_permission = '" . $rubric_permission . "' + WHERE user_group_id = '" . $user_group_id . "' + AND rubric_id = '" . $rubric_id . "' + "); + } + else + { + $AVE_DB->Query(" + INSERT " . PREFIX . "_rubric_permissions + SET + rubric_id = '" . $rubric_id . "', + user_group_id = '" . $user_group_id . "', + rubric_permission = '" . $rubric_permission . "' + "); + } + } + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_PERMS'); + $header = $AVE_Template->get_config_vars('RUBRIC_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('RUBRIK_REPORT_PERMISION') . ' (' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title)) . ') (Id:' . $rubric_id . ')'); + + if (isAjax()) { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } else { + header('Location:index.php?do=rubs&action=edit&Id=' . $rubric_id . '&cp=' . SESSION); + exit; + } + } + } + + /** + * Получить наименование и URL-префикс Рубрики по идентификатору + * + * @param int $rubric_id идентификатор Рубрики + * @return object наименование Рубрики + */ + function rubricNameByIdGet($rubric_id = 0) + { + global $AVE_DB; + + static $rubrics = array(); + + if (!isset($rubrics[$rubric_id])) + { + $rubrics[$rubric_id] = $AVE_DB->Query(" + SELECT + rubric_title, + rubric_alias, + rubric_description + FROM " . PREFIX . "_rubrics + WHERE Id = '" . $rubric_id . "' + LIMIT 1 + ")->FetchRow(); + } + + return $rubrics[$rubric_id]; + } + + /** + * Формирование прав доступа Групп пользователей на все Рубрики + * + */ + function rubricPermissionFetch() + { + global $AVE_DB, $AVE_Document, $AVE_Template; + + $items = array(); + + $sql = $AVE_DB->Query(" + SELECT + Id, + rubric_title, + rubric_docs_active + FROM + " . PREFIX . "_rubrics + ORDER + BY rubric_position + "); + + while ($row = $sql->FetchRow()) + { + $AVE_Document->documentPermissionFetch($row->Id); + + if (defined('UGROUP') && UGROUP == 1) $row->Show = 1; + elseif (isset($_SESSION[$row->Id . '_editown']) && $_SESSION[$row->Id . '_editown'] == 1) $row->Show = 1; + elseif (isset($_SESSION[$row->Id . '_editall']) && $_SESSION[$row->Id . '_editall'] == 1) $row->Show = 1; + elseif (isset($_SESSION[$row->Id . '_new']) && $_SESSION[$row->Id . '_new'] == 1) $row->Show = 1; + elseif (isset($_SESSION[$row->Id . '_newnow']) && $_SESSION[$row->Id . '_newnow'] == 1) $row->Show = 1; + elseif (isset($_SESSION[$row->Id . '_alles']) && $_SESSION[$row->Id . '_alles'] == 1) $row->Show = 1; + + array_push($items, $row); + } + + $AVE_Template->assign('rubrics', $items); + } + + /** + * Получить + */ + function rubricAliasAdd() + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT + a.rubric_title, + b.rubric_field_title, + b.rubric_field_alias + FROM + " . PREFIX . "_rubrics AS a + JOIN + " . PREFIX . "_rubric_fields AS b + WHERE + a.Id = '" . $_REQUEST['rubric_id'] . "' + AND + b.Id = '" . $_REQUEST['field_id'] . "' + ")->FetchAssocArray(); + + $AVE_Template->assign($sql); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/alias.tpl')); + } + + function rubricAliasCheck($rubric_id, $field_id, $value) + { + + global $AVE_DB, $AVE_Template; + + $errors = array(); + + if(!intval($rubric_id)>0){ + $errors[] = $AVE_Template->get_config_vars('RUBRIK_ALIAS_RUBID'); + } + + if(!intval($field_id)>0) { + $errors[] = $AVE_Template->get_config_vars('RUBRIK_ALIAS_FIELDID'); + }; + + if(!preg_match('/^[A-Za-z][[:word:]]{0,19}$/', $value)) { + $errors[] = $AVE_Template->get_config_vars('RUBRIK_ALIAS_MATCH'); + }; + + //Проверяем есть такой алиас уже + $res = $AVE_DB->Query(" + SELECT COUNT(*) + FROM + " . PREFIX . "_rubric_fields + WHERE + Id <> " . intval($field_id) . " + AND rubric_id = " . intval($rubric_id) . " + AND rubric_field_alias = '" . addslashes($value) . "' + ")->GetCell(); + + if($res>0){ + $errors[] = $AVE_Template->get_config_vars('RUBRIK_ALIAS_MATCH'); + }; + + if (empty($errors)) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubric_fields + SET + rubric_field_alias = '" . addslashes($value) . "' + WHERE + Id = '" . intval($field_id) . "' + AND rubric_id = '" . intval($rubric_id) . "' + "); + $AVE_Template->assign('success', true); + } + else + { + $AVE_Template->assign('errors', $errors); + } + + $sql = $AVE_DB->Query(" + SELECT + a.rubric_title, + b.rubric_field_title, + b.rubric_field_alias + FROM " . PREFIX . "_rubrics AS a + JOIN + " . PREFIX . "_rubric_fields AS b + WHERE a.Id = '" . $_REQUEST['rubric_id'] . "' + AND b.Id = '" . $_REQUEST['field_id'] . "' + ")->FetchAssocArray(); + + $AVE_Template->assign($sql); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/alias.tpl')); + } + + function rubricFieldTemplate() { + global $AVE_DB, $AVE_Template; + + $field = $AVE_DB->Query(" + SELECT + a.rubric_title, + b.rubric_field_default, + b.rubric_field_title, + b.rubric_field_template, + b.rubric_field_template_request, + b.rubric_field_description + FROM " . PREFIX . "_rubrics AS a + JOIN + " . PREFIX . "_rubric_fields AS b + WHERE a.Id = '" . $_REQUEST['rubric_id'] . "' + AND b.Id = '" . $_REQUEST['field_id'] . "' + ")->FetchAssocArray(); + + $AVE_Template->assign($field); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/field_template.tpl')); + } + + function rubricFieldTemplateSave($id, $rubric_id) { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubric_fields + SET + rubric_field_default = '" . $_POST['rubric_field_default'] . "', + rubric_field_template = '" . $_POST['rubric_field_template'] . "', + rubric_field_template_request = '" . $_POST['rubric_field_template_request'] . "', + rubric_field_description = '" . $_POST['rubric_field_description'] . "' + WHERE + Id = '" . $id . "' + "); + + if ($sql->_result === false) { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_FLDTPL_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIK_ERROR'); + $theme = 'error'; + + if (isAjax() && !$_REQUEST['save']) { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } else { + $this->rubricFieldTemplate(); + exit; + } + + }else{ + + $AVE_DB->clearcache('rub_'.$rubric_id); + + $sql = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_documents"); + + while ($row = $sql->FetchRow()) + { + $AVE_DB->clearcache('doc_'.$row->Id); + $AVE_DB->clearcompile('doc_'.$row->Id); + $AVE_DB->clearcacherequest('doc_'.$row->Id); + } + + // Очищаем кэш шаблона документов рубрики + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_rubric_template_cache + WHERE rub_id = '" . $rubric_id . "' + "); + + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_FLDTPL'); + $header = $AVE_Template->get_config_vars('RUBRIC_SUCCESS'); + $theme = 'accept'; + + if (isAjax()) { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + } + + } + + function rubricFieldChange($field_id, $rubric_id) + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields + WHERE + rubric_id = '" . $rubric_id . "' + AND + Id = " . $field_id . " + ")->FetchAssocArray(); + + $AVE_Template->assign('rf', $sql); + $AVE_Template->assign('fields', get_field_type()); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/change.tpl')); + } + + function rubricFieldChangeSave($field_id, $rubric_id) + { + global $AVE_DB, $AVE_Template; + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubric_fields + SET + rubric_field_type = '" . trim($_POST['rubric_field_type']) . "' + WHERE + Id = '" . $field_id . "' + AND + rubric_id = '" . $rubric_id . "' + "); + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields + WHERE + rubric_id = '" . $rubric_id . "' + AND + Id = " . $field_id . " + ")->FetchAssocArray(); + + $AVE_Template->assign('rf', $sql); + $AVE_Template->assign('fields', get_field_type()); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/change.tpl')); + } + + + function rubricFieldsGroups($rubric_id) + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields_group + WHERE + rubric_id = '" . $rubric_id . "' + ORDER BY + group_position + "); + + $groups = array(); + + while($row = $sql->FetchRow()) + { + array_push($groups, $row); + } + + $AVE_Template->assign('rubric', $this->rubricNameByIdGet($rubric_id)); + $AVE_Template->assign('groups', $groups); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/fields_groups.tpl')); + } + + /** + * Сортировка групп полей рубрики + * + * @param array $sorted последовательность id полей + */ + function rubricFieldsGroupsSort() + { + global $AVE_DB, $AVE_Template; + + foreach ($_REQUEST['sort'] as $position => $group_id) + { + $position++; + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_rubric_fields_group + SET + group_position = '" . (int)$position . "' + WHERE + Id = '" . (int)$group_id . "' + "); + } + + if (isAjax()) + { + $message = $AVE_Template->get_config_vars('RUBRIK_SORTED'); + $header = $AVE_Template->get_config_vars('RUBRIK_FILDS_SUCCESS'); + $theme = 'accept'; + + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + } + + + function rubricNewGroupFields($rubric_id) + { + global $AVE_DB; + + $position = $AVE_DB->Query(" + SELECT + MAX(group_position) + FROM + " . PREFIX . "_rubric_fields_group + WHERE + rubric_id = '" . $rubric_id . "' + ")->GetCell(); + + $position++; + + $AVE_DB->Query(" + INSERT + " . PREFIX . "_rubric_fields_group + SET + rubric_id = '" . $rubric_id . "', + group_position = '" . $position . "', + group_title= '" . $_REQUEST['group_title'] . "' + "); + + header('Location:index.php?do=rubs&action=fieldsgroups&Id=' . $rubric_id . '&cp=' . SESSION); + exit; + } + + + function rubricEditGroupFields($rubric_id) + { + global $AVE_DB; + + foreach($_REQUEST['group_title'] as $k => $v) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_rubric_fields_group + SET + group_title= '" . $v . "' + WHERE + Id = '" . $k . "' + "); + } + + header('Location:index.php?do=rubs&action=fieldsgroups&Id=' . $rubric_id . '&cp=' . SESSION); + exit; + } + + function rubricDelGroupFields($Id, $rubric_id) + { + global $AVE_DB; + + $AVE_DB->Query(" + DELETE FROM + " . PREFIX . "_rubric_fields_group + WHERE + Id = '" . $Id . "' + "); + + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_rubric_fields + SET + rubric_field_group = '0' + WHERE + rubric_field_group = '" . $Id . "' + AND + rubric_id = '" . $rubric_id . "' + "); + + header('Location:index.php?do=rubs&action=fieldsgroups&Id=' . $rubric_id . '&cp=' . SESSION); + exit; + } + + + function rubricFieldGroupChange($field_id, $rubric_id) + { + + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields + WHERE + rubric_id = '" . $rubric_id . "' + AND + Id = " . $field_id . " + ")->FetchAssocArray(); + + $AVE_Template->assign('rf', $sql); + $AVE_Template->assign('groups', $this->get_rubric_fields_group($rubric_id)); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/groups.tpl')); + } + + function rubricFieldGroupChangeSave($field_id, $rubric_id) + { + global $AVE_DB, $AVE_Template; + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_rubric_fields + SET + rubric_field_group = '" . trim($_POST['rubric_field_group']) . "' + WHERE + Id = '" . $field_id . "' + AND + rubric_id = '" . $rubric_id . "' + "); + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_rubric_fields + WHERE + rubric_id = '" . $rubric_id . "' + AND + Id = " . $field_id . " + ")->FetchAssocArray(); + + $AVE_Template->assign('rf', $sql); + $AVE_Template->assign('groups', $this->get_rubric_fields_group($rubric_id)); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/groups.tpl')); + } + + // Список дополнительных шаблон для данной рубрики + function tmplsList() + { + global $AVE_DB, $AVE_Template; + + $templates = array(); + + $num = $AVE_DB->Query(" + SELECT + COUNT(*) + FROM + " . PREFIX . "_rubric_templates + WHERE + rubric_id = '" . $_REQUEST['Id'] . "' + ")->GetCell(); + + $page_limit = $this->_limit; + + $pages = ceil($num / $page_limit); + + $set_start = get_current_page() * $page_limit - $page_limit; + + if ($num > $page_limit) + { + $page_nav = " {t} "; + $page_nav = get_pagination($pages, 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + $sql = $AVE_DB->Query(" + SELECT + rub.*, + rubrics.rubric_title, + COUNT(doc.Id) AS doc_count + FROM + " . PREFIX . "_rubric_templates AS rub + LEFT JOIN + " . PREFIX . "_rubrics AS rubrics + ON rubrics.Id = rub.rubric_id + LEFT JOIN + " . PREFIX . "_documents AS doc + ON (doc.rubric_id = rub.rubric_id AND doc.rubric_tmpl_id = rub.id) + WHERE + rub.rubric_id = '" . (int)$_REQUEST['Id'] . "' + GROUP + BY rub.id + ORDER + BY rub.id + LIMIT + " . $set_start . "," . $page_limit + ); + + while ($row = $sql->FetchRow()) + { + $row->author_id = get_username_by_id($row->author_id); + array_push($templates, $row); + } + + $rubric = $this->rubricNameByIdGet((int)$_REQUEST['Id']); + + $AVE_Template->assign('rubric', $rubric); + $AVE_Template->assign('templates', $templates); + } + + /** + * Вывод шаблона рубрики + * + * @param int $show + * @param int $extern + */ + function tmplsEdit() + { + global $AVE_DB, $AVE_Template; + + $tmpls_id = (isset($_REQUEST['id']) && is_numeric($_REQUEST['id'])) ? $_REQUEST['id'] : 0; + $rubric_id = (int)$_REQUEST['rubric_id']; + + if ($tmpls_id) + { + $template = $AVE_DB->Query(" + SELECT + title, + template + FROM + " . PREFIX . "_rubric_templates + WHERE + id = '" . $tmpls_id . "' + ") + ->FetchRow(); + } + + if ($_REQUEST['action'] == 'tmpls_from') + { + $template = $AVE_DB->Query(" + SELECT + rubric_title as title, + rubric_template as template + FROM + " . PREFIX . "_rubrics + WHERE + Id = '" . $rubric_id . "' + ") + ->FetchRow(); + } + + if ($_REQUEST['action'] == 'tmpls_copy') + { + $template = $AVE_DB->Query(" + SELECT + title, + template + FROM + " . PREFIX . "_rubric_templates + WHERE + id = '" . $_REQUEST['tmpls_id'] . "' + ") + ->FetchRow(); + } + + // Поля + $sql = $AVE_DB->Query(" + SELECT + a.*, b.group_title, b.group_description, b.group_position + FROM + " . PREFIX . "_rubric_fields AS a + LEFT JOIN + " . PREFIX . "_rubric_fields_group AS b + ON a.rubric_field_group = b.Id + WHERE + a.rubric_id = '" . $rubric_id . "' + ORDER BY + b.group_position ASC, a.rubric_field_position ASC + "); + + $fields_list = array(); + $drop_down_fields = array(); + + while ($row = $sql->FetchRow()) + { + $group_id = ($row->rubric_field_group) ? $row->rubric_field_group : 0; + + if ($row->rubric_field_type == 'drop_down' || $row->rubric_field_type == 'drop_down_key') + array_push($drop_down_fields, $row->Id); + + $fields_list[$group_id]['group_position'] = ($row->group_position) ? $row->group_position : 100; + $fields_list[$group_id]['group_title'] = $row->group_title; + $fields_list[$group_id]['group_description'] = $row->group_description; + $fields_list[$group_id]['fields'][$row->Id]['Id'] = $row->Id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_id'] = $row->rubric_id; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_group'] = $row->rubric_field_group; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_alias'] = $row->rubric_field_alias; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_title'] = $row->rubric_field_title; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_type'] = $row->rubric_field_type; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_numeric'] = $row->rubric_field_numeric; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_default'] = $row->rubric_field_default; + $fields_list[$group_id]['fields'][$row->Id]['rubric_field_search'] = $row->rubric_field_search; + } + + $fields_list = msort($fields_list, 'group_position'); + + $AVE_Template->assign('groups_count', count($fields_list)); + $AVE_Template->assign('fields_list', $fields_list); + + $AVE_Template->assign('field_array', get_field_type()); + + $rubric = $this->rubricNameByIdGet($rubric_id); + + $AVE_Template->assign('rubric', $rubric); + + $AVE_Template->assign('template', $template); + + $AVE_Template->assign('formaction', 'index.php?do=rubs&action=tmpls_edit&sub=save&id=' . $tmpls_id . '&rubric_id=' . $_REQUEST['rubric_id'] . '&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('rubs/tmpls_form.tpl')); + } + + + /** + * Редактирование шаблона рубрики + * + * @param string $data + */ + function tmplsSave($template = '', $title = '') + { + global $AVE_DB, $AVE_Template; + + $tmpls_id = (int)$_REQUEST['id']; + $rubric_id = (int)$_REQUEST['rubric_id']; + + if ($tmpls_id) + { + $sql = $AVE_DB->Query(" + UPDATE + " . PREFIX . "_rubric_templates + SET + title = '" . $title . "', + template = '" . $template . "' + WHERE + id = '" . $tmpls_id . "' + "); + } + else + { + $sql = $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_rubric_templates + SET + title = '" . $title . "', + template = '" . $template . "', + rubric_id = '" . $rubric_id . "', + author_id = '" . UID . "', + created = '" . time() . "' + "); + + $tmpls_id = $AVE_DB->InsertId(); + } + + // Очищаем кэш шаблона документов рубрики + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_rubric_template_cache + WHERE + rub_id = '" . $rubric_id . "' + AND + rub_tmpl_id = '" . $tmpls_id . "' + "); + + if ($sql === false) + { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_TPL_ERR'); + $header = $AVE_Template->get_config_vars('RUBRIK_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('RUBRIC_SAVED_TPL'); + $header = $AVE_Template->get_config_vars('RUBRIC_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('RUBRIC_TEMPL_REPORT') . ' ' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title)) . ' (Id шаблона:' . $tmpls_id . ')'); + } + + $sql = $AVE_DB->Query(" + SELECT + Id + FROM + " . PREFIX . "_documents + WHERE + rubric_id = ".$rubric_id." + AND + rubric_tmpl_id = " . $tmpls_id + ); + + while ($row = $sql->FetchRow()) + { + $AVE_DB->clearcache('doc_'.$row->Id); + $AVE_DB->clearcompile('doc_'.$row->Id); + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + else + { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=rubs&action=tmpls&Id='.$rubric_id.'&cp=' . SESSION); + exit; + } + } + + function tmplsDelete() + { + global $AVE_DB, $AVE_Template; + + $rubric_id = (int)$_REQUEST['rubric_id']; + $tmpls_id = (int)$_REQUEST['tmpls_id']; + + $rubric_not_empty = $AVE_DB->Query(" + SELECT 1 + FROM " . PREFIX . "_documents + WHERE + rubric_id = '" . $rubric_id . "' + AND + rubric_tmpl_id = '" . $tmpls_id . "' + LIMIT 1 + ")->GetCell(); + + if (! $rubric_not_empty) + { + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_rubric_templates + WHERE + id = '" . $tmpls_id . "' + AND + rubric_id = '" . $rubric_id . "' + "); + + // Очищаем кэш шаблона документов рубрики + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_rubric_template_cache + WHERE + rub_id = '" . $rubric_id . "' + AND + rub_tmpl_id = '" . $tmpls_id . "' + "); + + // Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('RUBRIC_TMPLS_LOG_DEL') . ' - ' . stripslashes(htmlspecialchars($this->rubricNameByIdGet($rubric_id)->rubric_title, ENT_QUOTES)) . ' (Id шаблона: '.$rubric_id.')'); + } + + header('Location:index.php?do=rubs&action=tmpls&Id='.$rubric_id.'&cp=' . SESSION); + exit; + } +} +?> diff --git a/class/class.session.files.php b/class/class.session.files.php new file mode 100644 index 0000000..5fc5b8e --- /dev/null +++ b/class/class.session.files.php @@ -0,0 +1,140 @@ +sess_lifetime = (defined('SESSION_LIFETIME') && is_numeric(SESSION_LIFETIME)) + ? SESSION_LIFETIME + : (get_cfg_var("session.gc_maxlifetime") < 1440 ? 1440 : get_cfg_var("session.gc_maxlifetime")); + + return true; + } + + /* Open session */ + function _open($sess_save_path, $session_name) + { + global $sess_save_path, $sess_session_name; + + $sess_save_path = BASE_DIR . '/session'; + $sess_session_name = $session_name; + + return true; + } + + /* Close session */ + function _close() + { + $this->_gc($this->sess_lifetime); + return true; + } + + /* Read session */ + function _read($id) + { + global $sess_save_path, $sess_session_name, $sess_session_id; + + $sess_session_id = $id; + $sess_file = $this->_folder() . '/' . $id . '.sess'; + + if (!file_exists($sess_file)) return ""; + + if ($fp = @fopen($sess_file, "r")) + { + $sess_data = fread($fp, filesize($sess_file)); + return($sess_data); + } + else + { + return ''; + } + } + + /* Write new data */ + function _write ($id, $sess_data) + { + global $sess_save_path, $sess_session_name, $sess_session_id; + + $sess_session_id = $id; + $sess_file = $this->_folder() . '/' . $id . '.sess'; + + if(!file_exists($this->_folder())) + mkdir($this->_folder(), 0777, true); + + if ($fp = @fopen($sess_file, "w")) + { + return fwrite($fp, $sess_data); + } + else + { + return false; + } + } + + /* Destroy session */ + function _destroy ($id) + { + global $sess_save_path, $sess_session_name, $sess_session_id; + + $sess_session_id = $id; + $sess_dir = $this->_folder(); + $sess_file = $sess_dir . '/' . $id . '.sess'; + + return @unlink($sess_file); + } + + /* Garbage collection, deletes old sessions */ + function _gc ($maxlifetime) + { + global $sess_save_path, $sess_session_id; + + $this->_clear($sess_save_path, 'sess', $maxlifetime); + + return true; + } + + function _clear($dir, $mask, $maxlifetime) + { + foreach(glob($dir . '/*') as $filename) { + + if(strtolower(substr($filename, strlen($filename) - strlen($mask), strlen($mask))) == strtolower($mask)) { + if((filemtime($filename) + $maxlifetime) < time()) + @unlink($filename); + } + + if(is_dir($filename)) + if (!count(glob($filename.'/*'))) @rmdir($filename); + self::_clear($filename, $mask, $maxlifetime); + } + } + + function _folder() + { + global $sess_session_id, $sess_save_path; + + return $sess_save_path . '/' . mb_substr($sess_session_id, 0, 3); + } + + function __destruct () + { + register_shutdown_function('session_write_close'); + } + +} +?> \ No newline at end of file diff --git a/class/class.session.php b/class/class.session.php new file mode 100644 index 0000000..bd6ed3c --- /dev/null +++ b/class/class.session.php @@ -0,0 +1,161 @@ +db_host = $config['dbhost']; + $this->db_user = $config['dbuser']; + $this->db_pass = $config['dbpass']; + $this->db_dbase = $config['dbname']; + $this->db_prefix = $config['dbpref']; + + $this->sess_lifetime = (defined('SESSION_LIFETIME') && is_numeric(SESSION_LIFETIME)) + ? SESSION_LIFETIME + : (get_cfg_var("session.gc_maxlifetime") < 1440 + ? 1440 + : get_cfg_var("session.gc_maxlifetime")); + + if (! $this->mysql_connect = mysqli_connect ($this->db_host, $this->db_user, $this->db_pass)) + { + $this->error(); + } + + if (! $this->mysql_db = mysqli_select_db ($this->mysql_connect, $this->db_dbase)) + { + $this->error(); + } + + $this->mysql_connect->set_charset('utf8'); + + return true; + } + + /* Open session */ + function _open($path, $name) + { + return true; + } + + /* Close session */ + function _close() + { + @mysqli_query($this->mysql_connect, "DELETE FROM " . PREFIX . "_sessions WHERE expiry < '" . time() . "'"); + + if ($this->mysql_connect !== null) + @mysqli_close($this->mysql_connect); + + return true; + } + + /* Read session */ + function _read($ses_id) + { + $qid = @mysqli_query($this->mysql_connect, "SELECT value, Ip FROM " . PREFIX . "_sessions WHERE sesskey = '" . $ses_id . "' AND expiry > '" . time() . "'"); + + if ((list($value, $ip) = @mysqli_fetch_row($qid)) && $ip == $_SERVER['REMOTE_ADDR']) + { + return $value; + } + + return ''; + } + + /* Write new data */ + function _write($ses_id, $data) + { + if (! $qid = @mysqli_query($this->mysql_connect, "INSERT INTO ".PREFIX."_sessions VALUES ('".$ses_id."', ".(time()+$this->sess_lifetime).", '".addslashes($data)."', '".$_SERVER['REMOTE_ADDR']."', FROM_UNIXTIME(expiry, '%d.%m.%Y, %H:%i:%s'))")) + { + $qid = @mysqli_query($this->mysql_connect, "UPDATE ".PREFIX."_sessions SET expiry = ".(time()+$this->sess_lifetime).", expire_datum = FROM_UNIXTIME(expiry,'%d.%m.%Y, %H:%i:%s'), value = '".addslashes($data)."', Ip = '".$_SERVER['REMOTE_ADDR']."' WHERE sesskey = '".$ses_id."' AND expiry > '".time()."'"); + } + + return $qid; + } + + /* Destroy session */ + function _destroy($ses_id) + { + return @mysqli_query($this->mysql_connect, "DELETE FROM ".PREFIX."_sessions WHERE sesskey = '".$ses_id."'"); + } + + /* Garbage collection, deletes old sessions */ + function _gc($maxlifetime) + { + $session_res = @mysqli_query($this->mysql_connect, "DELETE FROM ".PREFIX."_sessions WHERE expiry < UNIX_TIMESTAMP(NOW() - '" . $maxlifetime . "')"); + + if (!$session_res) { + return false; + } + else + { + return true; + } + } + + function error() { + ob_start(); + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header('Status: 503 Service Temporarily Unavailable'); + header('Retry-After: 3600'); + header('X-Powered-By:'); + display_notice("Error connect to MySQL."); + die; + } +} +?> \ No newline at end of file diff --git a/class/class.settings.php b/class/class.settings.php new file mode 100644 index 0000000..742a4c8 --- /dev/null +++ b/class/class.settings.php @@ -0,0 +1,561 @@ +assign('date_formats', $date_formats); + $AVE_Template->assign('time_formats', $time_formats); + $AVE_Template->assign('row', get_settings()); + $AVE_Template->assign('available_countries', get_country_list(1)); + $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_main.tpl')); + } + + /** + * Метод отображения дополнительных настроек + * + */ + function settingsCase() + { + global $AVE_Template; + + // Сохраняем настройки + if (@$_REQUEST['more']) { + $set='$v){ + switch ($GLOBALS['CMS_CONFIG'][$k]['TYPE']) { + case 'bool' : $v=$v ? 'true' : 'false'; break; + case 'integer' : $v=intval($v); break; + case 'string' : $v="'".add_slashes($v)."'";break; + case 'dropdown' : $v="'".add_slashes($v)."'";break; + default : $v="'".add_slashes($v)."'";break; + } + $set.=" + //".$GLOBALS['CMS_CONFIG'][$k]['DESCR']."\r\n"; + $set.=" define('".$k."',".$v.");\r\n\r\n"; + } + $set.='?>'; + $result = file_put_contents(BASE_DIR.'/inc/config.inc.php',$set); + + if ($result > 0) { + $message = $AVE_Template->get_config_vars('SETTINGS_SAVED'); + $header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('SETTINGS_SAVE_DOP')); + }else{ + $message = $AVE_Template->get_config_vars('SETTINGS_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('SETTINGS_ERROR'); + $theme = 'error'; + } + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=settings&sub=case&cp=' . SESSION); + } + + exit; + // Выводим настройки + } else { + $AVE_Template->assign('CMS_CONFIG',$GLOBALS['CMS_CONFIG']); + $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_case.tpl')); + } + } + + /** + * Метод записи настроек + * + */ + function settingsSave() + { + global $AVE_DB, $AVE_Template; + + $muname = ($_REQUEST['mail_smtp_login']) ? "mail_smtp_login = '" . $_REQUEST['mail_smtp_login'] . "'," : ''; + $mpass = ($_REQUEST['mail_smtp_pass']) ? "mail_smtp_pass = '" . $_REQUEST['mail_smtp_pass'] . "'," : ''; + $msmp = ($_REQUEST['mail_sendmail_path']) ? "mail_sendmail_path = '" . $_REQUEST['mail_sendmail_path'] . "'," : ''; + $mn = ($_REQUEST['mail_from_name']) ? "mail_from_name = '" . $_REQUEST['mail_from_name'] . "'," : ''; + $ma = ($_REQUEST['mail_from']) ? "mail_from = '" . $_REQUEST['mail_from'] . "'," : ''; + $ep = ($_REQUEST['page_not_found_id']) ? "page_not_found_id = '" . $_REQUEST['page_not_found_id'] . "'," : ''; + $sn = ($_REQUEST['site_name']) ? "site_name = '" . $_REQUEST['site_name'] . "'," : ''; + $mp = ($_REQUEST['mail_port']) ? "mail_port = '" . $_REQUEST['mail_port'] . "'," : ''; + $mh = ($_REQUEST['mail_host']) ? "mail_host = '" . $_REQUEST['mail_host'] . "'," : ''; + + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_settings + SET + " . $muname . " + " . $mpass . " + mail_smtp_encrypt = '" . $_REQUEST['mail_smtp_encrypt'] . "', + " . $msmp . " + " . $ma . " + " . $mn . " + " . $ep . " + " . $sn . " + " . $mp . " + " . $mh . " + default_country = '" . $_REQUEST['default_country'] . "', + mail_type = '" . $_REQUEST['mail_type'] . "', + mail_content_type = '" . $_REQUEST['mail_content_type'] . "', + mail_word_wrap = '" . (int)$_REQUEST['mail_word_wrap'] . "', + mail_new_user = '" . $_REQUEST['mail_new_user'] . "', + mail_signature = '" . $_REQUEST['mail_signature'] . "', + message_forbidden = '" . $_REQUEST['message_forbidden'] . "', + hidden_text = '" . $_REQUEST['hidden_text'] . "', + navi_box = '" . $_REQUEST['navi_box'] . "', + start_label = '" . $_REQUEST['start_label'] . "', + end_label = '" . $_REQUEST['end_label'] . "', + separator_label = '" . $_REQUEST['separator_label'] . "', + next_label = '" . $_REQUEST['next_label'] . "', + prev_label = '" . $_REQUEST['prev_label'] . "', + total_label = '" . $_REQUEST['total_label'] . "', + link_box = '" . $_REQUEST['link_box'] . "', + total_box = '" . $_REQUEST['total_box'] . "', + active_box = '" . $_REQUEST['active_box'] . "', + separator_box = '" . $_REQUEST['separator_box'] . "', + bread_box = '" . $_REQUEST['bread_box'] . "', + bread_show_main = '" . ($_REQUEST['bread_show_main'] != 0 ? 1 : 0) . "', + bread_show_host = '" . ($_REQUEST['bread_show_host'] != 0 ? 1 : 0) . "', + bread_sepparator = '" . $_REQUEST['bread_sepparator'] . "', + bread_sepparator_use = '" . ($_REQUEST['bread_sepparator_use'] != 0 ? 1 : 0) . "', + bread_link_box = '" . $_REQUEST['bread_link_box'] . "', + bread_link_template = '" . $_REQUEST['bread_link_template'] . "', + bread_self_box = '" . $_REQUEST['bread_self_box'] . "', + bread_link_box_last = '" . ($_REQUEST['bread_link_box_last'] != 0 ? 1 : 0) . "', + date_format = '" . $_REQUEST['date_format'] . "', + time_format = '" . $_REQUEST['time_format'] . "', + use_doctime = '" . intval($_REQUEST['use_doctime']) . "', + use_editor = '" . intval($_REQUEST['use_editor']) . "' + WHERE + Id = 1 + "); + + if ($sql->_result === false) + { + $message = $AVE_Template->get_config_vars('SETTINGS_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('SETTINGS_ERROR'); + $theme = 'error'; + } + else + { + $_SESSION['use_editor'] = intval($_REQUEST['use_editor']); + $message = $AVE_Template->get_config_vars('SETTINGS_SAVED'); + $header = $AVE_Template->get_config_vars('SETTINGS_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('SETTINGS_SAVE_MAIN')); + } + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=settings&cp=' . SESSION); + } + + exit; + } + + /** + * Метод отображения списка стран + * + */ + function settingsCountriesList() + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT SQL_CALC_FOUND_ROWS * + FROM " . PREFIX . "_countries + ORDER BY country_status ASC, country_name ASC + LIMIT " . (get_current_page() * $this->_limit - $this->_limit) . "," . $this->_limit + ); + + $countries = array(); + while ($row = $sql->FetchAssocArray()) + { + array_push($countries, $row); + } + + $num = $AVE_DB->Query("SELECT FOUND_ROWS()")->GetCell(); + + if ($num > $this->_limit) + { + $page_nav = "{t}"; + $page_nav = get_pagination(ceil($num / $this->_limit), 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + $AVE_Template->assign('countries', $countries); + $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_countries.tpl')); + } + + /** + * Метод записи параметров стран + * + */ + function settingsCountriesSave() + { + global $AVE_DB, $AVE_Template; + + foreach ($_POST['country_name'] as $id => $country_name) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_countries + SET + country_name = '" . $country_name . "', + country_status = '" . $_POST['country_status'][$id] . "', + country_eu = '" . $_POST['country_eu'][$id] . "' + WHERE + Id = '" . $id . "' + "); + } + + reportLog($AVE_Template->get_config_vars('SETTINGS_SAVE_COUNTRY')); + } + + + /** + * Метод отображения списка языков + * + */ + function settingsLanguageList() + { + global $AVE_DB, $AVE_Template; + + $sql = $AVE_DB->Query(" + SELECT SQL_CALC_FOUND_ROWS * + FROM " . PREFIX . "_settings_lang + ORDER BY lang_default DESC, lang_status ASC, lang_key ASC + "); + + $language = array(); + while ($row = $sql->FetchAssocArray()) + { + array_push($language, $row); + } + $AVE_Template->assign('language', $language); + $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang.tpl')); + } + + /** + * Метод Редактирования параметров языков + * + */ + function settingsLanguageEdit() + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST["Id"])) + { + $items = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_settings_lang + WHERE + Id = '" . $_REQUEST["Id"] . "' + ")->FetchRow(); + + $AVE_Template->assign('items', $items); + } + + $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_lang_edit.tpl')); + } + + function settingsLanguageEditSave() + { + global $AVE_DB, $AVE_Template; + + if (!empty($_REQUEST["Id"])) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_settings_lang + SET + lang_key = '" .$_REQUEST['lang_key']. "', + lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "', + lang_name = '" .$_REQUEST['lang_name']. "' + WHERE + Id = '" . $_REQUEST["Id"] . "' + "); + } + else + { + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_settings_lang + SET + lang_key = '" .$_REQUEST['lang_key']. "', + lang_name = '" .$_REQUEST['lang_name']. "', + lang_alias_pref = '" .$_REQUEST['lang_alias_pref']. "', + lang_default = '0', + lang_status = '0' + "); + + } + echo ""; + } + + + function settingsPaginationsList() + { + global $AVE_DB, $AVE_Template; + + $sql = " + SELECT + id, + pagination_name + FROM + " . PREFIX . "_paginations + "; + + $query = $AVE_DB->Query($sql); + + $items = array(); + + while ($row = $query->FetchRow()) + array_push($items, $row); + + $AVE_Template->assign('items', $items); + + $AVE_Template->assign('content', $AVE_Template->fetch('settings/settings_pagination.tpl')); + } + + + function settingsPaginationsNew() + { + global $AVE_DB, $AVE_Template; + + $pagination = new stdClass(); + + $AVE_Template->assign('pagination', $pagination); + $AVE_Template->assign('content', $AVE_Template->fetch('settings/pagination_edit.tpl')); + } + + + function settingsPaginationsEdit() + { + global $AVE_DB, $AVE_Template; + + $sql = " + SELECT + * + FROM + " . PREFIX . "_paginations + WHERE + id = '" . $_REQUEST['id'] . "' + "; + + $pagination = $AVE_DB->Query($sql)->FetchRow(); + + $AVE_Template->assign('pagination', $pagination); + $AVE_Template->assign('content', $AVE_Template->fetch('settings/pagination_edit.tpl')); + } + + + function settingsPaginationsSave() + { + global $AVE_DB, $AVE_Template; + + // Если пришел ID + if (isset($_REQUEST['id']) && $_REQUEST['id'] > 0) + { + $sql = " + UPDATE + " . PREFIX . "_paginations + SET + pagination_name = '" . $_REQUEST['pagination_name'] . "', + pagination_box = '" . $_REQUEST['pagination_box'] . "', + pagination_start_label = '" . $_REQUEST['pagination_start_label'] . "', + pagination_end_label = '" . $_REQUEST['pagination_end_label'] . "', + pagination_separator_box = '" . $_REQUEST['pagination_separator_box'] . "', + pagination_separator_label = '" . $_REQUEST['pagination_separator_label'] . "', + pagination_next_label = '" . $_REQUEST['pagination_next_label'] . "', + pagination_prev_label = '" . $_REQUEST['pagination_prev_label'] . "', + pagination_link_box = '" . $_REQUEST['pagination_link_box'] . "', + pagination_active_link_box = '" . $_REQUEST['pagination_active_link_box'] . "', + pagination_link_template = '" . $_REQUEST['pagination_link_template'] . "', + pagination_link_active_template = '" . $_REQUEST['pagination_link_active_template'] . "' + WHERE + id = '" . $_REQUEST['id'] . "' + "; + + $query = $AVE_DB->Query($sql); + + if ($query === false) + { + $message = $AVE_Template->get_config_vars('PAGINATION_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('PAGINATION_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('PAGINATION_SAVED'); + $header = $AVE_Template->get_config_vars('PAGINATION_SUCCESS'); + $theme = 'accept'; + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + else + { + header('Location:index.php?do=settings&action=paginations&cp=' . SESSION); + } + + exit; + } + // Если не пришел ID + else + { + $sql = " + INSERT INTO + " . PREFIX . "_paginations + SET + pagination_name = '" . $_REQUEST['pagination_name'] . "', + pagination_box = '" . $_REQUEST['pagination_box'] . "', + pagination_start_label = '" . $_REQUEST['pagination_start_label'] . "', + pagination_end_label = '" . $_REQUEST['pagination_end_label'] . "', + pagination_separator_box = '" . $_REQUEST['pagination_separator_box'] . "', + pagination_separator_label = '" . $_REQUEST['pagination_separator_label'] . "', + pagination_next_label = '" . $_REQUEST['pagination_next_label'] . "', + pagination_prev_label = '" . $_REQUEST['pagination_prev_label'] . "', + pagination_link_box = '" . $_REQUEST['pagination_link_box'] . "', + pagination_active_link_box = '" . $_REQUEST['pagination_active_link_box'] . "', + pagination_link_template = '" . $_REQUEST['pagination_link_template'] . "', + pagination_link_active_template = '" . $_REQUEST['pagination_link_active_template'] . "' + "; + } + + $query = $AVE_DB->Query($sql); + + header('Location:index.php?do=settings&action=paginations&cp=' . SESSION); + exit; + } + + + function settingsPaginationsDel() + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['id']) && $_REQUEST['id'] > 1) + { + $sql = " + DELETE + FROM + " . PREFIX . "_paginations + WHERE + id = '" . $_REQUEST['id'] . "' + "; + + $AVE_DB->Query($sql); + } + + header('Location:index.php?do=settings&action=paginations&cp=' . SESSION); + exit; + } + + + /** + * Функция делает рекурсивный обход вложенных папок, и добавляет их в архив + * + * @param string $src_dir папка которую хотим заархивировать + * @param string $zip Куда кладем и как называем файл архива + * @return ZIP + */ + function ZipDirectory($src_dir, $zip, $dir_in_archive = '') + { + $dirHandle = opendir($src_dir); + + while (false !== ($file = readdir($dirHandle))) + { + if (($file != '.') && ($file != '..')) + { + if (! is_dir($src_dir . $file)) + { + $zip->addFile($src_dir . $file, $dir_in_archive.$file); + } + else + { + $zip->addEmptyDir($dir_in_archive.$file); + $zip = ZipDirectory($src_dir . $file . DIRECTORY_SEPARATOR, $zip, $dir_in_archive . $file . DIRECTORY_SEPARATOR); + } + } + } + + return $zip; + } + + /** + * Функция проверяет, возможно ли создать zip-архив, запускает + * ZipDirectory и закрывает файл при завершении обхода папок. + * + * @param string $src_dir папка которую хотим заархивировать + * @param string $archive_path Куда кладем и как называем файл архива + * @return bool true|false + */ + function ZipFull($src_dir, $archive_path) + { + $zip = new ZipArchive(); + + if ($zip->open($archive_path, ZIPARCHIVE::CREATE) !== true) + { + return false; + } + + $zip = ZipDirectory($src_dir,$zip); + + $zip->close(); + + return true; + } + +} +?> \ No newline at end of file diff --git a/class/class.sysblocks.php b/class/class.sysblocks.php new file mode 100644 index 0000000..c639828 --- /dev/null +++ b/class/class.sysblocks.php @@ -0,0 +1,295 @@ +Query(" + SELECT 1 + FROM + " . PREFIX . "_sysblocks + WHERE + sysblock_alias = '" . $alias . "' + AND + id != '" . $id . "' + ")->GetCell(); + } + + /** + * Вывод списка системных блоков + */ + function sys_blockList() + { + global $AVE_DB, $AVE_Template; + + $sys_blocks = array(); + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_sysblocks + ORDER BY + id + "); + + // Формируем массив из полученных данных + while ($row = $sql->FetchRow()) + { + $row->sysblock_author_id = get_username_by_id($row->sysblock_author_id); + array_push($sys_blocks, $row); + } + + $AVE_Template->assign('sid', 0); + $AVE_Template->assign('sys_blocks', $sys_blocks); + $AVE_Template->assign('content', $AVE_Template->fetch('sysblocks/list.tpl')); + } + + /** + * Сохранение системного блока + * + * @param int $sysblock_id идентификатор системного блока + */ + function sys_blockSave($sysblock_id = null) + { + global $AVE_DB, $AVE_Template; + + if (is_numeric($sysblock_id)) + { + + $_REQUEST['sysblock_external'] = (isset($_REQUEST['sysblock_external'])) ? $_REQUEST['sysblock_external'] : 0; + $_REQUEST['sysblock_ajax'] = (isset($_REQUEST['sysblock_ajax'])) ? $_REQUEST['sysblock_ajax'] : 0; + $_REQUEST['sysblock_visual'] = (isset($_REQUEST['sysblock_visual'])) ? $_REQUEST['sysblock_visual'] : 0; + + $sysblock_alias = isset($_REQUEST['sysblock_alias']) ? $_REQUEST['sysblock_alias'] : ''; + + $sql = $AVE_DB->Query(" + UPDATE + " . PREFIX . "_sysblocks + SET + sysblock_name = '" . $_REQUEST['sysblock_name'] . "', + sysblock_description = '" . addslashes($_REQUEST['sysblock_description']) . "', + sysblock_alias = '" . $_REQUEST['sysblock_alias'] . "', + sysblock_text = '" . $_REQUEST['sysblock_text'] . "', + sysblock_external = '" . (int)$_REQUEST['sysblock_external'] . "', + sysblock_ajax = '" . (int)$_REQUEST['sysblock_ajax'] . "', + sysblock_visual = '" . (int)$_REQUEST['sysblock_visual'] . "' + WHERE + id = '" . $sysblock_id . "' + "); + + if ($sql->_result === false) + { + $message = $AVE_Template->get_config_vars('SYSBLOCK_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('SYSBLOCK_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('SYSBLOCK_SAVED'); + $header = $AVE_Template->get_config_vars('SYSBLOCK_SUCCESS'); + $theme = 'accept'; + + //-- Стираем кеш сисблока + if (file_exists(BASE_DIR . '/cache/sql/sysblock/' . $sysblock_id . '.cache')) + unlink(BASE_DIR . '/cache/sql/sysblock/' . $sysblock_id . '.cache'); + + if ($sysblock_alias != '' && file_exists(BASE_DIR . '/cache/sql/sysblock/' . $sysblock_alias . '.cache')) + unlink(BASE_DIR . '/cache/sql/sysblock/' . $sysblock_alias . '.cache'); + + //-- Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('SYSBLOCK_SQLUPDATE') . " (" . stripslashes($_REQUEST['sysblock_name']) . ") (id: $sysblock_id)"); + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + else + { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=sysblocks&cp=' . SESSION); + } + + exit; + } + else + { + $AVE_DB->Query(" + INSERT INTO + " . PREFIX . "_sysblocks + SET + sysblock_name = '" . $_REQUEST['sysblock_name'] . "', + sysblock_description = '" . addslashes($_REQUEST['sysblock_description']) . "', + sysblock_alias = '" . $_REQUEST['sysblock_alias'] . "', + sysblock_text = '" . $_REQUEST['sysblock_text'] . "', + sysblock_author_id = '" . (int)$_SESSION['user_id'] . "', + sysblock_external = '" . (int)$_REQUEST['sysblock_external'] . "', + sysblock_ajax = '" . (int)$_REQUEST['sysblock_ajax'] . "', + sysblock_visual = '" . (int)$_REQUEST['sysblock_visual'] . "', + sysblock_created = '" . time() . "' + "); + + $sysblock_id = $AVE_DB->InsertId(); + + //-- Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('SYSBLOCK_SQLNEW') . " (" . stripslashes($_REQUEST['sysblock_name']) . ") (id: $sysblock_id)"); + } + + if (! isset($_REQUEST['next_edit'])) + header('Location:index.php?do=sysblocks&cp=' . SESSION); + else + header('Location:index.php?do=sysblocks&action=edit&&id=' . $sysblock_id . '&cp=' . SESSION); + } + + /** + * Редактирование системного блока + * + * @param int $sysblock_id идентификатор системного блока + */ + function sys_blockEdit($sysblock_id) + { + global $AVE_DB, $AVE_Template; + + $row = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_sysblocks + WHERE + id = '" . $sysblock_id . "' + ")->FetchAssocArray(); + + $AVE_Template->assign('sid', $sysblock_id); + + if ((isset($_REQUEST['sysblock_visual']) && $_REQUEST['sysblock_visual'] == 1) || $row['sysblock_visual'] == 1) + { + switch ($_SESSION['use_editor']) + { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['customConfig'] = 'sysblock.js'; + $oCKeditor->config['toolbar'] = 'Big'; + $oCKeditor->config['height'] = 400; + $config = array(); + $row['sysblock_text'] = $oCKeditor->editor('sysblock_text', $row['sysblock_text'], $config); + break; + + case '1': // Elrte и Elfinder + break; + } + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch('sysblocks/form_visual.tpl')); + } + else + { + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch('sysblocks/form.tpl')); + } + } + + /** + * Создание системного блока + */ + function sys_blockNew() + { + global $AVE_DB, $AVE_Template; + + $row['sysblock_name'] = ''; + $row['sysblock_alias'] = ''; + $row['sysblock_text'] = ''; + $row['sysblock_visual'] = (isset($_REQUEST['sysblock_visual']) && $_REQUEST['sysblock_visual'] != 0) ? $_REQUEST['sysblock_visual'] : ''; + + $AVE_Template->assign('sid', 0); + + if ((isset($_REQUEST['sysblock_visual']) && $_REQUEST['sysblock_visual'] == 1) || $row['sysblock_visual'] == 1) + { + switch ($_SESSION['use_editor']) + { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['customConfig'] = 'sysblock.js'; + $oCKeditor->config['toolbar'] = 'Big'; + $oCKeditor->config['height'] = 400; + $config = array(); + $row['sysblock_text'] = $oCKeditor->editor('sysblock_text', $row['sysblock_text'], $config); + break; + + case '1': // Elrte и Elfinder + break; + } + + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch('sysblocks/form_visual.tpl')); + } + else + { + $AVE_Template->assign($row); + $AVE_Template->assign('content', $AVE_Template->fetch('sysblocks/form.tpl')); + } + } + + /** + * Удаление системного блока + * + * @param int $sysblock_id идентификатор системного блока + */ + function sys_blockDelete($sysblock_id) + { + global $AVE_DB, $AVE_Template; + + if (is_numeric($sysblock_id)) + { + $row = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_sysblocks + WHERE + id = '" . $sysblock_id . "' + ")->FetchRow(); + + $AVE_DB->Query(" + DELETE FROM + " . PREFIX . "_sysblocks + WHERE + id = '" . $sysblock_id . "' + "); + + //-- Стираем кеш сисблока + if (file_exists(BASE_DIR . '/cache/sql/sysblock-' . $sysblock_id . '.cache')) + unlink(BASE_DIR . '/cache/sql/sysblock/' . $sysblock_id . '.cache'); + + if ($row->sysblock_alias != '') + unlink(BASE_DIR . '/cache/sql/sysblock/' . $row->sysblock_alias . '.cache'); + + //-- Сохраняем системное сообщение в журнал + reportLog($AVE_Template->get_config_vars('SYSBLOCK_SQLDEL') . " (" . stripslashes($row->sysblock_name) . ") (id: $sysblock_id)"); + } + + header('Location:index.php?do=sysblocks&cp=' . SESSION); + } + } +?> \ No newline at end of file diff --git a/class/class.template.php b/class/class.template.php new file mode 100644 index 0000000..6b599f0 --- /dev/null +++ b/class/class.template.php @@ -0,0 +1,400 @@ +template_dir = $template_dir; + + /** + * Имя каталога, в котором хранятся компилированные шаблоны. + */ + $this->compile_dir = BASE_DIR . '/cache/smarty'; + + /** + * Имя каталога, в котором хранится кэш. + */ + $this->cache_dir_root = BASE_DIR . '/cache'; + + /** + * Имя каталога, в котором хранится кэш шаблонов. + */ + $this->cache_dir = BASE_DIR . '/cache/tpl'; + + /** + * Имя каталога, в котором хранится кэш модулей. + */ + $this->module_cache_dir = BASE_DIR . '/cache/module'; + + /** + * Имя каталога, в котором хранится сессии пользователей. + */ + $this->session_dir = BASE_DIR . '/session'; + + /** + * Имя каталога, в котором хранится сессии пользователей. + */ + $this->sql_cache_dir = BASE_DIR . '/cache/sql'; + + /** + * Использование поддиректорий для хранения кэша и скомпилированных шаблонов. + */ + $this->use_sub_dirs = SMARTY_USE_SUB_DIRS; + + /** + * При каждом вызове РНР-приложения Smarty проверяет, изменился или нет текущий шаблон + * с момента последней компиляции. Если шаблон изменился, он перекомпилируется. + * В случае, если шаблон еще не был скомпилирован, его компиляция производится + * с игнорированием значения этого параметра. + */ + $this->compile_check = SMARTY_COMPILE_CHECK; + + /** + * Активирует debugging console - порожденное при помощи javascript окно браузера, + * содержащее информацию о подключенных шаблонах и загруженных переменных для текущей страницы. + */ + $this->debugging = SMARTY_DEBUGGING; + + /** + * Регистрация плагинов-функций Smarty. + * Передается наименование функции шаблона и имя функции, реализующей ее. + */ + $this->register_function('check_permission', 'check_permission'); + $this->register_function('get_home_link', 'get_home_link'); + $this->register_function('num_format', 'num_format'); + $this->register_function('thumb', 'make_thumbnail'); + + /** + * Регистрация плагинов-модификаторов Smarty. + * Передается имя модификатора и имя функции, реализующей его. + */ + $this->register_modifier('pretty_date', 'pretty_date'); + $this->register_modifier('translate_date', 'translate_date'); + $this->register_modifier('utf8', 'utf8'); + + // плагин позволяющий поставить метки шаблонов + // для быстрого поиска шаблона отвечающего за вывод + // перед использованием очистить cache/smarty + // $this->register_postfilter('add_template_comment'); + + /** + * Присваиваем общие значения для шаблонов. + * Можно явно передавать пары имя/значение, + * или ассоциативные массивы, содержащие пары имя/значение. + */ + $assign['BASE_DIR'] = BASE_DIR; + $assign['ABS_PATH'] = ABS_PATH; + $assign['DATE_FORMAT'] = DATE_FORMAT; + $assign['TIME_FORMAT'] = TIME_FORMAT; + $assign['PAGE_NOT_FOUND_ID'] = PAGE_NOT_FOUND_ID; + + $this->assign($assign); + } + +/** + * ВНУТРЕННИЕ МЕТОДЫ + */ + + /** + * Проверка наличия одноименного шаблона в директории темы дизайна. + * При наличии шаблона в директории темы дизайна используется этот шаблон. + * + * @param string $tpl путь к шаблону + * @return string + */ + function _redefine_template($tpl) + { + if (!defined('THEME_FOLDER')) return $tpl; + + $r_tpl = str_replace(BASE_DIR, BASE_DIR . '/templates/' . THEME_FOLDER, $tpl); + + return (file_exists($r_tpl) && is_file($r_tpl)) ? $r_tpl : $tpl; + } + +/** + * ВНЕШНИЕ МЕТОДЫ + */ + + /** + * Переопределение одноименного метода Smarty + * для конфигурационных файлов созданных в теме дизайна. + * + * @param string $file + * @param string $section + * @param string $scope + */ + function config_load($file, $section = null, $scope = 'global') + { + Smarty::config_load($this->_redefine_template($file), $section, $scope); + } + + /** + * Переопределение одноименного метода Smarty + * для пользовательских шаблонов созданных в теме дизайна. + * + * @param string $tpl_file name of template file + * @param string $cache_id + * @param string $compile_id + * @return string|false results of {@link _read_cache_file()} + */ + function is_cached($tpl_file, $cache_id = null, $compile_id = null) + { + return Smarty::is_cached($this->_redefine_template($tpl_file), $cache_id, $compile_id); + } + + /** + * Переопределение одноименного метода Smarty + * для пользовательских шаблонов созданных в теме дизайна. + * + * @param string $resource_name + * @param string $cache_id + * @param string $compile_id + * @param boolean $display + */ + function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false) + { + return Smarty::fetch($this->_redefine_template($resource_name), $cache_id, $compile_id, $display); + } + + /** + * Переопределение одноименного метода Smarty + * для пользовательских шаблонов созданных в теме дизайна. + * + * @param string $resource_name + * @param string $cache_id + * @param string $compile_id + */ + function display($resource_name, $cache_id = null, $compile_id = null) + { + $this->fetch($resource_name, $cache_id, $compile_id, true); + } + + /** + * Метод очистки кэша + * + */ + function CacheClear() + { + global $AVE_DB, $AVE_Template; + + $message = array(); + + //Метод очистки кэша + if (isset($_REQUEST['templateCache']) && $_REQUEST['templateCache'] == '1') + { + $this->clear_all_cache(); + + foreach (glob($this->cache_dir_root."/cache_*") as $filename) + { + @unlink($filename); + } + + $filename = $this->cache_dir . '/.htaccess'; + if (!file_exists($filename)) + { + $fp = @fopen($filename, 'w'); + if ($fp) + { + fputs($fp, 'Deny from all'); + fclose($fp); + } + } + + if($_REQUEST['ajax'] && Memcached_Server && Memcached_Port) + { + $memcache = new Memcache; + $memcache->connect(Memcached_Server, Memcached_Port); + $memcache->flush(); + } + + // Очищаем кэш шаблона документов рубрики + $GLOBALS['AVE_DB']->Query(" + DELETE + FROM + " . PREFIX . "_rubric_template_cache + "); + + $message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS'); + reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SUCCESS_LOG')); + + // Очищаем кэш сессий в БД в таблице _sessions + $GLOBALS['AVE_DB']->Query(" + DELETE + FROM + " . PREFIX . "_sessions + "); + + $message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS'); + reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_DB_SUCCESS_LOG')); + } + + //Метод удаления скомпилированных шаблонов + if (isset($_REQUEST['templateCompiledTemplate']) && $_REQUEST['templateCompiledTemplate'] == '1') + { + $this->clear_compiled_tpl(); + + $filename = $this->compile_dir . '/.htaccess'; + if (! file_exists($filename)) + { + $fp = @fopen($filename, 'w'); + if ($fp) + { + fputs($fp, 'Deny from all'); + fclose($fp); + } + } + + $message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_CT_SUCCESS'); + reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_CT_SUCCESS_LOG')); + } + + //Метод удаления скомпилированных шаблонов модулей + if (isset($_REQUEST['moduleCache']) && $_REQUEST['moduleCache'] == '1') + { + rrmdir($this->module_cache_dir); + + mkdir($this->module_cache_dir,0777,true); + + $filename = $this->module_cache_dir . '/.htaccess'; + + if (! file_exists($filename)) + { + $fp = @fopen($filename, 'w'); + if ($fp) + { + fputs($fp, 'Deny from all'); + fclose($fp); + } + } + + $message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_MC_SUCCESS'); + reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_MC_SUCCESS_LOG')); + } + + //Метод удаления всех сессий + if (isset($_REQUEST['sessionUsers']) && $_REQUEST['sessionUsers'] == '1') + { + rrmdir($this->session_dir); + + mkdir($this->session_dir,0777,true); + + $filename = $this->session_dir . '/.htaccess'; + + if (! file_exists($filename)) + { + $fp = @fopen($filename, 'w'); + if ($fp) + { + fputs($fp, 'Deny from all'); + fclose($fp); + } + } + + $message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SU_SUCCESS'); + reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SU_SUCCESS_LOG')); + } + + //Метод удаления кэша запросов + if (isset($_REQUEST['sqlCache']) && $_REQUEST['sqlCache'] == '1') + { + rrmdir($this->sql_cache_dir); + + mkdir($this->sql_cache_dir,0777,true); + + $filename = $this->sql_cache_dir . '/.htaccess'; + + if (!file_exists($filename)) + { + $fp = @fopen($filename, 'w'); + if ($fp) + { + fputs($fp, 'Deny from all'); + fclose($fp); + } + } + + $message[] = $AVE_Template->get_config_vars('TEMPLATES_CACHE_SC_SUCCESS'); + reportLog($AVE_Template->get_config_vars('TEMPLATES_CACHE_SC_SUCCESS_LOG')); + } + + echo json_encode(array($AVE_Template->get_config_vars('TEMPLATES_MESSAGE') . "
      " . implode('
      ', $message), 'accept')); + } + + /** + * Метод очистки миниатюр + * + */ + function ThumbnailsClear() + { + global $AVE_DB, $AVE_Template; + + $message = array(); + + function rdel_thumb($dirname) + { + $dirs = glob("$dirname/*", GLOB_ONLYDIR|GLOB_NOSORT); + + foreach ($dirs as $dir) + { + $dir_thumb = THUMBNAIL_DIR; + $tmb = glob("$dir/$dir_thumb", GLOB_ONLYDIR|GLOB_NOSORT); + + foreach ($tmb as $tmbs) + { + rrmdir($tmbs); + } + + rdel_thumb($dir); + } + + $hid_cat=(glob("$dirname/{.tmb}*", GLOB_ONLYDIR|GLOB_BRACE)); + $hid_tmb=$hid_cat[0]; + + foreach (glob("$hid_cat[0]/*.png", GLOB_NOSORT) as $filename) + unlink("$filename"); + } + + rdel_thumb(BASE_DIR . '/' . UPLOAD_DIR); + + $message[] = $AVE_Template->get_config_vars('TEMPLATES_THUMBNAILS_SUCCESS'); + + reportLog($AVE_Template->get_config_vars('TEMPLATES_THUMBNAILS_SUCCESS_LOG')); + + echo json_encode(array($AVE_Template->get_config_vars('TEMPLATES_MESSAGE') . "
      " . implode('
      ', $message), 'accept')); + } + +} +?> \ No newline at end of file diff --git a/class/class.templates.php b/class/class.templates.php new file mode 100644 index 0000000..bf40c74 --- /dev/null +++ b/class/class.templates.php @@ -0,0 +1,615 @@ +assign('css_files', $css_files); + + unset($dir, $css_files); + + //-- Js файлы + $dir = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/js/'; + + if ($handle = opendir($dir)) + { + $js_files = array(); + + while (false !== ($file = readdir($handle))) + { + if ($file != "." && $file != ".." && substr($file,-2) == 'js') + { + if(! is_dir($dir."/".$file)) + $files[$ii]['filename'] = $file; + + $files[$ii]['filesize'] = filesize($dir ."/" . $file); + $js_files[] = $files; + } + } + + closedir($handle); + } + + $AVE_Template->assign('js_files', $js_files); + + unset($dir, $js_files); + + $items = array(); + + $num_tpl = $AVE_DB->Query(" + SELECT + COUNT(*) + FROM + " . PREFIX . "_templates + ")->GetCell(); + + $page_limit = (isset($_REQUEST['set']) && is_numeric($_REQUEST['set'])) ? (int)$_REQUEST['set'] : 30; + $pages = ceil($num_tpl / $page_limit); + $set_start = get_current_page() * $page_limit - $page_limit; + + if ($num_tpl > $page_limit) + { + $page_nav = " {t} "; + $page_nav = get_pagination($pages, 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_templates + LIMIT + " . $set_start . "," . $page_limit . " + "); + + while ($row = $sql->FetchRow()) + { + $inuse = $AVE_DB->Query(" + SELECT 1 + FROM + " . PREFIX . "_rubrics AS rubric, + " . PREFIX . "_module AS module + WHERE + rubric.rubric_template_id = '" . $row->Id . "' + OR + module.ModuleTemplate = '" . $row->Id . "' + LIMIT 1 + ")->NumRows(); + + if (! $inuse) + $row->can_deleted = 1; + + $row->template_author = get_username_by_id($row->template_author_id); + + array_push($items, $row); + + unset($row); + } + + $AVE_Template->assign('items', $items); + $AVE_Template->assign('content', $AVE_Template->fetch('templates/templates.tpl')); + } + + + public static function templatesNew() + { + global $AVE_Template; + + $AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl')); + } + + + public static function templatesEdit() + { + global $AVE_DB, $AVE_Template; + + $row = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_templates + WHERE + Id = '" . $_REQUEST['Id'] . "' + ")->FetchRow(); + + $check_code = strtolower($row->template_text); + + if (is_php_code($check_code) && !check_permission('template_php')) + { + $AVE_Template->assign('php_forbidden', 1); + $AVE_Template->assign('read_only', 'readonly'); + } + + $row->template_text = pretty_chars($row->template_text); + $row->template_text = stripslashes($row->template_text); + + $AVE_Template->assign('row', $row); + $AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl')); + } + + + public static function templatesSave() + { + global $AVE_DB, $AVE_Template; + + if (isset($_REQUEST['Id']) AND is_numeric($_REQUEST['Id'])) + { + $ok = true; + + $check_code = strtolower($_REQUEST['template_text']); + + if (is_php_code($check_code) && ! check_permission('template_php')) + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP') . ' (' . stripslashes($_REQUEST['template_title']) . ')'); + + $AVE_Template->assign('php_forbidden', 1); + + $ok = false; + + $message = $AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_ERR'); + $header = $AVE_Template->get_config_vars('TEMPLATES_ERROR'); + $theme = 'error'; + } + + if ($ok === false) + { + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + else + { + $row->template_text = stripslashes($_REQUEST['template_text']); + $AVE_Template->assign('row', $row); + } + } + else + { + $sql = $AVE_DB->Query(" + UPDATE + " . PREFIX . "_templates + SET + template_title = '" . $_REQUEST['template_title'] . "', + template_text = '" . addslashes(pretty_chars($_REQUEST['template_text'])) . "' + WHERE + Id = '" . (int)$_REQUEST['Id'] . "' + "); + + if ($sql === false) + { + $message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('TEMPLATES_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('TEMPLATES_SAVED'); + $header = $AVE_Template->get_config_vars('TEMPLATES_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_CHANGE') . ' - (' . stripslashes($_REQUEST['template_title']) . ')'); + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + else + { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=templates&cp=' . SESSION); + } + exit; + } + } + else + { + $save = true; + + $errors = array(); + + $row = new stdClass(); + + $row->template_text = pretty_chars($_REQUEST['template_text']); + $row->template_text = stripslashes($row->template_text); + $row->template_title = stripslashes($_REQUEST['template_title']); + + if (empty($_REQUEST['template_title'])) + { + $save = false; + $errors[] = $AVE_Template->get_config_vars('TEMPLATES_REPORT_ERROR_TITLE'); + } + + if (empty($_REQUEST['template_text'])) + { + $save = false; + $errors[] = $AVE_Template->get_config_vars('TEMPLATES_REPORT_ERROR_TEXT'); + } + + $check_code = strtolower($_REQUEST['template_text']); + + if (is_php_code($check_code) && !check_permission('template_php')) + { + $AVE_Template->assign('php_forbidden', 1); + $save = false; + } + + if ($save === false) + { + $AVE_Template->assign('row', $row); + $AVE_Template->assign('errors', $errors); + $AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl')); + } + else + { + $sql = $AVE_DB->Query(" + INSERT + INTO + " . PREFIX . "_templates + SET + Id = '', + template_title = '" . $_REQUEST['template_title'] . "', + template_text = '" . addslashes(pretty_chars($_REQUEST['template_text'])) . "', + template_author_id = '" . $_SESSION['user_id'] . "', + template_created = '" . time() . "' + "); + + $iid = $AVE_DB->InsertId(); + + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_NEW') . '(' . stripslashes(htmlspecialchars($_REQUEST['template_text'], ENT_QUOTES)) . ') (Id:' . (int)$iid . ')'); + + if (!$_REQUEST['next_edit']) + { + header('Location:index.php?do=templates&cp=' . SESSION); + } + else + { + header('Location:index.php?do=templates&action=edit&Id=' . (int)$template_new . '&cp=' . SESSION); + } + + exit; + } + } + + } + + + public static function templatesDelete() + { + global $AVE_DB, $AVE_Template; + + $Used = $AVE_DB->Query(" + SELECT + rubric_template_id + FROM + " . PREFIX . "_rubrics + WHERE + rubric_template_id = '" . (int)$_REQUEST['Id'] . "' + ")->GetCell(); + + if ($Used >= 1 || $_REQUEST['Id'] == 1) + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_ID_ERR') . ' - (' . templateName((int)$_REQUEST['Id']) . ')'); + + header('Location:index.php?do=templates'); + exit; + } + else + { + $template_name = templateName((int)$_REQUEST['Id']); + + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_templates + WHERE + Id = '" . (int)$_REQUEST['Id'] . "' + "); + + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DELETE') . ' - (' . $template_name . ')'); + + header('Location:index.php?do=templates'); + exit; + } + } + + + public static function templatesMulti() + { + global $AVE_DB, $AVE_Template; + + $ok = true; + + $errors = array(); + + $template_text = $AVE_DB->Query(" + SELECT + template_text + FROM + " . PREFIX . "_templates + WHERE + Id = '" . (int)$_REQUEST['Id'] . "' + ")->GetCell(); + + $template_title = $AVE_DB->Query(" + SELECT + template_title + FROM + " . PREFIX . "_templates + WHERE + template_title = '" . $_REQUEST['template_title'] . "' + ")->GetCell(); + + if ($template_title != '') + { + array_push($errors, $AVE_Template->get_config_vars('TEMPLATES_EXIST')); + + $AVE_Template->assign('errors', $errors); + + $ok = false; + } + + if ($_REQUEST['template_title'] == '') + { + array_push($errors, $AVE_Template->get_config_vars('TEMPLATES_NO_NAME')); + + $AVE_Template->assign('errors', $errors); + + $ok = false; + } + + if ($ok) + { + $AVE_DB->Query(" + INSERT + INTO + " . PREFIX . "_templates + SET + Id = '', + template_title = '" . $_REQUEST['template_title'] . "', + template_text = '" . addslashes($template_text) . "', + template_author_id = '" . $_SESSION['user_id'] . "', + template_created = '" . time() . "' + "); + + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_COPY') . ' - (' . $_REQUEST['template_title'].' - '.templateName((int)$_REQUEST['Id']) . ')'); + + header('Location:index.php?do=templates'.'&cp=' . SESSION); + exit; + } + + $row = new stdClass(); + + $row->template_text = pretty_chars($template_text); + $row->template_text = stripslashes($template_text); + $row->template_title = stripslashes($_REQUEST['template_title']); + + $AVE_Template->assign('row', $row); + $AVE_Template->assign('content', $AVE_Template->fetch('templates/form.tpl')); + } + + + public static function templatesEditCss() + { + global $AVE_Template; + + $_REQUEST['sub'] = (! isset($_REQUEST['sub'])) + ? '' + : $_REQUEST['sub']; + + switch ($_REQUEST['sub']) + { + + case 'save': + $dir = BASE_DIR.'/templates/'.DEFAULT_THEME_FOLDER.'/css/'.$_REQUEST['name_file']; + + $check_code = stripcslashes($_REQUEST['code_text']); + + if (is_php_code($check_code)) + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_CSS') . ' - (' . stripslashes($_REQUEST['name_file']) . ')'); + + $message = $AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_ERR'); + $header = $AVE_Template->get_config_vars('TEMPLATES_ERROR'); + $theme = 'error'; + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + + header('Location:index.php?do=templates'); + exit; + } + + $result = file_put_contents($dir, trim($check_code)); + + if ($result === false) + { + $message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_ERR_FILE'); + $header = $AVE_Template->get_config_vars('TEMPLATES_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_FILE'); + $header = $AVE_Template->get_config_vars('TEMPLATES_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_FILE') . ' - (' . stripslashes($dir) . ')'); + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + else + { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=templates&cp=' . SESSION); + } + + exit; + + case 'delete': + + $file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/css/'. $_REQUEST['name_file']; + + if (! is_file($file)) + return false; + + if (@unlink($file)) + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_OK') . ' ('.basename($_REQUEST['name_file']).')'); + } + else + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_ER') . ' ('.basename($_REQUEST['name_file']).')'); + } + + header('Location:index.php?do=templates&cp=' . SESSION); + exit; + + default: + $dir = BASE_DIR.'/templates/'.DEFAULT_THEME_FOLDER.'/css/'.stripslashes($_REQUEST['name_file']); + $code_text = file_get_contents($dir); + $formaction = "index.php?do=templates&action=edit_css&sub=save&name_file=".stripslashes($_REQUEST['name_file']); + $AVE_Template->assign('formaction', $formaction); + $AVE_Template->assign('code_text', $code_text); + break; + } + + $AVE_Template->assign('content', $AVE_Template->fetch('templates/edit_css.tpl')); + } + + + public static function templatesEditJs() + { + global $AVE_Template; + + $_REQUEST['sub'] = (! isset($_REQUEST['sub'])) + ? '' + : $_REQUEST['sub']; + + switch ($_REQUEST['sub']) + { + case 'save': + $dir = BASE_DIR.'/templates/'.DEFAULT_THEME_FOLDER.'/js/'.$_REQUEST['name_file']; + + $check_code = stripcslashes($_REQUEST['code_text']); + + if (is_php_code($check_code)) + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_JS') . ' - (' . stripslashes($_REQUEST['name_file']) . ')'); + + $message = $AVE_Template->get_config_vars('TEMPLATES_REPORT_PHP_ERR'); + $header = $AVE_Template->get_config_vars('TEMPLATES_ERROR'); + $theme = 'error'; + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + exit; + } + + header('Location:index.php?do=templates'); + exit; + } + + $result = file_put_contents($dir, trim($check_code)); + + if ($result === false) + { + $message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_ERR_FILE'); + $header = $AVE_Template->get_config_vars('TEMPLATES_ERROR'); + $theme = 'error'; + } + else + { + $message = $AVE_Template->get_config_vars('TEMPLATES_SAVED_FILE'); + $header = $AVE_Template->get_config_vars('TEMPLATES_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_FILE') . ' - (' . stripslashes($dir) . ')'); + } + + if (isAjax()) + { + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } + else + { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=templates&cp=' . SESSION); + } + exit; + + case 'delete': + + $file = BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/js/'. $_REQUEST['name_file']; + + if (! is_file($file)) + return false; + + if (@unlink($file)) + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_OK') . ' ('.basename($_REQUEST['name_file']).')'); + } + else + { + reportLog($AVE_Template->get_config_vars('TEMPLATES_REPORT_DEL_ER') . ' ('.basename($_REQUEST['name_file']).')'); + } + + header('Location:index.php?do=templates&cp=' . SESSION); + exit; + + + default: + $dir = BASE_DIR.'/templates/'.DEFAULT_THEME_FOLDER.'/js/'.stripslashes($_REQUEST['name_file']); + $code_text = file_get_contents($dir); + $formaction = "index.php?do=templates&action=edit_js&sub=save&name_file=".stripslashes($_REQUEST['name_file']); + $AVE_Template->assign('formaction', $formaction); + $AVE_Template->assign('code_text', $code_text); + break; + } + + $AVE_Template->assign('content', $AVE_Template->fetch('templates/edit_js.tpl')); + } + } +?> \ No newline at end of file diff --git a/class/class.thumbnail.php b/class/class.thumbnail.php new file mode 100644 index 0000000..43eadb4 --- /dev/null +++ b/class/class.thumbnail.php @@ -0,0 +1,1425 @@ + + * + * 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 2 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.. + * + * The latest version of Image_Toolbox can be obtained from: + * http://sourceforge.net/projects/image-toolbox + * http://www.phpclasses.org/image_toolbox + * + * @author Martin Theimer + * @copyright Copyright (C) 2003 Martin Theimer + * @version 1.1.0 + * @package Image_Toolbox + * @link http://sourceforge.net/projects/image-toolbox + */ + +// $Id: Image_Toolbox.class.php,v 1.9 2003/12/05 19:34:01 pappkamerad Exp $ + +if (!defined('IMAGE_TOOLBOX_DEFAULT_PNG_QUALITY')) { + define('IMAGE_TOOLBOX_DEFAULT_PNG_QUALITY', 3); +} +if (!defined('IMAGE_TOOLBOX_DEFAULT_JPEG_QUALITY')) { + define('IMAGE_TOOLBOX_DEFAULT_JPEG_QUALITY', 90); +} +if (!defined('IMAGE_TOOLBOX_DEFAULT_8BIT_COLORS')) { + define('IMAGE_TOOLBOX_DEFAULT_8BIT_COLORS', 256); +} +if (!defined('IMAGE_TOOLBOX_BIAS_HORIZONTAL')) { + define('IMAGE_TOOLBOX_BIAS_HORIZONTAL', 1); +} +if (!defined('IMAGE_TOOLBOX_BIAS_VERTICAL')) { + define('IMAGE_TOOLBOX_BIAS_VERTICAL', 0); +} +if (!defined('IMAGE_TOOLBOX_BLEND_COPY')) { + define('IMAGE_TOOLBOX_BLEND_COPY', 1); +} +if (!defined('IMAGE_TOOLBOX_BLEND_MULTIPLY')) { + define('IMAGE_TOOLBOX_BLEND_MULTIPLY', 2); +} +if (!defined('IMAGE_TOOLBOX_BLEND_SCREEN')) { + define('IMAGE_TOOLBOX_BLEND_SCREEN', 3); +} +if (!defined('IMAGE_TOOLBOX_BLEND_DIFFERENCE')) { + define('IMAGE_TOOLBOX_BLEND_DIFFERENCE', 4); +} +if (!defined('IMAGE_TOOLBOX_BLEND_NEGATION')) { + define('IMAGE_TOOLBOX_BLEND_NEGATION', 5); +} +if (!defined('IMAGE_TOOLBOX_BLEND_EXCLUSION')) { + define('IMAGE_TOOLBOX_BLEND_EXCLUSION', 6); +} +if (!defined('IMAGE_TOOLBOX_BLEND_OVERLAY')) { + define('IMAGE_TOOLBOX_BLEND_OVERLAY', 7); +} + +/** + * PHP image manipulation class + * + * This class provides an easy to use library to the PHP GD-based imagefunctions + * + * @author Martin Theimer + * @copyright 2003, Martin Theimer + * @package Image_Toolbox + * @link http://sourceforge.net/projects/image-toolbox + * @version 1.1.0 + */ +class Image_Toolbox { + + /** + * The prefix for every error message + * + * @access private + * @var string + */ + var $_error_prefix = 'Image: '; + + /** + * Defines imagetypes and how they are supported by the server + * + * @access private + * @var array + */ + var $_types = array ( + 1 => array ( + 'ext' => 'gif', + 'mime' => 'image/gif', + 'supported' => 0 + ), + 2 => array ( + 'ext' => 'jpg', + 'mime' => 'image/jpeg', + 'supported' => 0 + ), + 3 => array ( + 'ext' => 'png', + 'mime' => 'image/png', + 'supported' => 0 + ) + ); + + /** + * Which PHP image resize function to be used + * imagecopyresampled only supported with GD >= 2.0 + * + * @access private + * @var string + */ + var $_resize_function = 'imagecopyresampled'; + + /** + * Stores all image resource data + * + * @access private + * @var array + */ + var $_img = array ( + 'main' => array ( + 'resource' => 0, + 'width' => 0, + 'height' => 0, + 'bias' => 0, + 'aspectratio' => 0, + 'type' => 0, + 'output_type' => 0, + 'indexedcolors' => 0, + 'color' => -1 + ) + ); + + /** + * Which PHP image create function to be used + * imagecreatetruecolor only supported with GD >= 2.0 + * + * @access private + * @var string + */ + var $_imagecreatefunction = ''; + + /** + * The class constructor. + * + * Determines the image features of the server and sets the according values.
      + * Additionally you can specify a image to be created/loaded. like {@link addImage() addImage}. + * + * If no parameter is given, no image resource will be generated
      + * Or:
      + * string $file imagefile to load
      + * Or:
      + * integer $width imagewidth of new image to be created
      + * integer $height imageheight of new image to be created
      + * string $fillcolor optional fill the new image with this color (hexformat, e.g. '#FF0000')
      + */ + function Image_Toolbox() { + $args = func_get_args(); + $argc = func_num_args(); + + //get GD information. see what types we can handle + $gd_info = function_exists('gd_info') ? gd_info() : $this->_gd_info(); + preg_match('/\A[\D]*([\d+\.]*)[\D]*\Z/', $gd_info['GD Version'], $matches); + list($this->_gd_version_string, $this->_gd_version_number) = $matches; + $this->_gd_version = substr($this->_gd_version_number, 0, strpos($this->_gd_version_number, '.')); + if ($this->_gd_version >= 2) { + $this->_imagecreatefunction = 'imagecreatetruecolor'; + $this->_resize_function = 'imagecopyresampled'; + } else { + $this->_imagecreatefunction = 'imagecreate'; + $this->_resize_function = 'imagecopyresized'; + } + + $this->_gd_ttf = $gd_info['FreeType Support']; + $this->_gd_ps = $gd_info['T1Lib Support']; + if ($gd_info['GIF Read Support']) { + $this->_types[1]['supported'] = 1; + if ($gd_info['GIF Create Support']) { + $this->_types[1]['supported'] = 2; + } + } + if ((isset($gd_info['JPG Support']) && $gd_info['JPG Support']) || (isset($gd_info['JPEG Support']) && $gd_info['JPEG Support'])) { + $this->_types[2]['supported'] = 2; + } + if ($gd_info['PNG Support']) { + $this->_types[3]['supported'] = 2; + } + + //load or create main image + if ($argc == 0) { + return true; + } else { + if ($this->_addImage($argc, $args)) { + foreach ($this->_img['operator'] as $key => $value) { + $this->_img['main'][$key] = $value; + } + $this->_img['main']['output_type'] = $this->_img['main']['type']; + unset($this->_img['operator']); + return true; + } else { + trigger_error($this->_error_prefix . 'No appropriate constructor found.', E_USER_ERROR); + return null; + } + } + } + + /** + * Returns an assocative array with information about the image features of this server + * + * Array values: + *
        + *
      • 'gd_version' -> what GD version is installed on this server (e.g. 2.0)
      • + *
      • 'gif' -> 0 = not supported, 1 = reading is supported, 2 = creating is supported
      • + *
      • 'jpg' -> 0 = not supported, 1 = reading is supported, 2 = creating is supported
      • + *
      • 'png' -> 0 = not supported, 1 = reading is supported, 2 = creating is supported
      • + *
      • 'ttf' -> TTF text creation. true = supported, false = not supported + *
      + * + * @return array + */ + function getServerFeatures() { + $features = array(); + $features['gd_version'] = $this->_gd_version_number; + $features['gif'] = $this->_types[1]['supported']; + $features['jpg'] = $this->_types[2]['supported']; + $features['png'] = $this->_types[3]['supported']; + $features['ttf'] = $this->_gd_ttf; + return $features; + } + + /** + * Flush all image resources and init a new one + * + * Parameter:
      + * string $file imagefile to load
      + * Or:
      + * integer $width imagewidth of new image to be created
      + * integer $height imageheight of new image to be created
      + * string $fillcolor optional fill the new image with this color (hexformat, e.g. '#FF0000')
      + */ + function newImage() { + $args = func_get_args(); + $argc = func_num_args(); + + if ($this->_addImage($argc, $args)) { + foreach ($this->_img['operator'] as $key => $value) { + $this->_img['main'][$key] = $value; + } + $this->_img['main']['output_type'] = $this->_img['main']['type']; + unset($this->_img['operator']); + return true; + } else { + trigger_error($this->_error_prefix . 'No appropriate constructor found.', E_USER_ERROR); + return null; + } + } + + /** + * Reimplements the original PHP {@link gd_info()} function for older PHP versions + * + * @access private + * @return array associative array with info about the GD library of the server + */ + function _gd_info() { + $array = array( + "GD Version" => "", + "FreeType Support" => false, + "FreeType Linkage" => "", + "T1Lib Support" => false, + "GIF Read Support" => false, + "GIF Create Support" => false, + "JPG Support" => false, + "PNG Support" => false, + "WBMP Support" => false, + "XBM Support" => false + ); + + $gif_support = 0; + ob_start(); + eval("phpinfo();"); + $info = ob_get_contents(); + ob_end_clean(); + + foreach(explode("\n", $info) as $line) { + if(strpos($line, "GD Version") !== false) + $array["GD Version"] = trim(str_replace("GD Version", "", strip_tags($line))); + if(strpos($line, "FreeType Support") !== false) + $array["FreeType Support"] = trim(str_replace("FreeType Support", "", strip_tags($line))); + if(strpos($line, "FreeType Linkage") !== false) + $array["FreeType Linkage"] = trim(str_replace("FreeType Linkage", "", strip_tags($line))); + if(strpos($line, "T1Lib Support") !== false) + $array["T1Lib Support"] = trim(str_replace("T1Lib Support", "", strip_tags($line))); + if(strpos($line, "GIF Read Support") !== false) + $array["GIF Read Support"] = trim(str_replace("GIF Read Support", "", strip_tags($line))); + if(strpos($line, "GIF Create Support") !== false) + $array["GIF Create Support"] = trim(str_replace("GIF Create Support", "", strip_tags($line))); + if(strpos($line, "GIF Support") !== false) + $gif_support = trim(str_replace("GIF Support", "", strip_tags($line))); + if(strpos($line, "JPG Support") !== false) + $array["JPG Support"] = trim(str_replace("JPG Support", "", strip_tags($line))); + if(strpos($line, "PNG Support") !== false) + $array["PNG Support"] = trim(str_replace("PNG Support", "", strip_tags($line))); + if(strpos($line, "WBMP Support") !== false) + $array["WBMP Support"] = trim(str_replace("WBMP Support", "", strip_tags($line))); + if(strpos($line, "XBM Support") !== false) + $array["XBM Support"] = trim(str_replace("XBM Support", "", strip_tags($line))); + } + + if($gif_support === "enabled") { + $array["GIF Read Support"] = true; + $array["GIF Create Support"] = true; + } + + if($array["FreeType Support"] === "enabled") { + $array["FreeType Support"] = true; + } + + if($array["T1Lib Support"] === "enabled") { + $array["T1Lib Support"] = true; + } + + if($array["GIF Read Support"] === "enabled") { + $array["GIF Read Support"] = true; + } + + if($array["GIF Create Support"] === "enabled") { + $array["GIF Create Support"] = true; + } + + if($array["JPG Support"] === "enabled") { + $array["JPG Support"] = true; + } + + if($array["PNG Support"] === "enabled") { + $array["PNG Support"] = true; + } + + if($array["WBMP Support"] === "enabled") { + $array["WBMP Support"] = true; + } + + if($array["XBM Support"] === "enabled") { + $array["XBM Support"] = true; + } + + return $array; + } + + /** + * Convert a color defined in hexvalues to the PHP color format + * + * @access private + * @param string $hex color value in hexformat (e.g. '#FF0000') + * @return integer color value in PHP format + */ + function _hexToPHPColor($hex) { + $length = strlen($hex); + $dr = hexdec(substr($hex, $length - 6, 2)); + $dg = hexdec(substr($hex, $length - 4, 2)); + $db = hexdec(substr($hex, $length - 2, 2)); + $color = ($dr << 16) + ($dg << 8) + $db; + return $color; + } + + /** + * Convert a color defined in hexvalues to corresponding dezimal values + * + * @access private + * @param string $hex color value in hexformat (e.g. '#FF0000') + * @return array associative array with color values in dezimal format (fields: 'red', 'green', 'blue') + */ + function _hexToDecColor($hex) { + $length = strlen($hex); + $color['red'] = hexdec(substr($hex, $length - 6, 2)); + $color['green'] = hexdec(substr($hex, $length - 4, 2)); + $color['blue'] = hexdec(substr($hex, $length - 2, 2)); + return $color; + } + + /** + * Generate a new image resource based on the given parameters + * + * Parameter: + * string $file imagefile to load
      + * Or:
      + * integer $width imagewidth of new image to be created
      + * integer $height imageheight of new image to be created
      + * string $fillcolor optional fill the new image with this color (hexformat, e.g. '#FF0000')
      + * + * @access private + */ + function _addImage($argc, $args) { + if (($argc == 2 || $argc == 3) && is_int($args[0]) && is_int($args[1]) && (is_string($args[2]) || !isset($args[2]))) { + //neues leeres bild mit width und height (fillcolor optional) + $this->_img['operator']['width'] = $args[0]; + $this->_img['operator']['height'] = $args[1]; + ($this->_img['operator']['width'] >= $this->_img['operator']['height']) ? ($this->_img['operator']['bias'] = IMAGE_TOOLBOX_BIAS_HORIZONTAL) : ($this->_img['operator']['bias'] = IMAGE_TOOLBOX_BIAS_VERTICAL); + $this->_img['operator']['aspectratio'] = $this->_img['operator']['width'] / $this->_img['operator']['height']; + $this->_img['operator']['indexedcolors'] = 0; + $functionname = $this->_imagecreatefunction; + $this->_img['operator']['resource'] = $functionname($this->_img['operator']['width'], $this->_img['operator']['height']); + // set default type jpg. + $this->_img['operator']['type'] = 2; + if (isset($args[2]) && is_string($args[2])) { + //neues bild mit farbe fЃllen + $fillcolor = $this->_hexToPHPColor($args[2]); + imagefill($this->_img['operator']['resource'], 0, 0, $fillcolor); + $this->_img['operator']['color'] = $fillcolor; + } else { + $this->_img['operator']['color'] = 0; + } + } elseif ($argc == 1 && is_string($args[0])) { + //bild aus datei laden. width und height original gr”sse + $this->_img['operator'] = $this->_loadFile($args[0]); + $this->_img['operator']['indexedcolors'] = imagecolorstotal($this->_img['operator']['resource']); + $this->_img['operator']['color'] = -1; + } else { + return false; + } + return true; + } + + /** + * Loads a image file + * + * @access private + * @param string $filename imagefile to load + * @return array associative array with the loaded filedata + */ + function _loadFile($filename) { + if (file_exists($filename)) { + $info = getimagesize($filename); + $filedata['width'] = $info[0]; + $filedata['height'] = $info[1]; + ($filedata['width'] >= $filedata['height']) ? ($filedata['bias'] = IMAGE_TOOLBOX_BIAS_HORIZONTAL) : ($filedata['bias'] = IMAGE_TOOLBOX_BIAS_VERTICAL); + $filedata['aspectratio'] = $filedata['width'] / $filedata['height']; + $filedata['type'] = $info[2]; + + if ($this->_types[$filedata['type']]['supported'] < 1) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$filedata['type']]['ext'].') not supported for reading.', E_USER_ERROR); + return null; + } + switch ($filedata['type']) { + case 1: + $dummy = imagecreatefromgif($filename); + $functionname = $this->_imagecreatefunction; + $filedata['resource'] = $functionname($filedata['width'], $filedata['height']); + imagecopy($filedata['resource'], $dummy, 0, 0, 0, 0, $filedata['width'], $filedata['height']); + imagedestroy($dummy); + break; + + case 2: + $filedata['resource'] = imagecreatefromjpeg($filename); + break; + + case 3: + $dummy = imagecreatefrompng($filename); + if (imagecolorstotal($dummy) != 0) { + $functionname = $this->_imagecreatefunction; + $filedata['resource'] = $functionname($filedata['width'], $filedata['height']); + imagecopy($filedata['resource'], $dummy, 0, 0, 0, 0, $filedata['width'], $filedata['height']); + } else { + $filedata['resource'] = $dummy; + } + unset($dummy); + break; + + default: + trigger_error($this->_error_prefix . 'Imagetype not supported.', E_USER_ERROR); + return null; + } + return $filedata; + } else { + trigger_error($this->_error_prefix . 'Imagefile (' . $filename . ') does not exist.', E_USER_ERROR); + return null; + } + } + + /** + * Output a image to the browser + * + * $output_type can be one of the following:
      + *
        + *
      • 'gif' -> gif image (if supported) (8-bit indexed colors)
      • + *
      • 'png' -> png image (if supported) (truecolor)
      • + *
      • 'png8' -> png image (if supported) (8-bit indexed colors)
      • + *
      • 'jpg' -> jpeg image (if supported) (truecolor)
      • + *
      + * (default: same as original) + * + * $dither:
      + * If this is true than dither is used on the conversion from truecolor to 8-bit indexed imageformats (png8, gif)
      + * (default = false) + * + * @param string|integer $output_type type of outputted image + * @param integer $output_quality jpeg quality of outputted image (default: IMAGE_TOOLBOX_DEFAULT_JPEG_QUALITY) + * @param bool $dither use dither + * @return bool true on success, otherwise false + */ + function output($output_type = false, $output_quality = false, $dither = false) { + if ($output_type === false) { + $output_type = $this->_img['main']['output_type']; + } + switch ($output_type) { + case 1: + case 'gif': + case 'GIF': + if ($this->_types[1]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + header ('Content-type: ' . $this->_types[$output_type]['mime']); + if ($this->_gd_version >= 2) { + if ($this->_img['main']['indexedcolors'] == 0) { + $dummy = imagecreatetruecolor($this->_img['main']['width'], $this->_img['main']['height']); + imagecopy($dummy, $this->_img['main']['resource'], 0, 0, 0, 0, $this->_img['main']['width'], $this->_img['main']['height']); + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_8BIT_COLORS; + } + imagetruecolortopalette($dummy, $dither, $output_quality); + } + imagegif($dummy); + imagedestroy($dummy); + } + else { + imagegif($this->_img['main']['resource']); + } + break; + + case 2: + case '2': + case 'jpg': + case 'jpeg': + case 'JPG': + case 'JPEG': + if ($this->_types[2]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + header ('Content-type: ' . $this->_types[$output_type]['mime']); + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_JPEG_QUALITY; + } + imagejpeg($this->_img['main']['resource'], null, $output_quality); + break; + + case 3: + case '3': + case 'png': + case 'PNG': + case 'png24': + case 'PNG24': + if ($this->_types[3]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + header ('Content-type: ' . $this->_types[$output_type]['mime']); + if (version_compare(PHP_VERSION, '5.1.2', '>=')) { + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_PNG_QUALITY; + } + imagepng($this->_img['main']['resource'], null, $output_quality); + } + else { + imagepng($this->_img['main']['resource']); + } + break; + + case 4: + case '4': + case 'png8': + case 'PNG8': + if ($this->_types[3]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + header ('Content-type: ' . $this->_types[$output_type]['mime']); + if ($this->_gd_version >= 2) { + if ($this->_img['main']['indexedcolors'] == 0) { + $dummy = imagecreatetruecolor($this->_img['main']['width'], $this->_img['main']['height']); + imagecopy($dummy, $this->_img['main']['resource'], 0, 0, 0, 0, $this->_img['main']['width'], $this->_img['main']['height']); + imagetruecolortopalette($dummy, $dither, 255); + } + if (version_compare(PHP_VERSION, '5.1.2', '>=')) { + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_PNG_QUALITY; + } + imagepng($dummy, null, $output_quality); + } + else { + imagepng($dummy); + } + imagedestroy($dummy); + } + else { + imagepng($this->_img['main']['resource']); + } + break; + + default: + trigger_error($this->_error_prefix . 'Output-Imagetype not supported.', E_USER_ERROR); + return null; + } + return true; + } + + /** + * Save a image to disk + * + * $output_type can be one of the following:
      + *
        + *
      • 'gif' -> gif image (if supported) (8-bit indexed colors)
      • + *
      • 'png' -> png image (if supported) (truecolor)
      • + *
      • 'png8' -> png image (if supported) (8-bit indexed colors)
      • + *
      • 'jpg' -> jpeg image (if supported) (truecolor)
      • + *
      + * (default: same as original) + * + * $dither:
      + * If this is true than dither is used on the conversion from truecolor to 8-bit indexed imageformats (png8, gif)
      + * (default = false) + * + * @param string $filename filename of saved image + * @param string|integer $output_type type of saved image + * @param integer $output_quality jpeg quality of saved image (default: IMAGE_TOOLBOX_DEFAULT_JPEG_QUALITY) + * @param bool $dither use dither + * @return bool true on success, otherwise false + */ + function save($filename, $output_type = false, $output_quality = false, $dither = false) { + if ($output_type === false) { + $output_type = $this->_img['main']['output_type']; + } + switch ($output_type) { + case 1: + case 'gif': + case 'GIF': + if ($this->_types[1]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + if ($this->_gd_version >= 2) { + if ($this->_img['main']['indexedcolors'] == 0) { + $dummy = imagecreatetruecolor($this->_img['main']['width'], $this->_img['main']['height']); + imagecopy($dummy, $this->_img['main']['resource'], 0, 0, 0, 0, $this->_img['main']['width'], $this->_img['main']['height']); + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_8BIT_COLORS; + } + imagetruecolortopalette($dummy, $dither, $output_quality); + } + imagegif($dummy, $filename); + imagedestroy($dummy); + } + else { + imagegif($this->_img['main']['resource']); + } + break; + + case 2: + case '2': + case 'jpg': + case 'jpeg': + case 'JPG': + case 'JPEG': + if ($this->_types[2]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_JPEG_QUALITY; + } + imagejpeg($this->_img['main']['resource'], $filename, $output_quality); + break; + + case 3: + case '3': + case 'png': + case 'PNG': + case 'png24': + case 'PNG24': + if ($this->_types[3]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + if (version_compare(PHP_VERSION, '5.1.2', '>=')) { + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_PNG_QUALITY; + } + imagepng($this->_img['main']['resource'], $filename, $output_quality); + } + else { + imagepng($this->_img['main']['resource'], $filename); + } + break; + + case 4: + case '4': + case 'png8': + case 'PNG8': + if ($this->_types[3]['supported'] < 2) { + trigger_error($this->_error_prefix . 'Imagetype ('.$this->_types[$output_type]['ext'].') not supported for creating/writing.', E_USER_ERROR); + return null; + } + if ($this->_gd_version >= 2) { + if ($this->_img['main']['indexedcolors'] == 0) { + $dummy = imagecreatetruecolor($this->_img['main']['width'], $this->_img['main']['height']); + imagecopy($dummy, $this->_img['main']['resource'], 0, 0, 0, 0, $this->_img['main']['width'], $this->_img['main']['height']); + imagetruecolortopalette($dummy, $dither, 255); + } + if (version_compare(PHP_VERSION, '5.1.2', '>=')) { + if ($output_quality === false) { + $output_quality = IMAGE_TOOLBOX_DEFAULT_PNG_QUALITY; + } + imagepng($dummy, $filename, $output_quality); + } + else { + imagepng($dummy, $filename); + } + imagedestroy($dummy); + } + else { + imagepng($this->_img['main']['resource'], $filename); + } + break; + + default: + trigger_error($this->_error_prefix . 'Output-Imagetype not supported.', E_USER_ERROR); + return null; + } + return true; + } + + /** + * Sets the resize method of choice + * + * $method can be one of the following:
      + *
        + *
      • 'resize' -> supported by every version of GD (fast but ugly resize of image)
      • + *
      • 'resample' -> only supported by GD version >= 2.0 (slower but antialiased resize of image)
      • + *
      + * + * @param string|integer $method resize method + * @return bool true on success, otherwise false + */ + function setResizeMethod($method) { + switch ($method) { + case 1: + case '1': + case 'resize': + $this->_resize_function = 'imagecopyresized'; + break; + + case 2: + case '2': + case 'resample': + if (!function_exists('imagecopyresampled')) { + // no error message. just return false. + return null; + } + $this->_resize_function = 'imagecopyresampled'; + break; + + default: + trigger_error($this->_error_prefix . 'Resizemethod not supported.', E_USER_ERROR); + return null; + } + return true; + } + + /** + * Resize the current image + * + * if $width = 0 the new width will be calculated from the $height value preserving the correct aspectratio.
      + * + * if $height = 0 the new height will be calculated from the $width value preserving the correct aspectratio.
      + * + * $mode can be one of the following:
      + *
        + *
      • 0 -> image will be resized to the new output size, regardless of the original aspectratio. (default)
      • + *
      • 1 -> image will be cropped if necessary to preserve the aspectratio and avoid image distortions.
      • + *
      • 2 -> image will be resized preserving its original aspectratio. differences to the new outputsize will be filled with $bgcolor
      • + *
      + * + * if $autorotate is set to true the given $width and $height values may "change place" if the given image bias is different from the original one.
      + * if either $width or $height is 0, the new size will be applied to either the new width or the new height based on the bias value of the original image.
      + * (default = false) + * + * @param integer $width new width of image + * @param integer $height new height of image + * @param integer $mode resize mode + * @param bool $autorotate use autorotating + * @param string $bgcolor background fillcolor (hexformat, e.g. '#FF0000') + * @return bool true on success, otherwise false + */ + function newOutputSize($width, $height, $mode = 0, $autorotate = false, $bgcolor = '#000000') { + if ($width > 0 && $height > 0 && is_int($width) && is_int($height)) { + //ignore aspectratio + if (!$mode) { + //do not crop to get correct aspectratio + ($width >= $height) ? ($this->_img['target']['bias'] = IMAGE_TOOLBOX_BIAS_HORIZONTAL) : ($this->_img['target']['bias'] = IMAGE_TOOLBOX_BIAS_VERTICAL); + if ($this->_img['main']['bias'] == $this->_img['target']['bias'] || !$autorotate) { + $this->_img['target']['width'] = $width; + $this->_img['target']['height'] = $height; + } else { + $this->_img['target']['width'] = $height; + $this->_img['target']['height'] = $width; + } + $this->_img['target']['aspectratio'] = $this->_img['target']['width'] / $this->_img['target']['height']; + + $cpy_w = $this->_img['main']['width']; + $cpy_h = $this->_img['main']['height']; + $cpy_w_offset = 0; + $cpy_h_offset = 0; + } elseif ($mode == 1) { + //crop to get correct aspectratio + ($width >= $height) ? ($this->_img['target']['bias'] = IMAGE_TOOLBOX_BIAS_HORIZONTAL) : ($this->_img['target']['bias'] = IMAGE_TOOLBOX_BIAS_VERTICAL); + if ($this->_img['main']['bias'] == $this->_img['target']['bias'] || !$autorotate) { + $this->_img['target']['width'] = $width; + $this->_img['target']['height'] = $height; + } else { + $this->_img['target']['width'] = $height; + $this->_img['target']['height'] = $width; + } + $this->_img['target']['aspectratio'] = $this->_img['target']['width'] / $this->_img['target']['height']; + + if ($this->_img['main']['width'] / $this->_img['target']['width'] >= $this->_img['main']['height'] / $this->_img['target']['height']) { + $cpy_h = $this->_img['main']['height']; + $cpy_w = (integer) $this->_img['main']['height'] * $this->_img['target']['aspectratio']; + $cpy_w_offset = (integer) ($this->_img['main']['width'] - $cpy_w) / 2; + $cpy_h_offset = 0; + } else { + $cpy_w = $this->_img['main']['width']; + $cpy_h = (integer) $this->_img['main']['width'] / $this->_img['target']['aspectratio']; + $cpy_h_offset = (integer) ($this->_img['main']['height'] - $cpy_h) / 2; + $cpy_w_offset = 0; + } + } + elseif ($mode == 2) { + //fill remaining background with a color to keep aspectratio + $final_aspectratio = $width / $height; + if ($final_aspectratio < $this->_img['main']['aspectratio']) { + $this->_img['target']['width'] = $width; + $this->_img['target']['height'] = (integer) $width / $this->_img['main']['aspectratio']; + $cpy_w_offset2 = 0; + $cpy_h_offset2 = (integer) (($height - $this->_img['target']['height']) / 2); + } + else { + $this->_img['target']['height'] = $height; + $this->_img['target']['width'] = (integer) $height * $this->_img['main']['aspectratio']; + $cpy_h_offset2 = 0; + $cpy_w_offset2 = (integer) (($width - $this->_img['target']['width']) / 2); + } + $this->_img['target']['aspectratio'] = $this->_img['main']['aspectratio']; + $cpy_w = $this->_img['main']['width']; + $cpy_h = $this->_img['main']['height']; + $cpy_w_offset = 0; + $cpy_h_offset = 0; + } + elseif ($mode == 3) { + //fill remaining background with a color to keep aspectratio + $final_aspectratio = $width / $height; + if ($final_aspectratio < $this->_img['main']['aspectratio']) { + $this->_img['target']['width'] = $width; + $this->_img['target']['height'] = (integer) $width / $this->_img['main']['aspectratio']; + $cpy_w_offset2 = 0; + $cpy_h_offset2 = (integer) (($height - $this->_img['target']['height']) / 2); + } + else { + $this->_img['target']['height'] = $height; + $this->_img['target']['width'] = (integer) $height * $this->_img['main']['aspectratio']; + $cpy_h_offset2 = 0; + $cpy_w_offset2 = 0; + } + $this->_img['target']['aspectratio'] = $this->_img['main']['aspectratio']; + $cpy_w = $this->_img['main']['width']; + $cpy_h = $this->_img['main']['height']; + $cpy_w_offset = 0; + $cpy_h_offset = 0; + } + } elseif (($width == 0 && $height > 0) || ($width > 0 && $height == 0) && is_int($width) && is_int($height)) { + //keep aspectratio + if ($autorotate == true) { + if ($this->_img['main']['bias'] == IMAGE_TOOLBOX_BIAS_HORIZONTAL && $width > 0) { + $height = $width; + $width = 0; + } elseif ($this->_img['main']['bias'] == IMAGE_TOOLBOX_BIAS_VERTICAL && $height > 0) { + $width = $height; + $height = 0; + } + } + ($width >= $height) ? ($this->_img['target']['bias'] = IMAGE_TOOLBOX_BIAS_HORIZONTAL) : ($this->_img['target']['bias'] = IMAGE_TOOLBOX_BIAS_VERTICAL); + if ($width != 0) { + $this->_img['target']['width'] = $width; + $this->_img['target']['height'] = (integer) $width / $this->_img['main']['aspectratio']; + } else { + $this->_img['target']['height'] = $height; + $this->_img['target']['width'] = (integer) $height * $this->_img['main']['aspectratio']; + } + $this->_img['target']['aspectratio'] = $this->_img['main']['aspectratio']; + + $cpy_w = $this->_img['main']['width']; + $cpy_h = $this->_img['main']['height']; + $cpy_w_offset = 0; + $cpy_h_offset = 0; + } else { + trigger_error($this->_error_prefix . 'Outputwidth and -height must be integers greater zero.', E_USER_ERROR); + return null; + } + + //create resized picture + $functionname = $this->_imagecreatefunction; + $dummy = $functionname($this->_img['target']['width'] + 1, $this->_img['target']['height'] + 1); + if ($this->_img['main']['type'] == 3) { + imagealphablending($dummy, false); + imagesavealpha($dummy, true); + } + $resize_function = $this->_resize_function; + $resize_function($dummy, $this->_img["main"]["resource"], 0, 0, $cpy_w_offset, $cpy_h_offset, $this->_img["target"]["width"], $this->_img["target"]["height"], $cpy_w, $cpy_h); + if ($mode == 2) { + $this->_img['target']['resource'] = $functionname($width, $height); + $fillcolor = $this->_hexToPHPColor($bgcolor); + imagefill($this->_img['target']['resource'], 0, 0, $fillcolor); + } else { + $this->_img['target']['resource'] = $functionname($this->_img['target']['width'], $this->_img['target']['height']); + $cpy_w_offset2 = 0; + $cpy_h_offset2 = 0; + } + if ($this->_img['main']['type'] == 3) { + imagealphablending($this->_img['target']['resource'], false); + imagesavealpha($this->_img['target']['resource'], true); + } + imagecopy($this->_img['target']['resource'], $dummy, $cpy_w_offset2, $cpy_h_offset2, 0, 0, $this->_img['target']['width'], $this->_img['target']['height']); + imagedestroy($dummy); + + if ($mode == 2) { + $this->_img['target']['width'] = $width; + $this->_img['target']['height'] = $height; + } + //update _img['main'] with new data + foreach ($this->_img['target'] as $key => $value) { + $this->_img['main'][$key] = $value; + } + unset ($this->_img['target']); + + return true; + } + + /** + * Adds a new image resource based on the given parameters. + * + * It does not overwrite the existing image resource.
      + * Instead it is used to load a second image to merge with the existing image. + * + * Parameter:
      + * string $file imagefile to load
      + * Or:
      + * integer $width imagewidth of new image to be created
      + * integer $height imageheight of new image to be created
      + * string $fillcolor optional fill the new image with this color (hexformat, e.g. '#FF0000')
      + */ + function addImage() { + $args = func_get_args(); + $argc = func_num_args(); + + if ($this->_addImage($argc, $args)) { + return true; + } else { + trigger_error($this->_error_prefix . 'failed to add image.', E_USER_ERROR); + return false; + } + } + + /** + * Blend two images. + * + * Original image and the image loaded with {@link addImage() addImage}
      + * NOTE: This operation can take very long and is not intended for realtime use. + * (but of course depends on the power of your server :) ) + * + * IMPORTANT: {@link imagecopymerge() imagecopymerged} doesn't work with PHP 4.3.2. Bug ID: {@link http://bugs.php.net/bug.php?id=24816 24816}
      + * + * $x:
      + * negative values are possible.
      + * You can also use the following keywords ('left', 'center' or 'middle', 'right').
      + * Additionally you can specify an offset in pixel with the keywords like this 'left +10'.
      + * (default = 0) + * + * $y:
      + * negative values are possible.
      + * You can also use the following keywords ('top', 'center' or 'middle', 'bottom').
      + * Additionally you can specify an offset in pixel with the keywords like this 'bottom -10'.
      + * (default = 0) + * + * Possible values for $mode: + *
        + *
      • IMAGE_TOOLBOX_BLEND_COPY
      • + *
      • IMAGE_TOOLBOX_BLEND_MULTIPLY
      • + *
      • IMAGE_TOOLBOX_BLEND_SCREEN
      • + *
      • IMAGE_TOOLBOX_BLEND_DIFFERENCE
      • + *
      • IMAGE_TOOLBOX_BLEND_EXCLUSION
      • + *
      • IMAGE_TOOLBOX_BLEND_OVERLAY
      • + *
      + * + * $percent:
      + * alpha value in percent of blend effect (0 - 100)
      + * (default = 100) + * + * @param string|integer $x Horizontal position of second image. + * @param integer $y Vertical position of second image. negative values are possible. + * @param integer $mode blend mode. + * @param integer $percent alpha value + */ + function blend($x = 0, $y = 0, $mode = IMAGE_TOOLBOX_BLEND_COPY, $percent = 100) { + if (is_string($x) || is_string($y)) { + list($xalign, $xalign_offset) = explode(" ", $x); + list($yalign, $yalign_offset) = explode(" ", $y); + } + if (is_string($x)) { + switch ($xalign) { + case 'left': + $dst_x = 0 + $xalign_offset; + $src_x = 0; + $src_w = $this->_img['operator']['width']; + break; + + case 'right': + $dst_x = ($this->_img['main']['width'] - $this->_img['operator']['width']) + $xalign_offset; + $src_x = 0; + $src_w = $this->_img['operator']['width']; + break; + + case 'middle': + case 'center': + $dst_x = (($this->_img['main']['width'] / 2) - ($this->_img['operator']['width'] / 2)) + $yalign_offset; + $src_x = 0; + $src_w = $this->_img['operator']['width']; + break; + } + } else { + if ($x >= 0) { + $dst_x = $x; + $src_x = 0; + $src_w = $this->_img['operator']['width']; + } else { + $dst_x = 0; + $src_x = abs($x); + $src_w = $this->_img['operator']['width'] - $src_x; + } + } + if (is_string($y)) { + switch ($yalign) { + case 'top': + $dst_y = 0 + $yalign_offset; + $src_y = 0; + $src_h = $this->_img['operator']['height']; + break; + + case 'bottom': + $dst_y = ($this->_img['main']['height'] - $this->_img['operator']['height']) + $yalign_offset; + $src_y = 0; + $src_h = $this->_img['operator']['height']; + break; + + case 'middle': + case 'center': + $dst_y = (($this->_img['main']['height'] / 2) - ($this->_img['operator']['height'] / 2)) + $yalign_offset; + $src_y = 0; + $src_h = $this->_img['operator']['height']; + break; + } + } else { + if ($y >= 0) { + $dst_y = $y; + $src_y = 0; + $src_h = $this->_img['operator']['height']; + } else { + $dst_y = 0; + $src_y = abs($y); + $src_h = $this->_img['operator']['height'] - $src_y; + } + } + + if(($xalign == 'repeat') && ($yalign == 'repeat')){ + + $xLogoPosition = 0; + $yLogoPosition = 0; + + $widthWatermark = $this->_img['operator']['width']; + $heightWatermark = $this->_img['operator']['height']; + $widthPhoto = $this->_img['main']['width']; + $heightPhoto = $this->_img['main']['height']; + + // x line + $__xRepeat = ceil($widthPhoto / $widthWatermark); + for ($i = 0; $i <= $__xRepeat; $i++) { + $this->_imagecopymerge_alpha($this->_img['main']['resource'], $this->_img['operator']['resource'], ($xLogoPosition + $widthWatermark * $i), $yLogoPosition, 0, 0, ImageSX($this->_img['operator']['resource']), ImageSY($this->_img['operator']['resource']), $percent); + + // y line + $__yRepeat = ceil($heightPhoto / $heightWatermark); + for ($ii = 1; $ii <= $__yRepeat; $ii++) { + $this->_imagecopymerge_alpha($this->_img['main']['resource'], $this->_img['operator']['resource'], ($xLogoPosition + $widthWatermark * $i), ($yLogoPosition + $widthWatermark * $ii), 0, 0, ImageSX($this->_img['operator']['resource']), ImageSY($this->_img['operator']['resource']), $percent); + } + } + + }else{ + + $this->_imageBlend($mode, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $percent); + + } + + return true; + } + + /* + * PNG ALPHA CHANNEL SUPPORT for imagecopymerge(); + * This is a function like imagecopymerge but it handle alpha channel well!!! + */ + private function _imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){ + + $opacity = $pct; + + // creating a cut resource + $cut = imagecreatetruecolor($src_w, $src_h); + + // copying that section of the background to the cut + imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); + + // placing the watermark now + imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); + + imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity); + } + + /** + * Blend two images. + * + * @access private + */ + function _imageBlend($mode, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $percent) { + if ($mode == IMAGE_TOOLBOX_BLEND_COPY) { + if ($percent == 100) { + imagecopy($this->_img['main']['resource'], $this->_img['operator']['resource'], $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h); + } else { + $this->_imagecopymerge_alpha($this->_img['main']['resource'], $this->_img['operator']['resource'], $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $percent); + } + } else { + $functionname = $this->_imagecreatefunction; + $dummy = $functionname($src_w, $src_h); + for ($y=0; $y < $src_h; $y++) { + for ($x=0; $x < $src_w; $x++) { + $colorindex = imagecolorat($this->_img['main']['resource'], $dst_x + $x, $dst_y + $y); + $colorrgb1 = imagecolorsforindex($this->_img['main']['resource'], $colorindex); + $colorindex = imagecolorat($this->_img['operator']['resource'], $src_x + $x, $src_y + $y); + $colorrgb2 = imagecolorsforindex($this->_img['operator']['resource'], $colorindex); + $colorblend = $this->_calculateBlendvalue($mode, $colorrgb1, $colorrgb2); + $newcolor = imagecolorallocate($dummy, $colorblend['red'], $colorblend['green'], $colorblend['blue']); + imagesetpixel($dummy, $x, $y, $newcolor); + } + } + + $this->_img['target']['resource'] = $functionname($this->_img['main']['width'], $this->_img['main']['height']); + imagecopy($this->_img['target']['resource'], $this->_img['main']['resource'], 0, 0, 0, 0, $this->_img['main']['width'], $this->_img['main']['height']); + imagecopymerge($this->_img['target']['resource'], $dummy, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $percent); + + $this->_img['main']['resource'] = $this->_img['target']['resource']; + unset($this->_img['target']); + } + } + + /** + * Calculate blend values for given blend mode + * + * @access private + */ + function _calculateBlendvalue($mode, $colorrgb1, $colorrgb2) { + switch ($mode) { + case IMAGE_TOOLBOX_BLEND_MULTIPLY: + $c['red'] = ($colorrgb1['red'] * $colorrgb2['red']) >> 8; + $c['green'] = ($colorrgb1['green'] * $colorrgb2['green']) >> 8; + $c['blue'] = ($colorrgb1['blue'] * $colorrgb2['blue']) >> 8; + break; + + case IMAGE_TOOLBOX_BLEND_SCREEN: + $c['red'] = 255 - ((255 - $colorrgb1['red']) * (255 - $colorrgb2['red']) >> 8); + $c['green'] = 255 - ((255 - $colorrgb1['green']) * (255 - $colorrgb2['green']) >> 8); + $c['blue'] = 255 - ((255 - $colorrgb1['blue']) * (255 - $colorrgb2['blue']) >> 8); + break; + + case IMAGE_TOOLBOX_BLEND_DIFFERENCE: + $c['red'] = abs($colorrgb1['red'] - $colorrgb2['red']); + $c['green'] = abs($colorrgb1['green'] - $colorrgb2['green']); + $c['blue'] = abs($colorrgb1['blue'] - $colorrgb2['blue']); + break; + + case IMAGE_TOOLBOX_BLEND_NEGATION: + $c['red'] = 255 - abs(255 - $colorrgb1['red'] - $colorrgb2['red']); + $c['green'] = 255 - abs(255 - $colorrgb1['green'] - $colorrgb2['green']); + $c['blue'] = 255 - abs(255 - $colorrgb1['blue'] - $colorrgb2['blue']); + break; + + case IMAGE_TOOLBOX_BLEND_EXCLUSION: + $c['red'] = $colorrgb1['red'] + $colorrgb2['red'] - (($colorrgb1['red'] * $colorrgb2['red']) >> 7); + $c['green'] = $colorrgb1['green'] + $colorrgb2['green'] - (($colorrgb1['green'] * $colorrgb2['green']) >> 7); + $c['blue'] = $colorrgb1['blue'] + $colorrgb2['blue'] - (($colorrgb1['blue'] * $colorrgb2['blue']) >> 7); + break; + + case IMAGE_TOOLBOX_BLEND_OVERLAY: + if ($colorrgb1['red'] < 128) { + $c['red']= ($colorrgb1['red'] * $colorrgb2['red']) >> 7; + } else { + $c['red'] = 255 - ((255 - $colorrgb1['red']) * (255 - $colorrgb2['red']) >> 7); + } + if ($colorrgb1['green'] < 128) { + $c['green'] = ($colorrgb1['green'] * $colorrgb2['green']) >> 7; + } else { + $c['green'] = 255 - ((255 - $colorrgb1['green']) * (255 - $colorrgb2['green']) >> 7); + } + if ($colorrgb1['blue'] < 128) { + $c['blue'] = ($colorrgb1['blue'] * $colorrgb2['blue']) >> 7; + } else { + $c['blue'] = 255 - ((255 - $colorrgb1['blue']) * (255 - $colorrgb2['blue']) >> 7); + } + break; + + default: + break; + } + return $c; + } + + /** + * convert iso character coding to unicode (PHP conform) + * needed for TTF text generation of special characters (Latin-2) + * + * @access private + */ + function _iso2uni($isoline) { + $iso2uni = array( + 173 => "¡", + 155 => "¢", + 156 => "£", + 15 => "¤", + 157 => "¥", + 124 => "¦", + 21 => "§", + 249 => "¨", + 184 => "©", + 166 => "ª", + 174 => "«", + 170 => "¬", + 169 => "®", + 238 => "¯", + 248 => "°", + 241 => "±", + 253 => "²", + 252 => "³", + 239 => "´", + 230 => "µ", + 20 => "¶", + 250 => "·", + 247 => "¸", + 251 => "¹", + 167 => "º", + 175 => "»", + 172 => "¼", + 171 => "½", + 243 => "¾", + 168 => "¿", + 183 => "À", + 181 => "Á", + 182 => "Â", + 199 => "Ã", + 142 => "Ä", + 143 => "Å", + 146 => "Æ", + 128 => "Ç", + 212 => "È", + 144 => "É", + 210 => "Ê", + 211 => "Ë", + 141 => "Ì", + 161 => "Í", + 140 => "Î", + 139 => "Ï", + 209 => "Ð", + 165 => "Ñ", + 227 => "Ò", + 224 => "Ó", + 226 => "Ô", + 229 => "Õ", + 153 => "Ö", + 158 => "×", + 157 => "Ø", + 235 => "Ù", + 233 => "Ú", + 234 => "Û", + 154 => "Ü", + 237 => "Ý", + 232 => "Þ", + 225 => "ß", + 133 => "à", + 160 => "á", + 131 => "â", + 198 => "ã", + 132 => "ä", + 134 => "å", + 145 => "æ", + 135 => "ç", + 138 => "è", + 130 => "é", + 136 => "ê", + 137 => "ë", + 141 => "ì", + 161 => "í", + 140 => "î", + 139 => "ï", + 208 => "ð", + 164 => "ñ", + 149 => "ò", + 162 => "ó", + 147 => "ô", + 228 => "õ", + 148 => "ö", + 246 => "÷", + 155 => "ø", + 151 => "ù", + 163 => "ú", + 150 => "û", + 129 => "ü", + 236 => "ý", + 231 => "þ", + 152 => "ÿ" + ); + $uniline = ''; + $len = strlen($isoline); + for ($i=0; $i < $len; $i++){ + $thischar = substr($isoline, $i, 1); + $key = ord($thischar); + $uniline .= isset($iso2uni[$key]) ? $iso2uni[$key] : $thischar; + } + return $uniline; + } + + /** + * Writes text over the image + * + * only TTF fonts are supported at the moment + * + * $x:
      + * You can also use the following keywords ('left', 'center' or 'middle', 'right').
      + * Additionally you can specify an offset in pixel with the keywords like this 'left +10'.
      + * (default = 0) + * + * $y:
      + * You can also use the following keywords ('top', 'center' or 'middle', 'bottom').
      + * Additionally you can specify an offset in pixel with the keywords like this 'bottom -10'.
      + * (default = 0) + * + * @param string $text text to be generated. + * @param string $font TTF fontfile to be used. (relative paths are ok). + * @param integer $size textsize. + * @param string $color textcolor in hexformat (e.g. '#FF0000'). + * @param string|integer $x horizontal postion in pixel. + * @param string|integer $y vertical postion in pixel. + * @param integer $angle rotation of the text. + */ + function addText($text, $font, $size, $color, $x, $y, $angle = 0) { + global $HTTP_SERVER_VARS; + + if (substr($font, 0, 1) == DIRECTORY_SEPARATOR || (substr($font, 1, 1) == ":" && (substr($font, 2, 1) == "\\" || substr($font, 2, 1) == "/"))) { + $prepath = ''; + } else { + $prepath = substr($HTTP_SERVER_VARS['SCRIPT_FILENAME'], 0, strrpos($HTTP_SERVER_VARS['SCRIPT_FILENAME'], DIRECTORY_SEPARATOR)) . DIRECTORY_SEPARATOR; + } + $text = $this->_iso2uni($text); + if (is_string($x) || is_string($y)) { + $textsize = imagettfbbox($size, $angle, $prepath.$font, $text); + $textwidth = abs($textsize[2]); + $textheight = abs($textsize[7]); + list($xalign, $xalign_offset) = explode(" ", $x); + list($yalign, $yalign_offset) = explode(" ", $y); + } + if (is_string($x)) { + switch ($xalign) { + case 'left': + $x = 0 + $xalign_offset; + break; + + case 'right': + $x = ($this->_img['main']['width'] - $textwidth) + $xalign_offset; + break; + + case 'middle': + case 'center': + $x = (($this->_img['main']['width'] - $textwidth) / 2) + $xalign_offset; + break; + } + } + if (is_string($y)) { + switch ($yalign) { + case 'top': + $y = (0 + $textheight) + $yalign_offset; + break; + + case 'bottom': + $y = ($this->_img['main']['height']) + $yalign_offset; + break; + + case 'middle': + case 'center': + $y = ((($this->_img['main']['height'] - $textheight) / 2) + $textheight) + $yalign_offset; + break; + } + } + imagettftext($this->_img['main']['resource'], $size, $angle, $x, $y, $this->_hexToPHPColor($color), $prepath . $font, $text); + return true; + } +} +?> \ No newline at end of file diff --git a/class/class.user.php b/class/class.user.php new file mode 100644 index 0000000..f9aec22 --- /dev/null +++ b/class/class.user.php @@ -0,0 +1,878 @@ +get_config_vars('USER_NO_USERNAME'); + } + elseif (preg_match($regex_username, $_POST['user_name'])) + { + $errors[] = @$AVE_Template->get_config_vars('USER_ERROR_USERNAME'); + } + + // Проверка имени + if (empty($_POST['firstname'])) + { + $errors[] = @$AVE_Template->get_config_vars('USER_NO_FIRSTNAME'); + } + elseif (preg_match($regex, stripslashes($_POST['firstname']))) + { + $errors[] = @$AVE_Template->get_config_vars('USER_ERROR_FIRSTNAME'); + } + + // Проверка фамилии + if (empty($_POST['lastname'])) + { + $errors[] = @$AVE_Template->get_config_vars('USER_NO_LASTNAME'); + } + elseif (preg_match($regex, stripslashes($_POST['lastname']))) + { + $errors[] = @$AVE_Template->get_config_vars('USER_ERROR_LASTNAME'); + } + + // Проверка e-Mail + if (empty($_POST['email'])) + { + $errors[] = @$AVE_Template->get_config_vars('USER_NO_EMAIL'); + } + elseif (!preg_match($regex_email, $_POST['email'])) + { + $errors[] = @$AVE_Template->get_config_vars('USER_EMAIL_ERROR'); + } + else + { + $email_exist = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_users + WHERE email != '" . $_POST['Email_Old'] . "' + AND email = '" . $_POST['email'] . "' + " . ($new ? "AND email != '" . $_SESSION['user_email'] . "'" : '') . " + LIMIT 1 + ")->NumRows(); + if ($email_exist==1) + { + $errors[] = @$AVE_Template->get_config_vars('USER_EMAIL_EXIST'); + } + } + + // Проверка пароля + if (isset($_REQUEST['action']) && $_REQUEST['action'] != 'edit') + { + if (empty($_POST['password'])) + { + $errors[] = @$AVE_Template->get_config_vars('USER_NO_PASSWORD'); + } + elseif (strlen($_POST['password']) < 4) + { + $errors[] = @$AVE_Template->get_config_vars('USER_PASSWORD_SHORT'); + } + elseif (preg_match($regex_password, $_POST['password'])) + { + $errors[] = @$AVE_Template->get_config_vars('USER_PASSWORD_ERROR'); + } + } + + // Проверка даты рождения + $match = ''; + if (!empty($_POST['birthday']) && !preg_match($regex_birthday, $_POST['birthday'], $match)) + { + $errors[] = @$AVE_Template->get_config_vars('USER_ERROR_DATEFORMAT'); + } + elseif (!empty($match)) + { + + $_POST['birthday'] = $match[1] + . $this->_birthday_delimetr . $match[3] + . $this->_birthday_delimetr . $match[4]; + } + + return $errors; + } + +/** + * ВНЕШНИЕ МЕТОДЫ + */ + + /** + * Группы пользователей + */ + + /** + * Получение списка Групп пользователей + * + * @param string $exclude идентификатор исключаемой Группы пользователей (гостей) + * @return array + */ + function userGroupListGet($exclude = '') + { + global $AVE_DB; + + $user_groups = array(); + $sql = $AVE_DB->Query(" + SELECT + grp.*, + COUNT(usr.Id) AS UserCount + FROM + " . PREFIX . "_user_groups AS grp + LEFT JOIN + " . PREFIX . "_users AS usr + ON usr.user_group = grp.user_group + " . (($exclude != '' && is_numeric($exclude)) ? "WHERE grp.user_group != '" . $exclude . "'" : '') . " + GROUP BY grp.user_group + "); + + while ($row = $sql->FetchRow()) + { + array_push($user_groups, $row); + } + + return $user_groups; + } + + /** + * Отобразить список Групп пользователей + * + */ + function userGroupListShow() + { + global $AVE_Template; + + $AVE_Template->assign('ugroups', $this->userGroupListGet()); + $AVE_Template->assign('content', $AVE_Template->fetch('groups/groups.tpl')); + } + + /** + * Создание новой Группы пользователей + * + */ + function userGroupNew() + { + global $AVE_DB, $AVE_Template; + + if (!empty($_POST['user_group_name'])) + { + $AVE_DB->Query(" + INSERT + INTO " . PREFIX . "_user_groups + SET + user_group = '', + user_group_name = '" . $_POST['user_group_name'] . "', + status = '1', + user_group_permission = '' + "); + $iid = $AVE_DB->InsertId(); + + reportLog($AVE_Template->get_config_vars('UGROUP_REPORT_ADD') . ' - (' . groupName($iid) . ')'); + + header('Location:index.php?do=groups&action=grouprights&Id=' . $iid . '&cp=' . SESSION); + } + else + { + header('Location:index.php?do=groups&cp=' . SESSION); + } + } + + /** + * Удаление Группы пользователей + * + * @param int $user_group_id идентификатор Группы пользователей + */ + function userGroupDelete($user_group_id = '0') + { + global $AVE_DB, $AVE_Template; + + if (is_numeric($user_group_id) && $user_group_id > 2) + { + $exist_user_in_group = $AVE_DB->Query(" + SELECT user_group + FROM " . PREFIX . "_users + WHERE user_group = '" . $user_group_id . "' + LIMIT 1 + ")->NumRows(); + + if (!$exist_user_in_group) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_user_groups + WHERE user_group = '" . $user_group_id . "' + "); + + reportLog($AVE_Template->get_config_vars('UGROUP_REPORT_DEL') . ' - (' . groupName($user_group_id) . ')'); + } + } + + header('Location:index.php?do=groups&cp=' . SESSION); + } + + /** + * Редактирование прав Группы пользователей + * + * @param int $user_group_id идентификатор Группы пользователей + */ + function userGroupPermissionEdit($user_group_id) + { + global $AVE_DB, $AVE_Template, $AVE_Module; + + if ((UGROUP != 1 && UGROUP == $user_group_id) || (UGROUP != 1 && $user_group_id == 1) || (UGROUP != 1 && $user_group_id == 2)) + { + + $AVE_Template->assign('own_group', true); + } + else + { + if (is_numeric($user_group_id) && $user_group_id) + { + $row = $AVE_DB->Query(" + SELECT + user_group_name, + user_group_permission + FROM " . PREFIX . "_user_groups + WHERE user_group = '" . $user_group_id . "' + ")->FetchRow(); + } + + if (empty($row)) + { + $AVE_Template->assign('no_group', true); + } + else + { + $AVE_Template->assign('g_all_permissions', $this->_allowed_admin_permission); + $AVE_Template->assign('g_group_permissions', explode('|', $row->user_group_permission)); + $AVE_Template->assign('g_name', $row->user_group_name); + $AVE_Template->assign('modules', $AVE_Module->moduleListGet(1)); + } + } + + $AVE_Template->assign('content', $AVE_Template->fetch('groups/perms.tpl')); + } + + /** + * Запись прав Групп пользователей + * + * @param int $user_group_id идентификатор Группы пользователей + */ + function userGroupPermissionSave($user_group_id) + { + global $AVE_DB, $AVE_Template; + + if (is_numeric($user_group_id)) + { + $perms = (!empty($_REQUEST['perms']) && is_array($_REQUEST['perms'])) ? implode('|', $_REQUEST['perms']) : ''; + $perms = ($user_group_id == '1' || in_array('alles', $_REQUEST['perms'])) ? 'alles' : $perms; + $perms = ($user_group_id == '2') ? '' : $perms; + + $sql = $AVE_DB->Query(" + UPDATE " . PREFIX . "_user_groups + SET user_group_permission = '" . $perms . "' + " . (!empty($_POST['user_group_name']) ? ", user_group_name = '" . $_POST['user_group_name'] . "'" : '') . " + WHERE user_group = '" . $user_group_id . "' + "); + + } + + if ($sql->_result === false) { + $message = $AVE_Template->get_config_vars('UGROUP_SAVED_ERR'); + $header = $AVE_Template->get_config_vars('UGROUP_ERROR'); + $theme = 'error'; + + }else{ + $message = $AVE_Template->get_config_vars('UGROUP_SAVED'); + $header = $AVE_Template->get_config_vars('UGROUP_SUCCESS'); + $theme = 'accept'; + reportLog($AVE_Template->get_config_vars('UGROUP_SAVE_MAIN') . ' - (' . groupName($user_group_id) . ')'); + } + + if (isset($_REQUEST['ajax']) && $_REQUEST['ajax'] = '1') { + + echo json_encode(array('message' => $message, 'header' => $header, 'theme' => $theme)); + } else { + $AVE_Template->assign('message', $message); + header('Location:index.php?do=groups&cp=' . SESSION); + } + + exit; + } + + /** + * Учетные записи пользователей + */ + + /** + * Формирование спискка учетных записей пользователей + * + * @param int $user_group_id идентификатор Группы пользователей + */ + function userListFetch($user_group_id = '') + { + global $AVE_DB, $AVE_Template; + + $search_by_group = ''; + $search_by_id_or_name = ''; + $user_group_navi = ''; + $query_navi = ''; + $status_search = ''; + $status_navi = ''; + + if (isset($_REQUEST['user_group']) && $_REQUEST['user_group'] != '0') + { + $user_group_id = ($user_group_id != '') ? $user_group_id : $_REQUEST['user_group']; + $user_group_navi = '&user_group=' . $user_group_id; + $search_by_group = " AND user_group = '" . $user_group_id . "' "; + } + + if (!empty($_REQUEST['query'])) + { + $q = urldecode($_REQUEST['query']); + $search_by_id_or_name = " + AND (email LIKE '%" . $q . "%' + OR email = '" . $q . "' + OR Id = '" . $q . "' + OR firstname LIKE '" . $q . "%' + OR lastname LIKE '" . $q . "%') + "; + $query_navi = '&query=' . urlencode($_REQUEST['query']); + } + + if (isset($_REQUEST['status']) && $_REQUEST['status'] != 'all') + { + $status_search = " AND status = '" . $_REQUEST['status'] . "' "; + $status_navi = '&status=' . $_REQUEST['status']; + } + + $num = $AVE_DB->Query(" + SELECT COUNT(*) + FROM " . PREFIX . "_users + WHERE 1" + . $search_by_group + . $search_by_id_or_name + . $status_search + )->GetCell(); + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_users + WHERE 1" + . $search_by_group + . $search_by_id_or_name + . $status_search + . " LIMIT " . (get_current_page()*$this->_limit-$this->_limit) . "," . $this->_limit + ); + + $isShop = $AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_modul_shop_bestellungen'")->GetCell(); + $users = array(); + + while ($row = $sql->FetchRow()) + { + // для комментариев + //$sqla = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_modul_comment_info WHERE comment_author_id = '".(int)$row->Id."'"); + //$row->comments = $sqla->numrows(); + $row->avatar=getAvatar($row->Id,40); + array_push($users, $row); + } + + if ($num > $this->_limit) + { + $page_nav = '
    34. {t}
    35. '; + $page_nav = get_pagination(ceil($num/$this->_limit), 'page', $page_nav); + $AVE_Template->assign('page_nav', $page_nav); + } + + $AVE_Template->assign('ugroups', $this->userGroupListGet(2)); + $AVE_Template->assign('users', $users); + } + + /** + * Создание новой учетной записи + * + */ + function userNew() + { + global $AVE_DB, $AVE_Template; + + switch($_REQUEST['sub']) + { + case '': + $AVE_Template->assign('available_countries', get_country_list(1)); + $AVE_Template->assign('ugroups', $this->userGroupListGet(2)); + $AVE_Template->assign('formaction', 'index.php?do=user&action=new&sub=save&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('user/form.tpl')); + break; + + case 'save': + $errors = $this->_userFieldValidate(1); + if (!empty($errors)) + { + $AVE_Template->assign('errors', $errors); + $AVE_Template->assign('available_countries', get_country_list(1)); + $AVE_Template->assign('ugroups', $this->userGroupListGet(2)); + $AVE_Template->assign('formaction', 'index.php?do=user&action=new&sub=save&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('user/form.tpl')); + } + else + { + $salt = make_random_string(); + $password = md5(md5(trim($_POST['password']) . $salt)); + $AVE_DB->Query(" + INSERT INTO " . PREFIX . "_users + SET + Id = '', + password = '" . $password . "', + salt = '" . $salt . "', + email = '" . $_POST['email'] . "', + street = '" . $_POST['street'] . "', + street_nr = '" . $_POST['street_nr'] . "', + zipcode = '" . $_POST['zipcode'] . "', + city = '" . $_POST['city'] . "', + phone = '" . $_POST['phone'] . "', + telefax = '" . $_POST['telefax'] . "', + description = '" . $_POST['description'] . "', + firstname = '" . $_POST['firstname'] . "', + lastname = '" . $_POST['lastname'] . "', + user_name = '" . $_POST['user_name'] . "', + user_group = '" . $_POST['user_group'] . "', + reg_time = '" . time() . "', + status = '" . $_POST['status'] . "', + last_visit = '" . time() . "', + country = '" . $_POST['country'] . "', + birthday = '" . $_POST['birthday'] . "', + company = '" . $_POST['company'] . "', + taxpay = '" . $_POST['taxpay'] . "', + user_group_extra = '" . @implode(';', $_POST['user_group_extra']) . "' + "); + $user_id=$AVE_DB->InsertId(); + if(is_uploaded_file($_FILES["avatar"]["tmp_name"])) + { + // Если файл загружен успешно, перемещаем его + // из временной директории в конечную + $newf_n= BASE_DIR.'/'. UPLOAD_DIR.'/avatars/new/'.$_FILES["avatar"]["name"]; + move_uploaded_file($_FILES["avatar"]["tmp_name"],$newf_n); + SetAvatar($user_id,$newf_n); + } + + $message = get_settings('mail_new_user'); + $message = str_replace('%NAME%', $_POST['user_name'], $message); + $message = str_replace('%HOST%', HOST . ABS_PATH, $message); + $message = str_replace('%PASSWORD%', $_POST['password'], $message); + $message = str_replace('%EMAIL%', $_POST['email'], $message); + $message = str_replace('%EMAILSIGNATURE%', get_settings('mail_signature'), $message); +/* + send_mail( + $_POST['email'], + $message, + $AVE_Template->get_config_vars('USER_MAIL_SUBJECT') + ); +*/ + reportLog($AVE_Template->get_config_vars('USER_REPORT_ADD') . ' - (' . stripslashes($_POST['user_name']) . ')'); + + header('Location:index.php?do=user&cp=' . SESSION); + } + break; + } + } + + /** + * Редактирование учетной записи пользователя + * + * @param int $user_id идентификатор учетной записи пользователя + */ + function userEdit($user_id) + { + global $AVE_DB, $AVE_Template; + + $user_id = (int)$user_id; + + switch($_REQUEST['sub']) + { + case '': + $row = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_users + WHERE Id = '" . $user_id . "' + ")->FetchRow(); + + if (!$row) + { + header('Location:index.php?do=user&cp=' . SESSION); + exit; + } +/* + if ($AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_modul_shop'")->GetCell()) + { + $AVE_Template->assign('is_shop', 1); + } + + if ($AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_modul_forum_userprofile'")->GetCell()) + { + $row = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_modul_forum_userprofile + WHERE BenutzerId = '" . $user_id . "' + ")->FetchRow(); + + if (is_object($row)) + { + $AVE_Template->assign('row_fp', $row); + $AVE_Template->assign('is_forum', 1); + } + } +*/ + if (($_SESSION['user_group'] != 1)){ + + if (($_SESSION['user_group'] == $row->user_group) && ($_SESSION['user_id'] != $row->Id)){ + $AVE_Template->assign('no_edit', true); + } + + if ($row->user_group == 1 && $row->Id == 1) { + $AVE_Template->assign('no_edit', true); + } + + } + + $row->avatar = getAvatar($user_id, 70); + + $AVE_Template->assign('row', $row); + + $AVE_Template->assign('user_group_extra', explode(';', $row->user_group_extra)); + $AVE_Template->assign('available_countries', get_country_list(1)); + $AVE_Template->assign('ugroups', $this->userGroupListGet(2)); + $AVE_Template->assign('us_groups', explode(';', $row->user_group_extra)); + $AVE_Template->assign('formaction', 'index.php?do=user&action=edit&Id='. $user_id .'&sub=save&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('user/form.tpl')); + break; + + case 'save': + $errors = $this->_userFieldValidate(); + if (!empty($errors)) + { + + $row = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_users + WHERE Id = '" . $user_id . "' + ")->FetchRow(); + + if (!$row) + { + header('Location:index.php?do=user&cp=' . SESSION); + exit; + } + + if (($_SESSION['user_group'] != 1)){ + + if (($_SESSION['user_group'] == $row->user_group) && ($_SESSION['user_id'] != $row->Id)){ + $AVE_Template->assign('no_edit', true); + } + + if ($row->user_group == 1 && $row->Id == 1) { + $AVE_Template->assign('no_edit', true); + } + + } + + $row->avatar = getAvatar($user_id, 70); + + $AVE_Template->assign('row', $row); + $AVE_Template->assign('errors', $errors); + $AVE_Template->assign('user_group_extra', explode(';', $row->user_group_extra)); + $AVE_Template->assign('available_countries', get_country_list(1)); + $AVE_Template->assign('ugroups', $this->userGroupListGet(2)); + $AVE_Template->assign('us_groups', explode(';', $row->user_group_extra)); + $AVE_Template->assign('formaction', 'index.php?do=user&action=edit&Id='. $user_id .'&sub=save&cp=' . SESSION); + $AVE_Template->assign('content', $AVE_Template->fetch('user/form.tpl')); + } + else + { + if (!empty($_REQUEST['password'])) + { + $salt = make_random_string(); + $password = md5(md5(trim($_POST['password']) . $salt)); + $password_set = "password = '" . $password . "', salt = '" . $salt . "',"; + } + else + { + $password_set = ''; + } + + $user_group_set = ($_SESSION['user_id'] != $user_id) ? "user_group = '" . $_REQUEST['user_group'] . "'," : ''; + + $times = ($_REQUEST['deleted'] == "1") ? time() : ''; + + if(is_uploaded_file($_FILES["avatar"]["tmp_name"])) + { + // Если файл загружен успешно, перемещаем его + // из временной директории в конечную + $newf_n = BASE_DIR.'/'. UPLOAD_DIR.'/avatars/new/'.$_FILES["avatar"]["name"]; + move_uploaded_file($_FILES["avatar"]["tmp_name"],$newf_n); + SetAvatar($user_id,$newf_n); + } + + $AVE_DB->Query(" + UPDATE " . PREFIX . "_users + SET + " . $password_set . " + " . $user_group_set . " + email = '" . $_REQUEST['email'] . "', + street = '" . $_REQUEST['street'] . "', + street_nr = '" . $_REQUEST['street_nr'] . "', + zipcode = '" . $_REQUEST['zipcode'] . "', + city = '" . $_REQUEST['city'] . "', + phone = '" . $_REQUEST['phone'] . "', + telefax = '" . $_REQUEST['telefax'] . "', + description = '" . $_REQUEST['description'] . "', + firstname = '" . $_REQUEST['firstname'] . "', + lastname = '" . $_REQUEST['lastname'] . "', + user_name = '" . $_REQUEST['user_name'] . "', + status = '" . $_REQUEST['status'] . "', + country = '" . $_REQUEST['country'] . "', + birthday = '" . $_REQUEST['birthday'] . "', + deleted = '" . $_REQUEST['deleted'] . "', + del_time = '" . $times . "', + taxpay = '" . $_REQUEST['taxpay'] . "', + company = '" . $_REQUEST['company'] . "', + user_group_extra = '" . @implode(';', $_REQUEST['user_group_extra']) . "' + WHERE + Id = '" . $user_id . "' + "); + +/* + if ($AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_module_forum_userprofile'")->GetCell()) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_modul_forum_userprofile + SET + GroupIdMisc = '" . @implode(';', $_REQUEST['user_group_extra']) . "', + BenutzerName = '" . @$_REQUEST['BenutzerName_fp']. "', + Signatur = '" . @$_REQUEST['Signatur_fp'] . "' , + Avatar = '" . @$_REQUEST['Avatar_fp'] . "' + WHERE + BenutzerId = '" . $user_id . "' + "); + } +*/ + + if ($_REQUEST['status'] == 1 && @$_REQUEST['SendFreeMail'] == 1) + { + $host = HOST . ABS_PATH; + $body_start = $AVE_Template->get_config_vars('USER_MAIL_BODY1'); + $body_start = str_replace('%USER%', $_REQUEST['user_name'], $body_start); + $body_start .= str_replace('%HOST%', $host, $AVE_Template->get_config_vars('USER_MAIL_BODY2')); + $body_start .= str_replace('%HOMEPAGENAME%', get_settings('site_name'), $AVE_Template->get_config_vars('USER_MAIL_FOOTER')); + $body_start = str_replace('%N%', "\n", $body_start); + $body_start = str_replace('%HOST%', $host, $body_start); + + send_mail( + $_POST['email'], + $body_start, + $AVE_Template->get_config_vars('USER_MAIL_SUBJECT'), + get_settings('mail_from'), + get_settings('mail_from_name') . ' (' . get_settings('site_name') . ')', + 'text' + ); + } + + if (!empty($_REQUEST['password']) && $_REQUEST['PassChange'] == 1) + { + $host = HOST . ABS_PATH; + $body_start = $AVE_Template->get_config_vars('USER_MAIL_BODY1'); + $body_start = str_replace('%USER%', $_REQUEST['user_name'], $body_start); + $body_start .= str_replace('%HOST%', $host, $AVE_Template->get_config_vars('USER_MAIL_PASSWORD2')); + $body_start = str_replace('%NEWPASS%', $_REQUEST['password'], $body_start); + $body_start .= str_replace('%HOMEPAGENAME%', get_settings('site_name'), $AVE_Template->get_config_vars('USER_MAIL_FOOTER')); + $body_start = str_replace('%N%', "\n", $body_start); + $body_start = str_replace('%HOST%', $host, $body_start); + + send_mail( + $_POST['email'], + $body_start, + $AVE_Template->get_config_vars('USER_MAIL_PASSWORD'), + get_settings('mail_from'), + get_settings('mail_from_name') . ' (' . get_settings('site_name') . ')', + 'text' + ); + } + + if ($_REQUEST['SimpleMessage'] != '') + { + send_mail( + $_POST['email'], + stripslashes($_POST['SimpleMessage']), + stripslashes($_POST['SubjectMessage']), + $_SESSION['user_email'], + $_SESSION['user_name'], + 'text' + ); + } + + if (!empty($_REQUEST['password']) && $_SESSION['user_id'] == $user_id) + { + $_SESSION['user_pass'] = $password; + $_SESSION['user_email'] = $_POST['email']; + } + + reportLog($AVE_Template->get_config_vars('USER_REPORT_EDIT') . ' - (' . stripslashes($_POST['user_name']) . ')'); + + header('Location:index.php?do=user&cp=' . SESSION); + exit; + } + break; + } + } + + /** + * Удаление учетной записи пользователя + * + * @param int $user_id идентификатор учетной записи пользователя + */ + function userDelete($user_id) + { + global $AVE_DB, $AVE_Template; + + if (is_numeric($user_id) && $user_id != 1) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_users + WHERE Id = '" . $user_id . "' + "); + + if ($AVE_DB->Query("SHOW TABLES LIKE '" . PREFIX . "_modul_forum_userprofile'")->GetCell()) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_modul_forum_userprofile + WHERE BenutzerId = '" . $user_id . "' + "); + } + + reportLog($AVE_Template->get_config_vars('USER_REPORT_DEL') . ' - (' . get_username_by_id($user_id) . ')'); + } + + header('Location:index.php?do=user&cp=' . SESSION); + } + + /** + * Запись изменений учетных записей пользователей в списке + * + */ + function userListEdit() + { + global $AVE_DB, $AVE_Template; + + foreach ($_POST['del'] as $user_id => $del) + { + if (is_numeric($user_id) && $user_id > 1) + { + $AVE_DB->Query(" + DELETE + FROM " . PREFIX . "_users + WHERE Id = '" . $user_id . "' + "); + + reportLog($AVE_Template->get_config_vars('USER_REPORT_DEL') . ' - (' . get_username_by_id($user_id) . ')'); + } + } + + foreach ($_POST['user_group'] as $user_id => $user_group_id) + { + if (is_numeric($user_id) && $user_id > 0 && + is_numeric($user_group_id) && $user_group_id > 0) + { + $AVE_DB->Query(" + UPDATE " . PREFIX . "_users + SET user_group = '" . $user_group_id . "' + WHERE Id = '" . $user_id . "' + "); + reportLog($AVE_Template->get_config_vars('USER_REPORT_GROUP') . ' - (' . get_username_by_id($user_id) . ')'); + } + } + + header('Location:index.php?do=user&cp=' . SESSION); + exit; + } +} + +?> diff --git a/class/class.yml.php b/class/class.yml.php new file mode 100644 index 0000000..e5d5131 --- /dev/null +++ b/class/class.yml.php @@ -0,0 +1,436 @@ +, Arpad Ray + * @link http://php.net/function.htmlspecialchars_decode + * @author Aidan Lister + * @version $Revision: 1.6 $ + * @since PHP 5.1.0 + * @require PHP 4.0.0 (user_error) + */ +function php_compat_htmlspecialchars_decode($string, $quote_style = null) +{ + // Sanity check + if (!is_scalar($string)) { + user_error('htmlspecialchars_decode() expects parameter 1 to be string, ' . + gettype($string) . ' given', E_USER_WARNING); + return; + } + + if (!is_int($quote_style) && $quote_style !== null) { + user_error('htmlspecialchars_decode() expects parameter 2 to be integer, ' . + gettype($quote_style) . ' given', E_USER_WARNING); + return; + } + + // The function does not behave as documented + // This matches the actual behaviour of the function + if ($quote_style & ENT_COMPAT || $quote_style & ENT_QUOTES) { + $from = array('"', ''', '<', '>', '&'); + $to = array('"', "'", '<', '>', '&'); + } else { + $from = array('<', '>', '&'); + $to = array('<', '>', '&'); + } + + return str_replace($from, $to, $string); +} + +// Define +if (!function_exists('htmlspecialchars_decode')) { + function htmlspecialchars_decode($string, $quote_style = null) + { + return php_compat_htmlspecialchars_decode($string, $quote_style); + } +} + +/** + * AVE.cms + * + * @package AVE.cms + * @filesource + */ + +/** + * Класс генерации YML + * YML (Yandex Market Language) - стандарт, разработанный "Яндексом" + * для принятия и публикации информации в базе данных Яндекс.Маркет + * YML основан на стандарте XML (Extensible Markup Language) + * описание формата данных YML http://partner.market.yandex.ru/legal/tt/ + */ +class AVE_YML +{ + +/** + * СВОЙСТВА + */ + + /** + * Кодировка + * + * @public string + */ + public $from_charset = 'windows-1251'; + + /** + * Элемент описания магазина + * + * @public string + */ + public $shop = array('name'=>'', 'company'=>'', 'url'=>''); + + /** + * Элемент валюты + * + * @public string + */ + public $currencies = array(); + + /** + * Элемент категории + * + * @public string + */ + public $categories = array(); + + /** + * Элемент предложения + * + * @public string + */ + public $offers = array(); + + /** + * Конструктор + * + * @param string $from_charset + */ + function AVE_YML($from_charset = 'windows-1251') + { + $this->from_charset = trim(strtolower($from_charset)); + } + +/** + * ВНУТРЕННИЕ МЕТОДЫ + */ + + /** + * Преобразование массива в тег + * + * @param array $tags + * @return string + */ + function _ymlArray2Tag($tags) + { + $tag = ''; + foreach ($tags as $tag_name => $tag_value) + { + $tag .= '<' . $tag_name . '>' . $tag_value . ''; + } + $tag .= "\r\n"; + + return $tag; + } + + /** + * Преобразование массива в атрибуты + * + * @param array $attributes + * @param string $tag_name + * @param string $tag_value + * @return string + */ + function _ymlArray2Attribute($attributes, $tag_name, $tag_value = '') + { + $attribute = '<' . $tag_name . ' '; + foreach ($attributes as $attribute_name => $attribute_value) + { + $attribute .= $attribute_name . '="' . $attribute_value . '" '; + } + $attribute .= ($tag_value != '') ? '>' . $tag_value . '' : '/>'; + $attribute .= "\r\n"; + + return $attribute; + } + + /** + * Подготовка текстового поля в соответствии с требованиями Яндекса + * Запрещены любые html-теги. Стандарт XML не допускает использования в текстовых данных + * непечатаемых символов с ASCII-кодами в диапазоне значений от 0 до 31 (за исключением + * символов с кодами 9, 10, 13 - табуляция, перевод строки, возврат каретки). Также этот + * стандарт требует обязательной замены некоторых символов на эквивалентные им символьные + * примитивы. + * @param string $field + * @return string + */ + function _ymlFieldPrepare($field) + { + $field = htmlspecialchars_decode(trim($field)); + $field = strip_tags($field); + $from = array('"', '&', '>', '<', '\''); + $to = array('"', '&', '>', '<', '''); + $field = str_replace($from, $to, $field); + if ($this->from_charset != 'windows-1251') + { + $field = iconv($this->from_charset, 'windows-1251//IGNORE//TRANSLIT', $field); + } + $field = preg_replace('#[\x00-\x08\x0B-\x0C\x0E-\x1F]+#is', ' ', $field); + + return trim($field); + } + + /** + * формирование элемента catalog + * + * @return string + */ + function _ymlElementCatalogGet() + { + $eol = "\r\n"; + + $catalog = '' . $eol; + + // информация о магазине + $catalog .= $this->_ymlArray2Tag($this->shop); + + // валюты + $catalog .= '' . $eol; + foreach ($this->currencies as $currency) + { + $catalog .= $this->_ymlArray2Attribute($currency, 'currency'); + } + $catalog .= '' . $eol; + + // категории + $catalog .= '' . $eol; + foreach ($this->categories as $category) + { + $category_name = $category['name']; + unset($category['name']); + $catalog .= $this->_ymlArray2Attribute($category, 'category', $category_name); + } + $catalog .= '' . $eol; + + // товарные позиции + $catalog .= '' . $eol; + foreach ($this->offers as $offer) + { + $data = $offer['data']; + unset($offer['data']); + $catalog .= $this->_ymlArray2Attribute($offer, 'offer', $this->_ymlArray2Tag($data)); + } + $catalog .= '' . $eol; + + $catalog .= ''; + + return $catalog; + } + +/** + * ВНЕШНИЕ МЕТОДЫ + */ + + /** + * Формирование массива для элемента shop описывающего магазин + * + * @param string $name - Короткое название магазина (название, которое выводится в списке + * найденных на Яндекс.Маркете товаров. Не должно содержать более 20 символов). + * Нельзя использовать слова, не имеющие отношения к наименованию магазина ("лучший", "дешевый"), + * указывать номер телефона и т.п. Название магазина, должно совпадать с фактическим названием + * магазина, которое публикуется на сайте. При несоблюдении данного требования наименование + * может быть изменено Яндексом самостоятельно без уведомления Клиента. + * @param string $company - Полное наименование компании, владеющей магазином. + * Не публикуется, используется для внутренней идентификации. + * @param string $url - URL-адрес главной страницы магазина + */ + function ymlElementShopSet($name, $company, $url) + { + $this->shop['name'] = substr($this->_ymlFieldPrepare($name), 0, 20); + $this->shop['company'] = $this->_ymlFieldPrepare($company); + $this->shop['url'] = $this->_ymlFieldPrepare($url); + } + + /** + * Добавление валюты + * + * @param string $id - код валюты (RUR, UAH, USD, EUR...) + * @param float|string $rate - курс этой валюты к валюте, взятой за единицу. + * Параметр rate может иметь так же следующие значения: + * CBRF - курс по Центральному банку РФ. + * NBU - курс по Национальному банку Украины. + * СВ - курс по банку той страны, к которой относится интернет-магазин + * по Своему региону, указанному в Партнерском интерфейсе Яндекс.Маркета. + * @param int $plus - используется только в случае rate = CBRF, NBU или СВ + * и означает насколько увеличить курс в процентах от курса выбранного банка + * @return bool + */ + function ymlElementCurrencySet($id, $rate = 'CBRF', $plus = 0) + { + $rate = strtoupper($rate); + $allow_rate = array('CBRF', 'NBU', 'CB'); + if (in_array($rate, $allow_rate)) + { + $plus = str_replace(',', '.', $plus); + if ($plus > 0) + { + $this->currencies[] = array( + 'id'=>$this->_ymlFieldPrepare(strtoupper($id)), + 'rate'=>$rate, + 'plus'=>(float)$plus + ); + } + else + { + $this->currencies[] = array( + 'id'=>$this->_ymlFieldPrepare(strtoupper($id)), + 'rate'=>$rate + ); + } + } + else + { + $rate = str_replace(',', '.', $rate); + $this->currencies[] = array( + 'id'=>$this->_ymlFieldPrepare(strtoupper($id)), + 'rate'=>(float)$rate + ); + } + + return true; + } + + /** + * Добавление категории товаров + * + * @param string $name - название рубрики + * @param int $id - id рубрики + * @param int $parent_id - id родительской рубрики, если нет, то -1 + * @return bool + */ + function ymlElementCategorySet($name, $id, $parent_id = -1) + { + if ((int)$id < 1 || trim($name) == '') return false; + if ((int)$parent_id > 0) + { + $this->categories[] = array( + 'id'=>(int)$id, + 'parentId'=>(int)$parent_id, + 'name'=>$this->_ymlFieldPrepare($name) + ); + } + else + { + $this->categories[] = array( + 'id'=>(int)$id, + 'name'=>$this->_ymlFieldPrepare($name) + ); + } + + return true; + } + + /** + * Добавление товарного предложения + * + * @param int $id - id товара (товарного предложения) + * @param array $data - массив остальных параметров (звездочкой помечены обязательные) + * *url - URL-адрес страницы товара. + * *name - Наименование товарного предложения. + * *description - Описание товарного предложения. + * *price - Цена, по которой данный товар можно приобрести. + * Цена товарного предложения округляеся и выводится в зависимости от настроек пользователя. + * *currencyId - Идентификатор валюты товара (RUR, USD, UAH). + * Для корректного отображения цены в национальной валюте, необходимо использовать + * идентификатор (например, UAH) с соответствующим значением цены. + * *categoryId - Идентификатор категории товара (целое число не более 18 знаков). + * Товарное предложение может принадлежать только одной категории. + * *delivery - Элемент, обозначающий возможность доставить соответствующий товар. + * "false" данный товар не может быть доставлен("самовывоз"). + * "true" товар доставляется на условиях, которые указываются в партнерском интерфейсе + * http://partner.market.yandex.ru на странице "редактирование". + * picture - Ссылка на картинку соответствующего товарного предложения. + * Недопустимо давать ссылку на "заглушку", т.е. на картинку где написано + * "картинка отсутствует" или на логотип магазина. + * vendor - Производитель. + * vendorCode - Код товара (указывается код производителя). + * local_delivery_cost - Стоимость доставки данного товара в Своем регионе. + * sales_notes - Элемент, предназначенный для того, чтобы показать пользователям, + * чем отличается данный товар от других, или для описания акций магазина (кроме скидок). + * Допустимая длина текста в элементе - 50 символов. + * manufacturer_warranty - Элемент предназначен для отметки товаров, + * имеющих официальную гарантию производителя. {true|false} + * country_of_origin - Элемент предназначен для указания страны производства товара. + * downloadable - Элемент предназначен для обозначения товара, который можно скачать. + * @param bool $available - Статус доступности товара - в наличии/на заказ. + * "true" - товарное предложение в наличии. + * Магазин готов сразу договариваться с покупателем о доставке товара + * "false" - товарное предложение на заказ. + * Магазин готов осуществить поставку товара на указанных условиях в течение месяца + * (срок может быть больше для товаров, которые всеми участниками рынка поставляются только на заказ).. + * Те товарные предложения, на которые заказы не принимаются, не должны выгружаться в Яндекс.Маркет. + */ + function ymlElementOfferSet($id, $data, $available = true) + { + $allowed = array( + 'url', + 'price', + 'currencyId', + 'categoryId', + 'picture', + 'delivery', + 'local_delivery_cost', + 'name', + 'vendor', + 'vendorCode', + 'description', + 'sales_notes', + 'manufacturer_warranty', + 'country_of_origin', + 'downloadable' + ); + + foreach ($data as $k => $v) + { + if (!in_array($k, $allowed)) unset($data[$k]); + $data[$k] = strip_tags($this->_ymlFieldPrepare($v)); + } + $tmp = $data; + $data = array(); + // Стандарт XML учитывает порядок следования элементов, + // поэтому важно соблюдать его в соответствии с порядком описанным в DTD + foreach ($allowed as $key) + { + if (isset($tmp[$key])) $data[$key] = $tmp[$key]; + } + $this->offers[] = array( + 'id'=>(int)$id, + 'data'=>$data, + 'available'=>($available) ? 'true' : 'false' + ); + } + + /** + * Получить весь YML файл + * + * @return string + */ + function ymlGet() + { + $eol = "\r\n"; + + $yml = '' . $eol; + $yml .= '' . $eol; + $yml .= '' . $eol; + $yml .= $this->_ymlElementCatalogGet(); + $yml .= ''; + + return $yml; + } +} + +?> \ No newline at end of file diff --git a/fields/.htaccess b/fields/.htaccess new file mode 100644 index 0000000..1b10bcc --- /dev/null +++ b/fields/.htaccess @@ -0,0 +1,4 @@ +Deny from all + + Allow from all + \ No newline at end of file diff --git a/fields/checkbox/field.php b/fields/checkbox/field.php new file mode 100644 index 0000000..9820411 --- /dev/null +++ b/fields/checkbox/field.php @@ -0,0 +1,87 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = ''; + + switch ($action) + { + case 'edit': + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', (int)$field_value); + $AVE_Template->assign('doc_id', (isset($_REQUEST['Id']) ? (int)$_REQUEST['Id'] : 0)); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + return $AVE_Template->fetch($tpl_file); + + break; + + case 'doc': + $field_value = clean_php($field_value); + + $res = ((int)$field_value === 1) ? (int)$field_value : 0; + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + + return $res; + break; + + case 'req': + $field_value = clean_php($field_value); + + $res = ((int)$field_value === 1) ? (int)$field_value : 0; + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + + return $res; + break; + + case 'save': + $field_value = clean_php($field_value); + $res = ((int)$field_value === 1) ? $field_value : '0'; + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + } + + return ($res ? $res : $field_value); +} +?> diff --git a/fields/checkbox/lang/bg.txt b/fields/checkbox/lang/bg.txt new file mode 100644 index 0000000..dce9eff --- /dev/null +++ b/fields/checkbox/lang/bg.txt @@ -0,0 +1,2 @@ +[admin] +name = "Чекбокс (Checkbox)" \ No newline at end of file diff --git a/fields/checkbox/lang/cz.txt b/fields/checkbox/lang/cz.txt new file mode 100644 index 0000000..dce9eff --- /dev/null +++ b/fields/checkbox/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Чекбокс (Checkbox)" \ No newline at end of file diff --git a/fields/checkbox/lang/en.txt b/fields/checkbox/lang/en.txt new file mode 100644 index 0000000..6f0d65c --- /dev/null +++ b/fields/checkbox/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "Checkbox" \ No newline at end of file diff --git a/fields/checkbox/lang/pl.txt b/fields/checkbox/lang/pl.txt new file mode 100644 index 0000000..9e2393f --- /dev/null +++ b/fields/checkbox/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Checkbox (pole wyboru)" \ No newline at end of file diff --git a/fields/checkbox/lang/ru.txt b/fields/checkbox/lang/ru.txt new file mode 100644 index 0000000..dce9eff --- /dev/null +++ b/fields/checkbox/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Чекбокс (Checkbox)" \ No newline at end of file diff --git a/fields/checkbox/lang/ua.txt b/fields/checkbox/lang/ua.txt new file mode 100644 index 0000000..dce9eff --- /dev/null +++ b/fields/checkbox/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Чекбокс (Checkbox)" \ No newline at end of file diff --git a/fields/checkbox/tpl/field-doc.tpl b/fields/checkbox/tpl/field-doc.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/checkbox/tpl/field-doc.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/checkbox/tpl/field-req.tpl b/fields/checkbox/tpl/field-req.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/checkbox/tpl/field-req.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/checkbox/tpl/field.tpl b/fields/checkbox/tpl/field.tpl new file mode 100644 index 0000000..cfbe265 --- /dev/null +++ b/fields/checkbox/tpl/field.tpl @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/fields/code/field.php b/fields/code/field.php new file mode 100644 index 0000000..21fc304 --- /dev/null +++ b/fields/code/field.php @@ -0,0 +1,54 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + switch ($action) + { + case 'edit': + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + $AVE_Template->assign('doc_id', (int)$_REQUEST['Id']); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('f_id', $field_id.'_'.$_REQUEST['Id']); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + case 'req': + return get_field_default($field_value, $action, $field_id, $tpl, $tpl_empty); + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + default: return $field_value; + } +} +?> \ No newline at end of file diff --git a/fields/code/lang/bg.txt b/fields/code/lang/bg.txt new file mode 100644 index 0000000..8cc468d --- /dev/null +++ b/fields/code/lang/bg.txt @@ -0,0 +1,2 @@ +[admin] +name = "Код (Codemirror)" \ No newline at end of file diff --git a/fields/code/lang/cz.txt b/fields/code/lang/cz.txt new file mode 100644 index 0000000..11f8ae6 --- /dev/null +++ b/fields/code/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Kód (Codemirror)" \ No newline at end of file diff --git a/fields/code/lang/pl.txt b/fields/code/lang/pl.txt new file mode 100644 index 0000000..9c6d74c --- /dev/null +++ b/fields/code/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Kod (CodeMirror)" \ No newline at end of file diff --git a/fields/code/lang/ru.txt b/fields/code/lang/ru.txt new file mode 100644 index 0000000..8cc468d --- /dev/null +++ b/fields/code/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Код (Codemirror)" \ No newline at end of file diff --git a/fields/code/lang/ua.txt b/fields/code/lang/ua.txt new file mode 100644 index 0000000..8cc468d --- /dev/null +++ b/fields/code/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Код (Codemirror)" \ No newline at end of file diff --git a/fields/code/tpl/field.tpl b/fields/code/tpl/field.tpl new file mode 100644 index 0000000..0b99b0b --- /dev/null +++ b/fields/code/tpl/field.tpl @@ -0,0 +1,8 @@ +{if $codemirror != load} + {assign var = codemirror value='' scope="global"} + {include file = "$codemirror_connect"} + {assign var = codemirror value="load" scope="global"} +{/if} + + +{include file="$codemirror_editor" conn_id=$f_id textarea_id="field_code_$f_id" ctrls='SaveAjax();' height=300} \ No newline at end of file diff --git a/fields/date/field.php b/fields/date/field.php new file mode 100644 index 0000000..19cb6b9 --- /dev/null +++ b/fields/date/field.php @@ -0,0 +1,117 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res=0; + + switch ($action) + { + case 'edit': + $field_value = ($field_value != 0) ? $field_value : ''; + + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + $AVE_Template->assign('doc_id', (int)$_REQUEST['Id']); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $field_value = clean_php($field_value); + if ($tpl_empty) + { + $value = pretty_date(strftime(TIME_FORMAT, $field_value)); + } + else + { + $value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_value) + { + return $field_value; + }, + $tpl + ); + + return $res = $value; + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file){ + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + + $res = $field_value; + break; + + case 'req': + + $field_value = clean_php($field_value); + if ($tpl_empty) + { + $value = pretty_date(strftime(TIME_FORMAT, $field_value)); + } + else + { + $value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_value) + { + return $field_value; + }, + $tpl + ); + + return $res = $value; + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file){ + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + + $res = $field_value; + break; + + case 'save': + $res = $field_value; + break; + + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> diff --git a/fields/date/lang/bg.txt b/fields/date/lang/bg.txt new file mode 100644 index 0000000..13cc934 --- /dev/null +++ b/fields/date/lang/bg.txt @@ -0,0 +1,2 @@ +[admin] +name = "Дата (TimeStamp)" \ No newline at end of file diff --git a/fields/date/lang/cz.txt b/fields/date/lang/cz.txt new file mode 100644 index 0000000..2e5d160 --- /dev/null +++ b/fields/date/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Datum (TimeStamp)" \ No newline at end of file diff --git a/fields/date/lang/pl.txt b/fields/date/lang/pl.txt new file mode 100644 index 0000000..6ac6bc6 --- /dev/null +++ b/fields/date/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Data (TimeStamp)" \ No newline at end of file diff --git a/fields/date/lang/ru.txt b/fields/date/lang/ru.txt new file mode 100644 index 0000000..13cc934 --- /dev/null +++ b/fields/date/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Дата (TimeStamp)" \ No newline at end of file diff --git a/fields/date/lang/ua.txt b/fields/date/lang/ua.txt new file mode 100644 index 0000000..13cc934 --- /dev/null +++ b/fields/date/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Дата (TimeStamp)" \ No newline at end of file diff --git a/fields/date/tpl/field-doc.tpl b/fields/date/tpl/field-doc.tpl new file mode 100644 index 0000000..693f86b --- /dev/null +++ b/fields/date/tpl/field-doc.tpl @@ -0,0 +1,7 @@ +{* +{$field_value|date_format:$TIME_FORMAT|pretty_date|translate_date} +{$field_value|date_format:$DATE_FORMAT|pretty_date|translate_date} +{$field_value|date_format:$TIME_FORMAT|utf8|translate_date} +{$field_value|date_format:$DATE_FORMAT|utf8|translate_date} +*} +{$field_value|date_format:'%d-%m-%Y'} \ No newline at end of file diff --git a/fields/date/tpl/field-req.tpl b/fields/date/tpl/field-req.tpl new file mode 100644 index 0000000..693f86b --- /dev/null +++ b/fields/date/tpl/field-req.tpl @@ -0,0 +1,7 @@ +{* +{$field_value|date_format:$TIME_FORMAT|pretty_date|translate_date} +{$field_value|date_format:$DATE_FORMAT|pretty_date|translate_date} +{$field_value|date_format:$TIME_FORMAT|utf8|translate_date} +{$field_value|date_format:$DATE_FORMAT|utf8|translate_date} +*} +{$field_value|date_format:'%d-%m-%Y'} \ No newline at end of file diff --git a/fields/date/tpl/field.tpl b/fields/date/tpl/field.tpl new file mode 100644 index 0000000..3f7cc01 --- /dev/null +++ b/fields/date/tpl/field.tpl @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/fields/doc_from_rub/field.php b/fields/doc_from_rub/field.php new file mode 100644 index 0000000..8ce7215 --- /dev/null +++ b/fields/doc_from_rub/field.php @@ -0,0 +1,170 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + switch ($action) + { + case 'edit': + if (isset($default)) + { + $parent = $AVE_DB->Query(" + SELECT + MIN(document_parent) AS min + FROM + ". PREFIX ."_documents + WHERE + rubric_id IN (" . $default . ") + ")->GetCell(); + + $sql = $AVE_DB->Query(" + SELECT + Id, document_parent, document_title + FROM + ". PREFIX ."_documents + WHERE + rubric_id IN (" . $default . ") + "); + + $cats = array(); + + while($cat = $sql->FetchAssocArray()) + { + $cats_ID[$cat['Id']][] = $cat; + $cats[$cat['document_parent']][$cat['Id']] = $cat; + } + + $AVE_Template->assign('subtpl', $tpl_dir . "list.tpl"); + $AVE_Template->assign('fields', doc_from_rub_tree($cats, $parent)); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('doc_id', (isset($_REQUEST['Id']) ? (int)$_REQUEST['Id'] : 0)); + $AVE_Template->assign('field_value', $field_value); + } + else + { + $AVE_Template->assign('error', $AVE_Template->get_config_vars('error')); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $document = get_document($field_value); + + if ($tpl_empty) + { + $field_value = $document['document_title']; + $field_value = clean_php($field_value); + $field_value = stripcslashes($field_value); + $field_value = htmlspecialchars_decode($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('document', $document); + return $AVE_Template->fetch($tpl_file); + } + + $res = $field_value; + break; + + case 'req': + $document = get_document($field_value); + + if ($tpl_empty) + { + $field_value = $document['document_title']; + $field_value = clean_php($field_value); + $field_value = stripcslashes($field_value); + $field_value = htmlspecialchars_decode($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('document', $document); + return $AVE_Template->fetch($tpl_file); + } + + $res = $field_value; + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + } + return ($res ? $res : $field_value); +} + +function doc_from_rub_tree($cats, $parent) +{ + if (is_array($cats) and isset($cats[$parent])) + { + foreach($cats[$parent] as $cat) + { + $array[$cat['Id']]['Id'] = $cat['Id']; + $array[$cat['Id']]['document_title'] = $cat['document_title']; + $array[$cat['Id']]['child'] = doc_from_rub_tree($cats, $cat['Id']); + } + } + else + { + return null; + } + + return $array; +} +?> \ No newline at end of file diff --git a/fields/doc_from_rub/lang/bg.txt b/fields/doc_from_rub/lang/bg.txt new file mode 100644 index 0000000..42d4ab5 --- /dev/null +++ b/fields/doc_from_rub/lang/bg.txt @@ -0,0 +1,5 @@ +[admin] + +name = "Документ от рубрика" + +error = "Не е зададена рубрика" \ No newline at end of file diff --git a/fields/doc_from_rub/lang/cz.txt b/fields/doc_from_rub/lang/cz.txt new file mode 100644 index 0000000..472feb7 --- /dev/null +++ b/fields/doc_from_rub/lang/cz.txt @@ -0,0 +1,3 @@ +[admin] +name = "Dokument z rubriky" +error = "Rubrika nazadaná" \ No newline at end of file diff --git a/fields/doc_from_rub/lang/en.txt b/fields/doc_from_rub/lang/en.txt new file mode 100644 index 0000000..4070c5f --- /dev/null +++ b/fields/doc_from_rub/lang/en.txt @@ -0,0 +1,3 @@ +[admin] +name = "Document from rubric" +error = "Not specified category" \ No newline at end of file diff --git a/fields/doc_from_rub/lang/pl.txt b/fields/doc_from_rub/lang/pl.txt new file mode 100644 index 0000000..e8839ea --- /dev/null +++ b/fields/doc_from_rub/lang/pl.txt @@ -0,0 +1,3 @@ +[admin] +name = "Dokument z rubryki" +error = "Nie wybrano rubryki" \ No newline at end of file diff --git a/fields/doc_from_rub/lang/ru.txt b/fields/doc_from_rub/lang/ru.txt new file mode 100644 index 0000000..12a8e75 --- /dev/null +++ b/fields/doc_from_rub/lang/ru.txt @@ -0,0 +1,3 @@ +[admin] +name = "Документ из рубрики" +error = "Не задана рубрика" \ No newline at end of file diff --git a/fields/doc_from_rub/lang/ua.txt b/fields/doc_from_rub/lang/ua.txt new file mode 100644 index 0000000..380e51b --- /dev/null +++ b/fields/doc_from_rub/lang/ua.txt @@ -0,0 +1,3 @@ +[admin] +name = "Документ з рубрики" +error = "Не задано рубрику" \ No newline at end of file diff --git a/fields/doc_from_rub/tpl/field-doc.tpl b/fields/doc_from_rub/tpl/field-doc.tpl new file mode 100644 index 0000000..e7fb4dc --- /dev/null +++ b/fields/doc_from_rub/tpl/field-doc.tpl @@ -0,0 +1,31 @@ +{* + +Доступные параметры: +----------------------------------------------------------- +Id ID Документа +rubric_id ID Рубрики +document_parent ID Документа «родителя» +document_alias Алиас документа +document_title Заголовок документа +document_breadcrum_title Заголовок документа для «хлебных крошек» +document_published Начало публикации +document_expire Окончание публикации +document_changed Дата последнего изменения +document_author_id ID автора документа +document_in_search Учавствует в поиске (0|1) +document_meta_keywords Ключевые слова +document_meta_description Описание документа +document_meta_robots Индексация +document_status Документ опубликован (Статус) (0|1) +document_deleted Документ удален (0|1) +document_count_view Кол-во просмотров +document_linked_navi_id ID пункта меню,с которым связан документ +document_lang Язык документа +document_lang_group Языковая группа документа + +Пример вывода: +----------------------------------------------------------- +{$document.document_title} Просмотров: {$document.document_count_view} + +*} +{$document.document_title|stripcslashes} \ No newline at end of file diff --git a/fields/doc_from_rub/tpl/field-req.tpl b/fields/doc_from_rub/tpl/field-req.tpl new file mode 100644 index 0000000..e7fb4dc --- /dev/null +++ b/fields/doc_from_rub/tpl/field-req.tpl @@ -0,0 +1,31 @@ +{* + +Доступные параметры: +----------------------------------------------------------- +Id ID Документа +rubric_id ID Рубрики +document_parent ID Документа «родителя» +document_alias Алиас документа +document_title Заголовок документа +document_breadcrum_title Заголовок документа для «хлебных крошек» +document_published Начало публикации +document_expire Окончание публикации +document_changed Дата последнего изменения +document_author_id ID автора документа +document_in_search Учавствует в поиске (0|1) +document_meta_keywords Ключевые слова +document_meta_description Описание документа +document_meta_robots Индексация +document_status Документ опубликован (Статус) (0|1) +document_deleted Документ удален (0|1) +document_count_view Кол-во просмотров +document_linked_navi_id ID пункта меню,с которым связан документ +document_lang Язык документа +document_lang_group Языковая группа документа + +Пример вывода: +----------------------------------------------------------- +{$document.document_title} Просмотров: {$document.document_count_view} + +*} +{$document.document_title|stripcslashes} \ No newline at end of file diff --git a/fields/doc_from_rub/tpl/field.tpl b/fields/doc_from_rub/tpl/field.tpl new file mode 100644 index 0000000..453d8f5 --- /dev/null +++ b/fields/doc_from_rub/tpl/field.tpl @@ -0,0 +1,17 @@ +{if $fields && !isset($error)} + + + +{else} + +
        +
      • {#error#}
      • +
      + +{/if} diff --git a/fields/doc_from_rub/tpl/list.tpl b/fields/doc_from_rub/tpl/list.tpl new file mode 100644 index 0000000..95e9912 --- /dev/null +++ b/fields/doc_from_rub/tpl/list.tpl @@ -0,0 +1,12 @@ +{if $items} + {assign var=field_level value=$field_level+1 scope="global"} + {foreach from=$items key=key item=field} + + {include file="$subtpl" items=$field.child} + {/foreach} +{/if} diff --git a/fields/doc_from_rub_check/field.php b/fields/doc_from_rub_check/field.php new file mode 100644 index 0000000..c3cb44e --- /dev/null +++ b/fields/doc_from_rub_check/field.php @@ -0,0 +1,201 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = array(); + + switch ($action) + { + case 'edit': + if (isset($default)) + { + $parent = $AVE_DB->Query(" + SELECT + MIN(document_parent) AS min + FROM + ". PREFIX ."_documents + WHERE + rubric_id IN (" . $default . ") + ")->GetCell(); + + $sql = $AVE_DB->Query(" + SELECT + Id, document_parent, document_title + FROM + ". PREFIX ."_documents + WHERE + rubric_id IN (" . $default . ") + "); + + $field_value_array = explode('|', $field_value); + $field_value_array = array_values(array_diff($field_value_array, array(''))); + + $cats = array(); + + while($cat = $sql->FetchAssocArray()) + { + $cat['checked'] = ((in_array($cat['Id'], $field_value_array) == false) ? "0" : "1"); + $cats_ID[$cat['Id']][] = $cat; + $cats[$cat['document_parent']][$cat['Id']] = $cat; + } + + $AVE_Template->assign('subtpl', $tpl_dir."list.tpl"); + $AVE_Template->assign('fields', doc_from_rub_check_tree($cats, $parent)); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('doc_id', (isset($_REQUEST['Id']) ? (int)$_REQUEST['Id'] : 0)); + $AVE_Template->assign('field_value', $field_value); + } + else + { + $AVE_Template->assign('error', $AVE_Template->get_config_vars('error')); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('subtpl', $tpl_dir."list.tpl"); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $field_value_array = explode('|', $field_value); + $field_value_array = array_values(array_diff($field_value_array, array(''))); + + if ($field_value_array != false) + { + foreach ($field_value_array as $list_item) + { + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $AVE_DB->Query(" + SELECT + Id, + document_title, + document_alias, + document_breadcrum_title + FROM + ".PREFIX."_documents + WHERE + Id = '" . $list_item . "' + ")->FetchAssocArray(); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'req': + $field_value_array = explode('|', $field_value); + $field_value_array = array_values(array_diff($field_value_array, array(''))); + + if ($field_value_array != false) + { + foreach ($field_value_array as $list_item) + { + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $AVE_DB->Query(" + SELECT + Id, + document_title, + document_alias, + document_breadcrum_title + FROM + ".PREFIX."_documents + WHERE + Id = '" . $list_item . "' + ")->FetchAssocArray(); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + + } + + return ($res ? $res : $field_value); +} + +function doc_from_rub_check_tree($cats, $parent) +{ + if (is_array($cats) and isset($cats[$parent])) + { + foreach ($cats[$parent] as $cat) + { + $array[$cat['Id']]['Id'] = $cat['Id']; + $array[$cat['Id']]['checked'] = $cat['checked']; + $array[$cat['Id']]['document_title'] = $cat['document_title']; + $array[$cat['Id']]['child'] = doc_from_rub_check_tree($cats, $cat['Id']); + } + } + else + { + return null; + } + + return $array; +} +?> \ No newline at end of file diff --git a/fields/doc_from_rub_check/lang/bg.txt b/fields/doc_from_rub_check/lang/bg.txt new file mode 100644 index 0000000..09d64b5 --- /dev/null +++ b/fields/doc_from_rub_check/lang/bg.txt @@ -0,0 +1,4 @@ +[admin] + +name = "Документ от рубрика (Checkbox)" +error = "Не е зададена рубрика" \ No newline at end of file diff --git a/fields/doc_from_rub_check/lang/cz.txt b/fields/doc_from_rub_check/lang/cz.txt new file mode 100644 index 0000000..a8d48b7 --- /dev/null +++ b/fields/doc_from_rub_check/lang/cz.txt @@ -0,0 +1,3 @@ +[admin] +name = "Dokument z rubriky (Checkbox)" +error = "Rubrika nezadaná" \ No newline at end of file diff --git a/fields/doc_from_rub_check/lang/en.txt b/fields/doc_from_rub_check/lang/en.txt new file mode 100644 index 0000000..1c6c38c --- /dev/null +++ b/fields/doc_from_rub_check/lang/en.txt @@ -0,0 +1,3 @@ +[admin] +name = "Document from rubric (Checkbox)" +error = "Not specified category" \ No newline at end of file diff --git a/fields/doc_from_rub_check/lang/pl.txt b/fields/doc_from_rub_check/lang/pl.txt new file mode 100644 index 0000000..d606e6a --- /dev/null +++ b/fields/doc_from_rub_check/lang/pl.txt @@ -0,0 +1,3 @@ +[admin] +name = "Dokument z rubryki (Checkbox)" +error = "Nie wybrano rubryki" \ No newline at end of file diff --git a/fields/doc_from_rub_check/lang/ru.txt b/fields/doc_from_rub_check/lang/ru.txt new file mode 100644 index 0000000..ea62541 --- /dev/null +++ b/fields/doc_from_rub_check/lang/ru.txt @@ -0,0 +1,3 @@ +[admin] +name = "Документ из рубрики (Checkbox)" +error = "Не задана рубрика" \ No newline at end of file diff --git a/fields/doc_from_rub_check/lang/ua.txt b/fields/doc_from_rub_check/lang/ua.txt new file mode 100644 index 0000000..959c810 --- /dev/null +++ b/fields/doc_from_rub_check/lang/ua.txt @@ -0,0 +1,3 @@ +[admin] +name = "Документ з рубрики (Checkbox)" +error = "Не задано рубрику" \ No newline at end of file diff --git a/fields/doc_from_rub_check/tpl/field-doc.tpl b/fields/doc_from_rub_check/tpl/field-doc.tpl new file mode 100644 index 0000000..78dbf11 --- /dev/null +++ b/fields/doc_from_rub_check/tpl/field-doc.tpl @@ -0,0 +1,23 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$field_id} ID поля +{$field_value} Данные поля (массив) + +$item.Id +$item.document_title +$item.document_alias +$item.document_breadcrum_title + +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +Пример вывода: +----------------------------------------------------------- +*} + \ No newline at end of file diff --git a/fields/doc_from_rub_check/tpl/field-req.tpl b/fields/doc_from_rub_check/tpl/field-req.tpl new file mode 100644 index 0000000..78dbf11 --- /dev/null +++ b/fields/doc_from_rub_check/tpl/field-req.tpl @@ -0,0 +1,23 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$field_id} ID поля +{$field_value} Данные поля (массив) + +$item.Id +$item.document_title +$item.document_alias +$item.document_breadcrum_title + +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +Пример вывода: +----------------------------------------------------------- +*} + \ No newline at end of file diff --git a/fields/doc_from_rub_check/tpl/field.tpl b/fields/doc_from_rub_check/tpl/field.tpl new file mode 100644 index 0000000..c7d5ea8 --- /dev/null +++ b/fields/doc_from_rub_check/tpl/field.tpl @@ -0,0 +1,38 @@ +{if $docfromrubcheck != load} + {assign var=docfromrubcheck value='' scope="global"} + {literal} + + {/literal} + {assign var=docfromrubcheck value="load" scope="global"} +{/if} + +{if $fields && !isset($error)} + +
        + {foreach from=$fields key=key item=field} + +
      • + + +
      • + +
        + {include file="$subtpl" items=$field.child} + {/foreach} +
      +{else} +
        +
      • {#error#}
      • +
      +{/if} diff --git a/fields/doc_from_rub_check/tpl/list.tpl b/fields/doc_from_rub_check/tpl/list.tpl new file mode 100644 index 0000000..d78e0a7 --- /dev/null +++ b/fields/doc_from_rub_check/tpl/list.tpl @@ -0,0 +1,20 @@ +{if $items} +
        + {foreach from=$items key=key item=field} +
      • + + +
      • +
        + {include file="$subtpl" items=$field.child} + {/foreach} +
      +{/if} diff --git a/fields/doc_from_rub_search/css/field.css b/fields/doc_from_rub_search/css/field.css new file mode 100644 index 0000000..0a676da --- /dev/null +++ b/fields/doc_from_rub_search/css/field.css @@ -0,0 +1,18 @@ +.multi_lists { + position: relative; +} + +.multi_lists > .ui-state-highlight { + display: inline-block; + margin: 3px; + width: 450px; + height: 26px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; + padding: 0 !important; +} \ No newline at end of file diff --git a/fields/doc_from_rub_search/field.php b/fields/doc_from_rub_search/field.php new file mode 100644 index 0000000..c595350 --- /dev/null +++ b/fields/doc_from_rub_search/field.php @@ -0,0 +1,224 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = array(); + + switch ($action) + { + case 'edit': + + $items = array(); + + if ($field_value != '' && $field_value != $default) + { + $items = explode('|', $field_value); + $items = array_values(array_diff($items, array(''))); + } + + if(! empty($items)) + { + foreach($items as $k => $v) + { + $list[$k]['param'] = htmlspecialchars(get_document($v, 'document_title'), ENT_QUOTES); + $list[$k]['value'] = $v; + } + + $items = $list; + } + else + { + $items[0]['param'] = ''; + $items[0]['value'] = ''; + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('doc_id', $_REQUEST['Id']); + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('field_id', $field_id); + + return $AVE_Template->fetch($tpl_file); + + case 'save': + foreach ($field_value as $v) + { + if (! empty($v['value'])) + { + $field_value_new[] = $v['value']; + } + } + + if (isset($field_value_new)) + { + return '|' . implode('|', $field_value_new) . '|'; + } + else + { + return $field_value_new = ''; + } + break; + + case 'doc': + $field_value_array = explode('|', $field_value); + $field_value_array = array_values(array_diff($field_value_array, array(''))); + + if ($field_value_array != false) + { + foreach ($field_value_array as $list_item) + { + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $AVE_DB->Query(" + SELECT + Id, + document_title, + document_alias, + document_breadcrum_title + FROM + ".PREFIX."_documents + WHERE + Id = '" . $list_item . "' + ")->FetchAssocArray(); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'req': + $field_value_array = explode('|', $field_value); + $field_value_array = array_values(array_diff($field_value_array, array(''))); + + if ($field_value_array != false) + { + foreach ($field_value_array as $list_item) + { + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $AVE_DB->Query(" + SELECT + Id, + document_title, + document_alias, + document_breadcrum_title + FROM + ".PREFIX."_documents + WHERE + Id = '" . $list_item . "' + ")->FetchAssocArray(); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + + case 'search': + $default = get_field_default_value($_REQUEST['field_id']); + + $sql = $AVE_DB->Query(" + SELECT + doc.Id, + doc.document_title, + rub.rubric_title + FROM + " . PREFIX . "_documents AS doc + JOIN + " . PREFIX . "_rubrics AS rub + ON doc.rubric_id = rub.Id + WHERE + doc.rubric_id IN (" . $default . ") + AND + doc.document_status = 1 + AND + UPPER (doc.document_title) LIKE UPPER('%" . $_REQUEST['q'] . "%') + GROUP BY + doc.Id + LIMIT + 0,5 + "); + + $doc_finded = array(); + + while ($row = $sql->FetchRow()) + { + $doc_finded[] = array( + 'doc_id' => $row->Id, + 'doc_title' => $row->document_title, + 'doc_rubric' => $row->rubric_title + ); + } + + echo json_encode($doc_finded); + exit; + + default: + return $field_value; + } + + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/doc_from_rub_search/js/field.js b/fields/doc_from_rub_search/js/field.js new file mode 100644 index 0000000..3534a2e --- /dev/null +++ b/fields/doc_from_rub_search/js/field.js @@ -0,0 +1,127 @@ +var DocSearch = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.DocSearch_items(); + }, + + DocSearch_items: function() { + this.DocSearch_sortable(); + this.DocSearch_del_item(); + this.DocSearch_add(); + this.DocSearch_search(); + }, + + DocSearch_update: function() { + this.DocSearch_maxid(); + this.DocSearch_del_item(); + this.DocSearch_search(); + AveAdmin.tooltip(); + }, + + DocSearch_maxid: function(id) { + var maxid = 1; + $('#docsearch_lists_' + id).children('.docsearch_list').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + DocSearch_del_item: function() { + $('.docsearch_list .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + docsearch_del_conf, + docsearch_del_head, + function(b) { + if (b) { + $('#docsearch_list_' + id).remove(); + } + } + ); + }); + }, + + DocSearch_add: function() { + $('.AddButton').on('click', function() { + c_id = $(this).parent().parent('.docsearch_lists').attr("data-id"); + d_id = $(this).parent().parent('.docsearch_lists').attr("data-docid"); + i_id = DocSearch.DocSearch_maxid(d_id + '_' + c_id); + $('#docsearch_lists_' + d_id + '_' + c_id + ':last').append( + '
      ' + + '  Id:   ×' + + '
      ' + + '
      ' + ); + + DocSearch.DocSearch_update(); + }); + }, + + DocSearch_sortable: function() { + $('.docsearch_lists').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + }, + + /** + * @return {boolean} + */ + DocSearch_search: function() { + + $(document).on('input', '.search_docsearch', function(event) + { + event.preventDefault(); + + var query = $(this); + + var did = query.attr('data-docid'); + var fid = query.attr('data-fieldid'); + var kid = query.attr('data-id'); + var field_id_input = $('.field_' + did + '_' + fid + '_' + kid); + + query.autocomplete("index.php?do=fields&field=doc_from_rub_search&type=search&doc_id=" + did + "&field_id=" + fid, { + width: query.outerWidth(), + max: 5, + dataType: "json", + matchContains: "word", + scroll: true, + scrollHeight: 200, + parse: function(data) { + return $.map(data, function(row) { + return { + data: row, + value: row.doc_title, + result: query.val() + } + }); + }, + formatItem: function(item) { + return '
      (' + item.doc_rubric + ') ' + item.doc_title + '
      '; + } + }).result(function(event, item) { + + query.val(item.doc_title); + + field_id_input.val(item.doc_id); + + query.unautocomplete(); + }); + + return false; + }); + + return false; + } +} + +$(document).ready(function() +{ + DocSearch.init(); +}); diff --git a/fields/doc_from_rub_search/js/outside.js b/fields/doc_from_rub_search/js/outside.js new file mode 100644 index 0000000..7c01cd8 --- /dev/null +++ b/fields/doc_from_rub_search/js/outside.js @@ -0,0 +1,127 @@ +var DocSearch = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.DocSearch_items(); + }, + + DocSearch_items: function() { + this.DocSearch_sortable(); + this.DocSearch_del_item(); + this.DocSearch_add(); + this.DocSearch_search(); + }, + + DocSearch_update: function() { + this.DocSearch_maxid(); + this.DocSearch_del_item(); + this.DocSearch_search(); + AveAdmin.tooltip(); + }, + + DocSearch_maxid: function(id) { + var maxid = 1; + $('#docsearch_lists_' + id).children('.docsearch_list').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + DocSearch_del_item: function() { + $('.docsearch_list .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + docsearch_del_conf, + docsearch_del_head, + function(b) { + if (b) { + $('#docsearch_list_' + id).remove(); + } + } + ); + }); + }, + + DocSearch_add: function() { + $('.AddButton').on('click', function() { + c_id = $(this).parent().parent('.docsearch_lists').attr("data-id"); + d_id = $(this).parent().parent('.docsearch_lists').attr("data-docid"); + i_id = DocSearch.DocSearch_maxid(d_id + '_' + c_id); + $('#docsearch_lists_' + d_id + '_' + c_id + ':last').append( + '
      ' + + '  Id:   ×' + + '
      ' + + '
      ' + ); + + DocSearch.DocSearch_update(); + }); + }, + + DocSearch_sortable: function() { + $('.docsearch_lists').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + }, + + /** + * @return {boolean} + */ + DocSearch_search: function() { + + $(document).on('input', '.search_docsearch', function(event) + { + event.preventDefault(); + + var query = $(this); + + var did = query.attr('data-docid'); + var fid = query.attr('data-fieldid'); + var kid = query.attr('data-id'); + var field_id_input = $('.field_' + did + '_' + fid + '_' + kid); + + query.autocomplete("index.php?do=fields&field=doc_from_rub_search&type=search&doc_id=" + did + "&field_id=" + fid, { + width: query.outerWidth(), + max: 5, + dataType: "json", + matchContains: "word", + scroll: true, + scrollHeight: 200, + parse: function(data) { + return $.map(data, function(row) { + return { + data: row, + value: row.doc_title, + result: query.val() + } + }); + }, + formatItem: function(item) { + return '
      (' + item.doc_rubric + ') ' + item.doc_title + '
      '; + } + }).result(function(event, item) { + + query.val(item.doc_title); + + field_id_input.val(item.doc_id); + + query.unautocomplete(); + }); + + return false; + }); + + return false; + } +} + +$(document).ready(function() +{ + DocSearch.init(); +}); \ No newline at end of file diff --git a/fields/doc_from_rub_search/lang/bg.txt b/fields/doc_from_rub_search/lang/bg.txt new file mode 100644 index 0000000..3b194c7 --- /dev/null +++ b/fields/doc_from_rub_search/lang/bg.txt @@ -0,0 +1,8 @@ +[admin] +name = "Документи от рубрика" +delete = "Изтриване на документ" +param = "Документ" +value = "Id" +del_conf = "Сигурни ли сте, че желаете да изтриете този елемент (Документ)?" +del_head = "Изтриване на елемент(Документ)..." +add = "Добави" \ No newline at end of file diff --git a/fields/doc_from_rub_search/lang/cz.txt b/fields/doc_from_rub_search/lang/cz.txt new file mode 100644 index 0000000..76f3ea0 --- /dev/null +++ b/fields/doc_from_rub_search/lang/cz.txt @@ -0,0 +1,8 @@ +[admin] +name = "Dokument z rubrik" +delete = "Odstranit prvek" +param = "Dokument" +value = "Id" +del_conf = "Opravdu chcete odstranit tento prvek (dokument)?" +del_head = "Odstranění prvku (dokumentu)..." +add = "Přidat" \ No newline at end of file diff --git a/fields/doc_from_rub_search/lang/pl.txt b/fields/doc_from_rub_search/lang/pl.txt new file mode 100644 index 0000000..5c14d3e --- /dev/null +++ b/fields/doc_from_rub_search/lang/pl.txt @@ -0,0 +1,8 @@ +[admin] +name = "Dokumenty z rubryki" +delete = "Usuń element" +param = "Dokument" +value = "ID" +del_conf = "Czy na pewno chcesz usunąć ten element (document)?" +del_head = "Usuń element (document) ..." +add = "Dodaj" \ No newline at end of file diff --git a/fields/doc_from_rub_search/lang/ru.txt b/fields/doc_from_rub_search/lang/ru.txt new file mode 100644 index 0000000..0353712 --- /dev/null +++ b/fields/doc_from_rub_search/lang/ru.txt @@ -0,0 +1,8 @@ +[admin] +name = "Документы из рубрик" +delete = "Удалить элемент" +param = "Документ" +value = "Id" +del_conf = "Вы уверены, что хотите удалить данный элемент (Документ)?" +del_head = "Удаление элемента (Документа)..." +add = "Добавить" \ No newline at end of file diff --git a/fields/doc_from_rub_search/lang/ua.txt b/fields/doc_from_rub_search/lang/ua.txt new file mode 100644 index 0000000..6acc90e --- /dev/null +++ b/fields/doc_from_rub_search/lang/ua.txt @@ -0,0 +1,8 @@ +[admin] +name = "Документи з рубрик" +delete = "Видалити елемент" +param = "Документ" +value = "Id" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент (Документ)?" +del_head = "Видалення елемента (Документа)..." +add = "Додати" \ No newline at end of file diff --git a/fields/doc_from_rub_search/tpl/field-doc.tpl b/fields/doc_from_rub_search/tpl/field-doc.tpl new file mode 100644 index 0000000..78dbf11 --- /dev/null +++ b/fields/doc_from_rub_search/tpl/field-doc.tpl @@ -0,0 +1,23 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$field_id} ID поля +{$field_value} Данные поля (массив) + +$item.Id +$item.document_title +$item.document_alias +$item.document_breadcrum_title + +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +Пример вывода: +----------------------------------------------------------- +*} + \ No newline at end of file diff --git a/fields/doc_from_rub_search/tpl/field-req.tpl b/fields/doc_from_rub_search/tpl/field-req.tpl new file mode 100644 index 0000000..78dbf11 --- /dev/null +++ b/fields/doc_from_rub_search/tpl/field-req.tpl @@ -0,0 +1,23 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$field_id} ID поля +{$field_value} Данные поля (массив) + +$item.Id +$item.document_title +$item.document_alias +$item.document_breadcrum_title + +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +Пример вывода: +----------------------------------------------------------- +*} + \ No newline at end of file diff --git a/fields/doc_from_rub_search/tpl/field.tpl b/fields/doc_from_rub_search/tpl/field.tpl new file mode 100644 index 0000000..d847886 --- /dev/null +++ b/fields/doc_from_rub_search/tpl/field.tpl @@ -0,0 +1,29 @@ +{if $docsearch != load} + {assign var=docsearch value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=docsearch value="load" scope="global"} +{/if} + +
      +{foreach from=$items key=key item=item} + +
      +   Id:   {if $key == 0}+{else}×{/if} +
      +
      + +{/foreach} +
      \ No newline at end of file diff --git a/fields/download/field.php b/fields/download/field.php new file mode 100644 index 0000000..0b2973b --- /dev/null +++ b/fields/download/field.php @@ -0,0 +1,76 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res=0; + + switch ($action) + { + case 'edit': + $field_value = !empty($field_value) ? htmlspecialchars($field_value, ENT_QUOTES) : ''; + + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $field_value = clean_php($field_value); + $field_param = explode('|', $field_value); + if ($tpl_empty) + { + $field_value = (!empty($field_param[1]) ? $field_param[1] . '
      ' : '') + . '
      '; + } + else + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + $res = $field_value; + break; + + case 'req': + $res=get_field_default($field_value,$action,$field_id,$tpl,$tpl_empty,$maxlength,$document_fields,$rubric_id); + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + } + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/download/lang/bg.txt b/fields/download/lang/bg.txt new file mode 100644 index 0000000..568adeb --- /dev/null +++ b/fields/download/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] + +name = "Линк към файл" diff --git a/fields/download/lang/cz.txt b/fields/download/lang/cz.txt new file mode 100644 index 0000000..b7dcd65 --- /dev/null +++ b/fields/download/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Soubor ke stažení" diff --git a/fields/download/lang/en.txt b/fields/download/lang/en.txt new file mode 100644 index 0000000..4936e36 --- /dev/null +++ b/fields/download/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "Download file" diff --git a/fields/download/lang/pl.txt b/fields/download/lang/pl.txt new file mode 100644 index 0000000..7d0ef7d --- /dev/null +++ b/fields/download/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Pobierz plik" diff --git a/fields/download/lang/ru.txt b/fields/download/lang/ru.txt new file mode 100644 index 0000000..91e422e --- /dev/null +++ b/fields/download/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Загрузить файл" diff --git a/fields/download/lang/ua.txt b/fields/download/lang/ua.txt new file mode 100644 index 0000000..eef181e --- /dev/null +++ b/fields/download/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Завантажити файл" diff --git a/fields/download/tpl/field.tpl b/fields/download/tpl/field.tpl new file mode 100644 index 0000000..b0f38cc --- /dev/null +++ b/fields/download/tpl/field.tpl @@ -0,0 +1,7 @@ +
      + + +  +  +? \ No newline at end of file diff --git a/fields/drop_down/field.php b/fields/drop_down/field.php new file mode 100644 index 0000000..18f2007 --- /dev/null +++ b/fields/drop_down/field.php @@ -0,0 +1,87 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + switch ($action) + { + case 'edit': + $items = array(); + $items = explode(',', $default); + $items = array_diff($items, array('')); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', trim($field_value)); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + @$field_value = clean_php($field_value); + if (!$tpl_empty) + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + $res = $field_value; + break; + + case 'req': + @$field_value = clean_php($field_value); + if (!$tpl_empty) + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + $res = $field_value; + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> diff --git a/fields/drop_down/lang/bg.txt b/fields/drop_down/lang/bg.txt new file mode 100644 index 0000000..8084852 --- /dev/null +++ b/fields/drop_down/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] +name = "Падащ списък" +no_items = "Не са зададени стойности по подразбиране" \ No newline at end of file diff --git a/fields/drop_down/lang/cz.txt b/fields/drop_down/lang/cz.txt new file mode 100644 index 0000000..2843330 --- /dev/null +++ b/fields/drop_down/lang/cz.txt @@ -0,0 +1,3 @@ +[admin] +name = "Rozevírací seznam" +no_items = "Neexistuje žádná výchozí hodnota" \ No newline at end of file diff --git a/fields/drop_down/lang/en.txt b/fields/drop_down/lang/en.txt new file mode 100644 index 0000000..1c68529 --- /dev/null +++ b/fields/drop_down/lang/en.txt @@ -0,0 +1,3 @@ +[admin] +name = "Dropdown list" +no_items = "No default value" \ No newline at end of file diff --git a/fields/drop_down/lang/pl.txt b/fields/drop_down/lang/pl.txt new file mode 100644 index 0000000..96bb798 --- /dev/null +++ b/fields/drop_down/lang/pl.txt @@ -0,0 +1,3 @@ +[admin] +name = "Lista rozwijana" +no_items = "Nie ma znaczenia domyślnego" \ No newline at end of file diff --git a/fields/drop_down/lang/ru.txt b/fields/drop_down/lang/ru.txt new file mode 100644 index 0000000..41ee8d0 --- /dev/null +++ b/fields/drop_down/lang/ru.txt @@ -0,0 +1,3 @@ +[admin] +name = "Выпадающий список" +no_items = "Нет значения по умолчанию" \ No newline at end of file diff --git a/fields/drop_down/lang/ua.txt b/fields/drop_down/lang/ua.txt new file mode 100644 index 0000000..4dc25b9 --- /dev/null +++ b/fields/drop_down/lang/ua.txt @@ -0,0 +1,3 @@ +[admin] +name = "Випадаючий список" +no_items = "Немає значення за замовчуванням" \ No newline at end of file diff --git a/fields/drop_down/tpl/field.tpl b/fields/drop_down/tpl/field.tpl new file mode 100644 index 0000000..05e0b5c --- /dev/null +++ b/fields/drop_down/tpl/field.tpl @@ -0,0 +1,11 @@ +{if $items} + +{else} +
        +
      • {#no_items#}
      • +
      +{/if} \ No newline at end of file diff --git a/fields/drop_down_key/field.php b/fields/drop_down_key/field.php new file mode 100644 index 0000000..8697e03 --- /dev/null +++ b/fields/drop_down_key/field.php @@ -0,0 +1,78 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + switch ($action) + { + case 'edit': + $items = explode(',', $default); + $items = array_diff($items, array('')); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', trim($field_value)); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + case 'req': + @$field_value = clean_php($field_value); + + if (!$tpl_empty) + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + else + { + $items = explode(',', $default); + $items = array_diff($items, array('')); + $field_value = $items[$field_value]; + } + + return $field_value = ($field_value != '') ? $field_value : ''; + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> diff --git a/fields/drop_down_key/lang/bg.txt b/fields/drop_down_key/lang/bg.txt new file mode 100644 index 0000000..968df74 --- /dev/null +++ b/fields/drop_down_key/lang/bg.txt @@ -0,0 +1,4 @@ +[admin] + +name = "Падащ списък (Ключ)" +no_items = "Не са зададени стойности по подразбиране" \ No newline at end of file diff --git a/fields/drop_down_key/lang/cz.txt b/fields/drop_down_key/lang/cz.txt new file mode 100644 index 0000000..0bf884b --- /dev/null +++ b/fields/drop_down_key/lang/cz.txt @@ -0,0 +1,3 @@ +[admin] +name = "Rozevírací seznam (klíč)" +no_items = "Neexistuje žádná výchozí hodnota" \ No newline at end of file diff --git a/fields/drop_down_key/lang/en.txt b/fields/drop_down_key/lang/en.txt new file mode 100644 index 0000000..80554ed --- /dev/null +++ b/fields/drop_down_key/lang/en.txt @@ -0,0 +1,3 @@ +[admin] +name = "Dropdown list (Key)" +no_items = "No default value" \ No newline at end of file diff --git a/fields/drop_down_key/lang/pl.txt b/fields/drop_down_key/lang/pl.txt new file mode 100644 index 0000000..92a5a2e --- /dev/null +++ b/fields/drop_down_key/lang/pl.txt @@ -0,0 +1,3 @@ +[admin] +name = "Lista rozwijana (klucz)" +no_items = "Nie ma znaczenia domyślnego" \ No newline at end of file diff --git a/fields/drop_down_key/lang/ru.txt b/fields/drop_down_key/lang/ru.txt new file mode 100644 index 0000000..f68fdb5 --- /dev/null +++ b/fields/drop_down_key/lang/ru.txt @@ -0,0 +1,3 @@ +[admin] +name = "Выпадающий список (Ключ)" +no_items = "Нет значения по умолчанию" \ No newline at end of file diff --git a/fields/drop_down_key/lang/ua.txt b/fields/drop_down_key/lang/ua.txt new file mode 100644 index 0000000..4ea234a --- /dev/null +++ b/fields/drop_down_key/lang/ua.txt @@ -0,0 +1,3 @@ +[admin] +name = "Випадаючий список (Ключ)" +no_items = "Немає значення за замовчуванням" \ No newline at end of file diff --git a/fields/drop_down_key/tpl/field.tpl b/fields/drop_down_key/tpl/field.tpl new file mode 100644 index 0000000..5a0b6a9 --- /dev/null +++ b/fields/drop_down_key/tpl/field.tpl @@ -0,0 +1,12 @@ +{if $items} + +{else} +
        +
      • {#no_items#}
      • +
      +{/if} \ No newline at end of file diff --git a/fields/flash/field.php b/fields/flash/field.php new file mode 100644 index 0000000..56453af --- /dev/null +++ b/fields/flash/field.php @@ -0,0 +1,79 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + switch ($action) + { + case 'edit': + $field_value = !empty($field_value) ? htmlspecialchars($field_value, ENT_QUOTES) : ''; + + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $field_value = clean_php($field_value); + $field_param = explode('|', $field_value); + $field_param[1] = (!empty($field_param[1]) && is_numeric($field_param[1])) ? $field_param[1] : 470; + $field_param[2] = (!empty($field_param[2]) && is_numeric($field_param[2])) ? $field_param[2] : 320; + if ($tpl_empty) + { + $field_value = ''; + } + else + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + $res=$field_value; + break; + + case 'req': + $res=get_field_default($field_value,$action,$field_id,$tpl,$tpl_empty,$maxlength,$document_fields,$rubric_id); + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/flash/lang/bg.txt b/fields/flash/lang/bg.txt new file mode 100644 index 0000000..851a564 --- /dev/null +++ b/fields/flash/lang/bg.txt @@ -0,0 +1,2 @@ +[admin] +name = "Flash" \ No newline at end of file diff --git a/fields/flash/lang/cz.txt b/fields/flash/lang/cz.txt new file mode 100644 index 0000000..a9c35ea --- /dev/null +++ b/fields/flash/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Flash video (Flash)" \ No newline at end of file diff --git a/fields/flash/lang/pl.txt b/fields/flash/lang/pl.txt new file mode 100644 index 0000000..016f1fc --- /dev/null +++ b/fields/flash/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Wideo w formacie Flash" \ No newline at end of file diff --git a/fields/flash/lang/ru.txt b/fields/flash/lang/ru.txt new file mode 100644 index 0000000..790af0f --- /dev/null +++ b/fields/flash/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Флеш ролик (Flash)" \ No newline at end of file diff --git a/fields/flash/lang/ua.txt b/fields/flash/lang/ua.txt new file mode 100644 index 0000000..790af0f --- /dev/null +++ b/fields/flash/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Флеш ролик (Flash)" \ No newline at end of file diff --git a/fields/flash/tpl/field.tpl b/fields/flash/tpl/field.tpl new file mode 100644 index 0000000..d3d4215 --- /dev/null +++ b/fields/flash/tpl/field.tpl @@ -0,0 +1,6 @@ + + + +  +  + ? diff --git a/fields/image_mega/css/field.css b/fields/image_mega/css/field.css new file mode 100755 index 0000000..4b3b6ca --- /dev/null +++ b/fields/image_mega/css/field.css @@ -0,0 +1,139 @@ +.mega { + position: relative; +} + + +.mega_left_block +{ + width: 128px; + display: inline-block; + position: relative; + padding-left: 10px; +} + +.mega_right_block +{ + width: 258px; + display: inline-block; + position: relative; + padding-left: 10px; +} + +.mega_link { + margin-top: 5px; + padding-left: 10px; +} + +.mega_link_input { + display: inline-block; + width: 230px; + height: 24px; + line-height: 24px; + border-radius: 3px; + border: 1px solid #eaeaea !important; + resize: none !important; + padding: 3px !important; + + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; + + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; + box-sizing: border-box !important; +} + +.mega_item { + display: inline-block; + margin: 3px; + width: 400px; + height: 210px; + background-color: rgba(255, 255, 255, 0.5); + border: solid 1px #eaeaea; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + position: relative; + text-align: left; +} + +.mega_item:hover { + background-color: rgba(255, 255, 255, 1.0); + border: solid 1px rgba(234, 234, 234, 0.5); + -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); +} + +.mega_item:hover > .header { + background-color: rgba(210, 210, 210, 0.3); +} + +.mega_item .header { + background-color: rgba(210, 210, 210, 0.5); + height: 26px; + cursor: move; + border-radius: 5px 5px 0 0; +} + +.mega_item .image { + background-color: #fcfcfc; + border: solid 1px #eaeaea; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.mega_item textarea { + display: inline-block; + width: 238px; + height: 60px; + margin-top: 10px; + border-radius: 3px; + border: 1px solid #eaeaea !important; + resize: none !important; + padding: 3px !important; + + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + box-shadow: none !important; + + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; + box-sizing: border-box !important; +} + +.mega_item .view { + position: absolute; + top: 3px; + left: 3px; + cursor: pointer !important; +} + +.mega_item .delete { + position: absolute; + top: 3px; + right: 3px; + cursor: pointer !important; +} + +.mega_item .info { + position: absolute; + top: -5px; + right: -5px; + cursor: pointer !important; +} + +.mega_sortable > .ui-state-highlight { + display: inline-block; + margin: 5px; + width: 400px; + height: 210px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; +} \ No newline at end of file diff --git a/fields/image_mega/field.php b/fields/image_mega/field.php new file mode 100755 index 0000000..269cd3c --- /dev/null +++ b/fields/image_mega/field.php @@ -0,0 +1,435 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + $iniset_count = ini_get('max_file_uploads'); + + switch ($action) + { + case 'edit': + + $items = array(); + $image_items = array(); + + if ($_REQUEST['action'] != 'new') + { + $items = unserialize($field_value); + + if ($items != false) + { + foreach($items as $k => $v) + { + $image_item = explode('|', $v); + + $image[$k]['url'] = $image_item[0]; + $image[$k]['thumb'] = ($image_item[0] != '') + ? make_thumbnail(array('size' => 'f128x128', 'link' => $image_item[0])) + : $img_pixel; + + $image[$k]['title'] = (isset($image_item[1])) + ? $image_item[1] + : ''; + + $image[$k]['description'] = (isset($image_item[2])) + ? $image_item[2] + : ''; + + $image[$k]['link'] = (isset($image_item[3])) + ? htmlspecialchars($image_item[3], ENT_QUOTES) + : ''; + } + + if (! empty($image)) + { + $image_items = $image; + } + } + } + + $show_upload = true; + + $default = explode('|', $default); + + list($path, $watermark, $position, $transparency) = $default; + + if(preg_match("/%id/i", $path)) + { + if ($_REQUEST['action'] != 'new') + { + $path_upload = trim(@str_replace('%id', $_REQUEST['Id'], $path), '/'); + $show_upload = true; + } + else + { + $path_upload = (! empty($path)) + ? trim($default, '/') + : ''; + + $show_upload = false; + } + } + else + { + $path_upload = (! empty($path)) + ? trim($path, '/') + : ''; + + $show_upload = true; + } + + $dir_upload = '/' . UPLOAD_DIR . '/' . ((! empty($path_upload)) + ? $path_upload . '/' + : ''); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('max_files', $AVE_Template->get_config_vars('max_f_f') . $iniset_count); + $AVE_Template->assign('dir_upload', $AVE_Template->get_config_vars('upl_dir') . $dir_upload); + $AVE_Template->assign('show_upload', $show_upload); + + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('images', $image_items); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('doc_id', (isset($_REQUEST['Id']) ? (int)$_REQUEST['Id'] : 0)); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + + $items = (isset($field_value)) + ? unserialize($field_value) + : array(); + + $res = array(); + + if ($items != false) + { + foreach ($items as $image_item) + { + $field_data = explode('|', clean_php($image_item)); + + if (! empty($field_data)) + { + if ($tpl_empty) + { + $image_item = array(); + + $image_item['url'] = $field_data[0]; + $image_item['title'] = $field_data[1] ? $field_data[1] : ''; + $image_item['description'] = $field_data[2] ? $field_data[2] : ''; + $image_item['link'] = $field_data[3] ? $field_data[3] : ''; + + if (! empty($image_item['link'])) + $image_item['http'] = (preg_match('/^(http|https)/', $image_item['link']) ? true : false); + else + $image_item['http'] = false; + } + else + { + $image_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_data) + { + return $field_data[(int)$data[1]]; + }, + $tpl + ); + + $image_item = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $image_item + ); + + $image_item = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $image_item); + } + } + + $res[] = $image_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) + ? implode(PHP_EOL, $res) + : $tpl; + + break; + + case 'req': + $items = unserialize($field_value); + + $res = array(); + + if ($items != false) + { + foreach ($items as $image_item) + { + $field_data = explode('|', clean_php($image_item)); + + if (! empty($field_data)) + { + if ($tpl_empty) + { + $image_item = array(); + + $image_item['url'] = $field_data[0]; + $image_item['title'] = $field_data[1] ? $field_data[1] : ''; + $image_item['description'] = $field_data[2] ? $field_data[2] : ''; + $image_item['link'] = $field_data[3] ? $field_data[3] : ''; + + if (! empty($image_item['link'])) + $image_item['http'] = (preg_match('/^(http|https)/', $image_item['link']) ? true : false); + else + $image_item['http'] = false; + } + else + { + $image_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_data) + { + return $field_data[(int)$data[1]]; + }, + $tpl + ); + + $image_item = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $image_item + ); + + $image_item = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $image_item); + } + } + + $res[] = $image_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) + ? implode(PHP_EOL, $res) + : $tpl; + + break; + + case 'save': + foreach ($field_value as $v) + { + if (! empty($v['url'])) + { + + $field_value_new[] = $v['url'] + . ($v['title'] ? '|' . stripslashes(htmlspecialchars($v['title'], ENT_QUOTES)) : '|') + . ($v['description'] ? '|' . stripslashes(htmlspecialchars($v['description'], ENT_QUOTES)) : '|') + . ($v['link'] ? '|' . ltrim($v['link'], '/') : ''); + } + } + + if (isset($field_value_new)) + { + return serialize($field_value_new); + } + else + { + return $field_value_new = ''; + } + + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + + case 'upload': + $error = false; + + $search = array(); + $replace = array(); + + $files_unput = 'mega_files' . '_' . $_REQUEST['field_id'] . '_' . $_REQUEST['doc_id']; + + $search[] = '%d'; + $replace[] = date('d'); + $search[] = '%m'; + $replace[] = date('m'); + $search[] = '%Y'; + $replace[] = date('Y'); + + $default = explode('|', $default); + + list($path_upload, $watermark, $position, $transparency) = $default; + + if (! empty($path_upload)) + $path_upload = str_replace($search, $replace, $path_upload); + + if(preg_match("/%id/i", $path_upload)) + { + $path = trim(@str_replace('%id', $_REQUEST['doc_id'], $path_upload), '/'); + } + else + { + $path = (! empty($path_upload)) + ? $path_upload + : ''; + } + + function getExtension($file) + { + $file = pathinfo($file); + return $file['extension']; + } + + $valid_formats = array("jpg", "png", "gif", "bmp", "jpeg"); + + $dir = '/' . UPLOAD_DIR . '/' . ((! empty($path)) + ? trim($path, '/') . '/' + : ''); + + $dir_abs = BASE_DIR . $dir; + + if (! is_dir($dir_abs)) + mkdir($dir_abs, 0777, true); + + foreach ($_FILES[$files_unput]['name'] as $name => $value) + { + $filename = strtolower(stripslashes(prepare_url($_FILES[$files_unput]['name'][$name]))); + + $ext = getExtension($filename); + $ext = strtolower($ext); + + if (in_array($ext, $valid_formats)) + { + if (file_exists($dir_abs . $filename)) + { + $filename = rand(1000, 9999) . '_' . $filename; + } + + if (@move_uploaded_file($_FILES[$files_unput]['tmp_name'][$name], $dir_abs . $filename)) + { + $new_files[] = $filename; + + if ((bool)$watermark) + { + $position = ($position != '') ? $position : 'center'; + $transparency = ($transparency != '') ? $transparency : '50'; + + watermarks($dir . $filename, $position, $transparency); + } + + $error = false; + } + else + { + $error = true; + } + } + else + { + $error = true; + @unlink($_FILES[$files_unput]['tmp_name'][$name]); + } + } + + if ($error !== true) + { + echo json_encode(array( + 'files' => $new_files, + 'dir' => $dir, + 'respons' => 'succes', + 'message' => $AVE_Template->get_config_vars('resp_s_m'), + 'header' => $AVE_Template->get_config_vars('resp_s_h'), + 'theme' => 'accept' + ) + ); + } + else + { + echo json_encode(array( + 'respons' => 'error', + 'message' => $AVE_Template->get_config_vars('resp_e_m'), + 'header' => $AVE_Template->get_config_vars('resp_e_h'), + 'theme' => 'error' + ) + ); + } + + exit; + } + + return ($res ? $res : $field_value); + } diff --git a/fields/image_mega/js/field.js b/fields/image_mega/js/field.js new file mode 100755 index 0000000..936c475 --- /dev/null +++ b/fields/image_mega/js/field.js @@ -0,0 +1,284 @@ +var Mega = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.mega(); + }, + + mega: function() { + this.mega_sortable(); + this.mega_del_item(); + this.mega_del_all_item(); + this.mega_add_single(); + this.mega_add_folder(); + this.megae_upload_files(); + this.mega_click_upload(); + }, + + mega_update: function() { + this.mega_maxid(); + this.mega_del_item(); + AveAdmin.fancy_box(); + AveAdmin.tooltip(); + }, + + mega_maxid: function(id, doc) { + var maxid = 1; + $('#mega_' + doc + '_' + id).children('.mega_sortable').children('.mega_item').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + mega_del_item: function() { + $('.mega_item .delete').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + mega_del_conf, + mega_del_head, + function(b) { + if (b) { + $('#mega_image_' + id).remove(); + } + } + ); + }); + }, + + mega_del_all_item: function() { + $('.mega_del_all').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.mega').attr("data-id"); + var d_id = $(this).parent().parent().parent('.mega').attr("data-doc"); + jConfirm( + mega_del_all_c, + mega_del_all_h, + function(b) { + if (b) { + $('#mega_' + d_id + '_' + c_id).children('.mega_sortable').children('.mega_item').each(function() { + $(this).remove(); + }); + } + } + ); + }); + }, + + megae_upload_files: function() { + $('.mega_upload').on('change', function(event) { + + var mega_input = $(this); + + event.preventDefault(); + + if (mega_input.val() == '') { + return false; + } + + var files_input = this.files.length; + var max_files = mega_input.attr("data-max-files"); + + if (files_input > max_files) { + $.jGrowl(mega_max_f_t, { + header: mega_max_f_h, + theme: 'error' + }); + + mega_input.replaceWith(mega_input.val('').clone(true)); + + return false; + } + + var c_id = $(this).parent('.mega').attr("data-id"); + var d_id = $(this).parent('.mega').attr("data-doc"); + var r_id = $(this).parent('.mega').attr("data-rubric"); + + $('#formDoc').ajaxSubmit({ + url: 'index.php?do=fields', + data: { + "field_id": c_id, + "rubric_id": r_id, + "doc_id": d_id, + "field": 'image_mega', + "type": 'upload' + }, + beforeSend: function() { + $.alerts._overlay('show'); + }, + dataType: "JSON", + success: function(data) { + if (data['respons'] == 'succes') { + for (var p = 0, max = data.files.length; p < max; p++) { + + iid = Mega.mega_maxid(c_id, d_id); + var field_value = data['dir'] + data.files[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + + $('#mega_' + d_id + '_' + c_id + ' > .mega_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '
      ' + ); + + $.alerts._overlay('hide'); + + Mega.mega_update(); + } + } + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + + mega_input.replaceWith(mega_input = mega_input.clone(true)); + mega_input.val(); + } + }); + return false; + }); + }, + + mega_click_upload: function() { + $('.mega_upload_local').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.mega').attr("data-id"); + var d_id = $(this).parent().parent().parent('.mega').attr("data-doc"); + $('.mega_upload_field_' + c_id + '_' + d_id).trigger('click'); + }); + }, + + mega_add_single: function() { + $('.mega_add_single').on('click', function(event) { + event.preventDefault(); + + var c_id = $(this).parent().parent().parent('.mega').attr("data-id"); + var d_id = $(this).parent().parent().parent('.mega').attr("data-doc"); + var iid = Mega.mega_maxid(c_id, d_id); + + $('#mega_' + d_id + '_' + c_id + ' > .mega_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '
      ' + ); + + browse_uploads('image__' + c_id + '_' + d_id + '_' + iid + ''); + + Mega.mega_update(); + }); + }, + + mega_sortable: function() { + $('.mega_sortable').sortable({ + handle: ".header", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".mega").disableSelection(); + }, + + mega_add_folder: function() { + $('.mega_add_folder').on('click', function(event) { + event.preventDefault(); + + var c_id = $(this).parent().parent().parent('.mega').attr("data-id"); + var d_id = $(this).parent().parent().parent('.mega').attr("data-doc"); + + browse_dirs("cascad__" + c_id + '_' + d_id); + }); + } +}; + +$(document).ready(function() { + Mega.init(); + + $.fn.myPlugin = function mega_add_items(dir, c_id, d_id) { + + $.ajax({ + url: ave_path + 'admin/index.php?do=docs&action=image_import&ajax=run', + data: { + "path": dir + }, + dataType: "JSON", + success: function(data) { + $.alerts._overlay('hide'); + for (var p = 0, max = data.respons.length; p < max; p++) { + var iid = Mega.mega_maxid(c_id, d_id); + var field_value = dir + data.respons[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + + $('#mega_' + d_id + '_' + c_id + ' > .mega_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '' + + '
      ' + + '
      ' + + '' + + '
      ' + ); + + Mega.mega_update(); + } + } + }); + } + +}); \ No newline at end of file diff --git a/fields/image_mega/lang/pl.txt b/fields/image_mega/lang/pl.txt new file mode 100644 index 0000000..a8f1cb3 --- /dev/null +++ b/fields/image_mega/lang/pl.txt @@ -0,0 +1,30 @@ +[admin] +name = "Obrazek (Mega)" +look = "Подивитися" +select = "Вибрати зображення" +delete = "Видалити елемент каскада" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент?
      (зі сервера зображення видалене не буде)" +del_head = "Видалення елемента каскада..." +add_n_e = "Додати новий елемент:" +add_f = "Вибрати зображення" +add_d = "Вибрати папку" +add_l = "Завантажити з комп’ютера" +add_upl_e = "Ви зможете завантажити фотографії з локального комп’ютера після створення документа. Для цього натисніть внизу кнопку “Додати та продовжити редагування”" +upl_dir = "Папка: " +del_all = "Видалити усі елементи" +del_all_c = "Ви впевнені, що бажаєте видалити всі елементи?
      (зі сервера зображення видалене не буде)" +del_all_h = "Видалення всіх елементів каскада..." +resp_s_h = "Виконано" +resp_s_m = "Файли успішно завантажилися" +resp_e_m = "Сталася помилка при завантаженні файлів. Спробуйте ще раз." +resp_e_h = "Помилка" +resp_m_m = "Кіл-ть файлів для завантаження перевищує значення, яке вказане у налаштуваннях PHP." +resp_m_h = "Помилка" +max_f_f = "Максимальна кіль-ть файлів, що завантажуються: " +max_f_h = "Помилка" +max_f_t = "Перевищено максимальне число файлів,
      для одночасного завантаженння" +img_title = "Заголовок" +img_description = "Опис" +img_link = "Посилання" +from_file = "Файл" +from_docs = "Документ" \ No newline at end of file diff --git a/fields/image_mega/lang/ru.txt b/fields/image_mega/lang/ru.txt new file mode 100755 index 0000000..1f496fa --- /dev/null +++ b/fields/image_mega/lang/ru.txt @@ -0,0 +1,30 @@ +[admin] +name = "Изображение (Mega)" +look = "Посмотреть" +select = "Выбрать изображение" +delete = "Удалить элемент каскада" +del_conf = "Вы уверены, что хотите удалить данный элемент?
      (Изображение не будет удалено с сервера)" +del_head = "Удаление элемента каскада..." +add_n_e = "Добавить новый элемент:" +add_f = "Выбрать изображение" +add_d = "Выбрать папку" +add_l = "Загрузить с компьютера" +add_upl_e = "Вы сможете загрузить фотографии с локального компьютера после создания документа. Для этого нажмите внизу кнопку «Добавить и продолжить редактирование»" +upl_dir = "Папка: " +del_all = "Удалить все элементы" +del_all_c = "Вы уверены, что хотите удалить все элементы?
      (Изображения не будет удалены с сервера)" +del_all_h = "Удаление всех элемента каскада..." +resp_s_h = "Выполнено" +resp_s_m = "Файлы успешно загрузились" +resp_e_m = "Возникла ошибка при загрузке файлов. Попробуйте еще раз." +resp_e_h = "Ошибка" +resp_m_m = "Кол-во загружаемых файлов превышает значение, заданное в настройках PHP." +resp_m_h = "Ошибка" +max_f_f = "Макимальное кол-во загружаемых файлов: " +max_f_h = "Ошибка" +max_f_t = "Превышено максимальное число файлов,
      для одновременной загрузки" +img_title = "Заголовок" +img_description = "Описание" +img_link = "Ссылка" +from_file = "Файл" +from_docs = "Документ" \ No newline at end of file diff --git a/fields/image_mega/lang/ua.txt b/fields/image_mega/lang/ua.txt new file mode 100644 index 0000000..62110b4 --- /dev/null +++ b/fields/image_mega/lang/ua.txt @@ -0,0 +1,30 @@ +[admin] +name = "Зображення (Mega)" +look = "Подивитися" +select = "Вибрати зображення" +delete = "Видалити елемент каскада" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент?
      (зі сервера зображення видалене не буде)" +del_head = "Видалення елемента каскада..." +add_n_e = "Додати новий елемент:" +add_f = "Вибрати зображення" +add_d = "Вибрати папку" +add_l = "Завантажити з комп’ютера" +add_upl_e = "Ви зможете завантажити фотографії з локального комп’ютера після створення документа. Для цього натисніть внизу кнопку “Додати та продовжити редагування”" +upl_dir = "Папка: " +del_all = "Видалити усі елементи" +del_all_c = "Ви впевнені, що бажаєте видалити всі елементи?
      (зі сервера зображення видалене не буде)" +del_all_h = "Видалення всіх елементів каскада..." +resp_s_h = "Виконано" +resp_s_m = "Файли успішно завантажилися" +resp_e_m = "Сталася помилка при завантаженні файлів. Спробуйте ще раз." +resp_e_h = "Помилка" +resp_m_m = "Кіл-ть файлів для завантаження перевищує значення, яке вказане у налаштуваннях PHP." +resp_m_h = "Помилка" +max_f_f = "Максимальна кіль-ть файлів, що завантажуються: " +max_f_h = "Помилка" +max_f_t = "Перевищено максимальне число файлів,
      для одночасного завантаженння" +img_title = "Заголовок" +img_description = "Опис" +img_link = "Посилання" +from_file = "Файл" +from_docs = "Документ" \ No newline at end of file diff --git a/fields/image_mega/tpl/field-doc.tpl b/fields/image_mega/tpl/field-doc.tpl new file mode 100755 index 0000000..40ae5cf --- /dev/null +++ b/fields/image_mega/tpl/field-doc.tpl @@ -0,0 +1,46 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$ABS_PATH} Абсолютный путь + +{$field_id} ID поля +{$field_value} Данные поля (массив) +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +FOREACH +$image.url Адрес изображения +$image.title Заголовок +$image.description Описание +$image.link Ссылка +$image.http Есть ли в ссылке http или https (true/false) + +Пример вывода: +{if isset($image.title) && $image.title != ''}{$image.title}{/if} + +Можно использовать тег, для формирования миниатюры +[tag:X000x000:{$image.url}] +----------------------------------------------------------- +*} + +{foreach from=$field_value key=key item=image} +
      + {if isset($image.link) && $image.link != ''} + {if $image.http} + + {else} + + {/if} + {/if} + {if isset($image.title) && $image.title != ''}{$image.title}{/if} + {if isset($image.link)} + + {/if} + {if isset($image.description) && $image.description != ''} +

      + {$image.description} +

      + {/if} +
      +{/foreach} \ No newline at end of file diff --git a/fields/image_mega/tpl/field-req.tpl b/fields/image_mega/tpl/field-req.tpl new file mode 100755 index 0000000..cc5c33f --- /dev/null +++ b/fields/image_mega/tpl/field-req.tpl @@ -0,0 +1,46 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$ABS_PATH} Абсолютный путь + +{$field_id} ID поля +{$field_value} Данные поля (массив) +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +FOREACH +$image.url Адрес изображения +$image.title Заголовок +$image.description Описание +$image.link Ссылка +$image.http Есть ли в ссылке http или https (true/false) + +Пример вывода: +{if isset($image.title) && $image.title != ''}{$image.title}{/if} + +Можно использовать тег, для формирования миниатюры +[tag:X000x000:{$image.url}] +----------------------------------------------------------- +*} + +{foreach from=$field_value key=key item=image} +
      + {if isset($image.link) && $image.link != ''} + {if $image.http} + + {else} + + {/if} + {/if} + {if isset($image.title) && $image.title != ''}{$image.title}{/if} + {if isset($image.link)} + + {/if} + {if isset($image.description) && $image.description != ''} +

      + {$image.description} +

      + {/if} +
      +{/foreach} \ No newline at end of file diff --git a/fields/image_mega/tpl/field.tpl b/fields/image_mega/tpl/field.tpl new file mode 100755 index 0000000..05837e6 --- /dev/null +++ b/fields/image_mega/tpl/field.tpl @@ -0,0 +1,79 @@ +{if $mega_new != load} + {assign var=mega_new value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=mega_new value="load" scope="global"} +{/if} + +
      + + {if $show_upload} + + {/if} + + +
      + {foreach from=$images key=key item=image} + +
      +
      + + +
      +
      + + + +
      +
      + + +
      +
      + +
      + + {/foreach} +
      + +
      \ No newline at end of file diff --git a/fields/image_multi/css/field.css b/fields/image_multi/css/field.css new file mode 100755 index 0000000..432acf1 --- /dev/null +++ b/fields/image_multi/css/field.css @@ -0,0 +1,97 @@ +.cascad { + position: relative; +} + +.cascad_item { + display: inline-block; + margin: 3px; + width: 120px; + height: 216px; + background-color: rgba(255, 255, 255, 0.5); + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; +} + +.cascad_item:hover { + background-color: rgba(255, 255, 255, 1.0); + border: solid 1px rgba(234, 234, 234, 0.5); + -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); +} + +.cascad_item:hover > .header { + background-color: rgba(210, 210, 210, 0.3); +} + +.cascad_item .header { + background-color: rgba(210, 210, 210, 0.5); + height: 26px; + margin-bottom: 10px; + cursor: move; + border-radius: 5px 5px 0 0; +} + +.cascad_item .image { + background-color: #fcfcfc; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +.cascad_item textarea { + display: inline-block; + width: 100px; + height: 60px; + margin-top: 10px; + border-radius: 0 0 2px 2px; + border: 1px solid #eaeaea !important; + resize: none !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + padding: 3px !important; + box-sizing: border-box !important; + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; +} + +.cascad_item .view { + position: absolute; + top: 3px; + left: 3px; + cursor: pointer !important; +} + +.cascad_item .delete { + position: absolute; + top: 3px; + right: 3px; + cursor: pointer !important; +} + +.cascad_item .info { + position: absolute; + top: 30px; + right: 3px; + cursor: pointer !important; +} + +.cascad_sortable > .ui-state-highlight { + display: inline-block; + margin: 5px; + width: 120px; + height: 200px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; +} \ No newline at end of file diff --git a/fields/image_multi/field.php b/fields/image_multi/field.php new file mode 100755 index 0000000..561c244 --- /dev/null +++ b/fields/image_multi/field.php @@ -0,0 +1,395 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + $iniset_count = ini_get('max_file_uploads'); + + switch ($action) + { + case 'edit': + + $items = array(); + $image_items = array(); + + if ($_REQUEST['action'] != 'new') + { + $items = unserialize($field_value); + + if($items != false) + { + foreach($items as $k => $v) + { + $image_item = explode('|', $v); + + $img = $image_item[0]; + unset($image_item[0]); + $image_item = array($img, implode('|', $image_item)); + + $image[$k]['url'] = $image_item[0]; + $image[$k]['thumb'] = ($image_item[0] != '') + ? make_thumbnail(array('size' => 'f100x100', 'link' => $image_item[0])) + : $img_pixel; + + $image[$k]['desc'] = (isset($image_item[1])) + ? htmlspecialchars($image_item[1], ENT_QUOTES) + : ''; + } + + if (! empty($image)) + { + $image_items = $image; + } + } + } + + $show_upload = true; + + $default = explode('|', $default); + + list($path, $watermark, $position, $transparency) = $default; + + if(preg_match("/%id/i", $path)) + { + if ($_REQUEST['action'] != 'new') + { + $path_upload = trim(@str_replace('%id', $_REQUEST['Id'], $path), '/'); + $show_upload = true; + } + else + { + $path_upload = (! empty($path)) + ? trim($path, '/') + : ''; + + $show_upload = false; + } + } + else + { + $path_upload = (! empty($path)) + ? $path + : ''; + + $show_upload = true; + } + + $dir_upload = '/' . UPLOAD_DIR . '/' . ((!empty($path_upload)) + ? $path_upload . '/' + : ''); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('max_files', $AVE_Template->get_config_vars('max_f_f') . $iniset_count); + $AVE_Template->assign('dir_upload', $AVE_Template->get_config_vars('upl_dir') . $dir_upload); + $AVE_Template->assign('show_upload', $show_upload); + + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('images', $image_items); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('doc_id', (isset($_REQUEST['Id']) ? (int)$_REQUEST['Id'] : 0)); + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + + $items = (isset($field_value)) + ? unserialize($field_value) + : array(); + + $res = array(); + + if ($items != false) + { + foreach ($items as $image_item) + { + $image_item = clean_php($image_item); + $field_param = explode('|', $image_item); + + if ($image_item) + { + if ($tpl_empty) + { + $image_item = $field_param; + } + else + { + $image_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + + $image_item = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $image_item + ); + + $image_item = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $image_item); + } + } + + $res[] = $image_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) + ? implode(PHP_EOL, $res) + : $tpl; + + break; + + case 'req': + $items = unserialize($field_value); + + $res = array(); + + if ($items != false) + { + foreach ($items as $image_item) + { + $image_item = clean_php($image_item); + $field_param = explode('|', $image_item); + + if ($image_item) + { + if ($tpl_empty) + { + $image_item = $field_param; + } + else + { + $image_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + + $image_item = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $image_item + ); + + $image_item = preg_replace_callback('/\[tag:([r|c|f]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $image_item); + } + } + + $res[] = $image_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) + ? implode(PHP_EOL, $res) + : $tpl; + + break; + + case 'save': + foreach ($field_value as $v) + { + if (! empty($v['url'])) + { + $field_value_new[] = $v['url'] . ($v['descr'] ? '|' . $v['descr'] : ''); + } + } + + if (isset($field_value_new)) + { + return @serialize($field_value_new); + } + else + { + return $field_value_new = ''; + } + + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + + case 'upload': + $error = false; + + $search = array(); + $replace = array(); + + $files_unput = 'cascade_files'.'_'.$_REQUEST['field_id'].'_'.$_REQUEST['doc_id']; + + $search[] = '%d'; + $replace[] = date('d'); + $search[] = '%m'; + $replace[] = date('m'); + $search[] = '%Y'; + $replace[] = date('Y'); + + $default = explode('|', $default); + + list($path_upload, $watermark, $position, $transparency) = $default; + + if (! empty($path_upload)) + $path_upload = str_replace($search, $replace, $path_upload); + + if(preg_match("/%id/i", $path_upload)) + { + $path = trim(@str_replace('%id', $_REQUEST['doc_id'], $path_upload), '/'); + } + else + { + $path = (! empty($path_upload)) + ? $path_upload + : ''; + } + + function getExtension($file) + { + $file = pathinfo($file); + return $file['extension']; + } + + $valid_formats = array("jpg", "png", "gif", "bmp","jpeg"); + + $dir = '/' . UPLOAD_DIR . '/' . ((! empty($path)) + ? trim($path, '/') . '/' + : ''); + + $dir_abs = BASE_DIR . $dir; + + if (! is_dir($dir_abs)) + @mkdir($dir_abs, 0777, true); + + foreach ($_FILES[$files_unput]['name'] as $name => $value) + { + $filename = strtolower(stripslashes(prepare_url($_FILES[$files_unput]['name'][$name]))); + + $ext = getExtension($filename); + $ext = strtolower($ext); + + if(in_array($ext, $valid_formats)) + { + if (file_exists($dir_abs . $filename)) + { + $filename = rand(1000, 9999) . '_' . $filename; + } + + if (@move_uploaded_file($_FILES[$files_unput]['tmp_name'][$name], $dir_abs . $filename)) + { + $new_files[] = $filename; + $error = false; + + if ((bool)$watermark) + { + $position = ($position != '') ? $position : 'center'; + $transparency = ($transparency != '') ? $transparency : '100'; + + watermarks($dir . $filename, $position, $transparency); + } + } + else + { + $error = true; + } + } + else + { + $error = true; + @unlink($_FILES[$files_unput]['tmp_name'][$name]); + } + } + + if ($error !== true) + { + echo json_encode(array( + 'files' => $new_files, + 'dir' => $dir, + 'respons' => 'succes', + 'message' => $AVE_Template->get_config_vars('resp_s_m'), + 'header' => $AVE_Template->get_config_vars('resp_s_h'), + 'theme' => 'accept' + ) + ); + } + else + { + echo json_encode(array( + 'respons' => 'error', + 'message' => $AVE_Template->get_config_vars('resp_e_m'), + 'header' => $AVE_Template->get_config_vars('resp_e_h'), + 'theme' => 'error' + ) + ); + } + + exit; + } + + return ($res ? $res : $field_value); +} diff --git a/fields/image_multi/js/field.js b/fields/image_multi/js/field.js new file mode 100755 index 0000000..ae844d6 --- /dev/null +++ b/fields/image_multi/js/field.js @@ -0,0 +1,229 @@ +var Cascad = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.cascad(); + }, + + cascad: function() { + this.cascad_sortable(); + this.cascad_del_item(); + this.cascad_del_all_item(); + this.cascad_add_single(); + this.cascad_add_folder(); + this.cascade_upload_files(); + this.cascad_click_upload(); + }, + + cascad_update: function() { + this.cascad_maxid(); + this.cascad_del_item(); + AveAdmin.fancy_box(); + AveAdmin.tooltip(); + }, + + cascad_maxid: function(id, doc) { + var maxid = 1; + $('#cascad_' + doc + '_' + id).children('.cascad_sortable').children('.cascad_item').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + cascad_del_item: function() { + $('.cascad_item .delete').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + del_conf, + del_head, + function(b) { + if (b) { + $('#cascad_image_' + id).remove(); + } + } + ); + }); + }, + + cascad_del_all_item: function() { + $('.del_all').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + jConfirm( + del_all_c, + del_all_h, + function(b) { + if (b) { + $('#cascad_' + d_id + '_' + c_id).children('.cascad_sortable').children('.cascad_item').each(function() { + $(this).remove(); + }); + } + } + ); + }); + }, + + cascade_upload_files: function() { + $('.cascade_upload').on('change', function(event) { + + var cascade_input = $(this); + + event.preventDefault(); + + if (cascade_input.val() == '') { + return false; + } + + var files_input = this.files.length; + var max_files = cascade_input.attr("data-max-files"); + + if (files_input > max_files) { + $.jGrowl(max_f_t, { + header: max_f_h, + theme: 'error' + }); + + cascade_input.replaceWith(cascade_input.val('').clone(true)); + + return false; + } + + var cid = $(this).parent('.cascad').attr("data-id"); + var did = $(this).parent('.cascad').attr("data-doc"); + var rid = $(this).parent('.cascad').attr("data-rubric"); + + $('#formDoc').ajaxSubmit({ + url: 'index.php?do=fields', + data: { + "field_id": cid, + "rubric_id": rid, + "doc_id": did, + "field": 'image_multi', + "type": 'upload' + }, + beforeSend: function() { + $.alerts._overlay('show'); + }, + dataType: "json", + success: function(data) { + if (data['respons'] == 'succes') { + for (var p = 0, max = data.files.length; p < max; p++) { + iid = Cascad.cascad_maxid(cid, did); + var field_value = data['dir'] + data.files[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad_' + did + '_' + cid + ' > .cascad_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + $.alerts._overlay('hide'); + Cascad.cascad_update(); + } + } + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + cascade_input.replaceWith(cascade_input = cascade_input.clone(true)); + cascade_input.val(); + } + }); + return false; + }); + }, + + cascad_click_upload: function() { + $('.upload_local').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + $('.cascade_upload_field_' + c_id + '_' + d_id).trigger('click'); + }); + }, + + cascad_add_single: function() { + $('.add_single').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + var iid = Cascad.cascad_maxid(c_id, d_id); + $('#cascad_' + d_id + '_' + c_id + ' > .cascad_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + browse_uploads('image__' + c_id + '_' + d_id + '_' + iid + ''); + Cascad.cascad_update(); + }); + }, + + cascad_sortable: function() { + $('.cascad_sortable').sortable({ + handle: ".header", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".cascad").disableSelection(); + }, + + cascad_add_folder: function() { + $('.add_folder').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + browse_dirs("cascad__" + c_id + '_' + d_id); + }); + } +}; + +$(document).ready(function() { + Cascad.init(); + + $.fn.myPlugin = function cascad_add_items(dir, cid, did) { + + $.ajax({ + url: ave_path + 'admin/index.php?do=docs&action=image_import&ajax=run', + data: { + "path": dir + }, + dataType: "json", + success: function(data) { + $.alerts._overlay('hide'); + for (var p = 0, max = data.respons.length; p < max; p++) { + var iid = Cascad.cascad_maxid(cid, did); + var field_value = dir + data.respons[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad_' + did + '_' + cid + ' > .cascad_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + Cascad.cascad_update(); + } + } + }); + } + +}); \ No newline at end of file diff --git a/fields/image_multi/js/outside.js b/fields/image_multi/js/outside.js new file mode 100755 index 0000000..6a35ba2 --- /dev/null +++ b/fields/image_multi/js/outside.js @@ -0,0 +1,231 @@ +var Cascad = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.cascad(); + }, + + cascad: function() { + this.cascad_sortable(); + this.cascad_del_item(); + this.cascad_del_all_item(); + this.cascad_add_single(); + this.cascad_add_folder(); + this.cascade_upload_files(); + this.cascad_click_upload(); + }, + + cascad_update: function() { + this.cascad_maxid(); + this.cascad_del_item(); + AveAdmin.fancy_box(); + AveAdmin.tooltip(); + }, + + cascad_maxid: function(id, doc) { + var maxid = 1; + $('#cascad_' + doc + '_' + id).children('.cascad_sortable').children('.cascad_item').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + cascad_del_item: function() { + $('.cascad_item .delete').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + del_conf, + del_head, + function(b) { + if (b) { + $('#cascad_image_' + id).remove(); + } + } + ); + }); + }, + + cascad_del_all_item: function() { + $('.del_all').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + jConfirm( + del_all_c, + del_all_h, + function(b) { + if (b) { + $('#cascad_' + d_id + '_' + c_id).children('.cascad_sortable').children('.cascad_item').each(function() { + $(this).remove(); + }); + } + } + ); + }); + }, + + cascade_upload_files: function() { + $('.cascade_upload').on('change', function(event) { + + event.preventDefault(); + + var cascade_input = $(this); + + event.preventDefault(); + + if (cascade_input.val() == '') { + return false; + } + + var files_input = this.files.length; + var max_files = cascade_input.attr("data-max-files"); + + if (files_input > max_files) { + $.jGrowl(max_f_t, { + header: max_f_h, + theme: 'error' + }); + + cascade_input.replaceWith(cascade_input.val('').clone(true)); + + return false; + } + + var cid = $(this).parent('.cascad').attr("data-id"); + var did = $(this).parent('.cascad').attr("data-doc"); + var rid = $(this).parent('.cascad').attr("data-rubric"); + + $('#docmanager_edit').ajaxSubmit({ + url: 'index.php?do=fields', + data: { + "field_id": cid, + "rubric_id": rid, + "doc_id": did, + "field": 'image_multi', + "type": 'upload' + }, + beforeSend: function() { + $.alerts._overlay('show'); + }, + dataType: "json", + success: function(data) { + if (data['respons'] == 'succes') { + for (var p = 0, max = data.files.length; p < max; p++) { + iid = Cascad.cascad_maxid(cid, did); + var field_value = data['dir'] + data.files[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad_' + did + '_' + cid + ' > .cascad_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + $.alerts._overlay('hide'); + Cascad.cascad_update(); + } + } + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + cascade_input.replaceWith(cascade_input = cascade_input.clone(true)); + cascade_input.val(); + } + }); + return false; + }); + }, + + cascad_click_upload: function() { + $('.upload_local').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + $('.cascade_upload_field_' + c_id + '_' + d_id).trigger('click'); + }); + }, + + cascad_add_single: function() { + $('.add_single').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + var iid = Cascad.cascad_maxid(c_id, d_id); + $('#cascad_' + d_id + '_' + c_id + ' > .cascad_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + browse_uploads('image__' + c_id + '_' + d_id + '_' + iid + ''); + Cascad.cascad_update(); + }); + }, + + cascad_sortable: function() { + $('.cascad_sortable').sortable({ + handle: ".header", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".cascad").disableSelection(); + }, + + cascad_add_folder: function() { + $('.add_folder').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad').attr("data-doc"); + browse_dirs("cascad__" + c_id + '_' + d_id); + }); + } +} + +$(document).ready(function() { + Cascad.init(); + + $.fn.myPlugin = function cascad_add_items(dir, cid, did) { + + $.ajax({ + url: ave_path + 'admin/index.php?do=docs&action=image_import&ajax=run', + data: { + "path": dir + }, + dataType: "json", + success: function(data) { + $.alerts._overlay('hide'); + for (var p = 0, max = data.respons.length; p < max; p++) { + var iid = Cascad.cascad_maxid(cid, did); + var field_value = dir + data.respons[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad_' + did + '_' + cid + ' > .cascad_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + Cascad.cascad_update(); + } + } + }); + } + +}); \ No newline at end of file diff --git a/fields/image_multi/lang/bg.txt b/fields/image_multi/lang/bg.txt new file mode 100644 index 0000000..0bc6828 --- /dev/null +++ b/fields/image_multi/lang/bg.txt @@ -0,0 +1,27 @@ +[admin] +name = "Изображение (Каскада)" +look = "Преглед" +link = "Промени пътя" +select = "Избери изображение" +delete = "Изтриване на елелемт от элемент каскадата" +place = "Описание" +del_conf = "Сигурни ли сте, че желаете да изтриете този елемент?
      (Изображението няма да бъде изтрито от сървъра)" +del_head = "Изтриване на елемент от каскадата..." +add_n_e = "Добави нов елемент:" +add_f = "Избор на изображение" +add_d = "Избор на папка" +add_l = "Качи от компютъра" +add_upl_e = "Вие може за заредите изображения от локален компютър след създаването на документа. За това натиснете бутона по долу «Добави и продължи редактирането»" +upl_dir = "Папка: " +del_all = "Изтриване на всички елементи" +del_all_c = "Сигурни ли сте, че желаете да изтриете всички елементи?
      (Изображенията няма да бъдат изтрити от сървъра)" +del_all_h = "Изтриване на всички елементи на каскадата..." +resp_s_h = "Изпълнено" +resp_s_m = "Файловете са успешно заредени" +resp_e_m = "Възникна грешка при зареждането на файловете. Моля, опитайте отново." +resp_e_h = "Грешка" +resp_m_m = "Броя на файловете за зареждане са повече от максималния, зададен в настройките на PHP." +resp_m_h = "Грешка" +max_f_f = "Максимален брой файлове за зареждане: " +max_f_h = "Грешка" +max_f_t = "Превишен е максималния брой файлове,
      разрешен за едновременно зареждане" \ No newline at end of file diff --git a/fields/image_multi/lang/cz.txt b/fields/image_multi/lang/cz.txt new file mode 100644 index 0000000..b401190 --- /dev/null +++ b/fields/image_multi/lang/cz.txt @@ -0,0 +1,27 @@ +[admin] +name = "Zobrazení (Kaskádové)" +look = "Zobrazit" +link = "Změnit cestu" +select = "Vybrat zobrazení" +delete = "Smazat prvek kaskády" +place = "Popis" +del_conf = "Opravdu chcete odstranit tento prvek?
      (Zobrazení nebude smazáno ze serveru)" +del_head = "Smazání prvku kaskády..." +add_n_e = "Přidat nový element:" +add_f = "Vybrat zobrazení" +add_d = "Vybrat složku" +add_l = "Nahrát z počítače" +add_upl_e = "Můžete nahrávat obrázky z místního počítače po vytvoření dokumentu. Kliknutím níže na "Přidat a pokračovat v úpravách" +upl_dir = "Složka: " +del_all = "Odstranit všechny prvky" +del_all_c = "Opravdu chcete odstranit všechny prvky?
      (Zobrazení nebude smazáno ze serveru)" +del_all_h = "Odstranit všechny prvky kaskádu..." +resp_s_h = "Hotovo" +resp_s_m = "Soubory úspěšně nahrány" +resp_e_m = "Při stahování souborů došlo k chybě. Zkuste znovu." +resp_e_h = "Chyba" +resp_m_m = "Počet souborů, které se mají nahrát překračují hodnotu zadanou v konfiguračním PHP." +resp_m_h = "Chyba" +max_f_f = "Maximální počet souborů ke stažení: " +max_f_h = "Chba" +max_f_t = Překročen maximální počet souborů,
      během jednoho nahrávání" \ No newline at end of file diff --git a/fields/image_multi/lang/en.txt b/fields/image_multi/lang/en.txt new file mode 100755 index 0000000..bffa620 --- /dev/null +++ b/fields/image_multi/lang/en.txt @@ -0,0 +1,26 @@ +[admin] +name = "Cascade of images NEW" +look = "Lool" +link = "Change path" +select = "Select image" +delete = "Delete item cascade" +place = "Description" +del_conf = "are you sure You want to delete this item?
      (the Image will not be deleted from the server)" +del_head = "Delete item cascade..." +add_n_e = "Add new item:" +add_f = "Select image" +add_d = "Select folder" +add_l = "Download to computer" +add_upl_e = "You can upload pictures from your computer after you create the document. To do this, press the bottom button "Add and continue editing"" +del_all = "Delete any items" +del_all_c = "are you sure You want to delete all items?
      (Image will not be deleted from the server)" +del_all_h = "Delete all items of the cascade..." +resp_s_h = "Done" +resp_s_m = "File successfully loaded" +resp_e_m = "an error Occurred when uploading files. Try again." +resp_e_h = "Error" +resp_m_m = "number of uploaded file exceeds the value set in your PHP settings." +resp_m_h = "Error" +max_f_f = "Maximum number zagrozenia files:" +max_f_h = "Error" +max_f_t = "you have Exceeded the maximum number of files
      to download" \ No newline at end of file diff --git a/fields/image_multi/lang/pl.txt b/fields/image_multi/lang/pl.txt new file mode 100644 index 0000000..acdde72 --- /dev/null +++ b/fields/image_multi/lang/pl.txt @@ -0,0 +1,27 @@ +[admin] +name = "Obrazek (Kaskada)" +look = "Popatrz" +link = "Zmień sposób" +select = "Wybierz obrazek" +delete = "Usuń element kaskady" +place = "Opis" +del_conf = "Czy na pewno chcesz usunąć ten element?
      (Obrazek nie będzie usunięty z serwera)" +del_head = "Usuń element kaskady ..." +add_n_e = "Dodaj nowy element" +add_f = "Wybierz obrazek" +add_d = "Wybierz folder" +add_l = "Pobierz z komputera" +add_upl_e = "Możesz pobrać obrazki z komputera lokalnego po utworzeniu dokumentu. Aby to zrobić, kliknij poniżej na “Dodaj i kontynuować edycję”" +upl_dir = "Folder: " +del_all = "Usuń wszystkie elementy" +del_all_c = "Czy na pewno chcesz usunąć wszystkie elementy?
      (Obrazek nie będzie usunięty z serwera)" +del_all_h = "Usuń wszystkie elementy kaskady..." +resp_s_h = "Gotowe" +resp_s_m = "Pliki pomyślnie pobrane" +resp_e_m = "Wystąpił błąd podczas pobierania plików. Spróbuj ponownie." +resp_e_h = "Błąd" +resp_m_m = "Liczba plików do przesłania przekracza wartości określonej w PHP konfiguracji." +resp_m_h = "Błąd" +max_f_f = "Maksymalna liczba plików do pobrania:" +max_f_h = "Błąd" +max_f_t = "Przekroczono maksymalną liczbę plików,
      na jednoczesne ładowanie" \ No newline at end of file diff --git a/fields/image_multi/lang/ru.txt b/fields/image_multi/lang/ru.txt new file mode 100755 index 0000000..f74e7c3 --- /dev/null +++ b/fields/image_multi/lang/ru.txt @@ -0,0 +1,27 @@ +[admin] +name = "Изображение (Каскад)" +look = "Посмотреть" +link = "Изменить путь" +select = "Выбрать изображение" +delete = "Удалить элемент каскада" +place = "Описание" +del_conf = "Вы уверены, что хотите удалить данный элемент?
      (Изображение не будет удалено с сервера)" +del_head = "Удаление элемента каскада..." +add_n_e = "Добавить новый элемент:" +add_f = "Выбрать изображение" +add_d = "Выбрать папку" +add_l = "Загрузить с компьютера" +add_upl_e = "Вы сможете загрузить фотографии с локального компьютера после создания документа. Для этого нажмите внизу кнопку «Добавить и продолжить редактирование»" +upl_dir = "Папка: " +del_all = "Удалить все элементы" +del_all_c = "Вы уверены, что хотите удалить все элементы?
      (Изображения не будет удалены с сервера)" +del_all_h = "Удаление всех элемента каскада..." +resp_s_h = "Выполнено" +resp_s_m = "Файлы успешно загрузились" +resp_e_m = "Возникла ошибка при загрузке файлов. Попробуйте еще раз." +resp_e_h = "Ошибка" +resp_m_m = "Кол-во загружаемых файлов превышает значение, заданное в настройках PHP." +resp_m_h = "Ошибка" +max_f_f = "Макимальное кол-во загружаемых файлов: " +max_f_h = "Ошибка" +max_f_t = "Превышено максимальное число файлов,
      для одновременной загрузки" \ No newline at end of file diff --git a/fields/image_multi/lang/ua.txt b/fields/image_multi/lang/ua.txt new file mode 100644 index 0000000..e45a368 --- /dev/null +++ b/fields/image_multi/lang/ua.txt @@ -0,0 +1,27 @@ +[admin] +name = "Зображення (Каскад)" +look = "Подивитися" +link = "Змінити шлях" +select = "Обрати зображення" +delete = "Видалити елемент каскаду" +place = "Опис" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент?
      (Зображення не буде видалено зі сервера)" +del_head = "Видалення елемента каскаду..." +add_n_e = "Додати новий елемент:" +add_f = "Обрати зображення" +add_d = "Обрати папку" +add_l = "Завантажити з компьютера" +add_upl_e = "Ви зможете завантажити зображення з локального компьютера післе створення документа. Для цього натисніть внизу кнопку “Додати та продовжити редагування”" +upl_dir = "Папка: " +del_all = "Видалити всі елементи" +del_all_c = "Ви впевнені, що бажаєте видалити всі елементи?
      (Зображення не буде видалено зі сервера)" +del_all_h = "Видалення всіх елементів каскаду..." +resp_s_h = "Виконано" +resp_s_m = "Файли успішно завантажилися" +resp_e_m = "Сталася помилка при завантаженні файлів. Спробуйте ще раз." +resp_e_h = "Помилка" +resp_m_m = "Кількість файлів для завантаження перевищує значення, яке вказане у налаштуваннях PHP." +resp_m_h = "Помилка" +max_f_f = "Максимальна кількість файлів для завантаження: " +max_f_h = "Помилка" +max_f_t = "Перевищено максимальне число файлів,
      для одночасного завантаження" \ No newline at end of file diff --git a/fields/image_multi/tpl/field-doc.tpl b/fields/image_multi/tpl/field-doc.tpl new file mode 100755 index 0000000..3e07b09 --- /dev/null +++ b/fields/image_multi/tpl/field-doc.tpl @@ -0,0 +1,16 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$field_id} ID поля +{$field_value} Данные поля (массив) +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +Пример вывода: +----------------------------------------------------------- +*} + +{foreach from=$field_value item=image} + {if isset($image[1])}{$image[1]}{/if} +{/foreach} \ No newline at end of file diff --git a/fields/image_multi/tpl/field-req.tpl b/fields/image_multi/tpl/field-req.tpl new file mode 100755 index 0000000..274765c --- /dev/null +++ b/fields/image_multi/tpl/field-req.tpl @@ -0,0 +1,15 @@ +{* +Доступные параметры: +----------------------------------------------------------- +{$field_id} ID поля +{$field_value} Данные поля (массив) +{$field_count} Кол-во элементов в массиве +{$rubric_id} ID рубрики +{$default} Значение по умолчанию + +Пример вывода: +----------------------------------------------------------- +*} +{foreach from=$field_value item=image} + {if isset($image[1])}{$image[1]}{/if} +{/foreach} \ No newline at end of file diff --git a/fields/image_multi/tpl/field.tpl b/fields/image_multi/tpl/field.tpl new file mode 100755 index 0000000..f1701cb --- /dev/null +++ b/fields/image_multi/tpl/field.tpl @@ -0,0 +1,63 @@ +{if $cascad_new != load} + {assign var=cascad_new value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=cascad_new value="load" scope="global"} +{/if} + +
      + + {if $show_upload} + + {/if} + + +
      + {foreach from=$images key=key item=image} + +
      +
      + + + + + + +
      + + {/foreach} +
      + +
      \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/.gitkeep b/fields/image_multi_new_3inputs/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/fields/image_multi_new_3inputs/css/.gitkeep b/fields/image_multi_new_3inputs/css/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/fields/image_multi_new_3inputs/css/field.css b/fields/image_multi_new_3inputs/css/field.css new file mode 100755 index 0000000..5a56003 --- /dev/null +++ b/fields/image_multi_new_3inputs/css/field.css @@ -0,0 +1,96 @@ +.cascad3 { + position: relative; +} + +.cascad3_item { + display: inline-block; + margin: 3px; + width: 120px; + height: 226px; + background-color: rgba(255, 255, 255, 0.5); + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; +} + +.cascad3_item:hover { + background-color: rgba(255, 255, 255, 1.0); + border: solid 1px rgba(234, 234, 234, 0.5); + -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); +} + +.cascad3_item:hover > .header { + background-color: rgba(210, 210, 210, 0.3); +} + +.cascad3_item .header { + background-color: rgba(210, 210, 210, 0.5); + height: 26px; + margin-bottom: 10px; + cursor: move; + border-radius: 5px 5px 0 0; +} + +.cascad3_item .image { + background-color: #fcfcfc; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +.cascad3_item input { + display: inline-block; + width: 100px; + margin-top: 5px; + border-radius: 0 0 2px 2px; + border: 1px solid #eaeaea !important; + resize: none !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + padding: 3px !important; + box-sizing: border-box !important; + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; +} + +.cascad3_item .view { + position: absolute; + top: 3px; + left: 3px; + cursor: pointer !important; +} + +.cascad3_item .delete { + position: absolute; + top: 3px; + right: 3px; + cursor: pointer !important; +} + +.cascad3_item .info { + position: absolute; + top: 30px; + right: 3px; + cursor: pointer !important; +} + +.cascad3_sortable > .ui-state-highlight { + display: inline-block; + margin: 5px; + width: 120px; + height: 200px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; +} \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/field.php b/fields/image_multi_new_3inputs/field.php new file mode 100755 index 0000000..b5f7442 --- /dev/null +++ b/fields/image_multi_new_3inputs/field.php @@ -0,0 +1,307 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + $iniset_count = ini_get('max_file_uploads'); + + switch ($action) + { + case 'edit': + + $items = array(); + $items = unserialize($field_value); + $image_items = array(); + + if($items != false){ + + foreach($items as $k => $v){ + $image_item = explode('|', $v); + + $image[$k]['url'] = $image_item[0]; + $image[$k]['thumb'] = ($image_item[0] != '') ? make_thumbnail(array('size' => 'f100x100', 'link' => $image_item[0])) : $img_pixel; + $image[$k]['desc'] = (isset($image_item[1])) ? htmlspecialchars($image_item[1], ENT_QUOTES) : ''; + $image[$k]['desc2'] = (isset($image_item[2])) ? htmlspecialchars($image_item[2], ENT_QUOTES) : ''; + $image[$k]['desc3'] = (isset($image_item[3])) ? htmlspecialchars($image_item[3], ENT_QUOTES) : ''; + } + + if (!empty($image)) { + $image_items = $image; + } + } + + $show_upload = true; + + if(preg_match("/%id/i", $default)) + { + if ($_REQUEST['action'] != 'new') { + $path_upload = trim(@str_replace('%id', $_REQUEST['Id'], $default), '/'); + $show_upload = true; + } else { + $path_upload = (!empty($default)) ? trim($default, '/') : ''; + $show_upload = false; + } + } + else + { + $path_upload = (!empty($default)) ? $default : ''; + $show_upload = true; + } + + $dir_upload = '/' . UPLOAD_DIR . '/' . ((!empty($path_upload)) ? $path_upload . '/' : ''); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('max_files', $AVE_Template->get_config_vars('max_f_f') . $iniset_count); + $AVE_Template->assign('dir_upload', $AVE_Template->get_config_vars('upl_dir') . $dir_upload); + $AVE_Template->assign('show_upload', $show_upload); + + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('images', $image_items); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('doc_id', (int)$_REQUEST['Id']); + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + + $items = (isset($field_value)) ? unserialize($field_value) : array(); + + $res = array(); + + if($items != false){ + foreach($items as $image_item) + { + $image_item = clean_php($image_item); + $field_param = explode('|', $image_item); + if($image_item){ + if ($tpl_empty) + { + $image_item = $field_param; + } + else + { + $image_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + + $image_item = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $image_item + ); + + $image_item = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $image_item); + } + } + $res[] = $image_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file){ + + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'req': + $items = unserialize($field_value); + + $res = ''; + + if($items != false) { + foreach($items as $image_item) + { + $image_item = clean_php($image_item); + $field_param = explode('|', $image_item); + if($image_item){ + if ($tpl_empty) + { + $image_item = $field_param; + } + else + { + $image_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + + $image_item = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $image_item + ); + + $image_item = preg_replace_callback('/\[tag:([r|c|f]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $image_item); + } + } + $res[] = $image_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file){ + + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'save': + foreach ($field_value as $v) + { + if(!empty($v['url'])){ + $field_value_new[] = $v['url'] . '|' . $v['descr'] . '|' . $v['descr2'] . '|' . $v['descr3']; + } + } + if (isset($field_value_new)) { + return @serialize($field_value_new); + } else { + return $field_value_new = ''; + } + + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + + case 'upload': + $error = false; + + $files_unput = 'cascad3_files'.'_'.$_REQUEST['field_id'].'_'.$_REQUEST['doc_id']; + + if(preg_match("/%id/i", $default)) + { + $path = trim(@str_replace('%id', $_REQUEST['doc_id'], $default), '/'); + } + else + { + $path = (!empty($default)) ? $default : ''; + } + + function getExtension($file) + { + $file = pathinfo($file); + return $file['extension']; + } + + $valid_formats = array("jpg", "png", "gif", "bmp","jpeg"); + + $dir = '/' . UPLOAD_DIR . '/' . ((!empty($path)) ? $path . '/' : ''); + $dir_abs = BASE_DIR . $dir; + + if (!is_dir($dir_abs)) @mkdir($dir_abs, 0777, true); + + foreach ($_FILES[$files_unput]['name'] as $name => $value) { + + $filename = strtolower(stripslashes(prepare_url($_FILES[$files_unput]['name'][$name]))); + //$size = filesize($_FILES[$files_unput]['tmp_name'][$name]); + + $ext = getExtension($filename); + $ext = strtolower($ext); + + if(in_array($ext, $valid_formats)) + { + if (file_exists($dir_abs . $filename)) + { + $filename = rand(1000, 9999) . '_' . $filename; + } + + if (@move_uploaded_file($_FILES[$files_unput]['tmp_name'][$name], $dir_abs . $filename)) { + $new_files[] = $filename; + $error = false; + } else { + $error = true; + } + } + else + { + $error = true; + @unlink($_FILES[$files_unput]['tmp_name'][$name]); + } + } + if ($error !== true) { + echo json_encode(array( + 'files' => $new_files, + 'dir' => $dir, + 'respons' => 'succes', + 'message' => $AVE_Template->get_config_vars('resp_s_m'), + 'header' => $AVE_Template->get_config_vars('resp_s_h'), + 'theme' => 'accept' + ) + ); + } + else + { + echo json_encode(array( + 'respons' => 'error', + 'message' => $AVE_Template->get_config_vars('resp_e_m'), + 'header' => $AVE_Template->get_config_vars('resp_e_h'), + 'theme' => 'error' + ) + ); + } + exit; + } + + return ($res ? $res : $field_value); +} \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/js/.gitkeep b/fields/image_multi_new_3inputs/js/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/fields/image_multi_new_3inputs/js/field.js b/fields/image_multi_new_3inputs/js/field.js new file mode 100755 index 0000000..7e9bc6a --- /dev/null +++ b/fields/image_multi_new_3inputs/js/field.js @@ -0,0 +1,235 @@ +var Cascad3 = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.cascad3(); + }, + + cascad3: function() { + this.cascad3_sortable(); + this.cascad3_del_item(); + this.cascad3_del_all_item(); + this.cascad3_add_single(); + this.cascad3_add_folder(); + this.cascad3_upload_files(); + this.cascad3_click_upload(); + }, + + cascad3_update: function() { + this.cascad3_maxid(); + this.cascad3_del_item(); + AveAdmin.fancy_box(); + AveAdmin.tooltip(); + }, + + cascad3_maxid: function(id, doc) { + var maxid = 1; + $('#cascad3_' + doc + '_' + id).children('.cascad3_sortable').children('.cascad3_item').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + cascad3_del_item: function() { + $('.cascad3_item .delete').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + del_conf, + del_head, + function(b) { + if (b) { + $('#cascad3_image_' + id).remove(); + } + } + ); + }); + }, + + cascad3_del_all_item: function() { + $('.cascad3_del_all').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + jConfirm( + del_all_c, + del_all_h, + function(b) { + if (b) { + $('#cascad3_' + d_id + '_' + c_id).children('.cascad3_sortable').children('.cascad3_item').each(function() { + $(this).remove(); + }); + } + } + ); + }); + }, + + cascad3_upload_files: function() { + $('.cascad3_upload').on('change', function(event) { + + var cascad3_input = $(this); + + event.preventDefault(); + + if (cascad3_input.val() == '') { + return false; + } + + var files_input = this.files.length; + var max_files = cascad3_input.attr("data-max-files"); + + if (files_input > max_files) { + $.jGrowl(max_f_t, { + header: max_f_h, + theme: 'error' + }); + + cascad3_input.replaceWith(cascad3_input.val('').clone(true)); + + return false; + } + + var cid = $(this).parent('.cascad3').attr("data-id"); + var did = $(this).parent('.cascad3').attr("data-doc"); + var rid = $(this).parent('.cascad3').attr("data-rubric"); + + $('#formDoc').ajaxSubmit({ + url: 'index.php?do=fields', + data: { + "field_id": cid, + "rubric_id": rid, + "doc_id": did, + "field": 'image_multi_new_3inputs', + "type": 'upload' + }, + beforeSend: function() { + $.alerts._overlay('show'); + }, + dataType: "json", + success: function(data) { + if (data['respons'] == 'succes') { + for (var p = 0, max = data.files.length; p < max; p++) { + iid = Cascad3.cascad3_maxid(cid, did); + var field_value = data['dir'] + data.files[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad3_' + did + '_' + cid + ' > .cascad3_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + $.alerts._overlay('hide'); + Cascad3.cascad3_update(); + } + } + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + cascad3_input.replaceWith(cascad3_input = cascad3_input.clone(true)); + cascad3_input.val(); + } + }); + return false; + }); + }, + + cascad3_click_upload: function() { + $('.cascad3_upload_local').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + $('.cascad3_upload_field_' + c_id + '_' + d_id).trigger('click'); + }); + }, + + cascad3_add_single: function() { + $('.cascad3_add_single').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + var iid = Cascad3.cascad3_maxid(c_id, d_id); + $('#cascad3_' + d_id + '_' + c_id + ' > .cascad3_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + browse_uploads('image__' + c_id + '_' + d_id + '_' + iid + ''); + Cascad3.cascad3_update(); + }); + }, + + cascad3_sortable: function() { + $('.cascad3_sortable').sortable({ + handle: ".header", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".cascad3").disableSelection(); + }, + + cascad3_add_folder: function() { + $('.cascad3_add_folder').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + browse_dirs("cascad3__" + c_id + '_' + d_id); + }); + } +}; + +$(document).ready(function() { + Cascad3.init(); + + $.fn.myPlugin = function cascad3_add_items(dir, cid, did) { + + $.ajax({ + url: ave_path + 'admin/index.php?do=docs&action=image_import&ajax=run', + data: { + "path": dir + }, + dataType: "json", + success: function(data) { + $.alerts._overlay('hide'); + for (var p = 0, max = data.respons.length; p < max; p++) { + var iid = Cascad3.cascad3_maxid(cid, did); + var field_value = dir + data.respons[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad3_' + did + '_' + cid + ' > .cascad3_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + Cascad3.cascad3_update(); + } + } + }); + } + +}); \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/js/outside.js b/fields/image_multi_new_3inputs/js/outside.js new file mode 100755 index 0000000..701c263 --- /dev/null +++ b/fields/image_multi_new_3inputs/js/outside.js @@ -0,0 +1,231 @@ +var Cascad3 = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.cascad3(); + }, + + cascad3: function() { + this.cascad3_sortable(); + this.cascad3_del_item(); + this.cascad3_del_all_item(); + this.cascad3_add_single(); + this.cascad3_add_folder(); + this.cascad3_upload_files(); + this.cascad3_click_upload(); + }, + + cascad3_update: function() { + this.cascad3_maxid(); + this.cascad3_del_item(); + AveAdmin.fancy_box(); + AveAdmin.tooltip(); + }, + + cascad3_maxid: function(id, doc) { + var maxid = 1; + $('#cascad3_' + doc + '_' + id).children('.cascad3_sortable').children('.cascad3_item').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + cascad3_del_item: function() { + $('.cascad3_item .delete').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + del_conf, + del_head, + function(b) { + if (b) { + $('#cascad3_image_' + id).remove(); + } + } + ); + }); + }, + + cascad3_del_all_item: function() { + $('.cascad3_del_all').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + jConfirm( + del_all_c, + del_all_h, + function(b) { + if (b) { + $('#cascad3_' + d_id + '_' + c_id).children('.cascad3_sortable').children('.cascad3_item').each(function() { + $(this).remove(); + }); + } + } + ); + }); + }, + + cascad3_upload_files: function() { + $('.cascad3_upload').on('change', function(event) { + + event.preventDefault(); + + var cascad3_input = $(this); + + event.preventDefault(); + + if (cascad3_input.val() == '') { + return false; + } + + var files_input = this.files.length; + var max_files = cascad3_input.attr("data-max-files"); + + if (files_input > max_files) { + $.jGrowl(max_f_t, { + header: max_f_h, + theme: 'error' + }); + + cascad3_input.replaceWith(cascad3_input.val('').clone(true)); + + return false; + } + + var cid = $(this).parent('.cascad3').attr("data-id"); + var did = $(this).parent('.cascad3').attr("data-doc"); + var rid = $(this).parent('.cascad3').attr("data-rubric"); + + $('#docmanager_edit').ajaxSubmit({ + url: 'index.php?do=fields', + data: { + "field_id": cid, + "rubric_id": rid, + "doc_id": did, + "field": 'image_multi_new_3inputs', + "type": 'upload' + }, + beforeSend: function() { + $.alerts._overlay('show'); + }, + dataType: "json", + success: function(data) { + if (data['respons'] == 'succes') { + for (var p = 0, max = data.files.length; p < max; p++) { + iid = Cascad3.cascad3_maxid(cid, did); + var field_value = data['dir'] + data.files[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad3_' + did + '_' + cid + ' > .cascad3_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + $.alerts._overlay('hide'); + Cascad3.cascad3_update(); + } + } + $.jGrowl(data['message'], { + header: data['header'], + theme: data['theme'] + }); + cascad3_input.replaceWith(cascad3_input = cascad3_input.clone(true)); + cascad3_input.val(); + } + }); + return false; + }); + }, + + cascad3_click_upload: function() { + $('.cascad3_upload_local').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + $('.cascad3_upload_field_' + c_id + '_' + d_id).trigger('click'); + }); + }, + + cascad3_add_single: function() { + $('.cascad3_add_single').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + var iid = Cascad3.cascad3_maxid(c_id, d_id); + $('#cascad3_' + d_id + '_' + c_id + ' > .cascad3_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + browse_uploads('image__' + c_id + '_' + d_id + '_' + iid + ''); + Cascad3.cascad3_update(); + }); + }, + + cascad3_sortable: function() { + $('.cascad3_sortable').sortable({ + handle: ".header", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".cascad3").disableSelection(); + }, + + cascad3_add_folder: function() { + $('.cascad3_add_folder').on('click', function(event) { + event.preventDefault(); + var c_id = $(this).parent().parent().parent('.cascad3').attr("data-id"); + var d_id = $(this).parent().parent().parent('.cascad3').attr("data-doc"); + browse_dirs("cascad3__" + c_id + '_' + d_id); + }); + } +} + +$(document).ready(function() { + Cascad3.init(); + + $.fn.myPlugin = function cascad3_add_items(dir, cid, did) { + + $.ajax({ + url: ave_path + 'admin/index.php?do=docs&action=image_import&ajax=run', + data: { + "path": dir + }, + dataType: "json", + success: function(data) { + $.alerts._overlay('hide'); + for (var p = 0, max = data.respons.length; p < max; p++) { + var iid = Cascad3.cascad3_maxid(cid, did); + var field_value = dir + data.respons[p]; + var img_path = '../index.php?thumb=' + field_value + '&mode=f&width=128&height=128'; + $('#cascad3_' + did + '_' + cid + ' > .cascad3_sortable:last').prepend( + '
      ' + + '
      ' + + '' + + '' + + '' + + '' + + '' + + '' + + '
      ' + ); + Cascad3.cascad3_update(); + } + } + }); + } + +}); \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/lang/.gitkeep b/fields/image_multi_new_3inputs/lang/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/fields/image_multi_new_3inputs/lang/bg.txt b/fields/image_multi_new_3inputs/lang/bg.txt new file mode 100644 index 0000000..e771d4d --- /dev/null +++ b/fields/image_multi_new_3inputs/lang/bg.txt @@ -0,0 +1,27 @@ +[admin] +name = "Изображение (Каскада, 3 полета)" +look = "Преглед" +link = "Промени пътя" +select = "Избери изображение" +delete = "Изтриване на елелемт от элемент каскадата" +place = "Описание" +del_conf = "Сигурни ли сте, че желаете да изтриете този елемент?
      (Изображението няма да бъде изтрито от сървъра)" +del_head = "Изтриване на елемент от каскадата..." +add_n_e = "Добави нов елемент:" +add_f = "Избор на изображение" +add_d = "Избор на папка" +add_l = "Качи от компютъра" +add_upl_e = "Вие може за заредите изображения от локален компютър след създаването на документа. За това натиснете бутона по долу «Добави и продължи редактирането»" +upl_dir = "Папка: " +del_all = "Изтриване на всички елементи" +del_all_c = "Сигурни ли сте, че желаете да изтриете всички елементи?
      (Изображенията няма да бъдат изтрити от сървъра)" +del_all_h = "Изтриване на всички елементи на каскадата..." +resp_s_h = "Изпълнено" +resp_s_m = "Файловете са успешно заредени" +resp_e_m = "Възникна грешка при зареждането на файловете. Моля, опитайте отново." +resp_e_h = "Грешка" +resp_m_m = "Броя на файловете за зареждане са повече от максималния, зададен в настройките на PHP." +resp_m_h = "Грешка" +max_f_f = "Максимален брой файлове за зареждане: " +max_f_h = "Грешка" +max_f_t = "Превишен е максималния брой файлове,
      разрешен за едновременно зареждане" \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/lang/cz.txt b/fields/image_multi_new_3inputs/lang/cz.txt new file mode 100644 index 0000000..53f8b41 --- /dev/null +++ b/fields/image_multi_new_3inputs/lang/cz.txt @@ -0,0 +1,29 @@ +[admin] +name = "Zobrazení (Kaskáda, 3 inputy)" +look = "Zobrazit" +link = "Změnit cestu" +select = "Vybrat zobrazení" +delete = "Smazat prvek kaskády" +place = "Popis" +del_conf = "Opravdu chcete odstranit tento prvek?
      (Zobrazení nebude smazáno ze serveru)" +del_head = "Smazání prvku kaskády..." +add_n_e = "Přidat nový element:" +add_f = "Vybrat zobrazení" +add_d = "Vybrat složku" +add_l = "Nahrát z počítače" +add_upl_e = "Můžete nahrávat obrázky z místního počítače po vytvoření dokumentu. Kliknutím níže na "Přidat a pokračovat v úpravách" +upl_dir = "Složka: " +del_all = "Odstranit všechny prvky" +del_all_c = "Opravdu chcete odstranit všechny prvky?
      (Zobrazení nebude smazáno ze serveru)" +del_all_h = "Odstranit všechny prvky kaskádu..." +resp_s_h = "Hotovo" +resp_s_m = "Soubory úspěšně nahrány" +resp_s_h = "Hotovo" +resp_s_m = "Soubory úspěšně nahrány" +resp_e_m = "Při stahování souborů došlo k chybě. Zkuste znovu." +resp_e_h = "Chyba" +resp_m_m = "Počet souborů, které se mají nahrát překračují hodnotu zadanou v konfiguračním PHP." +resp_m_h = "Chyba" +max_f_f = "Maximální počet souborů ke stažení: " +max_f_h = "Chba" +max_f_t = Překročen maximální počet souborů,
      během jednoho nahrávání" \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/lang/en.txt b/fields/image_multi_new_3inputs/lang/en.txt new file mode 100755 index 0000000..5de64c1 --- /dev/null +++ b/fields/image_multi_new_3inputs/lang/en.txt @@ -0,0 +1,26 @@ +[en] +name = "Cascad NEW, 3 inputs" +look = "Lool" +link = "Change path" +select = "Select image" +delete = "Delete item cascade" +place = "Description" +del_conf = "are you sure You want to delete this item?
      (the Image will not be deleted from the server)" +del_head = "Delete item cascade..." +add_n_e = "Add new item:" +add_f = "Select image" +add_d = "Select folder" +add_l = "Download to computer" +add_upl_e = "You can upload pictures from your computer after you create the document. To do this, press the bottom button "Add and continue editing"" +del_all = "Delete any items" +del_all_c = "are you sure You want to delete all items?
      (Image will not be deleted from the server)" +del_all_h = "Delete all items of the cascade..." +resp_s_h = "Done" +resp_s_m = "File successfully loaded" +resp_e_m = "an error Occurred when uploading files. Try again." +resp_e_h = "Error" +resp_m_m = "number of uploaded file exceeds the value set in your PHP settings." +resp_m_h = "Error" +max_f_f = "Maximum number zagrozenia files:" +max_f_h = "Error" +max_f_t = "you have Exceeded the maximum number of files
      to download" \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/lang/pl.txt b/fields/image_multi_new_3inputs/lang/pl.txt new file mode 100644 index 0000000..81337e7 --- /dev/null +++ b/fields/image_multi_new_3inputs/lang/pl.txt @@ -0,0 +1,27 @@ +[admin] +name = "Obrazek (Kaskada, 3 input’y)" +look = "Popatrz" +link = "Zmień sposób" +select = "Wybierz obrazek" +delete = "Usuń kaskadę" +place = "Opis" +del_conf = "Czy na pewno chcesz usunąć ten element?
      (Obrazek nie będzie usunięty z serwera)" +del_head = "Usuń element kaskady ..." +add_n_e = "Dodaj nowy element" +add_f = "Wybierz obrazek" +add_d = "Wybierz folder" +add_l = "Pobierz z komputera" +add_upl_e = "Możesz pobrać obrazki z komputera lokalnego po utworzeniu dokumentu. Aby to zrobić, kliknij poniżej na “Dodaj i kontynuować edycję”" +upl_dir = "Folder:" +del_all = "Usuń wszystkie elementy" +del_all_c = "Czy na pewno chcesz usunąć wszystkie elementy?
      (Obrazek nie będzie usunięty z serwera)" +del_all_h = "Usuń wszystkie pozycje kaskady..." +resp_s_h = "Gotowe" +resp_s_m = "Pliki pomyślnie pobrane" +resp_e_m = "Wystąpił błąd podczas pobierania plików. Spróbuj ponownie." +resp_e_h = "Błąd" +resp_m_m = "Liczba plików do przesłania przekracza wartości, określone w PHP konfiguracji." +resp_m_h = "Błąd" +max_f_f = "Maksymalna liczba plików do pobrania:" +max_f_h = "Błąd" +max_f_t = "Przekroczono maksymalną liczbę plików,
      na jednoczesne ładowanie" \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/lang/ru.txt b/fields/image_multi_new_3inputs/lang/ru.txt new file mode 100755 index 0000000..555dc98 --- /dev/null +++ b/fields/image_multi_new_3inputs/lang/ru.txt @@ -0,0 +1,27 @@ +[admin] +name = "Изображение (Каскад, 3 инпута)" +look = "Посмотреть" +link = "Изменить путь" +select = "Выбрать изображение" +delete = "Удалить элемент каскада" +place = "параметр" +del_conf = "Вы уверены, что хотите удалить данный элемент?
      (Изображение не будет удалено с сервера)" +del_head = "Удаление элемента каскада..." +add_n_e = "Добавить новый элемент:" +add_f = "Выбрать изображение" +add_d = "Выбрать папку" +add_l = "Загрузить с компьютера" +add_upl_e = "Вы сможете загрузить фотографии с локального компьютера после создания документа. Для этого нажмите внизу кнопку «Добавить и продолжить редактирование»" +upl_dir = "Папка: " +del_all = "Удалить все элементы" +del_all_c = "Вы уверены, что хотите удалить все элементы?
      (Изображения не будет удалены с сервера)" +del_all_h = "Удаление всех элемента каскада..." +resp_s_h = "Выполнено" +resp_s_m = "Файлы успешно загрузились" +resp_e_m = "Возникла ошибка при загрузке файлов. Попробуйте еще раз." +resp_e_h = "Ошибка" +resp_m_m = "Кол-во загружаемых файлов превышает значение, заданное в настройках PHP." +resp_m_h = "Ошибка" +max_f_f = "Макимальное кол-во загружаемых файлов: " +max_f_h = "Ошибка" +max_f_t = "Превышено максимальное число файлов,
      для одновременной загрузки" \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/lang/ua.txt b/fields/image_multi_new_3inputs/lang/ua.txt new file mode 100644 index 0000000..f2afc1f --- /dev/null +++ b/fields/image_multi_new_3inputs/lang/ua.txt @@ -0,0 +1,27 @@ +[admin] +name = "Зображення (Каскад, 3 інпута)" +look = "Подивитися" +link = "Змінити шлях" +select = "Обрати зображення" +delete = "Видалити елемент каскаду" +place = "Опис" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент?
      (Зображення не буде видалено зі сервера)" +del_head = "Видалення елемента каскаду..." +add_n_e = "Додати новий елемент:" +add_f = "Обрати зображення" +add_d = "Обрати папку" +add_l = "Завантажити з компьютера" +add_upl_e = "Ви зможете завантажити зображення з локального компьютера післе створення документа. Для цього натисніть внизу кнопку “Додати та продовжити редагування”" +upl_dir = "Папка: " +del_all = "Видалити всі елементи" +del_all_c = "Ви впевнені, що бажаєте видалити всі елементи?
      (Зображення не буде видалено зі сервера)" +del_all_h = "Видалення всіх елементів каскаду..." +resp_s_h = "Виконано" +resp_s_m = "Файли успішно завантажилися" +resp_e_m = "Сталася помилка при завантаженні файлів. Спробуйте ще раз." +resp_e_h = "Помилка" +resp_m_m = "Кількість файлів для завантаження перевищує значення, яке вказане у налаштуваннях PHP." +resp_m_h = "Помилка" +max_f_f = "Максимальна кількість файлів для завантаження: " +max_f_h = "Помилка" +max_f_t = "Перевищено максимальне число файлів,
      для одночасного завантаження" \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/tpl/.gitkeep b/fields/image_multi_new_3inputs/tpl/.gitkeep new file mode 100755 index 0000000..e69de29 diff --git a/fields/image_multi_new_3inputs/tpl/field-doc.tpl b/fields/image_multi_new_3inputs/tpl/field-doc.tpl new file mode 100755 index 0000000..c52ebed --- /dev/null +++ b/fields/image_multi_new_3inputs/tpl/field-doc.tpl @@ -0,0 +1,3 @@ +{foreach from=$field_value item=image} + {if isset($image[1])}{$image[1]}{/if} +{/foreach} \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/tpl/field-req.tpl b/fields/image_multi_new_3inputs/tpl/field-req.tpl new file mode 100755 index 0000000..c52ebed --- /dev/null +++ b/fields/image_multi_new_3inputs/tpl/field-req.tpl @@ -0,0 +1,3 @@ +{foreach from=$field_value item=image} + {if isset($image[1])}{$image[1]}{/if} +{/foreach} \ No newline at end of file diff --git a/fields/image_multi_new_3inputs/tpl/field.tpl b/fields/image_multi_new_3inputs/tpl/field.tpl new file mode 100755 index 0000000..6836d03 --- /dev/null +++ b/fields/image_multi_new_3inputs/tpl/field.tpl @@ -0,0 +1,65 @@ +{if $cascad3_new_3inputs != load} + {assign var=cascad3_new_3inputs value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=cascad3_new_3inputs value="load" scope="global"} +{/if} + +
      + + {if $show_upload} + + {/if} + + +
      + {foreach from=$images key=key item=image} + +
      +
      + + + + + + + + +
      + + {/foreach} +
      + +
      \ No newline at end of file diff --git a/fields/image_single/css/field.css b/fields/image_single/css/field.css new file mode 100644 index 0000000..59a7bbc --- /dev/null +++ b/fields/image_single/css/field.css @@ -0,0 +1,133 @@ +.single_image_images .img { + position: relative; + border-radius: 4px; + display: block; + float: left; + margin: 5px 10px 5px 0; + overflow: hidden; + padding: 0px 0px 4px 0px; + background-color: rgba(255, 255, 255, 0.5); + border: solid 1px #eaeaea; + text-align: center; + width: 138px; +} + +.single_image_images .img:hover { + background-color: rgba(255, 255, 255, 1.0); + border: solid 1px rgba(234, 234, 234, 0.5); + -webkit-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1); +} + +.single_image_images .header { + background-color: rgba(210, 210, 210, 0.5); + height: 26px; + margin-bottom: 8px; + border-radius: 5px 5px 0 0; +} + +.single_image_images .header:hover { + background-color: rgba(210, 210, 210, 0.3); +} + +.single_image_images .img img { + display: inline-block; + float: none; + clear: both; + cursor: pointer; + overflow: hidden; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; +} + +.single_image_images textarea { + display: inline-block; + width: 128px; + height: 60px; + margin-top: 8px; + border-radius: 0 0 2px 2px; + border: 1px solid #eaeaea !important; + resize: none !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + padding: 3px !important; + box-sizing: border-box !important; + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; +} + +.single_image_images input { + display: inline-block; + width: 128px !important; + height: 20px !important; + margin: 0 0 4px 0 !important; + border-radius: 0 0 2px 2px !important; + border: 1px solid #ccc !important; + resize: none !important; + box-shadow: none !important; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + padding: 3px !important; + box-sizing: border-box !important; + -webkit-box-sizing: border-box !important; + -moz-box-sizing: border-box !important; +} + +.single_image_add { + position: relative; + float: left; + margin: 5px 10px 5px 0; + height: 158px; + width: 100px; +} + +.single_image_add > div { + position: relative; + border: 1px #ccc solid; + border-radius: 4px; + cursor: pointer; + color: #ccc; + font-size: 60px; + text-align: center; + height: 74.5px; + line-height: 60px; + background: #fff; +} + +.single_image_add > div > span { + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 20px; + font-size: 12px; + line-height: normal; + color: #ccc; +} + +.single_image_add input { + filter:alpha(opacity:0); + font-size: 199px; + cursor: pointer; + padding: 0px; + margin: -30px 0 0 -450px; + cursor: pointer !important; +} + +.single_image_images .view { + position: absolute; + top: 3px; + left: 3px; + cursor: pointer !important; +} + +.single_image_images .lnk { + position: absolute; + top: 3px; + right: 3px; + cursor: pointer !important; +} \ No newline at end of file diff --git a/fields/image_single/field.php b/fields/image_single/field.php new file mode 100644 index 0000000..61ed0b0 --- /dev/null +++ b/fields/image_single/field.php @@ -0,0 +1,161 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = 0; + + switch ($action) + { + case 'edit': + $blanc = '/uploads/images/noimage.gif'; + $image = explode('|', $field_value); + $img = $image[0]; + unset($image[0]); + $image = array($img, implode('|', $image)); + $field = (!empty($image[0]) ? '../' . make_thumbnail(array('link' => $image[0], 'size' => 'f128x128')) : make_thumbnail(array('link' => $blanc, 'size' => 'f128x128'))); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('image', $image); + $AVE_Template->assign('doc_id', (int)$_REQUEST['Id']); + $AVE_Template->assign('field', $field); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $field_value = clean_php($field_value); + + $field_param = explode('|', $field_value); + + if ($tpl_empty) + { + $field_value = '' . (isset($field_param[1]) ? $field_param[1] : '')
+					. ''; + } + else + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + + $field_value = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $field_value + ); + + $field_value = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $field_value); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('image', $field_param); + return $AVE_Template->fetch($tpl_file); + } + + return $field_value; + break; + + case 'req': + $field_value = clean_php($field_value); + + $field_param = explode('|', $field_value); + + if ($tpl_empty) + { + $field_param[1] = isset($field_param[1]) ? $field_param[1] : ''; + $field_value = '' . $field_param[1] . ''; + } + else + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + + $field_value = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'return watermarks(\'$m[1]\', \'$m[2]\', $m[3]);' + ), + $field_value + ); + + $field_value = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $field_value); + } + + $maxlength = null; + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('image', $field_param); + return $AVE_Template->fetch($tpl_file); + } + + return $field_value; + break; + + case 'save': + if (isset($field_value) && $field_value['img'] != '' ) + { + $field_value = htmlspecialchars(implode("|", $field_value), ENT_QUOTES); + } + else + { + $field_value = ''; + } + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + } + + return ($res ? $res : $field_value); +} +?> diff --git a/fields/image_single/js/field.js b/fields/image_single/js/field.js new file mode 100644 index 0000000..c8c28d1 --- /dev/null +++ b/fields/image_single/js/field.js @@ -0,0 +1,55 @@ +var SingleImage = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + this.single_image(); + }, + + single_image: function() { + $('.single_image').each(function(index, element) { + + var image_id = $(element).attr('data-id'); + var doc_id = $(element).attr('data-doc'); + var link = $(element).find('a.lnk'); + var look = $(element).find('a.look'); + var input = $(element).find('input'); + + link.on('click', function(event) { + event.preventDefault(); + $('#image__' + image_id + '_' + doc_id).toggle('show'); + }); + + input.on('input', function(event) { + event.preventDefault(); + + src = $(this).val(); + dir = src.substring(0, src.lastIndexOf("/")); + file_full = src.match(/(\w*)\.\w{3,4}$/)[0]; + + $('.preview__' + image_id + '_' + doc_id).attr({ + 'href': '/' + $(this).val() + }); + + $('#preview__' + image_id + '_' + doc_id).attr({ + 'src': '../index.php?mode=f&width=128&height=128&thumb=/' + dir + '/' + file_full + }); + }); + + if (input.val() == '') { + $('#preview__' + image_id + '_' + doc_id).attr({ + 'src': '/uploads/images/' + thumbdir + '/noimage-f128x128.gif' + }); + $('.preview__' + image_id + '_' + doc_id).attr({ + 'href': '/uploads/images/noimage.gif' + }); + } + }); + }, +} + +$(document).ready(function() { + SingleImage.init(); +}); \ No newline at end of file diff --git a/fields/image_single/lang/bg.txt b/fields/image_single/lang/bg.txt new file mode 100644 index 0000000..928ec94 --- /dev/null +++ b/fields/image_single/lang/bg.txt @@ -0,0 +1,6 @@ +[admin] +name = "Изображение (Единично)" +look = "Преглед" +link = "Промени пътя" +select = "Избери изображение" +place = "Описание" \ No newline at end of file diff --git a/fields/image_single/lang/cz.txt b/fields/image_single/lang/cz.txt new file mode 100644 index 0000000..f8b0154 --- /dev/null +++ b/fields/image_single/lang/cz.txt @@ -0,0 +1,6 @@ +[admin] +name = "Zobrazení (Jediné)" +look = "Zobrazit" +link = "Změnit cestu" +select = "Vybrat zobrazení" +place = "Popis" \ No newline at end of file diff --git a/fields/image_single/lang/en.txt b/fields/image_single/lang/en.txt new file mode 100644 index 0000000..36ad83d --- /dev/null +++ b/fields/image_single/lang/en.txt @@ -0,0 +1,6 @@ +[admin] +name = "Image (Single)" +look = "Look" +link = "Change path" +select = "Select image" +place = "Description" \ No newline at end of file diff --git a/fields/image_single/lang/pl.txt b/fields/image_single/lang/pl.txt new file mode 100644 index 0000000..b5981c3 --- /dev/null +++ b/fields/image_single/lang/pl.txt @@ -0,0 +1,6 @@ +[admin] +name = "Obrazek (Pojedyńczy)" +look = "Popztrz" +link = "Zmień sposób" +select = "Wybierz obrazek" +place = "Opis" \ No newline at end of file diff --git a/fields/image_single/lang/ru.txt b/fields/image_single/lang/ru.txt new file mode 100644 index 0000000..d38d242 --- /dev/null +++ b/fields/image_single/lang/ru.txt @@ -0,0 +1,6 @@ +[admin] +name = "Изображение (Одиночное)" +look = "Посмотреть" +link = "Изменить путь" +select = "Выбрать изображение" +place = "Описание" \ No newline at end of file diff --git a/fields/image_single/lang/ua.txt b/fields/image_single/lang/ua.txt new file mode 100644 index 0000000..ed8ddf6 --- /dev/null +++ b/fields/image_single/lang/ua.txt @@ -0,0 +1,6 @@ +[admin] +name = "Зображення (Одиночне)" +look = "Подивитися" +link = "Змінити шлях" +select = "Обрати зображення" +place = "Опис" \ No newline at end of file diff --git a/fields/image_single/tpl/field-doc.tpl b/fields/image_single/tpl/field-doc.tpl new file mode 100644 index 0000000..3a46794 --- /dev/null +++ b/fields/image_single/tpl/field-doc.tpl @@ -0,0 +1 @@ +{if isset($image[1])}{$image[1]}{/if} \ No newline at end of file diff --git a/fields/image_single/tpl/field-req.tpl b/fields/image_single/tpl/field-req.tpl new file mode 100644 index 0000000..3a46794 --- /dev/null +++ b/fields/image_single/tpl/field-req.tpl @@ -0,0 +1 @@ +{if isset($image[1])}{$image[1]}{/if} \ No newline at end of file diff --git a/fields/image_single/tpl/field.tpl b/fields/image_single/tpl/field.tpl new file mode 100644 index 0000000..5242ba1 --- /dev/null +++ b/fields/image_single/tpl/field.tpl @@ -0,0 +1,32 @@ +{if $single_image != load} + {assign var=single_image value='' scope="global"} + + + + {assign var=single_image value="load" scope="global"} +{/if} + +{if $smarty.session.use_editor == 1} +
      +
      + + + + + +
      +
      +{else} +
      +
      +
      + + + + + +
      +
      +{/if} \ No newline at end of file diff --git a/fields/link/field.php b/fields/link/field.php new file mode 100644 index 0000000..54e1965 --- /dev/null +++ b/fields/link/field.php @@ -0,0 +1,100 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = ''; + + switch ($action) + { + case 'edit': + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $field_value = clean_php($field_value); + $field_param = explode('|', $field_value); + $field_param[1] = empty($field_param[1]) ? $field_param[0] : $field_param[1]; + + if ($tpl_empty) + { + $field_value = ' ' . $field_param[1] . ''; + } + else + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $res = $field_value; + break; + + case 'req': + $field_value = clean_php($field_value); + $field_param = explode('|', $field_value); + + if (empty($field_param[1])) + $field_param[1] = $field_param[0]; + + if (isset($document_fields[$rubric_id]['tpl_req_empty'])) + { + $field_value = " " . $field_param[1] . ""; + } + else + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $maxlength = null; + + $res = $field_value; + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/link/lang/bg.txt b/fields/link/lang/bg.txt new file mode 100644 index 0000000..bf54edb --- /dev/null +++ b/fields/link/lang/bg.txt @@ -0,0 +1,2 @@ +[admin] +name = "Връзка(Link)" \ No newline at end of file diff --git a/fields/link/lang/cz.txt b/fields/link/lang/cz.txt new file mode 100644 index 0000000..3adf02a --- /dev/null +++ b/fields/link/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Odkaz" \ No newline at end of file diff --git a/fields/link/lang/pl.txt b/fields/link/lang/pl.txt new file mode 100644 index 0000000..6a575ee --- /dev/null +++ b/fields/link/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Link" \ No newline at end of file diff --git a/fields/link/lang/ru.txt b/fields/link/lang/ru.txt new file mode 100644 index 0000000..6797df8 --- /dev/null +++ b/fields/link/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Ссылка" \ No newline at end of file diff --git a/fields/link/lang/ua.txt b/fields/link/lang/ua.txt new file mode 100644 index 0000000..605b880 --- /dev/null +++ b/fields/link/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Посилання" \ No newline at end of file diff --git a/fields/link/tpl/field.tpl b/fields/link/tpl/field.tpl new file mode 100644 index 0000000..e007f13 --- /dev/null +++ b/fields/link/tpl/field.tpl @@ -0,0 +1,2 @@ +  + \ No newline at end of file diff --git a/fields/multi_checkbox/field.php b/fields/multi_checkbox/field.php new file mode 100644 index 0000000..f396ccd --- /dev/null +++ b/fields/multi_checkbox/field.php @@ -0,0 +1,163 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = array(); + + switch ($action) + { + case 'edit': + $default_items = explode(',', $default); + $default_items = array_diff($default_items, array('')); + + $field_value_array = explode('|', $field_value); + $field_value_array = array_values(array_diff($field_value_array, array(''))); + + $AVE_Template->assign('items', $default_items); + $AVE_Template->assign('used', $field_value_array); + $AVE_Template->assign('doc_id', (isset($_REQUEST['Id']) ? (int)$_REQUEST['Id'] : 0)); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $default_items = explode(',', $default); + + $items = explode('|', $field_value); + $items = array_diff($items, array('')); + + if (! empty($items)) + { + foreach($items as $item) + { + if ($item) + { + if ($tpl_empty) + { + $item = $default_items[(int)$item-1]; + } + else + { + $field_param = explode('|', $item); + + $item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param, $default_items) + { + return $default_items[$field_param[(int)$data[1]]-1]; + }, + $tpl + ); + } + } + + $res[] = $item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default_items); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) + ? implode(PHP_EOL, $res) + : $tpl; + + break; + + case 'req': + $default_items = explode(',', $default); + + $items = explode('|', $field_value); + $items = array_diff($items, array('')); + + if (! empty($items)) + { + foreach($items as $item) + { + if ($item) + { + if ($tpl_empty) + { + $item = $default_items[(int)$item-1]; + } + else + { + $field_param = explode('|', $item); + + $item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param, $default_items) + { + return $default_items[$field_param[(int)$data[1]]-1]; + }, + $tpl + ); + } + } + + $res[] = $item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default_items); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) + ? implode(PHP_EOL, $res) + : $tpl; + + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/multi_checkbox/lang/bg.txt b/fields/multi_checkbox/lang/bg.txt new file mode 100644 index 0000000..0b48621 --- /dev/null +++ b/fields/multi_checkbox/lang/bg.txt @@ -0,0 +1,4 @@ +[admin] +name = "Мулти чекбокс" +no_items = "Не са зададени стойности по подразбиране" + diff --git a/fields/multi_checkbox/lang/cz.txt b/fields/multi_checkbox/lang/cz.txt new file mode 100644 index 0000000..4a03569 --- /dev/null +++ b/fields/multi_checkbox/lang/cz.txt @@ -0,0 +1,3 @@ +[admin] +name = "Multicheckbox" +no_items = "Neexistuje žádná výchozí hodnota" diff --git a/fields/multi_checkbox/lang/en.txt b/fields/multi_checkbox/lang/en.txt new file mode 100644 index 0000000..307549f --- /dev/null +++ b/fields/multi_checkbox/lang/en.txt @@ -0,0 +1,3 @@ +[admin] +name = "Multi Checkbox" +no_items = "No default value" diff --git a/fields/multi_checkbox/lang/pl.txt b/fields/multi_checkbox/lang/pl.txt new file mode 100644 index 0000000..9a05810 --- /dev/null +++ b/fields/multi_checkbox/lang/pl.txt @@ -0,0 +1,3 @@ +[admin] +name = "Multi checkbox" +no_items = "Brak wartości domyślnej" diff --git a/fields/multi_checkbox/lang/ru.txt b/fields/multi_checkbox/lang/ru.txt new file mode 100644 index 0000000..ec4833f --- /dev/null +++ b/fields/multi_checkbox/lang/ru.txt @@ -0,0 +1,3 @@ +[admin] +name = "Мульти чекбокс" +no_items = "Нет значения по умолчанию" diff --git a/fields/multi_checkbox/lang/ua.txt b/fields/multi_checkbox/lang/ua.txt new file mode 100644 index 0000000..905ddc0 --- /dev/null +++ b/fields/multi_checkbox/lang/ua.txt @@ -0,0 +1,3 @@ +[admin] +name = "Мульти чекбокс" +no_items = "Немає значення по замовчуванню" diff --git a/fields/multi_checkbox/tpl/field-doc.tpl b/fields/multi_checkbox/tpl/field-doc.tpl new file mode 100644 index 0000000..75fc3ea --- /dev/null +++ b/fields/multi_checkbox/tpl/field-doc.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=item} +
      • {$item}
      • +{/foreach} +
      diff --git a/fields/multi_checkbox/tpl/field-req.tpl b/fields/multi_checkbox/tpl/field-req.tpl new file mode 100644 index 0000000..75fc3ea --- /dev/null +++ b/fields/multi_checkbox/tpl/field-req.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=item} +
      • {$item}
      • +{/foreach} +
      diff --git a/fields/multi_checkbox/tpl/field.tpl b/fields/multi_checkbox/tpl/field.tpl new file mode 100644 index 0000000..89f5544 --- /dev/null +++ b/fields/multi_checkbox/tpl/field.tpl @@ -0,0 +1,20 @@ +{if $items} + + +{foreach from=$items key=key item=item} + +
      +{/foreach} +{else} +
        +
      • {#no_items#}
      • +
      +{/if} diff --git a/fields/multi_line/field.php b/fields/multi_line/field.php new file mode 100644 index 0000000..d2667cf --- /dev/null +++ b/fields/multi_line/field.php @@ -0,0 +1,93 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res=0; + + switch ($action) + { + case 'edit': + if (isset($_COOKIE['no_wysiwyg']) && $_COOKIE['no_wysiwyg'] == 1) + { + $field = ''; + $field .= ''; + } + else + { + if (isset($_REQUEST['outside']) && ($_REQUEST['outside'] === (bool)true)) { + switch ($_SESSION['use_editor']) { + case '0': + case '1': + case '2': + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Verysmall'; + $oCKeditor->config['height'] = 250; + $config = array(); + $field = $oCKeditor->editor('data['.$_REQUEST['Id'].'][feld][' . $field_id . ']', $field_value, $config); + break; + + default: + $field = $field_value; + break; + } + } else { + switch ($_SESSION['use_editor']) { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Big'; + $oCKeditor->config['height'] = 400; + $config = array(); + $field = $oCKeditor->editor('feld[' . $field_id . ']', $field_value, $config); + break; + + case '1': // Elrte и Elfinder + $field = ''; + $field .='
      '; + break; + + default: + $field = $field_value; + break; + } + } + } + $res = $field; + break; + + case 'doc': + case 'req': + $res = get_field_default($field_value, $action, $field_id, $tpl, $tpl_empty, $maxlength, $document_fields, $rubric_id); + $res = document_pagination($res); + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + } + return ($res ? $res : $field_value); +} +?> diff --git a/fields/multi_line/lang/bg.txt b/fields/multi_line/lang/bg.txt new file mode 100644 index 0000000..da304fd --- /dev/null +++ b/fields/multi_line/lang/bg.txt @@ -0,0 +1,2 @@ +[admin] +name = "Многоредово (Голямо)" \ No newline at end of file diff --git a/fields/multi_line/lang/cz.txt b/fields/multi_line/lang/cz.txt new file mode 100644 index 0000000..cbcc8a2 --- /dev/null +++ b/fields/multi_line/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Víceřádkové (Velké)" \ No newline at end of file diff --git a/fields/multi_line/lang/en.txt b/fields/multi_line/lang/en.txt new file mode 100644 index 0000000..e277221 --- /dev/null +++ b/fields/multi_line/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "Multi Lines (Big)" \ No newline at end of file diff --git a/fields/multi_line/lang/pl.txt b/fields/multi_line/lang/pl.txt new file mode 100644 index 0000000..06975d3 --- /dev/null +++ b/fields/multi_line/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Multi (Wielkie)" \ No newline at end of file diff --git a/fields/multi_line/lang/ru.txt b/fields/multi_line/lang/ru.txt new file mode 100644 index 0000000..db2a8b3 --- /dev/null +++ b/fields/multi_line/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Многострочное (Большое)" \ No newline at end of file diff --git a/fields/multi_line/lang/ua.txt b/fields/multi_line/lang/ua.txt new file mode 100644 index 0000000..3a1553d --- /dev/null +++ b/fields/multi_line/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Багаторядкове (Велике)" \ No newline at end of file diff --git a/fields/multi_line_simple/field.php b/fields/multi_line_simple/field.php new file mode 100644 index 0000000..e03db46 --- /dev/null +++ b/fields/multi_line_simple/field.php @@ -0,0 +1,95 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res=0; + + switch ($action) + { + case 'edit': + if (isset($_COOKIE['no_wysiwyg']) && $_COOKIE['no_wysiwyg'] == 1) + { + $field = ""; + $field .= ""; + } + else + { + if (isset($_REQUEST['outside']) && ($_REQUEST['outside'] === (bool)true)) { + switch ($_SESSION['use_editor']) + { + case '0': + case '1': + case '2': + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Verysmall'; + $oCKeditor->config['height'] = 200; + $config = array(); + $field = $oCKeditor->editor('data['.$_REQUEST['Id'].'][feld][' . $field_id . ']', $field_value, $config); + break; + + default: + $field = $field_value; + break; + } + } else { + switch ($_SESSION['use_editor']) { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Small'; + $oCKeditor->config['height'] = 300; + $config = array(); + $field = $oCKeditor->editor('feld[' . $field_id . ']', $field_value, $config); + break; + + case '1': // Elrte и Elfinder + $field = ''; + $field .=''; + break; + + default: + $field = $field_value; + break; + } + } + } + + $res = $field; + break; + + case 'doc': + case 'req': + $res = get_field_default($field_value,$action,$field_id,$tpl,$tpl_empty,$maxlength,$document_fields,$rubric_id); + $res = document_pagination($res); + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + } + return ($res ? $res : $field_value); +} +?> diff --git a/fields/multi_line_simple/lang/bg.txt b/fields/multi_line_simple/lang/bg.txt new file mode 100644 index 0000000..fde0527 --- /dev/null +++ b/fields/multi_line_simple/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] + +name = "Многоредово (Средно)" \ No newline at end of file diff --git a/fields/multi_line_simple/lang/cz.txt b/fields/multi_line_simple/lang/cz.txt new file mode 100644 index 0000000..be5e618 --- /dev/null +++ b/fields/multi_line_simple/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Víceřádkové (Střední)" \ No newline at end of file diff --git a/fields/multi_line_simple/lang/en.txt b/fields/multi_line_simple/lang/en.txt new file mode 100644 index 0000000..bd02d25 --- /dev/null +++ b/fields/multi_line_simple/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "Multi Lines (Middle)" \ No newline at end of file diff --git a/fields/multi_line_simple/lang/pl.txt b/fields/multi_line_simple/lang/pl.txt new file mode 100644 index 0000000..d77cd37 --- /dev/null +++ b/fields/multi_line_simple/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Multi (Średnie)" \ No newline at end of file diff --git a/fields/multi_line_simple/lang/ru.txt b/fields/multi_line_simple/lang/ru.txt new file mode 100644 index 0000000..51d2a6e --- /dev/null +++ b/fields/multi_line_simple/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Многострочное (Среднее)" \ No newline at end of file diff --git a/fields/multi_line_simple/lang/ua.txt b/fields/multi_line_simple/lang/ua.txt new file mode 100644 index 0000000..5e6f917 --- /dev/null +++ b/fields/multi_line_simple/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Багаторядкове (Середнє)" \ No newline at end of file diff --git a/fields/multi_line_slim/field.php b/fields/multi_line_slim/field.php new file mode 100644 index 0000000..04e4aea --- /dev/null +++ b/fields/multi_line_slim/field.php @@ -0,0 +1,95 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res=0; + + switch ($action) + { + case 'edit': + if (isset($_COOKIE['no_wysiwyg']) && $_COOKIE['no_wysiwyg'] == 1) + { + $field = ""; + $field .= ""; + } + else + { + if (isset($_REQUEST['outside']) && ($_REQUEST['outside'] === (bool)true)) { + switch ($_SESSION['use_editor']) { + case '0': + case '1': + case '2': + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Verysmall'; + $oCKeditor->config['height'] = 200; + $config = array(); + $field = $oCKeditor->editor('data['.$_REQUEST['Id'].'][feld][' . $field_id . ']', $field_value, $config); + break; + + default: + $field = $field_value; + break; + } + } else { + switch ($_SESSION['use_editor']) { + case '0': // CKEditor + $oCKeditor = new CKeditor(); + $oCKeditor->returnOutput = true; + $oCKeditor->config['toolbar'] = 'Verysmall'; + $oCKeditor->config['height'] = 200; + $config = array(); + $field = $oCKeditor->editor('feld[' . $field_id . ']', $field_value, $config); + break; + + case '1': // Elrte и Elfinder + $field = ''; + $field .=''; + break; + + default: + $field = $field_value; + break; + } + } + } + + $res = $field; + break; + + case 'doc': + case 'req': + $res = get_field_default($field_value,$action,$field_id,$tpl,$tpl_empty,$maxlength,$document_fields,$rubric_id); + $res = document_pagination($res); + break; + + case 'name' : + return $AVE_Template->get_config_vars('name'); + break; + } + return ($res ? $res : $field_value); + +} +?> diff --git a/fields/multi_line_slim/lang/bg.txt b/fields/multi_line_slim/lang/bg.txt new file mode 100644 index 0000000..37575ed --- /dev/null +++ b/fields/multi_line_slim/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] + +name = "Многоредово (Малко)" diff --git a/fields/multi_line_slim/lang/cz.txt b/fields/multi_line_slim/lang/cz.txt new file mode 100644 index 0000000..46109f2 --- /dev/null +++ b/fields/multi_line_slim/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Víceřádkové (Malé)" diff --git a/fields/multi_line_slim/lang/en.txt b/fields/multi_line_slim/lang/en.txt new file mode 100644 index 0000000..89829a2 --- /dev/null +++ b/fields/multi_line_slim/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "Multi Lines (Small)" diff --git a/fields/multi_line_slim/lang/pl.txt b/fields/multi_line_slim/lang/pl.txt new file mode 100644 index 0000000..d4436af --- /dev/null +++ b/fields/multi_line_slim/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Multi (Małe)" diff --git a/fields/multi_line_slim/lang/ru.txt b/fields/multi_line_slim/lang/ru.txt new file mode 100644 index 0000000..676420d --- /dev/null +++ b/fields/multi_line_slim/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Многострочное (Маленькое)" diff --git a/fields/multi_line_slim/lang/ua.txt b/fields/multi_line_slim/lang/ua.txt new file mode 100644 index 0000000..9871f6b --- /dev/null +++ b/fields/multi_line_slim/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Багаторядкове (Маленьке)" diff --git a/fields/multi_list/css/field.css b/fields/multi_list/css/field.css new file mode 100644 index 0000000..0a676da --- /dev/null +++ b/fields/multi_list/css/field.css @@ -0,0 +1,18 @@ +.multi_lists { + position: relative; +} + +.multi_lists > .ui-state-highlight { + display: inline-block; + margin: 3px; + width: 450px; + height: 26px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; + padding: 0 !important; +} \ No newline at end of file diff --git a/fields/multi_list/field.php b/fields/multi_list/field.php new file mode 100644 index 0000000..2d1e750 --- /dev/null +++ b/fields/multi_list/field.php @@ -0,0 +1,194 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = array(); + + switch ($action) + { + case 'edit': + + $items = array(); + + $items = unserialize($field_value); + + if ($items != false) + { + + foreach($items as $k => $v){ + $list_item = explode('|', $v); + + $list[$k]['param'] = (isset($list_item[0])) ? htmlspecialchars($list_item[0], ENT_QUOTES) : ''; + $list[$k]['value'] = (isset($list_item[1])) ? htmlspecialchars($list_item[1], ENT_QUOTES) : ''; + } + + $items = $list; + } + else + { + $items = explode(',', $default); + + foreach($items as $k => $v){ + $list_item = explode('|', $v); + + $list[$k]['param'] = (isset($list_item[0])) ? htmlspecialchars($list_item[0], ENT_QUOTES) : ''; + $list[$k]['value'] = (isset($list_item[1])) ? htmlspecialchars($list_item[1], ENT_QUOTES) : ''; + } + $items = $list; + } + + $AVE_Template->assign('doc_id', $_REQUEST['Id']); + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_id', $field_id); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $items = unserialize($field_value); + + if ($items != false) + { + foreach($items as $list_item) + { + $list_item = clean_php($list_item); + $field_param = explode('|', $list_item); + + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $field_param; + } + else + { + $list_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'req': + $items = unserialize($field_value); + + if ($items != false) + { + foreach($items as $list_item) + { + $list_item = clean_php($list_item); + $field_param = explode('|', $list_item); + + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $field_param; + } + else + { + $list_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'save': + foreach ($field_value as $v) + { + if(! empty($v['param'])) + { + $field_value_new[] = $v['param'] . ($v['value'] ? '|' . $v['value'] : ''); + } + } + + if (isset($field_value_new)) + { + return @serialize($field_value_new); + } + else + { + return $field_value_new = ''; + } + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/multi_list/js/field.js b/fields/multi_list/js/field.js new file mode 100644 index 0000000..e67fa2f --- /dev/null +++ b/fields/multi_list/js/field.js @@ -0,0 +1,75 @@ +var MultiList = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.lists(); + }, + + lists: function() { + this.lists_sortable(); + this.lists_del_item(); + this.lists_add(); + }, + + lists_update: function() { + this.lists_maxid(); + this.lists_del_item(); + AveAdmin.tooltip(); + }, + + lists_maxid: function(id) { + var maxid = 1; + $('#multi_lists_' + id).children('.multi_list').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + lists_del_item: function() { + $('.multi_list .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + list_del_conf, + list_del_head, + function(b) { + if (b) { + $('#list_' + id).remove(); + } + } + ); + }); + }, + + lists_add: function() { + $('.AddButton').on('click', function(event) { + event.preventDefault(); + c_id = $(this).parent().parent('.multi_lists').attr("data-id"); + iid = MultiList.lists_maxid(c_id); + $('#multi_lists_' + c_id + ':last').append( + '
      ' + + '    ×' + + '
      ' + + '
      ' + ); + + MultiList.lists_update(); + }); + }, + + lists_sortable: function() { + $('.multi_lists').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".multi_lists").disableSelection(); + } +} + +$(document).ready(function() { + MultiList.init(); +}); \ No newline at end of file diff --git a/fields/multi_list/js/outside.js b/fields/multi_list/js/outside.js new file mode 100644 index 0000000..e67fa2f --- /dev/null +++ b/fields/multi_list/js/outside.js @@ -0,0 +1,75 @@ +var MultiList = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.lists(); + }, + + lists: function() { + this.lists_sortable(); + this.lists_del_item(); + this.lists_add(); + }, + + lists_update: function() { + this.lists_maxid(); + this.lists_del_item(); + AveAdmin.tooltip(); + }, + + lists_maxid: function(id) { + var maxid = 1; + $('#multi_lists_' + id).children('.multi_list').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + lists_del_item: function() { + $('.multi_list .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + list_del_conf, + list_del_head, + function(b) { + if (b) { + $('#list_' + id).remove(); + } + } + ); + }); + }, + + lists_add: function() { + $('.AddButton').on('click', function(event) { + event.preventDefault(); + c_id = $(this).parent().parent('.multi_lists').attr("data-id"); + iid = MultiList.lists_maxid(c_id); + $('#multi_lists_' + c_id + ':last').append( + '
      ' + + '    ×' + + '
      ' + + '
      ' + ); + + MultiList.lists_update(); + }); + }, + + lists_sortable: function() { + $('.multi_lists').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".multi_lists").disableSelection(); + } +} + +$(document).ready(function() { + MultiList.init(); +}); \ No newline at end of file diff --git a/fields/multi_list/lang/bg.txt b/fields/multi_list/lang/bg.txt new file mode 100644 index 0000000..d5aa25e --- /dev/null +++ b/fields/multi_list/lang/bg.txt @@ -0,0 +1,8 @@ +[admin] +name = "Мулти лист (Двоен)" +delete = "Изтриване на елемент" +param = "Параметър" +value = "Значение" +del_conf = "Сигурни ли сте, че желаете да изтриете този елемент?" +del_head = "Изтриване на елемент..." +add = "Добави" \ No newline at end of file diff --git a/fields/multi_list/lang/cz.txt b/fields/multi_list/lang/cz.txt new file mode 100644 index 0000000..9b31684 --- /dev/null +++ b/fields/multi_list/lang/cz.txt @@ -0,0 +1,8 @@ +[admin] +name = "Multiseznam (Dvojitý)" +delete = "Odstranit prvek" +param = "Dokument" +value = "Id" +del_conf = "Opravdu chcete odstranit tento prvek?" +del_head = "Odstranění prvku..." +add = "Přidat" \ No newline at end of file diff --git a/fields/multi_list/lang/en.txt b/fields/multi_list/lang/en.txt new file mode 100644 index 0000000..bc5c2d1 --- /dev/null +++ b/fields/multi_list/lang/en.txt @@ -0,0 +1,8 @@ +[admin] +name = "Multi List (Double)" +delete = "Delete element" +param = "Parametr" +value = "Value" +del_conf = "Вы уверены, что хотите удалить данный элемент?" +del_head = "Удаление элемента..." +add = "Добавить" \ No newline at end of file diff --git a/fields/multi_list/lang/pl.txt b/fields/multi_list/lang/pl.txt new file mode 100644 index 0000000..4ad08df --- /dev/null +++ b/fields/multi_list/lang/pl.txt @@ -0,0 +1,8 @@ +[admin] +name = "Multi list (Podwójne)" +delete = "Usuń element" +param = "Parametr" +value = "Znaczenie" +del_conf = "Czy na pewno chcesz usunąć ten element?" +del_head = "Usuń element..." +add = "Dodaj" \ No newline at end of file diff --git a/fields/multi_list/lang/ru.txt b/fields/multi_list/lang/ru.txt new file mode 100644 index 0000000..a6682b0 --- /dev/null +++ b/fields/multi_list/lang/ru.txt @@ -0,0 +1,8 @@ +[admin] +name = "Мульти лист (Двойное)" +delete = "Удалить элемент" +param = "Параметр" +value = "Значение" +del_conf = "Вы уверены, что хотите удалить данный элемент?" +del_head = "Удаление элемента..." +add = "Добавить" \ No newline at end of file diff --git a/fields/multi_list/lang/ua.txt b/fields/multi_list/lang/ua.txt new file mode 100644 index 0000000..c1bd4b3 --- /dev/null +++ b/fields/multi_list/lang/ua.txt @@ -0,0 +1,8 @@ +[admin] +name = "Мульти лист (Подвійне)" +delete = "Видалити елемент" +param = "Параметр" +value = "Значення" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент?" +del_head = "Видалення елемента..." +add = "Додати" \ No newline at end of file diff --git a/fields/multi_list/tpl/field-doc.tpl b/fields/multi_list/tpl/field-doc.tpl new file mode 100644 index 0000000..ef6968b --- /dev/null +++ b/fields/multi_list/tpl/field-doc.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=list} +
      • {$list[0]}: {$list[1]}
      • +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list/tpl/field-req.tpl b/fields/multi_list/tpl/field-req.tpl new file mode 100644 index 0000000..ef6968b --- /dev/null +++ b/fields/multi_list/tpl/field-req.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=list} +
      • {$list[0]}: {$list[1]}
      • +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list/tpl/field.tpl b/fields/multi_list/tpl/field.tpl new file mode 100644 index 0000000..652405e --- /dev/null +++ b/fields/multi_list/tpl/field.tpl @@ -0,0 +1,29 @@ +{if $multi_list != load} + {assign var=multi_list value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=multi_list value="load" scope="global"} +{/if} + +
      +{foreach from=$items key=key item=item} + +
      +     {if $key == 0}+{else}×{/if} +
      +
      + +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list_single/css/field.css b/fields/multi_list_single/css/field.css new file mode 100644 index 0000000..f714c6a --- /dev/null +++ b/fields/multi_list_single/css/field.css @@ -0,0 +1,18 @@ +.multi_lists_single { + position: relative; +} + +.multi_lists_single > .ui-state-highlight { + display: inline-block; + margin: 3px; + width: 450px; + height: 26px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; + padding: 0 !important; +} \ No newline at end of file diff --git a/fields/multi_list_single/field.php b/fields/multi_list_single/field.php new file mode 100644 index 0000000..c76277e --- /dev/null +++ b/fields/multi_list_single/field.php @@ -0,0 +1,177 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = array(); + + switch ($action) + { + case 'edit': + + $items = array(); + + $items = unserialize($field_value); + + if ($items != false) + { + $items = $items; + } + else + { + $items = explode(',', $default); + } + + $AVE_Template->assign('doc_id', $_REQUEST['Id']); + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_id', $field_id); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $items = unserialize($field_value); + + if ($items != false) + { + foreach($items as $list_item) + { + $list_item = clean_php($list_item); + $field_param = explode('|', $list_item); + + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $field_param; + } + else + { + $list_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'req': + $items = unserialize($field_value); + + if ($items != false) + { + foreach($items as $list_item) + { + $list_item = clean_php($list_item); + $field_param = explode('|', $list_item); + + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $field_param; + } + else + { + $list_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'save': + foreach ($field_value as $v) + { + if (! empty($v)) + { + $field_value_new[] = $v; + } + } + + if (isset($field_value_new)) + { + return @serialize($field_value_new); + } + else + { + return $field_value_new = ''; + } + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/multi_list_single/js/field.js b/fields/multi_list_single/js/field.js new file mode 100644 index 0000000..d977cfe --- /dev/null +++ b/fields/multi_list_single/js/field.js @@ -0,0 +1,75 @@ +var MultiListSingle = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.s_lists(); + }, + + s_lists: function() { + this.s_lists_sortable(); + this.s_lists_del_item(); + this.s_lists_add(); + }, + + s_lists_update: function() { + this.s_lists_maxid(); + this.s_lists_del_item(); + AveAdmin.tooltip(); + }, + + s_lists_maxid: function(id) { + var maxid = 1; + $('#multi_lists_single_' + id).children('.multi_list_single').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + s_lists_del_item: function() { + $('.multi_list_single .DelSingleButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + s_list_del_conf, + s_list_del_head, + function(b) { + if (b) { + $('#list_' + id).remove(); + } + } + ); + }); + }, + + s_lists_add: function() { + $('.AddSingleButton').on('click', function(event) { + event.preventDefault(); + c_id = $(this).parent().parent('.multi_lists_single').attr("data-id"); + iid = MultiListSingle.s_lists_maxid(c_id); + $('#multi_lists_single_' + c_id + ':last').append( + '
      ' + + '  ×' + + '
      ' + + '
      ' + ); + + MultiListSingle.s_lists_update(); + }); + }, + + s_lists_sortable: function() { + $('.multi_lists_single').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".multi_lists_single").disableSelection(); + } +} + +$(document).ready(function() { + MultiListSingle.init(); +}); \ No newline at end of file diff --git a/fields/multi_list_single/js/outside.js b/fields/multi_list_single/js/outside.js new file mode 100644 index 0000000..d977cfe --- /dev/null +++ b/fields/multi_list_single/js/outside.js @@ -0,0 +1,75 @@ +var MultiListSingle = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.s_lists(); + }, + + s_lists: function() { + this.s_lists_sortable(); + this.s_lists_del_item(); + this.s_lists_add(); + }, + + s_lists_update: function() { + this.s_lists_maxid(); + this.s_lists_del_item(); + AveAdmin.tooltip(); + }, + + s_lists_maxid: function(id) { + var maxid = 1; + $('#multi_lists_single_' + id).children('.multi_list_single').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + s_lists_del_item: function() { + $('.multi_list_single .DelSingleButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + s_list_del_conf, + s_list_del_head, + function(b) { + if (b) { + $('#list_' + id).remove(); + } + } + ); + }); + }, + + s_lists_add: function() { + $('.AddSingleButton').on('click', function(event) { + event.preventDefault(); + c_id = $(this).parent().parent('.multi_lists_single').attr("data-id"); + iid = MultiListSingle.s_lists_maxid(c_id); + $('#multi_lists_single_' + c_id + ':last').append( + '
      ' + + '  ×' + + '
      ' + + '
      ' + ); + + MultiListSingle.s_lists_update(); + }); + }, + + s_lists_sortable: function() { + $('.multi_lists_single').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".multi_lists_single").disableSelection(); + } +} + +$(document).ready(function() { + MultiListSingle.init(); +}); \ No newline at end of file diff --git a/fields/multi_list_single/lang/bg.txt b/fields/multi_list_single/lang/bg.txt new file mode 100644 index 0000000..82900d2 --- /dev/null +++ b/fields/multi_list_single/lang/bg.txt @@ -0,0 +1,8 @@ +[admin] +name = "Мулти лист (Единичен)" +delete = "Изтриване на елемент" +param = "Параметър" +value = "Значение" +del_conf = "Сигурни ли сте, че желаете да изтриете този елемент?" +del_head = "Изтриване на елемента..." +add = "Добави" \ No newline at end of file diff --git a/fields/multi_list_single/lang/cz.txt b/fields/multi_list_single/lang/cz.txt new file mode 100644 index 0000000..ae020b6 --- /dev/null +++ b/fields/multi_list_single/lang/cz.txt @@ -0,0 +1,8 @@ +[admin] +name = "Multiseznam (Jediný)" +delete = "Odstranit prvek" +param = "Dokument" +value = "Id" +del_conf = "Opravdu chcete odstranit tento prvek?" +del_head = "Odstranění prvku..." +add = "Přidat" \ No newline at end of file diff --git a/fields/multi_list_single/lang/en.txt b/fields/multi_list_single/lang/en.txt new file mode 100644 index 0000000..54cef4f --- /dev/null +++ b/fields/multi_list_single/lang/en.txt @@ -0,0 +1,8 @@ +[admin] +name = "Multi List (Single)" +delete = "Delete element" +param = "Parametr" +value = "Value" +del_conf = "Вы уверены, что хотите удалить данный элемент?" +del_head = "Удаление элемента..." +add = "Добавить" \ No newline at end of file diff --git a/fields/multi_list_single/lang/pl.txt b/fields/multi_list_single/lang/pl.txt new file mode 100644 index 0000000..1e979bf --- /dev/null +++ b/fields/multi_list_single/lang/pl.txt @@ -0,0 +1,8 @@ +[admin] +name = "Multi list (Pojedyncze)" +delete = "Usuń element" +param = "Parametr" +value = "Znaczenie" +del_conf = "Czy na pewno chcesz usunąć ten element?" +del_head = "Usuń element..." +add = "Dodaj" \ No newline at end of file diff --git a/fields/multi_list_single/lang/ru.txt b/fields/multi_list_single/lang/ru.txt new file mode 100644 index 0000000..8bccc75 --- /dev/null +++ b/fields/multi_list_single/lang/ru.txt @@ -0,0 +1,8 @@ +[admin] +name = "Мульти лист (Одиночное)" +delete = "Удалить элемент" +param = "Параметр" +value = "Значение" +del_conf = "Вы уверены, что хотите удалить данный элемент?" +del_head = "Удаление элемента..." +add = "Добавить" \ No newline at end of file diff --git a/fields/multi_list_single/lang/ua.txt b/fields/multi_list_single/lang/ua.txt new file mode 100644 index 0000000..397971b --- /dev/null +++ b/fields/multi_list_single/lang/ua.txt @@ -0,0 +1,8 @@ +[admin] +name = "Мульти лист (Одиночне)" +delete = "Видалити елемент" +param = "Параметр" +value = "Значення" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент?" +del_head = "Видалення елемента..." +add = "Додати" \ No newline at end of file diff --git a/fields/multi_list_single/tpl/field-doc.tpl b/fields/multi_list_single/tpl/field-doc.tpl new file mode 100644 index 0000000..7105c30 --- /dev/null +++ b/fields/multi_list_single/tpl/field-doc.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=list} +
      • {$list[0]}
      • +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list_single/tpl/field-req.tpl b/fields/multi_list_single/tpl/field-req.tpl new file mode 100644 index 0000000..7105c30 --- /dev/null +++ b/fields/multi_list_single/tpl/field-req.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=list} +
      • {$list[0]}
      • +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list_single/tpl/field.tpl b/fields/multi_list_single/tpl/field.tpl new file mode 100644 index 0000000..f34c377 --- /dev/null +++ b/fields/multi_list_single/tpl/field.tpl @@ -0,0 +1,28 @@ +{if $multi_list_single != load} + {assign var=multi_list_single value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=multi_list_single value="load" scope="global"} +{/if} + +
      +{foreach from=$items key=key item=item} + +
      +   {if $key == 0}+{else}×{/if} +
      +
      + +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list_triple/css/field.css b/fields/multi_list_triple/css/field.css new file mode 100644 index 0000000..929f949 --- /dev/null +++ b/fields/multi_list_triple/css/field.css @@ -0,0 +1,18 @@ +.multi_list_triples { + position: relative; +} + +.multi_list_triples > .ui-state-highlight { + display: inline-block; + margin: 3px; + width: 450px; + height: 26px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; + padding: 0 !important; +} \ No newline at end of file diff --git a/fields/multi_list_triple/field.php b/fields/multi_list_triple/field.php new file mode 100644 index 0000000..138e855 --- /dev/null +++ b/fields/multi_list_triple/field.php @@ -0,0 +1,200 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = array(); + + switch ($action) + { + case 'edit': + + $items = array(); + + $items = unserialize($field_value); + + if ($items != false) + { + + foreach($items as $k => $v) + { + $list_item = explode('|', $v); + + $list[$k]['param'] = (isset($list_item[0])) ? htmlspecialchars($list_item[0], ENT_QUOTES) : ''; + $list[$k]['value'] = (isset($list_item[1])) ? htmlspecialchars($list_item[1], ENT_QUOTES) : ''; + $list[$k]['value2'] = (isset($list_item[2])) ? htmlspecialchars($list_item[2], ENT_QUOTES) : ''; + } + + $items = $list; + } + else + { + + $items = explode(',', $default); + + foreach ($items as $k => $v) + { + $list_item = explode('|', $v); + + $list[$k]['param'] = (isset($list_item[0])) ? htmlspecialchars($list_item[0], ENT_QUOTES) : ''; + $list[$k]['value'] = (isset($list_item[1])) ? htmlspecialchars($list_item[1], ENT_QUOTES) : ''; + $list[$k]['value2'] = (isset($list_item[2])) ? htmlspecialchars($list_item[2], ENT_QUOTES) : ''; + } + + $items = $list; + } + + $AVE_Template->assign('doc_id', $_REQUEST['Id']); + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_id', $field_id); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $items = unserialize($field_value); + + if ($items != false) + { + foreach ($items as $list_item) + { + $list_item = clean_php($list_item); + $field_param = explode('|', $list_item); + + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $field_param; + } + else + { + $list_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'req': + $items = unserialize($field_value); + + if ($items != false) + { + foreach ($items as $list_item) + { + $list_item = clean_php($list_item); + $field_param = explode('|', $list_item); + + if ($list_item) + { + if ($tpl_empty) + { + $list_item = $field_param; + } + else + { + $list_item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $list_item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('field_count', count($res)); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'save': + foreach ($field_value as $v) + { + if(!empty($v['param'])) + { + $field_value_new[] = $v['param'] . '|' . $v['value'] . '|' . $v['value2']; + } + } + + if (isset($field_value_new)) + { + return @serialize($field_value_new); + } + else + { + return $field_value_new = ''; + } + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/multi_list_triple/js/field.js b/fields/multi_list_triple/js/field.js new file mode 100644 index 0000000..e4d5ca8 --- /dev/null +++ b/fields/multi_list_triple/js/field.js @@ -0,0 +1,75 @@ +var MultiListTriple = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.lists(); + }, + + lists: function() { + this.lists_sortable(); + this.lists_del_item(); + this.lists_add(); + }, + + lists_update: function() { + this.lists_maxid(); + this.lists_del_item(); + AveAdmin.tooltip(); + }, + + lists_maxid: function(id) { + var maxid = 1; + $('#multi_lists_triple_' + id).children('.multi_list_triple').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + lists_del_item: function() { + $('.multi_list_triple .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + list_del_conf, + list_del_head, + function(b) { + if (b) { + $('#list_' + id).remove(); + } + } + ); + }); + }, + + lists_add: function() { + $('.AddButton').on('click', function(event) { + event.preventDefault(); + c_id = $(this).parent().parent('.multi_lists_triple').attr("data-id"); + iid = MultiListTriple.lists_maxid(c_id); + $('#multi_lists_triple_' + c_id + ':last').append( + '
      ' + + '      ×' + + '
      ' + + '
      ' + ); + + MultiListTriple.lists_update(); + }); + }, + + lists_sortable: function() { + $('.multi_lists_triple').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".multi_lists_triple").disableSelection(); + } +} + +$(document).ready(function() { + MultiListTriple.init(); +}); \ No newline at end of file diff --git a/fields/multi_list_triple/js/outside.js b/fields/multi_list_triple/js/outside.js new file mode 100644 index 0000000..e4d5ca8 --- /dev/null +++ b/fields/multi_list_triple/js/outside.js @@ -0,0 +1,75 @@ +var MultiListTriple = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.lists(); + }, + + lists: function() { + this.lists_sortable(); + this.lists_del_item(); + this.lists_add(); + }, + + lists_update: function() { + this.lists_maxid(); + this.lists_del_item(); + AveAdmin.tooltip(); + }, + + lists_maxid: function(id) { + var maxid = 1; + $('#multi_lists_triple_' + id).children('.multi_list_triple').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + lists_del_item: function() { + $('.multi_list_triple .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + list_del_conf, + list_del_head, + function(b) { + if (b) { + $('#list_' + id).remove(); + } + } + ); + }); + }, + + lists_add: function() { + $('.AddButton').on('click', function(event) { + event.preventDefault(); + c_id = $(this).parent().parent('.multi_lists_triple').attr("data-id"); + iid = MultiListTriple.lists_maxid(c_id); + $('#multi_lists_triple_' + c_id + ':last').append( + '
      ' + + '      ×' + + '
      ' + + '
      ' + ); + + MultiListTriple.lists_update(); + }); + }, + + lists_sortable: function() { + $('.multi_lists_triple').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + //$(".multi_lists_triple").disableSelection(); + } +} + +$(document).ready(function() { + MultiListTriple.init(); +}); \ No newline at end of file diff --git a/fields/multi_list_triple/lang/bg.txt b/fields/multi_list_triple/lang/bg.txt new file mode 100644 index 0000000..757e19e --- /dev/null +++ b/fields/multi_list_triple/lang/bg.txt @@ -0,0 +1,9 @@ +[admin] +name = "Мулти лист (Троен)" +delete = "Изтриване на елемент" +param = "Параметър" +value = "Значение" +value2 = "Значение 2" +del_conf = "Сигурно ли сте, че желаете да изтриете този елемент?" +del_head = "Изтриване на елемента..." +add = "Добави" \ No newline at end of file diff --git a/fields/multi_list_triple/lang/cz.txt b/fields/multi_list_triple/lang/cz.txt new file mode 100644 index 0000000..faa7bd0 --- /dev/null +++ b/fields/multi_list_triple/lang/cz.txt @@ -0,0 +1,9 @@ +[admin] +name = "Multiseznam (Trojitý)" +delete = "Odstranit prvek" +param = "Dokument" +value = "Id" +value2 = "Id 2" +del_conf = "Opravdu chcete odstranit tento prvek?" +del_head = "Odstranění prvku..." +add = "Přidat" \ No newline at end of file diff --git a/fields/multi_list_triple/lang/pl.txt b/fields/multi_list_triple/lang/pl.txt new file mode 100644 index 0000000..3fba90a --- /dev/null +++ b/fields/multi_list_triple/lang/pl.txt @@ -0,0 +1,9 @@ +[admin] +name = "Multi list (Potrójne)" +delete = "Usuń element" +param = "Parametr" +value = "Znaczenie" +value2 = "Znaczenie 2" +del_conf = "Czy na pewno chcesz usunąć ten element?" +del_head = "Usuń element..." +add = "Dodaj" \ No newline at end of file diff --git a/fields/multi_list_triple/lang/ru.txt b/fields/multi_list_triple/lang/ru.txt new file mode 100644 index 0000000..4d406a4 --- /dev/null +++ b/fields/multi_list_triple/lang/ru.txt @@ -0,0 +1,9 @@ +[admin] +name = "Мульти лист (Тройное)" +delete = "Удалить элемент" +param = "Параметр" +value = "Значение" +value2 = "Значение 2" +del_conf = "Вы уверены, что хотите удалить данный элемент?" +del_head = "Удаление элемента..." +add = "Добавить" \ No newline at end of file diff --git a/fields/multi_list_triple/lang/ua.txt b/fields/multi_list_triple/lang/ua.txt new file mode 100644 index 0000000..9ccc9c8 --- /dev/null +++ b/fields/multi_list_triple/lang/ua.txt @@ -0,0 +1,9 @@ +[admin] +name = "Мульти лист (Потрійне)" +delete = "Видалити елемент" +param = "Параметр" +value = "Значення" +value2 = "Значення 2" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент?" +del_head = "Видалення елемента..." +add = "Додати" \ No newline at end of file diff --git a/fields/multi_list_triple/tpl/field-doc.tpl b/fields/multi_list_triple/tpl/field-doc.tpl new file mode 100644 index 0000000..54c683f --- /dev/null +++ b/fields/multi_list_triple/tpl/field-doc.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=list} +
      • {$list[0]}: {$list[1]}: {$list[2]}
      • +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list_triple/tpl/field-req.tpl b/fields/multi_list_triple/tpl/field-req.tpl new file mode 100644 index 0000000..54c683f --- /dev/null +++ b/fields/multi_list_triple/tpl/field-req.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=list} +
      • {$list[0]}: {$list[1]}: {$list[2]}
      • +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_list_triple/tpl/field.tpl b/fields/multi_list_triple/tpl/field.tpl new file mode 100644 index 0000000..2efbe5c --- /dev/null +++ b/fields/multi_list_triple/tpl/field.tpl @@ -0,0 +1,30 @@ +{if $multi_list_triple != load} + {assign var=multi_list_triple value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=multi_list_triple value="load" scope="global"} +{/if} + +
      +{foreach from=$items key=key item=item} + +
      +       {if $key == 0}+{else}×{/if} +
      +
      + +{/foreach} +
      \ No newline at end of file diff --git a/fields/multi_select/field.php b/fields/multi_select/field.php new file mode 100644 index 0000000..a999467 --- /dev/null +++ b/fields/multi_select/field.php @@ -0,0 +1,159 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + $res = array(); + + switch ($action) + { + case 'edit': + $items = array(); + + $items = explode(',', $default); + + $items = array_diff($items, array('')); + + @$field_value = unserialize($field_value); + + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + $items = (isset($field_value)) + ? unserialize($field_value) + : array(); + + if ($items != false) + { + foreach($items as $item) + { + $item = clean_php($item); + + $field_param = explode('|', $item); + + if ($item) + { + if ($tpl_empty) + { + $item = $field_param[0]; + } + else + { + $item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if ($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (! empty($res)) + ? implode(PHP_EOL, $res) + : $tpl; + + break; + + case 'req': + $items = (isset($field_value)) ? unserialize($field_value) : array(); + + if ($items != false) + { + foreach($items as $item) + { + $item = clean_php($item); + + $field_param = explode('|', $item); + + if ($item) + { + if ($tpl_empty) + { + $item = $field_param[0]; + } + else + { + $item = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + } + $res[] = $item; + } + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $res); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('default', $default); + + return $AVE_Template->fetch($tpl_file); + } + + return (!empty($res)) ? implode(PHP_EOL, $res) : $tpl; + break; + + case 'name': + return $AVE_Template->get_config_vars('name'); + break; + + } + + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/multi_select/lang/bg.txt b/fields/multi_select/lang/bg.txt new file mode 100644 index 0000000..36f4aa8 --- /dev/null +++ b/fields/multi_select/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] +name = "Мулти селект" +no_items = "Липсват стойности по подразбиране" \ No newline at end of file diff --git a/fields/multi_select/lang/cz.txt b/fields/multi_select/lang/cz.txt new file mode 100644 index 0000000..5503b6b --- /dev/null +++ b/fields/multi_select/lang/cz.txt @@ -0,0 +1,3 @@ +[admin] +name = "Multivýběr" +no_items = "Neexistuje žádná výchozí hodnota" \ No newline at end of file diff --git a/fields/multi_select/lang/en.txt b/fields/multi_select/lang/en.txt new file mode 100644 index 0000000..88dc91d --- /dev/null +++ b/fields/multi_select/lang/en.txt @@ -0,0 +1,3 @@ +[admin] +name = "Multi Select" +no_items = "No default value" \ No newline at end of file diff --git a/fields/multi_select/lang/pl.txt b/fields/multi_select/lang/pl.txt new file mode 100644 index 0000000..f348838 --- /dev/null +++ b/fields/multi_select/lang/pl.txt @@ -0,0 +1,3 @@ +[admin] +name = "Multi selekt" +no_items = "Brak znaczenia domyślnego" \ No newline at end of file diff --git a/fields/multi_select/lang/ru.txt b/fields/multi_select/lang/ru.txt new file mode 100644 index 0000000..ad3eb25 --- /dev/null +++ b/fields/multi_select/lang/ru.txt @@ -0,0 +1,3 @@ +[admin] +name = "Мульти селект" +no_items = "Нет значения по умолчанию" \ No newline at end of file diff --git a/fields/multi_select/lang/ua.txt b/fields/multi_select/lang/ua.txt new file mode 100644 index 0000000..4124a0e --- /dev/null +++ b/fields/multi_select/lang/ua.txt @@ -0,0 +1,3 @@ +[admin] +name = "Мульти селект" +no_items = "Немає значення по замовчуванню" \ No newline at end of file diff --git a/fields/multi_select/tpl/field-doc.tpl b/fields/multi_select/tpl/field-doc.tpl new file mode 100644 index 0000000..75fc3ea --- /dev/null +++ b/fields/multi_select/tpl/field-doc.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=item} +
      • {$item}
      • +{/foreach} +
      diff --git a/fields/multi_select/tpl/field-req.tpl b/fields/multi_select/tpl/field-req.tpl new file mode 100644 index 0000000..75fc3ea --- /dev/null +++ b/fields/multi_select/tpl/field-req.tpl @@ -0,0 +1,5 @@ +
        +{foreach from=$field_value item=item} +
      • {$item}
      • +{/foreach} +
      diff --git a/fields/multi_select/tpl/field.tpl b/fields/multi_select/tpl/field.tpl new file mode 100644 index 0000000..027c0da --- /dev/null +++ b/fields/multi_select/tpl/field.tpl @@ -0,0 +1,11 @@ +{if $items} + +{else} +
        +
      • {#no_items#}
      • +
      +{/if} \ No newline at end of file diff --git a/fields/single_line/field.php b/fields/single_line/field.php new file mode 100644 index 0000000..facabad --- /dev/null +++ b/fields/single_line/field.php @@ -0,0 +1,115 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + switch ($action) + { + case 'edit': + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + + $AVE_Template->config_load($lang_file, 'public'); + + if ($tpl_empty) + { + $field_value = clean_php($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + + return $field_value; + break; + + case 'req': + + $AVE_Template->config_load($lang_file, 'public'); + + if ($tpl_empty) + { + $field_value = clean_php($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + + return $field_value; + break; + + case 'save': + return $field_value; + + case 'name': + return $AVE_Template->get_config_vars('name'); + + default: return $field_value; + } +} + +?> diff --git a/fields/single_line/lang/bg.txt b/fields/single_line/lang/bg.txt new file mode 100644 index 0000000..1bf9266 --- /dev/null +++ b/fields/single_line/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] + +name = "Едноредово" \ No newline at end of file diff --git a/fields/single_line/lang/cz.txt b/fields/single_line/lang/cz.txt new file mode 100644 index 0000000..18461b5 --- /dev/null +++ b/fields/single_line/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Jednořádkový" \ No newline at end of file diff --git a/fields/single_line/lang/en.txt b/fields/single_line/lang/en.txt new file mode 100644 index 0000000..d10bf19 --- /dev/null +++ b/fields/single_line/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "Single Line" \ No newline at end of file diff --git a/fields/single_line/lang/pl.txt b/fields/single_line/lang/pl.txt new file mode 100644 index 0000000..308b776 --- /dev/null +++ b/fields/single_line/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Linia pojedyncza" \ No newline at end of file diff --git a/fields/single_line/lang/ru.txt b/fields/single_line/lang/ru.txt new file mode 100644 index 0000000..6b9c6ca --- /dev/null +++ b/fields/single_line/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Однострочное" \ No newline at end of file diff --git a/fields/single_line/lang/ua.txt b/fields/single_line/lang/ua.txt new file mode 100644 index 0000000..05d7a4e --- /dev/null +++ b/fields/single_line/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Однорядкове" \ No newline at end of file diff --git a/fields/single_line/tpl/field-doc.tpl b/fields/single_line/tpl/field-doc.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/single_line/tpl/field-doc.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/single_line/tpl/field-req.tpl b/fields/single_line/tpl/field-req.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/single_line/tpl/field-req.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/single_line/tpl/field.tpl b/fields/single_line/tpl/field.tpl new file mode 100644 index 0000000..5b96cef --- /dev/null +++ b/fields/single_line/tpl/field.tpl @@ -0,0 +1 @@ + diff --git a/fields/single_line_numeric/field.php b/fields/single_line_numeric/field.php new file mode 100644 index 0000000..ddd77b1 --- /dev/null +++ b/fields/single_line_numeric/field.php @@ -0,0 +1,106 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + switch ($action) + { + case 'edit': + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + case 'doc': + if ($tpl_empty) + { + $field_value = clean_php($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file){ + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + return $field_value; + break; + + case 'req': + if ($tpl_empty) + { + $field_value = clean_php($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file){ + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + return $field_value; + break; + + case 'save': + $field_value = preg_replace('/[^\d.]/','',$field_value); + return $field_value; + + case 'name': + return $AVE_Template->get_config_vars('name'); + + default: return $field_value; + } +} + +?> diff --git a/fields/single_line_numeric/js/field.js b/fields/single_line_numeric/js/field.js new file mode 100644 index 0000000..dd1994e --- /dev/null +++ b/fields/single_line_numeric/js/field.js @@ -0,0 +1,26 @@ +$(document).ready(function() { + $(".field_numeric").keydown(function(event) { + var num_dot = $(this).attr('data-num-dot'); + var keyCode = window.event ? event.keyCode : event.which; + var foo = 0; + // prevent if already dot + if (keyCode != 8 && keyCode != 46) { + if ((foo == 0) && (keyCode != 190) && (keyCode < 96 || keyCode > 105) && (keyCode < 46 || keyCode > 59)) { + event.preventDefault(); + } // prevent if not number/dot + } + if ($(this).val().indexOf('.') > -1) { + if (keyCode == 190) event.preventDefault(); + } + $(this).keyup(function() { + this.value = this.value.replace(/[^0-9.]/i, ""); + if($(this).val().indexOf('.')!=-1){ + if($(this).val().split(".")[1].length >= num_dot){ + if( isNaN( parseFloat( this.value ) ) ) return; + this.value = parseFloat(this.value).toFixed(num_dot); + } + } + return this; + }); + }); +}); \ No newline at end of file diff --git a/fields/single_line_numeric/lang/bg.txt b/fields/single_line_numeric/lang/bg.txt new file mode 100644 index 0000000..51dcca4 --- /dev/null +++ b/fields/single_line_numeric/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] + +name = "Едноредово (Числово)" \ No newline at end of file diff --git a/fields/single_line_numeric/lang/cz.txt b/fields/single_line_numeric/lang/cz.txt new file mode 100644 index 0000000..67162c8 --- /dev/null +++ b/fields/single_line_numeric/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "Jednořádkový (Číselný)" \ No newline at end of file diff --git a/fields/single_line_numeric/lang/en.txt b/fields/single_line_numeric/lang/en.txt new file mode 100644 index 0000000..fce8b0c --- /dev/null +++ b/fields/single_line_numeric/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "Single line (Numbers)" \ No newline at end of file diff --git a/fields/single_line_numeric/lang/pl.txt b/fields/single_line_numeric/lang/pl.txt new file mode 100644 index 0000000..74abffa --- /dev/null +++ b/fields/single_line_numeric/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "Linia pojedyncza (Numeryczne)" \ No newline at end of file diff --git a/fields/single_line_numeric/lang/ru.txt b/fields/single_line_numeric/lang/ru.txt new file mode 100644 index 0000000..b159408 --- /dev/null +++ b/fields/single_line_numeric/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "Однострочное (Числовое)" \ No newline at end of file diff --git a/fields/single_line_numeric/lang/ua.txt b/fields/single_line_numeric/lang/ua.txt new file mode 100644 index 0000000..37bf67d --- /dev/null +++ b/fields/single_line_numeric/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "Однорядкове (Числове)" \ No newline at end of file diff --git a/fields/single_line_numeric/tpl/field-doc.tpl b/fields/single_line_numeric/tpl/field-doc.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/single_line_numeric/tpl/field-doc.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/single_line_numeric/tpl/field-req.tpl b/fields/single_line_numeric/tpl/field-req.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/single_line_numeric/tpl/field-req.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/single_line_numeric/tpl/field.tpl b/fields/single_line_numeric/tpl/field.tpl new file mode 100644 index 0000000..815cb30 --- /dev/null +++ b/fields/single_line_numeric/tpl/field.tpl @@ -0,0 +1,6 @@ +{if $single_line_numeric != load} + {assign var=single_line_numeric value='' scope="global"} + + {assign var=single_line_numeric value="load" scope="global"} +{/if} + \ No newline at end of file diff --git a/fields/teasers/css/field.css b/fields/teasers/css/field.css new file mode 100644 index 0000000..0a676da --- /dev/null +++ b/fields/teasers/css/field.css @@ -0,0 +1,18 @@ +.multi_lists { + position: relative; +} + +.multi_lists > .ui-state-highlight { + display: inline-block; + margin: 3px; + width: 450px; + height: 26px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; + padding: 0 !important; +} \ No newline at end of file diff --git a/fields/teasers/field.php b/fields/teasers/field.php new file mode 100644 index 0000000..dcb9276 --- /dev/null +++ b/fields/teasers/field.php @@ -0,0 +1,165 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + switch ($action) + { + case 'edit': + + $items = array(); + + $items = unserialize($field_value); + + if($items != false){ + + foreach($items as $k => $v){ + $list_item = explode('|', $v); + + $list[$k]['param'] = (isset($list_item[0])) ? htmlspecialchars($list_item[0], ENT_QUOTES) : ''; + $list[$k]['value'] = (isset($list_item[1])) ? htmlspecialchars($list_item[1], ENT_QUOTES) : ''; + } + + $items = $list; + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('doc_id', $_REQUEST['Id']); + $AVE_Template->assign('items', $items); + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('field_id', $field_id); + + return $AVE_Template->fetch($tpl_file); + + case 'save': + foreach ($field_value as $v) + { + if(! empty($v['value']) && ! empty($v['param'])) + { + $field_value_new[] = $v['param'] . ($v['value'] ? '|' . $v['value'] : ''); + } + } + if (isset($field_value_new)) + { + return @serialize($field_value_new); + } + else + { + return $field_value_new = ''; + } + break; + + case 'doc': + $items = (isset($field_value)) ? unserialize($field_value) : array(); + + $res = array(); + + if ($items != false) + { + foreach($items as $item) + { + $item = explode('|', $item); + + if ($item[1]) + $res[] = eval2var('?>' . showteaser($item[1]) . 'get_config_vars('name'); + break; + + case 'search': + + $field_default = explode(',', $default); + + $zap_1 = ($field_default[0]) ? ',' : ''; + $zap_2 = ($field_default[0] && $field_default[1]) ? ',' : ''; + + $sel_1 = ($field_default[0]) ? 'b.field_value as b1' : ''; + $sel_2 = ($field_default[1]) ? 'c.field_value as c1' : ''; + + $from_1 = ($field_default[0]) ? PREFIX . '_document_fields b' : ''; + $from_2 = ($field_default[1]) ? PREFIX . '_document_fields c' : ''; + + $search_1 = ($field_default[0]) ? "AND (b.document_id=a.Id AND b.rubric_field_id = " . $field_default[0] . ")" : ""; + $search_2 = ($field_default[1]) ? "AND (c.document_id=a.Id AND c.rubric_field_id = " . $field_default[1] . ")" : ""; + + $or_1 = ($field_default[0]) ? "OR (UPPER(b.field_value) LIKE UPPER('%" . $_REQUEST['q'] . "%'))" : ""; + $or_2 = ($field_default[1]) ? "OR (UPPER(c.field_value) LIKE UPPER('%" . $_REQUEST['q'] . "%'))" : ""; + + $sql = $AVE_DB->Query(" + SELECT + a.Id, + a.document_title + $zap_1 + $sel_1 + $zap_2 + $sel_2 + FROM + " . PREFIX . "_documents a + $zap_1 + " . $from_1 . " + $zap_2 + " . $from_2 . " + WHERE + a.rubric_id = '" . $_REQUEST['rubric_id'] . "' + AND + a.document_status = 1 + " . $search_1 . " + " . $search_2 . " + AND + ( + (UPPER(document_title) LIKE UPPER('%" . $_REQUEST['q'] . "%')) + $or_1 + $or_2 + ) + GROUP BY a.Id + LIMIT 0,5 + "); + + $doc_finded = array(); + + while ($row = $sql->FetchRow()) + { + $doc_finded[] = array( + 'doc_id' => $row->Id, + 'doc_title' => $row->document_title, + 'doc_name' => (($field_default[0]) ? $row->b1 : $row->document_title), + 'doc_article' => (($field_default[1]) ? $row->c1 : '') + ); + } + + echo json_encode($doc_finded); + exit; + + default: + return $field_value; + } + + return ($res ? $res : $field_value); +} +?> \ No newline at end of file diff --git a/fields/teasers/js/field.js b/fields/teasers/js/field.js new file mode 100644 index 0000000..ddc8e4f --- /dev/null +++ b/fields/teasers/js/field.js @@ -0,0 +1,129 @@ +var Analoque = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.Analoque_items(); + }, + + Analoque_items: function() { + this.Analoque_sortable(); + this.Analoque_del_item(); + this.Analoque_add(); + this.Analoque_search(); + }, + + Analoque_update: function() { + this.Analoque_maxid(); + this.Analoque_del_item(); + this.Analoque_search(); + AveAdmin.tooltip(); + }, + + /** + * @return {number} + */ + Analoque_maxid: function(id) + { + var maxid = 1; + $('#analoque_lists_' + id).children('.analoque_list').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + Analoque_del_item: function() + { + $('.analoque_list .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + analoque_del_conf, + analoque_del_head, + function(b) { + if (b) { + $('#analoque_list_' + id).remove(); + } + } + ); + }); + }, + + Analoque_add: function() + { + $('.AddButton').on('click', function() { + c_id = $(this).parent().parent('.analoque_lists').attr("data-id"); + d_id = $(this).parent().parent('.analoque_lists').attr("data-docid"); + i_id = Analoque.Analoque_maxid(d_id + '_' + c_id); + $('#analoque_lists_' + d_id + '_' + c_id + ':last').append( + '
      ' + + '  Id:   ×' + + '
      ' + + '
      ' + ); + + Analoque.Analoque_update(); + }); + }, + + Analoque_sortable: function() { + $('.analoque_lists').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + }, + + /** + * @return {boolean} + */ + Analoque_search: function() { + + $('.search_analoque').on('input', function(event) + { + event.preventDefault(); + + var query = $(this); + + var did = query.attr('data-docid'); + var fid = query.attr('data-fieldid'); + var kid = query.attr('data-id'); + var field_id_input = $('.field_' + did + '_' + fid + '_' + kid); + + query.autocomplete("index.php?do=fields&field=analoque&type=search&doc_id=" + did + "&field_id=" + fid, { + width: query.outerWidth(), + max: 10, + dataType: "json", + matchContains: "word", + scroll: true, + scrollHeight: 200, + parse: function(data) { + return $.map(data, function(row) { + return { + data: row, + value: row.doc_title, + result: query.val() + } + }); + }, + formatItem: function(item) { + return '
      ' + item.doc_article + ' ' + item.doc_name + '
      '; + } + }).result(function(e, item) { + query.val(item.doc_name); + field_id_input.val(item.doc_id); + }); + + return false; + }); + + return false; + } +} + +$(document).ready(function() +{ + Analoque.init(); +}); diff --git a/fields/teasers/js/outside.js b/fields/teasers/js/outside.js new file mode 100644 index 0000000..89e625d --- /dev/null +++ b/fields/teasers/js/outside.js @@ -0,0 +1,120 @@ +var Analoque = { + + init: false, + + init: function() { + if (this.initialized) return; + this.initialized = true; + + this.Analoque_items(); + }, + + Analoque_items: function() { + this.Analoque_sortable(); + this.Analoque_del_item(); + this.Analoque_add(); + this.Analoque_search(); + }, + + Analoque_update: function() { + this.Analoque_maxid(); + this.Analoque_del_item(); + this.Analoque_search(); + AveAdmin.tooltip(); + }, + + Analoque_maxid: function(id) { + var maxid = 1; + $('#analoque_lists_' + id).children('.analoque_list').each(function() { + maxid = Math.max(maxid, parseInt($(this).attr("data-id")) + 1); + }); + return maxid; + }, + + Analoque_del_item: function() { + $('.analoque_list .DelButton').on('click', function(event) { + event.preventDefault(); + var id = $(this).attr('data-id'); + jConfirm( + analoque_del_conf, + analoque_del_head, + function(b) { + if (b) { + $('#analoque_list_' + id).remove(); + } + } + ); + }); + }, + + Analoque_add: function() { + $('.AddButton').on('click', function() { + c_id = $(this).parent().parent('.analoque_lists').attr("data-id"); + d_id = $(this).parent().parent('.analoque_lists').attr("data-docid"); + i_id = Analoque.Analoque_maxid(d_id + '_' + c_id); + $('#analoque_lists_' + d_id + '_' + c_id + ':last').append( + '
      ' + + '  Id:   ×' + + '
      ' + + '
      ' + ); + + Analoque.Analoque_update(); + }); + }, + + Analoque_sortable: function() { + $('.analoque_lists').sortable({ + handle: ".handle", + placeholder: "ui-state-highlight grey_bg" + }); + }, + + Analoque_search: function() { + + $('.search_analoque').on('input', function(event) { + + var query = $(this); + + var did = query.attr('data-docid'); + var fid = query.attr('data-fieldid'); + var kid = query.attr('data-id'); + var field_id_input = $('.field_' + did + '_' + fid + '_' + kid); + + query.autocomplete("index.php?do=fields&field=analoque&type=search&doc_id=" + did + "&field_id=" + fid, { + width: query.outerWidth(), + max: 10, + dataType: "json", + matchContains: "word", + scroll: true, + scrollHeight: 200, + parse: function(data) { + return $.map(data, function(row) { + return { + data: row, + value: row.doc_title, + result: query.val() + } + }); + }, + formatItem: function(item) { + return '
      ' + item.doc_article + ' ' + item.doc_name + '
      '; + } + }).result(function(e, item) { + query.val(item.doc_name); + field_id_input.val(item.doc_id); + }); + + }); + + } + + + + + +} + +$(document).ready(function() { + Analoque.init(); +}); \ No newline at end of file diff --git a/fields/teasers/lang/bg.txt b/fields/teasers/lang/bg.txt new file mode 100644 index 0000000..bc6a9e5 --- /dev/null +++ b/fields/teasers/lang/bg.txt @@ -0,0 +1,8 @@ +[admin] +name = "Аналогични продукти" +delete = "Изтриване на елемент" +param = "Продукт" +value = "Id" +del_conf = "Сигурни ли сте, че желаете да изтриете този елемент (продукт)?" +del_head = "Изтриване на елемент (продукт) ..." +add = "Добави" \ No newline at end of file diff --git a/fields/teasers/lang/cz.txt b/fields/teasers/lang/cz.txt new file mode 100644 index 0000000..7a68fac --- /dev/null +++ b/fields/teasers/lang/cz.txt @@ -0,0 +1,8 @@ +[admin] +name = "Podobné produkty" +delete = "Odstranit prvek" +param = "Zboží" +value = "ID" +del_conf = "Opravdu chcete odstranit tento prvek (zboží)?" +del_head = "Odsranění prvku (zboží)..." +add = "Přidat" \ No newline at end of file diff --git a/fields/teasers/lang/pl.txt b/fields/teasers/lang/pl.txt new file mode 100644 index 0000000..11e1625 --- /dev/null +++ b/fields/teasers/lang/pl.txt @@ -0,0 +1,8 @@ +[admin] +name = "Podobne produkty" +delete = "Usuń element" +param = "Produkt" +value = "ID" +del_conf = "Czy na pewno chcesz usunąć ten element (produkt)?" +del_head = "Usunięcie elementu (produktu) ..." +add = "Dodaj" \ No newline at end of file diff --git a/fields/teasers/lang/ru.txt b/fields/teasers/lang/ru.txt new file mode 100644 index 0000000..c6c544b --- /dev/null +++ b/fields/teasers/lang/ru.txt @@ -0,0 +1,8 @@ +[admin] +name = "Тизеры" +delete = "Удалить элемент" +param = "Документ" +value = "Id" +del_conf = "Вы уверены, что хотите удалить данный элемент?" +del_head = "Удаление элемента ..." +add = "Добавить" \ No newline at end of file diff --git a/fields/teasers/lang/ua.txt b/fields/teasers/lang/ua.txt new file mode 100644 index 0000000..185d633 --- /dev/null +++ b/fields/teasers/lang/ua.txt @@ -0,0 +1,8 @@ +[admin] +name = "Аналогічні товари" +delete = "Видалити елемент" +param = "Товар" +value = "Id" +del_conf = "Ви впевнені, що бажаєте видалити цей елемент (товар)?" +del_head = "Видаленя елемента (товара)..." +add = "Додати" \ No newline at end of file diff --git a/fields/teasers/tpl/field.tpl b/fields/teasers/tpl/field.tpl new file mode 100644 index 0000000..36d0c54 --- /dev/null +++ b/fields/teasers/tpl/field.tpl @@ -0,0 +1,29 @@ +{if $analoque != load} + {assign var=analoque value='' scope="global"} + {if $smarty.request.outside} + + {else} + + {/if} + + + {assign var=analoque value="load" scope="global"} +{/if} + +
      +{foreach from=$items key=key item=item} + +
      +   Id:   {if $key == 0}+{else}×{/if} +
      +
      + +{/foreach} +
      \ No newline at end of file diff --git a/fields/text_to_image/.htaccess b/fields/text_to_image/.htaccess new file mode 100644 index 0000000..524e0de --- /dev/null +++ b/fields/text_to_image/.htaccess @@ -0,0 +1,4 @@ +Deny from all + + Allow from all + \ No newline at end of file diff --git a/fields/text_to_image/class.txtimage.php b/fields/text_to_image/class.txtimage.php new file mode 100644 index 0000000..c00f629 --- /dev/null +++ b/fields/text_to_image/class.txtimage.php @@ -0,0 +1,279 @@ +do_cache === true){ + if(!is_dir($this->cache_folder)){ + if(!mkdir($this->cache_folder, 0755)){ + $this->do_cache = false; + } + if(!is_writable($this->cache_folder)){ + $this->do_cache = false; + } + } + else { + if(!is_writable($this->cache_folder)){ + $this->do_cache = false; + if(!chmod($this->cache_folder, 0755)){ + $this->do_cache = false; + } + else { + if(is_writable($this->cache_folder)){ + $this->do_cache = true; + } + } + } + } + } + else { + $this->do_cache = false; + } + } + + + private function cache($text, $font, $size, $color, $trans = 0, $shadow = false, $shadow_off = false) + { + if($this->do_cache){ + $hash = md5($text . $font . $size . $color . $trans . $shadow . $shadow_off); + if(file_exists($this->cache_folder . '/' . $hash . '.png')){ + $image = file_get_contents($this->cache_folder . '/' . $hash . '.png'); + $text = file_get_contents($this->cache_folder . '/' . $hash . '.txt'); + if($this->return_as_html !== true){ + return $image; + } + else { + if ($this->embed_image) { + return ''.$text.''; + } + else { + return ''.$text.''; + } + } + } + else { + return false; + } + } + else { + return false; + } + } + + public function generate($text, $font, $size, $color, $display_alt = 1, $trans = 0, $shadow = false, $shadow_off = false) + { + + $cache = $this->cache($text, $font, $size, $color, $trans, $shadow, $shadow_off); + if($cache !== false){ return $cache; } + if ($display_alt == 1){ + $text = ( !empty($text) ? trim(urldecode($text)) : "Заполните все поля!" ); + $textWeb = str_replace(array("\n", "\r\n", "\r"), " ", $text); + } + else { + $text = ( !empty($text) ? trim(urldecode($text)) : "Нет сопоставлений" ); + $textWeb = str_replace(array("\n", "\r\n", "\r"), " ", ''); + } + if(file_exists($font)){ $font = $font; } + elseif(file_exists($font.'.ttf')){ $font = $font.'.ttf'; } + elseif(file_exists($font.'.otf')){ $font = $font.'.otf'; } + elseif(file_exists(BASE_DIR . '/fields/text_to_image/fonts/'.$font.'')){ $font = BASE_DIR . '/fields/text_to_image/fonts/'.$font.''; } + elseif(file_exists(BASE_DIR . '/fields/text_to_image/fonts/'.$font.'.ttf')){ $font = BASE_DIR . '/fields/text_to_image/fonts/'.$font.'.ttf'; } + elseif(file_exists(BASE_DIR . '/fields/text_to_image/fonts/'.$font.'.otf')){ $font = BASE_DIR . '/fields/text_to_image/fonts/'.$font.'.otf'; } + else { + $error_image = "iVBORw0KGgoAAAANSUhEUgAAAI0AAAANCAYAAACU7u19AAAEB0lEQVRYhe2YT2jcRR"; + $error_image.= "THP7MsEkppaYzFxjStpIdQBVu81NsDe+il4MFrVUSlerClYlOqJRSpMZUGVFqLPVQt"; + $error_image.= "VA+CB5uDCuEdaj14EFEqGMH4b6mkVSyhlBIyHn5v4+z4m9ndbMCU5AvLb2fem/e+78"; + $error_image.= "3Mm9/8YAXLHl7kWDv6FS9yolMjK7jtUWlV0YuMVxIDWjaygmWHSjUn9SJdwBHgL+BO"; + $error_image.= "4KhTvRnI33Cq+8raXuQs8C3wgFN93Is8BvQA9wDjTnXCi5wzHYD7TO8OYNh8rjOft7"; + $error_image.= "zIQYrFPAu861SvepFRpzqU4b8XWA1sAD52qhczPL62YT841QvGf9L8rbM8nIjjBb4v"; + $error_image.= "8THPy4tsBd5yqg97kUeBfmA38AlQc6ofNovD7Iw61SEvcsypvlR/Brlu4OpUZzM8qs"; + $error_image.= "ArlmOAbV7kEDAXxPpIGVeA7KIBngNOOtWaF+mz9lggn/QiW5zqj15kPfBHILviVMe8"; + $error_image.= "yAiAU30/SvaE6Ry3vhETPwOccapTXmQz8JQXuQ5cdKqXIn7ZiuhUTwc+R8xGisdYNH"; + $error_image.= "zGqb5qeluN13/iLfMR8XoBuGx8PjK9DZG/Vip7JfFMcT2V4mHyc071so0ZcKqvheOd"; + $error_image.= "6qkEVypArxc5GP6APpNvdKo1C/g3it0Z4gKwy/7vAj4zR9UmibiRkW1yqlPmcwrYCG"; + $error_image.= "wvWTBE3J9MGfQiPcB0mzzmK6oldxOJeFM+vMhO4AtgJuOn5Tja5JrjMVBfMIY/c+Nj"; + $error_image.= "VCnKzvHISX3X3+1Fng9E10I9qwb3WvPBYBdv499jBy+yGthLUf5mgd4cqRLMJfprQa"; + $error_image.= "W634scCHeFF1lDUWq7gac75DFXFm/sIxqzx47cEfLIxrEAxPmKeaTymRrfgGbHU82p"; + $error_image.= "vtlEZ8aLrIr6dgNvB+1hYNSpXoWGRdkqmpZvp/qdF9kT9V0HXvQi/RQleaADHnUODf"; + $error_image.= "GW+Dhttp8A3mvDfjKOBWA+Xwvkkcv3XLPJmPQig010PgeGgK+Cvn6neiVod9UnylCN"; + $error_image.= "niF+tXcZbCJ+B77xIjtyJGwiZ8tkTvUXipKb4lGGrsD2IPCzNcviDX0ArAIecqoTOc"; + $error_image.= "5lyMWxAK4pHj9F89qdGF+GfVXKS1G97x3gZS9SPzPP27tNiEvAB8B2c7ofWO9FDpi8"; + $error_image.= "Dzhpu3qaYqK22LegLxM+j3qRaYob27Ddng55EaFI6Hl71+oNblVrgflvTnYL22927w"; + $error_image.= "LGgVsRj57Id4g1XuQwjbenhngTPgAGgWdLYku1k3GU6OyI3jtzXFM86jn+29qbg9vT"; + $error_image.= "WoqTIcX1CIsBL3Im+P/6ohj9n5GLI4x3KaDTnLf7utDxRzwv0g3Ugq6zndpcyiiJd9"; + $error_image.= "lhMb787gQ+rTeiq9ztjNQNoiHeJYJmt6FFHf8PmykzDVQO9iwAAAAASUVORK5CYII="; + + if($this->return_as_html !== true){ + return base64_decode($error_image); + } + else { + return 'Ошибка при загрузке шрифта!'; + } + } + + $sizes = $this->getfontbox($size, 0, $font, $text); + $colors = $this->color($color); + + if ($shadow !== false) { + if (is_numeric($shadow) && $shadow <= 4) { + if ($shadow_off != false) { + $i_base = $shadow_off; + } + $im = imagecreatetruecolor($sizes['width']+$shadow+$i_base+1, $sizes['height']+$shadow+$i_base+1); + } + else { + $im = imagecreatetruecolor($sizes['width'], $sizes['height']); + } + } + else { + $im = imagecreatetruecolor($sizes['width'], $sizes['height']); + } + imagesavealpha($im, true); + + if (is_numeric($trans) && $trans <= 127 && $trans >= 0) { + + } + + + $color = imagecolorallocatealpha($im, $colors[0], $colors[1], $colors[2], $trans); + + $trans_color = imagecolorallocatealpha($im, 0, 0, 0, 127); + imagefill($im, 0, 0, $trans_color); + + if ($shadow !== false && $shadow <= 4) { + if ($shadow_off != false) { + $i_base = $shadow_off; + } + else { + $i_base = 0; + } + for ($i=$i_base,$o=64; $i < $shadow+$i_base; $i++,$o+=16) { + $shadow_color = imagecolorallocatealpha($im, 100, 100, 100, $o); + imagettftext($im, $size, 0, $sizes['left']+$i+1, $sizes['top']+$i+1, $shadow_color, $font, $text); + } + } + + imagettftext($im, $size, 0, $sizes['left'], $sizes['top'], $color, $font, $text); + + ob_start(); + imagepng($im); + $image = ob_get_clean(); + imagedestroy($im); + + if($this->do_cache){ + $hash = md5($text . $font . $size . $color . $shadow); + file_put_contents($this->cache_folder . '/' . $hash . '.png', $image); + file_put_contents($this->cache_folder . '/' . $hash . '.txt', $textWeb); + } + + if($this->return_as_html !== true){ + return $image; + } + else { + if ($this->embed_image == true) { + return ''.$textWeb.''; + } + else { + if ($this->do_cache == false) { + return ''.$textWeb.''; + } + else { + return ''.$textWeb.''; + } + } + } + } + + private function getfontbox($font_size, $font_angle, $font_file, $text) + { + $box = imagettfbbox($font_size, $font_angle, $font_file, $text); + if( !$box ) return false; + $min_x = min( array($box[0], $box[2], $box[4], $box[6]) ); + $max_x = max( array($box[0], $box[2], $box[4], $box[6]) ); + $min_y = min( array($box[1], $box[3], $box[5], $box[7]) ); + $max_y = max( array($box[1], $box[3], $box[5], $box[7]) ); + $width = ( $max_x - $min_x ); + $height = ( $max_y - $min_y ); + $left = abs( $min_x ) + $width; + $top = abs( $min_y ) + $height; + $img = @imagecreatetruecolor( $width << 2, $height << 2 ); + $white = imagecolorallocate( $img, 255, 255, 255 ); + $black = imagecolorallocate( $img, 0, 0, 0 ); + imagefilledrectangle($img, 0, 0, imagesx($img), imagesy($img), $black); + imagettftext( $img, $font_size, + $font_angle, $left, $top, + $white, $font_file, $text); + $rleft = $w4 = $width<<2; + $rright = 0; + $rbottom = 0; + $rtop = $h4 = $height<<2; + for( $x = 0; $x < $w4; $x++ ) + for( $y = 0; $y < $h4; $y++ ) + if( imagecolorat( $img, $x, $y ) ){ + $rleft = min( $rleft, $x ); + $rright = max( $rright, $x ); + $rtop = min( $rtop, $y ); + $rbottom = max( $rbottom, $y ); + } + imagedestroy( $img ); + return array( "left" => $left - $rleft, + "top" => $top - $rtop, + "width" => $rright - $rleft + 1, + "height" => $rbottom - $rtop + 1 ); + } + + private function color($color) + { + if($color[0].$color[1].$color[2] == "rgb"){ + preg_match("/^rgb\((\d*),\s(\d*),\s(\d*)\)$/", $color, $colors); + return array($colors[1], $colors[2], $colors[3]); + } + else { + if ($color[0] == '#') + $color = substr($color, 1); + + if (strlen($color) == 6) + list($r, $g, $b) = array($color[0].$color[1], + $color[2].$color[3], + $color[4].$color[5]); + elseif (strlen($color) == 3) + list($r, $g, $b) = array($color[0].$color[0], $color[1].$color[1], $color[2].$color[2]); + else + return false; + + $r = hexdec($r); $g = hexdec($g); $b = hexdec($b); + + return array($r, $g, $b); + } + } + +} +?> \ No newline at end of file diff --git a/fields/text_to_image/css/field.css b/fields/text_to_image/css/field.css new file mode 100644 index 0000000..d38a6dd --- /dev/null +++ b/fields/text_to_image/css/field.css @@ -0,0 +1,18 @@ +.get_field_text_to_image { + position: relative; +} + +.get_field_text_to_image > .ui-state-highlight { + display: inline-block; + margin: 3px; + width: 450px; + height: 26px; + background-color: rgba(255,255,255,0.5); !important; + border: solid 1px #eaeaea; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + position: relative; + text-align: center; + padding: 0 !important; +} \ No newline at end of file diff --git a/fields/text_to_image/field.php b/fields/text_to_image/field.php new file mode 100644 index 0000000..a7d28eb --- /dev/null +++ b/fields/text_to_image/field.php @@ -0,0 +1,125 @@ +config_load($lang_file, 'lang'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + $AVE_Template->config_load($lang_file, 'admin'); + + switch ($action) + { + // Отображение поля в административной части + case 'edit': + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + return $AVE_Template->fetch($tpl_file); + break; + + // Отображение поля в документах + case 'doc': + + $AVE_Template->config_load($lang_file, 'public'); + + if ($tpl_empty) + { + $field_value = clean_php($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file){ + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + return $field_value; + break; + + // Отображение поля в запросах + case 'req': + + $AVE_Template->config_load($lang_file, 'public'); + + if ($tpl_empty) + { + $field_value = clean_php($field_value); + } + else + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file){ + $AVE_Template->assign('field_value', $field_value); + return $AVE_Template->fetch($tpl_file); + } + return $field_value; + break; + + // Сохранение поля в административной части + case 'save': + return $field_value; + // Тип | Имя поля в административной части + case 'name': + return $AVE_Template->get_config_vars('name'); + + default: return $field_value; + } +} + +?> \ No newline at end of file diff --git a/fields/text_to_image/fonts/CoreSansNR27.ttf b/fields/text_to_image/fonts/CoreSansNR27.ttf new file mode 100644 index 0000000000000000000000000000000000000000..72e0f8e4570a2e2b3a4c65a5c4c4eca0147f0c95 GIT binary patch literal 75720 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 literal 0 HcmV?d00001 diff --git a/fields/text_to_image/fonts/CoreSansNR47.ttf b/fields/text_to_image/fonts/CoreSansNR47.ttf new file mode 100644 index 0000000000000000000000000000000000000000..26b730901f155afce5aff3b2e5e1617d0c435236 GIT binary patch literal 75856 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 Urg!R>3!<)a#%Bh9wSckz1bPFj2mk;8 literal 0 HcmV?d00001 diff --git a/fields/text_to_image/fonts/Cuprum-Bold.ttf b/fields/text_to_image/fonts/Cuprum-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..df9a37213517dea74c82f7b427dfa10a696ed3ca GIT binary patch literal 100172 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 literal 0 HcmV?d00001 diff --git a/fields/text_to_image/fonts/Cuprum-Italic.ttf b/fields/text_to_image/fonts/Cuprum-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..619065fb6b7630de12b00b359a75a3de134542d5 GIT binary patch literal 96400 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 jq94&}$7#6fN$;uS?e1_tmi7G%nv literal 0 HcmV?d00001 diff --git a/fields/text_to_image/fonts/Cuprum-Regular.ttf b/fields/text_to_image/fonts/Cuprum-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7434c525b6ba921240328c4c856d8d7d229ffb5f GIT binary patch literal 100608 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 vs[a] ? + (-vp[a]+tp[a]+ts[a]/2 > vs[a]/2 && tp[a]+ts[a]-ps[a] >= 0 ? tp[a]+ts[a]-ps[a] : tp[a]) : + tp[a], + -vp[b]+tp[b]+ts[b]+ps[b]-l+l*c > vs[b] ? + (-vp[b]+tp[b]+ts[b]/2 > vs[b]/2 && tp[b]+ts[b]-l-l*c >= 0 ? tp[b]+ts[b]-l-l*c : tp[b]+ts[b]-l+l*c) : + (tp[b]+ts[b]-l+l*c >= 0 ? tp[b]+ts[b]-l+l*c : tp[b]+ts[b]-l-l*c) + ]; + } + + var x = pp[a]; + var y = pp[b]; + var positionValue = thisObj.fixed ? 'fixed' : 'absolute'; + var contractShadow = + (pp[0] + ps[0] > tp[0] || pp[0] < tp[0] + ts[0]) && + (pp[1] + ps[1] < tp[1] + ts[1]); + + jsc._drawPosition(thisObj, x, y, positionValue, contractShadow); + } + }, + + + _drawPosition : function (thisObj, x, y, positionValue, contractShadow) { + var vShadow = contractShadow ? 0 : thisObj.shadowBlur; // px + + jsc.picker.wrap.style.position = positionValue; + jsc.picker.wrap.style.left = x + 'px'; + jsc.picker.wrap.style.top = y + 'px'; + + jsc.setBoxShadow( + jsc.picker.boxS, + thisObj.shadow ? + new jsc.BoxShadow(0, vShadow, thisObj.shadowBlur, 0, thisObj.shadowColor) : + null); + }, + + + getPickerDims : function (thisObj) { + var displaySlider = !!jsc.getSliderComponent(thisObj); + var dims = [ + 2 * thisObj.insetWidth + 2 * thisObj.padding + thisObj.width + + (displaySlider ? 2 * thisObj.insetWidth + jsc.getPadToSliderPadding(thisObj) + thisObj.sliderSize : 0), + 2 * thisObj.insetWidth + 2 * thisObj.padding + thisObj.height + + (thisObj.closable ? 2 * thisObj.insetWidth + thisObj.padding + thisObj.buttonHeight : 0) + ]; + return dims; + }, + + + getPickerOuterDims : function (thisObj) { + var dims = jsc.getPickerDims(thisObj); + return [ + dims[0] + 2 * thisObj.borderWidth, + dims[1] + 2 * thisObj.borderWidth + ]; + }, + + + getPadToSliderPadding : function (thisObj) { + return Math.max(thisObj.padding, 1.5 * (2 * thisObj.pointerBorderWidth + thisObj.pointerThickness)); + }, + + + getPadYComponent : function (thisObj) { + switch (thisObj.mode.charAt(1).toLowerCase()) { + case 'v': return 'v'; break; + } + return 's'; + }, + + + getSliderComponent : function (thisObj) { + if (thisObj.mode.length > 2) { + switch (thisObj.mode.charAt(2).toLowerCase()) { + case 's': return 's'; break; + case 'v': return 'v'; break; + } + } + return null; + }, + + + onDocumentMouseDown : function (e) { + if (!e) { e = window.event; } + var target = e.target || e.srcElement; + + if (target._jscLinkedInstance) { + if (target._jscLinkedInstance.showOnClick) { + target._jscLinkedInstance.show(); + } + } else if (target._jscControlName) { + jsc.onControlPointerStart(e, target, target._jscControlName, 'mouse'); + } else { + // Mouse is outside the picker controls -> hide the color picker! + if (jsc.picker && jsc.picker.owner) { + jsc.picker.owner.hide(); + } + } + }, + + + onDocumentTouchStart : function (e) { + if (!e) { e = window.event; } + var target = e.target || e.srcElement; + + if (target._jscLinkedInstance) { + if (target._jscLinkedInstance.showOnClick) { + target._jscLinkedInstance.show(); + } + } else if (target._jscControlName) { + jsc.onControlPointerStart(e, target, target._jscControlName, 'touch'); + } else { + if (jsc.picker && jsc.picker.owner) { + jsc.picker.owner.hide(); + } + } + }, + + + onWindowResize : function (e) { + jsc.redrawPosition(); + }, + + + onParentScroll : function (e) { + // hide the picker when one of the parent elements is scrolled + if (jsc.picker && jsc.picker.owner) { + jsc.picker.owner.hide(); + } + }, + + + _pointerMoveEvent : { + mouse: 'mousemove', + touch: 'touchmove' + }, + _pointerEndEvent : { + mouse: 'mouseup', + touch: 'touchend' + }, + + + _pointerOrigin : null, + _capturedTarget : null, + + + onControlPointerStart : function (e, target, controlName, pointerType) { + var thisObj = target._jscInstance; + + jsc.preventDefault(e); + jsc.captureTarget(target); + + var registerDragEvents = function (doc, offset) { + jsc.attachGroupEvent('drag', doc, jsc._pointerMoveEvent[pointerType], + jsc.onDocumentPointerMove(e, target, controlName, pointerType, offset)); + jsc.attachGroupEvent('drag', doc, jsc._pointerEndEvent[pointerType], + jsc.onDocumentPointerEnd(e, target, controlName, pointerType)); + }; + + registerDragEvents(document, [0, 0]); + + if (window.parent && window.frameElement) { + var rect = window.frameElement.getBoundingClientRect(); + var ofs = [-rect.left, -rect.top]; + registerDragEvents(window.parent.window.document, ofs); + } + + var abs = jsc.getAbsPointerPos(e); + var rel = jsc.getRelPointerPos(e); + jsc._pointerOrigin = { + x: abs.x - rel.x, + y: abs.y - rel.y + }; + + switch (controlName) { + case 'pad': + // if the slider is at the bottom, move it up + switch (jsc.getSliderComponent(thisObj)) { + case 's': if (thisObj.hsv[1] === 0) { thisObj.fromHSV(null, 100, null); }; break; + case 'v': if (thisObj.hsv[2] === 0) { thisObj.fromHSV(null, null, 100); }; break; + } + jsc.setPad(thisObj, e, 0, 0); + break; + + case 'sld': + jsc.setSld(thisObj, e, 0); + break; + } + + jsc.dispatchFineChange(thisObj); + }, + + + onDocumentPointerMove : function (e, target, controlName, pointerType, offset) { + return function (e) { + var thisObj = target._jscInstance; + switch (controlName) { + case 'pad': + if (!e) { e = window.event; } + jsc.setPad(thisObj, e, offset[0], offset[1]); + jsc.dispatchFineChange(thisObj); + break; + + case 'sld': + if (!e) { e = window.event; } + jsc.setSld(thisObj, e, offset[1]); + jsc.dispatchFineChange(thisObj); + break; + } + } + }, + + + onDocumentPointerEnd : function (e, target, controlName, pointerType) { + return function (e) { + var thisObj = target._jscInstance; + jsc.detachGroupEvents('drag'); + jsc.releaseTarget(); + // Always dispatch changes after detaching outstanding mouse handlers, + // in case some user interaction will occur in user's onchange callback + // that would intrude with current mouse events + jsc.dispatchChange(thisObj); + }; + }, + + + dispatchChange : function (thisObj) { + if (thisObj.valueElement) { + if (jsc.isElementType(thisObj.valueElement, 'input')) { + jsc.fireEvent(thisObj.valueElement, 'change'); + } + } + }, + + + dispatchFineChange : function (thisObj) { + if (thisObj.onFineChange) { + var callback; + if (typeof thisObj.onFineChange === 'string') { + callback = new Function (thisObj.onFineChange); + } else { + callback = thisObj.onFineChange; + } + callback.call(thisObj); + } + }, + + + setPad : function (thisObj, e, ofsX, ofsY) { + var pointerAbs = jsc.getAbsPointerPos(e); + var x = ofsX + pointerAbs.x - jsc._pointerOrigin.x - thisObj.padding - thisObj.insetWidth; + var y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.insetWidth; + + var xVal = x * (360 / (thisObj.width - 1)); + var yVal = 100 - (y * (100 / (thisObj.height - 1))); + + switch (jsc.getPadYComponent(thisObj)) { + case 's': thisObj.fromHSV(xVal, yVal, null, jsc.leaveSld); break; + case 'v': thisObj.fromHSV(xVal, null, yVal, jsc.leaveSld); break; + } + }, + + + setSld : function (thisObj, e, ofsY) { + var pointerAbs = jsc.getAbsPointerPos(e); + var y = ofsY + pointerAbs.y - jsc._pointerOrigin.y - thisObj.padding - thisObj.insetWidth; + + var yVal = 100 - (y * (100 / (thisObj.height - 1))); + + switch (jsc.getSliderComponent(thisObj)) { + case 's': thisObj.fromHSV(null, yVal, null, jsc.leavePad); break; + case 'v': thisObj.fromHSV(null, null, yVal, jsc.leavePad); break; + } + }, + + + _vmlNS : 'jsc_vml_', + _vmlCSS : 'jsc_vml_css_', + _vmlReady : false, + + + initVML : function () { + if (!jsc._vmlReady) { + // init VML namespace + var doc = document; + if (!doc.namespaces[jsc._vmlNS]) { + doc.namespaces.add(jsc._vmlNS, 'urn:schemas-microsoft-com:vml'); + } + if (!doc.styleSheets[jsc._vmlCSS]) { + var tags = ['shape', 'shapetype', 'group', 'background', 'path', 'formulas', 'handles', 'fill', 'stroke', 'shadow', 'textbox', 'textpath', 'imagedata', 'line', 'polyline', 'curve', 'rect', 'roundrect', 'oval', 'arc', 'image']; + var ss = doc.createStyleSheet(); + ss.owningElement.id = jsc._vmlCSS; + for (var i = 0; i < tags.length; i += 1) { + ss.addRule(jsc._vmlNS + '\\:' + tags[i], 'behavior:url(#default#VML);'); + } + } + jsc._vmlReady = true; + } + }, + + + createPalette : function () { + + var paletteObj = { + elm: null, + draw: null + }; + + if (jsc.isCanvasSupported) { + // Canvas implementation for modern browsers + + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + var drawFunc = function (width, height, type) { + canvas.width = width; + canvas.height = height; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + var hGrad = ctx.createLinearGradient(0, 0, canvas.width, 0); + hGrad.addColorStop(0 / 6, '#F00'); + hGrad.addColorStop(1 / 6, '#FF0'); + hGrad.addColorStop(2 / 6, '#0F0'); + hGrad.addColorStop(3 / 6, '#0FF'); + hGrad.addColorStop(4 / 6, '#00F'); + hGrad.addColorStop(5 / 6, '#F0F'); + hGrad.addColorStop(6 / 6, '#F00'); + + ctx.fillStyle = hGrad; + ctx.fillRect(0, 0, canvas.width, canvas.height); + + var vGrad = ctx.createLinearGradient(0, 0, 0, canvas.height); + switch (type.toLowerCase()) { + case 's': + vGrad.addColorStop(0, 'rgba(255,255,255,0)'); + vGrad.addColorStop(1, 'rgba(255,255,255,1)'); + break; + case 'v': + vGrad.addColorStop(0, 'rgba(0,0,0,0)'); + vGrad.addColorStop(1, 'rgba(0,0,0,1)'); + break; + } + ctx.fillStyle = vGrad; + ctx.fillRect(0, 0, canvas.width, canvas.height); + }; + + paletteObj.elm = canvas; + paletteObj.draw = drawFunc; + + } else { + // VML fallback for IE 7 and 8 + + jsc.initVML(); + + var vmlContainer = document.createElement('div'); + vmlContainer.style.position = 'relative'; + vmlContainer.style.overflow = 'hidden'; + + var hGrad = document.createElement(jsc._vmlNS + ':fill'); + hGrad.type = 'gradient'; + hGrad.method = 'linear'; + hGrad.angle = '90'; + hGrad.colors = '16.67% #F0F, 33.33% #00F, 50% #0FF, 66.67% #0F0, 83.33% #FF0' + + var hRect = document.createElement(jsc._vmlNS + ':rect'); + hRect.style.position = 'absolute'; + hRect.style.left = -1 + 'px'; + hRect.style.top = -1 + 'px'; + hRect.stroked = false; + hRect.appendChild(hGrad); + vmlContainer.appendChild(hRect); + + var vGrad = document.createElement(jsc._vmlNS + ':fill'); + vGrad.type = 'gradient'; + vGrad.method = 'linear'; + vGrad.angle = '180'; + vGrad.opacity = '0'; + + var vRect = document.createElement(jsc._vmlNS + ':rect'); + vRect.style.position = 'absolute'; + vRect.style.left = -1 + 'px'; + vRect.style.top = -1 + 'px'; + vRect.stroked = false; + vRect.appendChild(vGrad); + vmlContainer.appendChild(vRect); + + var drawFunc = function (width, height, type) { + vmlContainer.style.width = width + 'px'; + vmlContainer.style.height = height + 'px'; + + hRect.style.width = + vRect.style.width = + (width + 1) + 'px'; + hRect.style.height = + vRect.style.height = + (height + 1) + 'px'; + + // Colors must be specified during every redraw, otherwise IE won't display + // a full gradient during a subsequential redraw + hGrad.color = '#F00'; + hGrad.color2 = '#F00'; + + switch (type.toLowerCase()) { + case 's': + vGrad.color = vGrad.color2 = '#FFF'; + break; + case 'v': + vGrad.color = vGrad.color2 = '#000'; + break; + } + }; + + paletteObj.elm = vmlContainer; + paletteObj.draw = drawFunc; + } + + return paletteObj; + }, + + + createSliderGradient : function () { + + var sliderObj = { + elm: null, + draw: null + }; + + if (jsc.isCanvasSupported) { + // Canvas implementation for modern browsers + + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + + var drawFunc = function (width, height, color1, color2) { + canvas.width = width; + canvas.height = height; + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + var grad = ctx.createLinearGradient(0, 0, 0, canvas.height); + grad.addColorStop(0, color1); + grad.addColorStop(1, color2); + + ctx.fillStyle = grad; + ctx.fillRect(0, 0, canvas.width, canvas.height); + }; + + sliderObj.elm = canvas; + sliderObj.draw = drawFunc; + + } else { + // VML fallback for IE 7 and 8 + + jsc.initVML(); + + var vmlContainer = document.createElement('div'); + vmlContainer.style.position = 'relative'; + vmlContainer.style.overflow = 'hidden'; + + var grad = document.createElement(jsc._vmlNS + ':fill'); + grad.type = 'gradient'; + grad.method = 'linear'; + grad.angle = '180'; + + var rect = document.createElement(jsc._vmlNS + ':rect'); + rect.style.position = 'absolute'; + rect.style.left = -1 + 'px'; + rect.style.top = -1 + 'px'; + rect.stroked = false; + rect.appendChild(grad); + vmlContainer.appendChild(rect); + + var drawFunc = function (width, height, color1, color2) { + vmlContainer.style.width = width + 'px'; + vmlContainer.style.height = height + 'px'; + + rect.style.width = (width + 1) + 'px'; + rect.style.height = (height + 1) + 'px'; + + grad.color = color1; + grad.color2 = color2; + }; + + sliderObj.elm = vmlContainer; + sliderObj.draw = drawFunc; + } + + return sliderObj; + }, + + + leaveValue : 1<<0, + leaveStyle : 1<<1, + leavePad : 1<<2, + leaveSld : 1<<3, + + + BoxShadow : (function () { + var BoxShadow = function (hShadow, vShadow, blur, spread, color, inset) { + this.hShadow = hShadow; + this.vShadow = vShadow; + this.blur = blur; + this.spread = spread; + this.color = color; + this.inset = !!inset; + }; + + BoxShadow.prototype.toString = function () { + var vals = [ + Math.round(this.hShadow) + 'px', + Math.round(this.vShadow) + 'px', + Math.round(this.blur) + 'px', + Math.round(this.spread) + 'px', + this.color + ]; + if (this.inset) { + vals.push('inset'); + } + return vals.join(' '); + }; + + return BoxShadow; + })(), + + + // + // Usage: + // var myColor = new jscolor( [, ]) + // + + jscolor : function (targetElement, options) { + + // General options + // + this.value = null; // initial HEX color. To change it later, use methods fromString(), fromHSV() and fromRGB() + this.valueElement = targetElement; // element that will be used to display and input the color code + this.styleElement = targetElement; // element that will preview the picked color using CSS backgroundColor + this.required = true; // whether the associated text can be left empty + this.refine = true; // whether to refine the entered color code (e.g. uppercase it and remove whitespace) + this.hash = false; // whether to prefix the HEX color code with # symbol + this.uppercase = true; // whether to uppercase the color code + this.onFineChange = null; // called instantly every time the color changes (value can be either a function or a string with javascript code) + this.activeClass = 'jscolor-active'; // class to be set to the target element when a picker window is open on it + this.minS = 0; // min allowed saturation (0 - 100) + this.maxS = 100; // max allowed saturation (0 - 100) + this.minV = 0; // min allowed value (brightness) (0 - 100) + this.maxV = 100; // max allowed value (brightness) (0 - 100) + + // Accessing the picked color + // + this.hsv = [0, 0, 100]; // read-only [0-360, 0-100, 0-100] + this.rgb = [255, 255, 255]; // read-only [0-255, 0-255, 0-255] + + // Color Picker options + // + this.width = 181; // width of color palette (in px) + this.height = 101; // height of color palette (in px) + this.showOnClick = true; // whether to display the color picker when user clicks on its target element + this.mode = 'HSV'; // HSV | HVS | HS | HV - layout of the color picker controls + this.position = 'bottom'; // left | right | top | bottom - position relative to the target element + this.smartPosition = true; // automatically change picker position when there is not enough space for it + this.sliderSize = 16; // px + this.crossSize = 8; // px + this.closable = false; // whether to display the Close button + this.closeText = 'Close'; + this.buttonColor = '#000000'; // CSS color + this.buttonHeight = 18; // px + this.padding = 12; // px + this.backgroundColor = '#FFFFFF'; // CSS color + this.borderWidth = 1; // px + this.borderColor = '#BBBBBB'; // CSS color + this.borderRadius = 8; // px + this.insetWidth = 1; // px + this.insetColor = '#BBBBBB'; // CSS color + this.shadow = true; // whether to display shadow + this.shadowBlur = 15; // px + this.shadowColor = 'rgba(0,0,0,0.2)'; // CSS color + this.pointerColor = '#4C4C4C'; // px + this.pointerBorderColor = '#FFFFFF'; // px + this.pointerBorderWidth = 1; // px + this.pointerThickness = 2; // px + this.zIndex = 1000; + this.container = null; // where to append the color picker (BODY element by default) + + + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this[opt] = options[opt]; + } + } + + + this.hide = function () { + if (isPickerOwner()) { + detachPicker(); + } + }; + + + this.show = function () { + drawPicker(); + }; + + + this.redraw = function () { + if (isPickerOwner()) { + drawPicker(); + } + }; + + + this.importColor = function () { + if (!this.valueElement) { + this.exportColor(); + } else { + if (jsc.isElementType(this.valueElement, 'input')) { + if (!this.refine) { + if (!this.fromString(this.valueElement.value, jsc.leaveValue)) { + if (this.styleElement) { + this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage; + this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor; + this.styleElement.style.color = this.styleElement._jscOrigStyle.color; + } + this.exportColor(jsc.leaveValue | jsc.leaveStyle); + } + } else if (!this.required && /^\s*$/.test(this.valueElement.value)) { + this.valueElement.value = ''; + if (this.styleElement) { + this.styleElement.style.backgroundImage = this.styleElement._jscOrigStyle.backgroundImage; + this.styleElement.style.backgroundColor = this.styleElement._jscOrigStyle.backgroundColor; + this.styleElement.style.color = this.styleElement._jscOrigStyle.color; + } + this.exportColor(jsc.leaveValue | jsc.leaveStyle); + + } else if (this.fromString(this.valueElement.value)) { + // managed to import color successfully from the value -> OK, don't do anything + } else { + this.exportColor(); + } + } else { + // not an input element -> doesn't have any value + this.exportColor(); + } + } + }; + + + this.exportColor = function (flags) { + if (!(flags & jsc.leaveValue) && this.valueElement) { + var value = this.toString(); + if (this.uppercase) { value = value.toUpperCase(); } + if (this.hash) { value = '#' + value; } + + if (jsc.isElementType(this.valueElement, 'input')) { + this.valueElement.value = value; + } else { + this.valueElement.innerHTML = value; + } + } + if (!(flags & jsc.leaveStyle)) { + if (this.styleElement) { + this.styleElement.style.backgroundImage = 'none'; + this.styleElement.style.backgroundColor = '#' + this.toString(); + this.styleElement.style.color = this.isLight() ? '#000' : '#FFF'; + } + } + if (!(flags & jsc.leavePad) && isPickerOwner()) { + redrawPad(); + } + if (!(flags & jsc.leaveSld) && isPickerOwner()) { + redrawSld(); + } + }; + + + // h: 0-360 + // s: 0-100 + // v: 0-100 + // + this.fromHSV = function (h, s, v, flags) { // null = don't change + if (h !== null) { + if (isNaN(h)) { return false; } + h = Math.max(0, Math.min(360, h)); + } + if (s !== null) { + if (isNaN(s)) { return false; } + s = Math.max(0, Math.min(100, this.maxS, s), this.minS); + } + if (v !== null) { + if (isNaN(v)) { return false; } + v = Math.max(0, Math.min(100, this.maxV, v), this.minV); + } + + this.rgb = HSV_RGB( + h===null ? this.hsv[0] : (this.hsv[0]=h), + s===null ? this.hsv[1] : (this.hsv[1]=s), + v===null ? this.hsv[2] : (this.hsv[2]=v) + ); + + this.exportColor(flags); + }; + + + // r: 0-255 + // g: 0-255 + // b: 0-255 + // + this.fromRGB = function (r, g, b, flags) { // null = don't change + if (r !== null) { + if (isNaN(r)) { return false; } + r = Math.max(0, Math.min(255, r)); + } + if (g !== null) { + if (isNaN(g)) { return false; } + g = Math.max(0, Math.min(255, g)); + } + if (b !== null) { + if (isNaN(b)) { return false; } + b = Math.max(0, Math.min(255, b)); + } + + var hsv = RGB_HSV( + r===null ? this.rgb[0] : r, + g===null ? this.rgb[1] : g, + b===null ? this.rgb[2] : b + ); + if (hsv[0] !== null) { + this.hsv[0] = Math.max(0, Math.min(360, hsv[0])); + } + if (hsv[2] !== 0) { + this.hsv[1] = hsv[1]===null ? null : Math.max(0, this.minS, Math.min(100, this.maxS, hsv[1])); + } + this.hsv[2] = hsv[2]===null ? null : Math.max(0, this.minV, Math.min(100, this.maxV, hsv[2])); + + // update RGB according to final HSV, as some values might be trimmed + var rgb = HSV_RGB(this.hsv[0], this.hsv[1], this.hsv[2]); + this.rgb[0] = rgb[0]; + this.rgb[1] = rgb[1]; + this.rgb[2] = rgb[2]; + + this.exportColor(flags); + }; + + + this.fromString = function (str, flags) { + var m; + if (m = str.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i)) { + // HEX notation + // + + if (m[1].length === 6) { + // 6-char notation + this.fromRGB( + parseInt(m[1].substr(0,2),16), + parseInt(m[1].substr(2,2),16), + parseInt(m[1].substr(4,2),16), + flags + ); + } else { + // 3-char notation + this.fromRGB( + parseInt(m[1].charAt(0) + m[1].charAt(0),16), + parseInt(m[1].charAt(1) + m[1].charAt(1),16), + parseInt(m[1].charAt(2) + m[1].charAt(2),16), + flags + ); + } + return true; + + } else if (m = str.match(/^\W*rgba?\(([^)]*)\)\W*$/i)) { + var params = m[1].split(','); + var re = /^\s*(\d*)(\.\d+)?\s*$/; + var mR, mG, mB; + if ( + params.length >= 3 && + (mR = params[0].match(re)) && + (mG = params[1].match(re)) && + (mB = params[2].match(re)) + ) { + var r = parseFloat((mR[1] || '0') + (mR[2] || '')); + var g = parseFloat((mG[1] || '0') + (mG[2] || '')); + var b = parseFloat((mB[1] || '0') + (mB[2] || '')); + this.fromRGB(r, g, b, flags); + return true; + } + } + return false; + }; + + + this.toString = function () { + return ( + (0x100 | Math.round(this.rgb[0])).toString(16).substr(1) + + (0x100 | Math.round(this.rgb[1])).toString(16).substr(1) + + (0x100 | Math.round(this.rgb[2])).toString(16).substr(1) + ); + }; + + + this.toHEXString = function () { + return '#' + this.toString().toUpperCase(); + }; + + + this.toRGBString = function () { + return ('rgb(' + + Math.round(this.rgb[0]) + ',' + + Math.round(this.rgb[1]) + ',' + + Math.round(this.rgb[2]) + ')' + ); + }; + + + this.isLight = function () { + return ( + 0.213 * this.rgb[0] + + 0.715 * this.rgb[1] + + 0.072 * this.rgb[2] > + 255 / 2 + ); + }; + + + this._processParentElementsInDOM = function () { + if (this._linkedElementsProcessed) { return; } + this._linkedElementsProcessed = true; + + var elm = this.targetElement; + do { + // If the target element or one of its parent nodes has fixed position, + // then use fixed positioning instead + // + // Note: In Firefox, getComputedStyle returns null in a hidden iframe, + // that's why we need to check if the returned style object is non-empty + var currStyle = jsc.getStyle(elm); + if (currStyle && currStyle.position.toLowerCase() === 'fixed') { + this.fixed = true; + } + + if (elm !== this.targetElement) { + // Ensure to attach onParentScroll only once to each parent element + // (multiple targetElements can share the same parent nodes) + // + // Note: It's not just offsetParents that can be scrollable, + // that's why we loop through all parent nodes + if (!elm._jscEventsAttached) { + jsc.attachEvent(elm, 'scroll', jsc.onParentScroll); + elm._jscEventsAttached = true; + } + } + } while ((elm = elm.parentNode) && !jsc.isElementType(elm, 'body')); + }; + + + // r: 0-255 + // g: 0-255 + // b: 0-255 + // + // returns: [ 0-360, 0-100, 0-100 ] + // + function RGB_HSV (r, g, b) { + r /= 255; + g /= 255; + b /= 255; + var n = Math.min(Math.min(r,g),b); + var v = Math.max(Math.max(r,g),b); + var m = v - n; + if (m === 0) { return [ null, 0, 100 * v ]; } + var h = r===n ? 3+(b-g)/m : (g===n ? 5+(r-b)/m : 1+(g-r)/m); + return [ + 60 * (h===6?0:h), + 100 * (m/v), + 100 * v + ]; + } + + + // h: 0-360 + // s: 0-100 + // v: 0-100 + // + // returns: [ 0-255, 0-255, 0-255 ] + // + function HSV_RGB (h, s, v) { + var u = 255 * (v / 100); + + if (h === null) { + return [ u, u, u ]; + } + + h /= 60; + s /= 100; + + var i = Math.floor(h); + var f = i%2 ? h-i : 1-(h-i); + var m = u * (1 - s); + var n = u * (1 - s * f); + switch (i) { + case 6: + case 0: return [u,n,m]; + case 1: return [n,u,m]; + case 2: return [m,u,n]; + case 3: return [m,n,u]; + case 4: return [n,m,u]; + case 5: return [u,m,n]; + } + } + + + function detachPicker () { + jsc.unsetClass(THIS.targetElement, THIS.activeClass); + jsc.picker.wrap.parentNode.removeChild(jsc.picker.wrap); + delete jsc.picker.owner; + } + + + function drawPicker () { + + // At this point, when drawing the picker, we know what the parent elements are + // and we can do all related DOM operations, such as registering events on them + // or checking their positioning + THIS._processParentElementsInDOM(); + + if (!jsc.picker) { + jsc.picker = { + owner: null, + wrap : document.createElement('div'), + box : document.createElement('div'), + boxS : document.createElement('div'), // shadow area + boxB : document.createElement('div'), // border + pad : document.createElement('div'), + padB : document.createElement('div'), // border + padM : document.createElement('div'), // mouse/touch area + padPal : jsc.createPalette(), + cross : document.createElement('div'), + crossBY : document.createElement('div'), // border Y + crossBX : document.createElement('div'), // border X + crossLY : document.createElement('div'), // line Y + crossLX : document.createElement('div'), // line X + sld : document.createElement('div'), + sldB : document.createElement('div'), // border + sldM : document.createElement('div'), // mouse/touch area + sldGrad : jsc.createSliderGradient(), + sldPtrS : document.createElement('div'), // slider pointer spacer + sldPtrIB : document.createElement('div'), // slider pointer inner border + sldPtrMB : document.createElement('div'), // slider pointer middle border + sldPtrOB : document.createElement('div'), // slider pointer outer border + btn : document.createElement('div'), + btnT : document.createElement('span') // text + }; + + jsc.picker.pad.appendChild(jsc.picker.padPal.elm); + jsc.picker.padB.appendChild(jsc.picker.pad); + jsc.picker.cross.appendChild(jsc.picker.crossBY); + jsc.picker.cross.appendChild(jsc.picker.crossBX); + jsc.picker.cross.appendChild(jsc.picker.crossLY); + jsc.picker.cross.appendChild(jsc.picker.crossLX); + jsc.picker.padB.appendChild(jsc.picker.cross); + jsc.picker.box.appendChild(jsc.picker.padB); + jsc.picker.box.appendChild(jsc.picker.padM); + + jsc.picker.sld.appendChild(jsc.picker.sldGrad.elm); + jsc.picker.sldB.appendChild(jsc.picker.sld); + jsc.picker.sldB.appendChild(jsc.picker.sldPtrOB); + jsc.picker.sldPtrOB.appendChild(jsc.picker.sldPtrMB); + jsc.picker.sldPtrMB.appendChild(jsc.picker.sldPtrIB); + jsc.picker.sldPtrIB.appendChild(jsc.picker.sldPtrS); + jsc.picker.box.appendChild(jsc.picker.sldB); + jsc.picker.box.appendChild(jsc.picker.sldM); + + jsc.picker.btn.appendChild(jsc.picker.btnT); + jsc.picker.box.appendChild(jsc.picker.btn); + + jsc.picker.boxB.appendChild(jsc.picker.box); + jsc.picker.wrap.appendChild(jsc.picker.boxS); + jsc.picker.wrap.appendChild(jsc.picker.boxB); + } + + var p = jsc.picker; + + var displaySlider = !!jsc.getSliderComponent(THIS); + var dims = jsc.getPickerDims(THIS); + var crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize); + var padToSliderPadding = jsc.getPadToSliderPadding(THIS); + var borderRadius = Math.min( + THIS.borderRadius, + Math.round(THIS.padding * Math.PI)); // px + var padCursor = 'crosshair'; + + // wrap + p.wrap.style.clear = 'both'; + p.wrap.style.width = (dims[0] + 2 * THIS.borderWidth) + 'px'; + p.wrap.style.height = (dims[1] + 2 * THIS.borderWidth) + 'px'; + p.wrap.style.zIndex = THIS.zIndex; + + // picker + p.box.style.width = dims[0] + 'px'; + p.box.style.height = dims[1] + 'px'; + + p.boxS.style.position = 'absolute'; + p.boxS.style.left = '0'; + p.boxS.style.top = '0'; + p.boxS.style.width = '100%'; + p.boxS.style.height = '100%'; + jsc.setBorderRadius(p.boxS, borderRadius + 'px'); + + // picker border + p.boxB.style.position = 'relative'; + p.boxB.style.border = THIS.borderWidth + 'px solid'; + p.boxB.style.borderColor = THIS.borderColor; + p.boxB.style.background = THIS.backgroundColor; + jsc.setBorderRadius(p.boxB, borderRadius + 'px'); + + // IE hack: + // If the element is transparent, IE will trigger the event on the elements under it, + // e.g. on Canvas or on elements with border + p.padM.style.background = + p.sldM.style.background = + '#FFF'; + jsc.setStyle(p.padM, 'opacity', '0'); + jsc.setStyle(p.sldM, 'opacity', '0'); + + // pad + p.pad.style.position = 'relative'; + p.pad.style.width = THIS.width + 'px'; + p.pad.style.height = THIS.height + 'px'; + + // pad palettes (HSV and HVS) + p.padPal.draw(THIS.width, THIS.height, jsc.getPadYComponent(THIS)); + + // pad border + p.padB.style.position = 'absolute'; + p.padB.style.left = THIS.padding + 'px'; + p.padB.style.top = THIS.padding + 'px'; + p.padB.style.border = THIS.insetWidth + 'px solid'; + p.padB.style.borderColor = THIS.insetColor; + + // pad mouse area + p.padM._jscInstance = THIS; + p.padM._jscControlName = 'pad'; + p.padM.style.position = 'absolute'; + p.padM.style.left = '0'; + p.padM.style.top = '0'; + p.padM.style.width = (THIS.padding + 2 * THIS.insetWidth + THIS.width + padToSliderPadding / 2) + 'px'; + p.padM.style.height = dims[1] + 'px'; + p.padM.style.cursor = padCursor; + + // pad cross + p.cross.style.position = 'absolute'; + p.cross.style.left = + p.cross.style.top = + '0'; + p.cross.style.width = + p.cross.style.height = + crossOuterSize + 'px'; + + // pad cross border Y and X + p.crossBY.style.position = + p.crossBX.style.position = + 'absolute'; + p.crossBY.style.background = + p.crossBX.style.background = + THIS.pointerBorderColor; + p.crossBY.style.width = + p.crossBX.style.height = + (2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px'; + p.crossBY.style.height = + p.crossBX.style.width = + crossOuterSize + 'px'; + p.crossBY.style.left = + p.crossBX.style.top = + (Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2) - THIS.pointerBorderWidth) + 'px'; + p.crossBY.style.top = + p.crossBX.style.left = + '0'; + + // pad cross line Y and X + p.crossLY.style.position = + p.crossLX.style.position = + 'absolute'; + p.crossLY.style.background = + p.crossLX.style.background = + THIS.pointerColor; + p.crossLY.style.height = + p.crossLX.style.width = + (crossOuterSize - 2 * THIS.pointerBorderWidth) + 'px'; + p.crossLY.style.width = + p.crossLX.style.height = + THIS.pointerThickness + 'px'; + p.crossLY.style.left = + p.crossLX.style.top = + (Math.floor(crossOuterSize / 2) - Math.floor(THIS.pointerThickness / 2)) + 'px'; + p.crossLY.style.top = + p.crossLX.style.left = + THIS.pointerBorderWidth + 'px'; + + // slider + p.sld.style.overflow = 'hidden'; + p.sld.style.width = THIS.sliderSize + 'px'; + p.sld.style.height = THIS.height + 'px'; + + // slider gradient + p.sldGrad.draw(THIS.sliderSize, THIS.height, '#000', '#000'); + + // slider border + p.sldB.style.display = displaySlider ? 'block' : 'none'; + p.sldB.style.position = 'absolute'; + p.sldB.style.right = THIS.padding + 'px'; + p.sldB.style.top = THIS.padding + 'px'; + p.sldB.style.border = THIS.insetWidth + 'px solid'; + p.sldB.style.borderColor = THIS.insetColor; + + // slider mouse area + p.sldM._jscInstance = THIS; + p.sldM._jscControlName = 'sld'; + p.sldM.style.display = displaySlider ? 'block' : 'none'; + p.sldM.style.position = 'absolute'; + p.sldM.style.right = '0'; + p.sldM.style.top = '0'; + p.sldM.style.width = (THIS.sliderSize + padToSliderPadding / 2 + THIS.padding + 2 * THIS.insetWidth) + 'px'; + p.sldM.style.height = dims[1] + 'px'; + p.sldM.style.cursor = 'default'; + + // slider pointer inner and outer border + p.sldPtrIB.style.border = + p.sldPtrOB.style.border = + THIS.pointerBorderWidth + 'px solid ' + THIS.pointerBorderColor; + + // slider pointer outer border + p.sldPtrOB.style.position = 'absolute'; + p.sldPtrOB.style.left = -(2 * THIS.pointerBorderWidth + THIS.pointerThickness) + 'px'; + p.sldPtrOB.style.top = '0'; + + // slider pointer middle border + p.sldPtrMB.style.border = THIS.pointerThickness + 'px solid ' + THIS.pointerColor; + + // slider pointer spacer + p.sldPtrS.style.width = THIS.sliderSize + 'px'; + p.sldPtrS.style.height = sliderPtrSpace + 'px'; + + // the Close button + function setBtnBorder () { + var insetColors = THIS.insetColor.split(/\s+/); + var outsetColor = insetColors.length < 2 ? insetColors[0] : insetColors[1] + ' ' + insetColors[0] + ' ' + insetColors[0] + ' ' + insetColors[1]; + p.btn.style.borderColor = outsetColor; + } + p.btn.style.display = THIS.closable ? 'block' : 'none'; + p.btn.style.position = 'absolute'; + p.btn.style.left = THIS.padding + 'px'; + p.btn.style.bottom = THIS.padding + 'px'; + p.btn.style.padding = '0 15px'; + p.btn.style.height = THIS.buttonHeight + 'px'; + p.btn.style.border = THIS.insetWidth + 'px solid'; + setBtnBorder(); + p.btn.style.color = THIS.buttonColor; + p.btn.style.font = '12px sans-serif'; + p.btn.style.textAlign = 'center'; + try { + p.btn.style.cursor = 'pointer'; + } catch(eOldIE) { + p.btn.style.cursor = 'hand'; + } + p.btn.onmousedown = function () { + THIS.hide(); + }; + p.btnT.style.lineHeight = THIS.buttonHeight + 'px'; + p.btnT.innerHTML = ''; + p.btnT.appendChild(document.createTextNode(THIS.closeText)); + + // place pointers + redrawPad(); + redrawSld(); + + // If we are changing the owner without first closing the picker, + // make sure to first deal with the old owner + if (jsc.picker.owner && jsc.picker.owner !== THIS) { + jsc.unsetClass(jsc.picker.owner.targetElement, THIS.activeClass); + } + + // Set the new picker owner + jsc.picker.owner = THIS; + + // The redrawPosition() method needs picker.owner to be set, that's why we call it here, + // after setting the owner + if (jsc.isElementType(container, 'body')) { + jsc.redrawPosition(); + } else { + jsc._drawPosition(THIS, 0, 0, 'relative', false); + } + + if (p.wrap.parentNode != container) { + container.appendChild(p.wrap); + } + + jsc.setClass(THIS.targetElement, THIS.activeClass); + } + + + function redrawPad () { + // redraw the pad pointer + switch (jsc.getPadYComponent(THIS)) { + case 's': var yComponent = 1; break; + case 'v': var yComponent = 2; break; + } + var x = Math.round((THIS.hsv[0] / 360) * (THIS.width - 1)); + var y = Math.round((1 - THIS.hsv[yComponent] / 100) * (THIS.height - 1)); + var crossOuterSize = (2 * THIS.pointerBorderWidth + THIS.pointerThickness + 2 * THIS.crossSize); + var ofs = -Math.floor(crossOuterSize / 2); + jsc.picker.cross.style.left = (x + ofs) + 'px'; + jsc.picker.cross.style.top = (y + ofs) + 'px'; + + // redraw the slider + switch (jsc.getSliderComponent(THIS)) { + case 's': + var rgb1 = HSV_RGB(THIS.hsv[0], 100, THIS.hsv[2]); + var rgb2 = HSV_RGB(THIS.hsv[0], 0, THIS.hsv[2]); + var color1 = 'rgb(' + + Math.round(rgb1[0]) + ',' + + Math.round(rgb1[1]) + ',' + + Math.round(rgb1[2]) + ')'; + var color2 = 'rgb(' + + Math.round(rgb2[0]) + ',' + + Math.round(rgb2[1]) + ',' + + Math.round(rgb2[2]) + ')'; + jsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2); + break; + case 'v': + var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 100); + var color1 = 'rgb(' + + Math.round(rgb[0]) + ',' + + Math.round(rgb[1]) + ',' + + Math.round(rgb[2]) + ')'; + var color2 = '#000'; + jsc.picker.sldGrad.draw(THIS.sliderSize, THIS.height, color1, color2); + break; + } + } + + + function redrawSld () { + var sldComponent = jsc.getSliderComponent(THIS); + if (sldComponent) { + // redraw the slider pointer + switch (sldComponent) { + case 's': var yComponent = 1; break; + case 'v': var yComponent = 2; break; + } + var y = Math.round((1 - THIS.hsv[yComponent] / 100) * (THIS.height - 1)); + jsc.picker.sldPtrOB.style.top = (y - (2 * THIS.pointerBorderWidth + THIS.pointerThickness) - Math.floor(sliderPtrSpace / 2)) + 'px'; + } + } + + + function isPickerOwner () { + return jsc.picker && jsc.picker.owner === THIS; + } + + + function blurValue () { + THIS.importColor(); + } + + + // Find the target element + if (typeof targetElement === 'string') { + var id = targetElement; + var elm = document.getElementById(id); + if (elm) { + this.targetElement = elm; + } else { + jsc.warn('Could not find target element with ID \'' + id + '\''); + } + } else if (targetElement) { + this.targetElement = targetElement; + } else { + jsc.warn('Invalid target element: \'' + targetElement + '\''); + } + + if (this.targetElement._jscLinkedInstance) { + jsc.warn('Cannot link jscolor twice to the same element. Skipping.'); + return; + } + this.targetElement._jscLinkedInstance = this; + + // Find the value element + this.valueElement = jsc.fetchElement(this.valueElement); + // Find the style element + this.styleElement = jsc.fetchElement(this.styleElement); + + var THIS = this; + var container = + this.container ? + jsc.fetchElement(this.container) : + document.getElementsByTagName('body')[0]; + var sliderPtrSpace = 3; // px + + // For BUTTON elements it's important to stop them from sending the form when clicked + // (e.g. in Safari) + if (jsc.isElementType(this.targetElement, 'button')) { + if (this.targetElement.onclick) { + var origCallback = this.targetElement.onclick; + this.targetElement.onclick = function (evt) { + origCallback.call(this, evt); + return false; + }; + } else { + this.targetElement.onclick = function () { return false; }; + } + } + + /* + var elm = this.targetElement; + do { + // If the target element or one of its offsetParents has fixed position, + // then use fixed positioning instead + // + // Note: In Firefox, getComputedStyle returns null in a hidden iframe, + // that's why we need to check if the returned style object is non-empty + var currStyle = jsc.getStyle(elm); + if (currStyle && currStyle.position.toLowerCase() === 'fixed') { + this.fixed = true; + } + + if (elm !== this.targetElement) { + // attach onParentScroll so that we can recompute the picker position + // when one of the offsetParents is scrolled + if (!elm._jscEventsAttached) { + jsc.attachEvent(elm, 'scroll', jsc.onParentScroll); + elm._jscEventsAttached = true; + } + } + } while ((elm = elm.offsetParent) && !jsc.isElementType(elm, 'body')); + */ + + // valueElement + if (this.valueElement) { + if (jsc.isElementType(this.valueElement, 'input')) { + var updateField = function () { + THIS.fromString(THIS.valueElement.value, jsc.leaveValue); + jsc.dispatchFineChange(THIS); + }; + jsc.attachEvent(this.valueElement, 'keyup', updateField); + jsc.attachEvent(this.valueElement, 'input', updateField); + jsc.attachEvent(this.valueElement, 'blur', blurValue); + this.valueElement.setAttribute('autocomplete', 'off'); + } + } + + // styleElement + if (this.styleElement) { + this.styleElement._jscOrigStyle = { + backgroundImage : this.styleElement.style.backgroundImage, + backgroundColor : this.styleElement.style.backgroundColor, + color : this.styleElement.style.color + }; + } + + if (this.value) { + // Try to set the color from the .value option and if unsuccessful, + // export the current color + this.fromString(this.value) || this.exportColor(); + } else { + this.importColor(); + } + } + +}; + + +//================================ +// Public properties and methods +//================================ + + +// By default, search for all elements with class="jscolor" and install a color picker on them. +// +// You can change what class name will be looked for by setting the property jscolor.lookupClass +// anywhere in your HTML document. To completely disable the automatic lookup, set it to null. +// +jsc.jscolor.lookupClass = 'jscolor'; + + +jsc.jscolor.installByClassName = function (className) { + var inputElms = document.getElementsByTagName('input'); + var buttonElms = document.getElementsByTagName('button'); + + jsc.tryInstallOnElements(inputElms, className); + jsc.tryInstallOnElements(buttonElms, className); +}; + + +jsc.register(); + + +return jsc.jscolor; + + +})(); } diff --git a/fields/text_to_image/lang/bg.txt b/fields/text_to_image/lang/bg.txt new file mode 100644 index 0000000..2933309 --- /dev/null +++ b/fields/text_to_image/lang/bg.txt @@ -0,0 +1,8 @@ +[admin] +name = "Текст в изображение" +TXT_IMG_TEXT = "Текст, който ще бъде преобразуван е изображение" +TXT_IMG_SIZE = "Размер шрифта" +TXT_IMG_COLOR = "Цвят на текста" +TXT_IMG_ALT = "Текст alt" +TXT_IMG_BTN = "Преобразуване" +TXT_IMG_EXIST = "Текущо значение на полето:" \ No newline at end of file diff --git a/fields/text_to_image/lang/cz.txt b/fields/text_to_image/lang/cz.txt new file mode 100644 index 0000000..8db1c70 --- /dev/null +++ b/fields/text_to_image/lang/cz.txt @@ -0,0 +1,8 @@ +[admin] +name = "Text u zobrazení" +TXT_IMG_TEXT = "Text, který bude přenes do obrazu" +TXT_IMG_SIZE = "Velikost písma" +TXT_IMG_COLOR = "Barva textu" +TXT_IMG_ALT = "Dosazení textu v alt" +TXT_IMG_BTN = "Transformovat" +TXT_IMG_EXIST = "Aktuální hodnota pole:" \ No newline at end of file diff --git a/fields/text_to_image/lang/en.txt b/fields/text_to_image/lang/en.txt new file mode 100644 index 0000000..d047749 --- /dev/null +++ b/fields/text_to_image/lang/en.txt @@ -0,0 +1,8 @@ +[admin] +name = "Текст в изображение" +TXT_IMG_TEXT = "Текст, который будет преобразован в изображение" +TXT_IMG_SIZE = "Размер шрифта" +TXT_IMG_COLOR = "Цвет текста" +TXT_IMG_ALT = "Подстановка текста в alt" +TXT_IMG_BTN = "Преобразовать" +TXT_IMG_EXIST = "Текущее значение поля:" \ No newline at end of file diff --git a/fields/text_to_image/lang/pl.txt b/fields/text_to_image/lang/pl.txt new file mode 100644 index 0000000..9647dee --- /dev/null +++ b/fields/text_to_image/lang/pl.txt @@ -0,0 +1,8 @@ +[admin] +name = "Tekst w obrazku" +TXT_IMG_TEXT = "Tekst który zostanie przekształcony w obrazek" +TXT_IMG_SIZE = "Rozmiar czcionki" +TXT_IMG_COLOR = "Kolor tekstu" +TXT_IMG_ALT = "Substytucja tekstu w alt" +TXT_IMG_BTN = "Transformować" +TXT_IMG_EXIST = "Aktualne znaczenie pola:" \ No newline at end of file diff --git a/fields/text_to_image/lang/ru.txt b/fields/text_to_image/lang/ru.txt new file mode 100644 index 0000000..d047749 --- /dev/null +++ b/fields/text_to_image/lang/ru.txt @@ -0,0 +1,8 @@ +[admin] +name = "Текст в изображение" +TXT_IMG_TEXT = "Текст, который будет преобразован в изображение" +TXT_IMG_SIZE = "Размер шрифта" +TXT_IMG_COLOR = "Цвет текста" +TXT_IMG_ALT = "Подстановка текста в alt" +TXT_IMG_BTN = "Преобразовать" +TXT_IMG_EXIST = "Текущее значение поля:" \ No newline at end of file diff --git a/fields/text_to_image/lang/ua.txt b/fields/text_to_image/lang/ua.txt new file mode 100644 index 0000000..90cd776 --- /dev/null +++ b/fields/text_to_image/lang/ua.txt @@ -0,0 +1,8 @@ +[admin] +name = "Текст у зображення" +TXT_IMG_TEXT = "Текст, який буде трансформований у зображення" +TXT_IMG_SIZE = "Розмір шрифта" +TXT_IMG_COLOR = "Колір текста" +TXT_IMG_ALT = "Підстановка текста в alt" +TXT_IMG_BTN = "Трансформувати" +TXT_IMG_EXIST = "Поточне значення поля:" \ No newline at end of file diff --git a/fields/text_to_image/res.php b/fields/text_to_image/res.php new file mode 100644 index 0000000..4223f2f --- /dev/null +++ b/fields/text_to_image/res.php @@ -0,0 +1,42 @@ +return_as_html = true; + +// определяем вывод изображения: либо в виде кода base64, либо файл .png +// если true - тогда выводим кодом, если false - тогда выводим файл.png - но в этом режиме кеш +// изображений должен быть обязательно включен! +$ti->embed_image = false; + +// устанавливаем - будут ли сохранятся/кешироваться изображения, true - да , false- нет. +$ti->do_cache = true; + +// путь до папки, где лежат сохраненные изображения (см. файл class.txtimage.php)если хотите изменить то меняйте в файле класса так же... +$ti->cache_folder = '../../uploads/txtimages'; + +// Преобразуем обычный текст в изображение +echo $ti->generate("$a", "$b", "$c", "$d", $e); +?> \ No newline at end of file diff --git a/fields/text_to_image/tpl/field-doc.tpl b/fields/text_to_image/tpl/field-doc.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/text_to_image/tpl/field-doc.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/text_to_image/tpl/field-req.tpl b/fields/text_to_image/tpl/field-req.tpl new file mode 100644 index 0000000..20c861d --- /dev/null +++ b/fields/text_to_image/tpl/field-req.tpl @@ -0,0 +1 @@ +{$field_value} \ No newline at end of file diff --git a/fields/text_to_image/tpl/field.tpl b/fields/text_to_image/tpl/field.tpl new file mode 100644 index 0000000..000b8b7 --- /dev/null +++ b/fields/text_to_image/tpl/field.tpl @@ -0,0 +1,73 @@ +{if $get_field_text_to_image != load} + {assign var=get_field_text_to_image value='' scope="global"} + + + {assign var=get_field_text_to_image value="load" scope="global"} +{/if} +
      +
      +   +   +{#TXT_IMG_SIZE#}   +   +{#TXT_IMG_COLOR#}   +   +
      +{#TXT_IMG_ALT#} + +    +    +  +
      {#TXT_IMG_BTN#}
         + +
      +
      + + \ No newline at end of file diff --git a/fields/youtube/field.php b/fields/youtube/field.php new file mode 100644 index 0000000..425b8e7 --- /dev/null +++ b/fields/youtube/field.php @@ -0,0 +1,205 @@ +config_load($lang_file, 'lang'); + $AVE_Template->config_load($lang_file, 'admin'); + $AVE_Template->assign('config_vars', $AVE_Template->get_config_vars()); + + $result = 0; + + switch ($action) + { + + // Отображение поля в административной части + case 'edit': + $video = explode('|', $field_value); + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'admin'); + + $AVE_Template->assign('field_dir', $fld_name); + $AVE_Template->assign('video', $video); + $AVE_Template->assign('rubric_id', $rubric_id); + $AVE_Template->assign('doc_id', (int)$_REQUEST['Id']); + $AVE_Template->assign('field_id', $field_id); + $AVE_Template->assign('field_value', $field_value); + + return $AVE_Template->fetch($tpl_file); + + // Отображение поля в документах + case 'doc': + $field_value = clean_php($field_value); + + $field_param = explode('|', $field_value); + + if (! empty($field_param[0])) + $url = youtube_url_parser($field_param[0], $field_param[4]); + + if (! $tpl_empty) + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'doc'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('param', $field_param); + $AVE_Template->assign('video_url', $url); + return $AVE_Template->fetch($tpl_file); + } + + return $field_value; + + // Отображение поля в запросах + case 'req': + $field_value = clean_php($field_value); + + $field_param = explode('|', $field_value); + + if (! empty($field_param[0])) + $url = youtube_url_parser($field_param[0], $field_param[4]); + + if (! $tpl_empty) + { + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + + $tpl_file = get_field_tpl($tpl_dir, $field_id, 'req'); + + if($tpl_empty && $tpl_file) + { + $AVE_Template->assign('param', $field_param); + $AVE_Template->assign('video_url', $url); + return $AVE_Template->fetch($tpl_file); + } + + return $field_value; + + // Сохранение поля в административной части + case 'save': + if (isset($field_value) && $field_value['url'] != '' ) + { + $field_value = htmlspecialchars(implode("|", $field_value), ENT_QUOTES); + } + else + { + $field_value = ''; + } + break; + + // Тип/Имя поля в административной части + case 'name' : + return $AVE_Template->get_config_vars('name'); + } + + return ($result ? $result : $field_value); + } + + // Check YouTube link + function youtube_url_parser($url, $source = 'embed') + { + // Parse URL + $p_url = parse_url($url); + + // Find host + $host = $p_url['host']; + + // Check if youtube + if ($host == 'www.youtube.com') { + + if (preg_match('/[\\?\\&]v=([^\\?\\&]+)/', $url, $match)) + { + $vid = $match[1]; + + if ($source == 'embed') + { + return 'http://www.youtube.com/v/'.$vid; + } + else + { + return 'http://www.youtube.com/embed/'.$vid; + } + + } + else + { + return $url; + } + + // Check the new video url + } + else if ($host == 'youtu.be') + { + if (preg_match('/^(http|https):\/\/youtu\.be\/(.*)/i', $url, $match)) + { + $vid = $match[2]; + + if ($source == 'embed') + { + return 'http://www.youtube.com/v/'.$vid; + } + else + { + return 'http://www.youtube.com/embed/'.$vid; + } + } + else + { + return $url; + } + } + // Nothing just return the url + else + { + return $url; + } + } +?> diff --git a/fields/youtube/lang/bg.txt b/fields/youtube/lang/bg.txt new file mode 100644 index 0000000..4e0085c --- /dev/null +++ b/fields/youtube/lang/bg.txt @@ -0,0 +1,3 @@ +[admin] + +name = "YouTube" diff --git a/fields/youtube/lang/cz.txt b/fields/youtube/lang/cz.txt new file mode 100644 index 0000000..e087e9b --- /dev/null +++ b/fields/youtube/lang/cz.txt @@ -0,0 +1,2 @@ +[admin] +name = "YouTube" diff --git a/fields/youtube/lang/en.txt b/fields/youtube/lang/en.txt new file mode 100644 index 0000000..e087e9b --- /dev/null +++ b/fields/youtube/lang/en.txt @@ -0,0 +1,2 @@ +[admin] +name = "YouTube" diff --git a/fields/youtube/lang/pl.txt b/fields/youtube/lang/pl.txt new file mode 100644 index 0000000..e087e9b --- /dev/null +++ b/fields/youtube/lang/pl.txt @@ -0,0 +1,2 @@ +[admin] +name = "YouTube" diff --git a/fields/youtube/lang/ru.txt b/fields/youtube/lang/ru.txt new file mode 100644 index 0000000..e087e9b --- /dev/null +++ b/fields/youtube/lang/ru.txt @@ -0,0 +1,2 @@ +[admin] +name = "YouTube" diff --git a/fields/youtube/lang/ua.txt b/fields/youtube/lang/ua.txt new file mode 100644 index 0000000..e087e9b --- /dev/null +++ b/fields/youtube/lang/ua.txt @@ -0,0 +1,2 @@ +[admin] +name = "YouTube" diff --git a/fields/youtube/tpl/field-doc.tpl b/fields/youtube/tpl/field-doc.tpl new file mode 100644 index 0000000..dabc99e --- /dev/null +++ b/fields/youtube/tpl/field-doc.tpl @@ -0,0 +1,14 @@ +{if $param.4 == 'embed'} + + + + + + + + +{else} + + + +{/if} \ No newline at end of file diff --git a/fields/youtube/tpl/field-req.tpl b/fields/youtube/tpl/field-req.tpl new file mode 100644 index 0000000..dabc99e --- /dev/null +++ b/fields/youtube/tpl/field-req.tpl @@ -0,0 +1,14 @@ +{if $param.4 == 'embed'} + + + + + + + + +{else} + + + +{/if} \ No newline at end of file diff --git a/fields/youtube/tpl/field.tpl b/fields/youtube/tpl/field.tpl new file mode 100644 index 0000000..7366b60 --- /dev/null +++ b/fields/youtube/tpl/field.tpl @@ -0,0 +1,24 @@ +
      + Ссылка: + +
      + +
      + Ширина: px +          + Высота: px +
      + +
      + Полноэкранный режим: + +          + Метод вставки: + +
      diff --git a/functions/.htaccess b/functions/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/functions/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/functions/func.block.php b/functions/func.block.php new file mode 100644 index 0000000..1026530 --- /dev/null +++ b/functions/func.block.php @@ -0,0 +1,87 @@ +Query(" + SELECT + block_text + FROM + " . PREFIX . "_blocks + WHERE + " . (is_numeric($id) ? 'id' : 'block_alias') . " = '" . $id . "' + LIMIT 1 + ")->GetCell(); + + file_put_contents($cache_file,$return); + } + + //-- парсим теги + $search = array( + '[tag:mediapath]', + '[tag:path]', + '[tag:docid]' + ); + + $replace = array( + ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', + ABS_PATH, + get_current_document_id() + ); + + $return = str_replace($search, $replace, $return); + + $return = preg_replace_callback('/\[tag:home]/', 'get_home_link', $return); + $return = preg_replace_callback('/\[tag:breadcrumb]/', 'get_breadcrumb', $return); + $return = preg_replace_callback('/\[tag:request:([A-Za-z0-9-_]{1,20}+)\]/', 'request_parse', $return); + + if (isset($_REQUEST['id']) && $_REQUEST['id'] != '') + { + //-- парсим теги полей документа в шаблоне рубрики + $return = preg_replace_callback('/\[tag:fld:([a-zA-Z0-9-_]+)\]/', 'document_get_field', $return); + $return = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $return); + } + + $gen_time = Debug::endTime('SYSBLOCK_' . $id); + + $GLOBALS['block_generate'][] = array('BLOCK_'. $id => $gen_time); + + return $return; + } +} +?> \ No newline at end of file diff --git a/functions/func.breadcrumbs.php b/functions/func.breadcrumbs.php new file mode 100644 index 0000000..e6388ff --- /dev/null +++ b/functions/func.breadcrumbs.php @@ -0,0 +1,214 @@ +Query($sql)->FetchRow(); + + $search = array('[name]', '[link]', '[count]'); + $replace = array($lang_home_alias->document_breadcrum_title, $bread_show_host ? HOST . '/' . ltrim($lang_home_alias->document_alias, '/') : $lang_home_alias->document_alias, 1); + + $link = str_replace($search, $replace, $bread_link_template); + + $bread_crumb = $lang_home_alias + ? sprintf($bread_link_box, $link) + : ''; + + if ($bread_sepparator_use) + $bread_crumb .= $bread_sepparator; + + unset($search, $replace, $link, $sql, $lang_home_alias); + } + + if ($curent_document == 1 || $curent_document == PAGE_NOT_FOUND_ID) + $noprint = 1; + + $sql_document = $AVE_DB->Query(" + SELECT + document_title, + document_breadcrum_title, + document_parent + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $curent_document . "'", -1, 'doc_' . $curent_document + ); + + $row_document = $sql_document->FetchRow(); + + $current = new stdClass(); + + $current->document_breadcrum_title = (empty($row_document->document_breadcrum_title) + ? stripslashes(htmlspecialchars_decode($row_document->document_title)) + : stripslashes(htmlspecialchars_decode($row_document->document_breadcrum_title))); + + $row_document->document_parent = (isset($AVE_Core->curentdoc->document_parent) && $AVE_Core->curentdoc->document_parent != 0) + ? $AVE_Core->curentdoc->document_parent + : $row_document->document_parent; + + if (isset($row_document->document_parent) && $row_document->document_parent != 0) + { + $i = 0; + + $current->document_parent = $row_document->document_parent; + + while ($current->document_parent != 0) + { + $sql_doc = $AVE_DB->Query(" + SELECT + Id, + document_alias, + document_breadcrum_title, + document_title, + document_parent, + document_status + FROM + " . PREFIX . "_documents + WHERE + Id = '" . $current->document_parent . "'", -1, 'doc_' . $current->document_parent + ); + + $row_doc = $sql_doc->FetchRow(); + + $current->document_parent = $row_doc->document_parent; + + if ($row_doc->document_parent == $row_doc->Id) + { + echo "Ошибка! Вы указали в качестве родительского документа текущий документ.
      "; + $current->document_parent = 1; + } + + if ($row_doc->document_status==1 && $row_document->document_parent != 0) + { + $crumb['document_breadcrum_title'][$i] = (empty($row_doc->document_breadcrum_title) + ? stripslashes(htmlspecialchars_decode($row_doc->document_title)) + : stripslashes(htmlspecialchars_decode($row_doc->document_breadcrum_title))); + + $crumb['document_alias'][$i] = $row_doc->document_alias; + $crumb['Id'][$i] = $row_doc->Id; + + $i++; + } + + if ($row_doc->document_parent==0 AND $row_doc->Id != 1) + $current->document_parent = 1; + } + + $length = count($crumb['document_breadcrum_title']); + + $crumb['document_breadcrum_title'] = array_reverse($crumb['document_breadcrum_title']); + + $crumb['document_alias'] = array_reverse($crumb['document_alias']); + + $crumb['Id'] = array_reverse($crumb['Id']); + + for ($n = 0; $n < $length; $n++) + { + if ($crumb['Id'][$n] != 1) + { + $number = $n; + + if ($bread_show_main) + $number = $number + 1; + + $url = rewrite_link('index.php?id=' . $crumb['Id'][$n] . '&doc=' . $crumb['document_alias'][$n]); + + $search = array('[name]', '[link]', '[count]'); + $replace = array($crumb['document_breadcrum_title'][$n], $bread_show_host ? HOST . '/' . ltrim($url, '/') : $url, $number); + + $link = str_replace($search, $replace, $bread_link_template); + + $bread_crumb .= sprintf($bread_link_box, $link); + + if (get_settings('bread_link_box_last') == 1) + { + if ($bread_sepparator_use) + $bread_crumb .= $bread_sepparator; + } + else + { + if ($n != $length - 1) + if ($bread_sepparator_use) + $bread_crumb .= $bread_sepparator; + } + + unset($search, $replace, $link, $number); + } + } + } + + // Последний элемент + if (get_settings('bread_link_box_last') == 1) + $bread_crumb .= sprintf($bread_self_box, $current->document_breadcrum_title); + + if (! $noprint) + { + $crumbs[$curent_document] = sprintf($bread_box, $bread_crumb); + } + else + { + $crumbs[$curent_document] = ''; + } + + unset($bread_crumb); + + return $crumbs[$curent_document]; + } +?> \ No newline at end of file diff --git a/functions/func.common.php b/functions/func.common.php new file mode 100755 index 0000000..a5b41bf --- /dev/null +++ b/functions/func.common.php @@ -0,0 +1,1022 @@ + 0 ? false : true; +} + + +/** + * Очистка текста от програмного кода + * + * @param string $text исходный текст + * @return string очищенный текст + */ +function clean_php($text) +{ + return str_replace(array('', 'Системное сообщение: ' . $message . '
      '; +} + + +/** + * Сообщение о запрете распечатки страницы + * + */ +function print_error() +{ + display_notice('Запрашиваемая страница не может быть распечатана.'); + exit; +} + + +/** + * Сообщение о проблемах доступа к файлам модуля + * + */ +function module_error() +{ + display_notice('Запрашиваемый модуль не может быть загружен.'); + exit; +} + + +/** + * Получение основных настроек + * + * @param string $field параметр настройки, если не указан - все параметры + * @return mixed + */ +function get_settings($field = '') +{ + global $AVE_DB; + + static $settings = null; + + if ($settings === null) + { + $settings = $AVE_DB->Query("SELECT * FROM " . PREFIX . "_settings", SYSTEM_CACHE_LIFETIME)->FetchAssocArray(); + } + + if ($field == '') + return $settings; + + return isset($settings[$field]) + ? $settings[$field] + : null; +} + + +/** + * Формирование URL редиректа + * + * @param string|mixed $exclude + * @return string URL + */ +function get_redirect_link($exclude = '') +{ + global $AVE_Core; + + $link = 'index.php'; + + if (! empty($_GET)) + { + if ($exclude != '' && ! is_array($exclude)) + $exclude = explode(',', $exclude); + + if (empty($exclude)) + $exclude = array(); + + $exclude[] = 'url'; + + $params = array(); + + foreach($_GET as $key => $value) + { + if (! in_array($key, $exclude)) + { + if ($key == 'doc') + { + $params[] = 'doc=' . (empty($AVE_Core->curentdoc->document_alias) ? prepare_url($AVE_Core->curentdoc->document_title) : $AVE_Core->curentdoc->document_alias); + } + else + { + if (! is_array($value)) + { + $params[] = @urlencode($key) . '=' . @urlencode($value); + } + else + { + foreach($value AS $k => $v) + { + $params[] = @urlencode($k) . '=' . @urlencode($v); + } + } + } + } + } + + if (sizeof($params)) + $link .= '?' . implode('&', $params); + } + + return $link; +} + +/** + * Ссылка на главную страницу + * + * @return string ссылка + */ +function get_home_link() +{ + return HOST . ABS_PATH.($_SESSION['user_language'] == DEFAULT_LANGUAGE + ? '' + : $_SESSION['accept_langs'][$_SESSION['user_language']] . URL_SUFF); +} + + +/** + * Ссылка на страницу версии для печати + * + * @return string ссылка + */ +function get_print_link() +{ + /* + $link = get_redirect_link('print'); + $link .= (strpos($link, '?')===false ? '?print=1' : '&print=1'); + */ + /* Временное решение */ + $link = ABS_PATH."index.php?id=".get_current_document_id()."&print=1"; + + return $link; +} + + +/** + * Ссылка на реферал + * + * @return string ссылка + */ +function get_referer_link() +{ + static $link = null; + + if ($link === null) + { + if (isset($_SERVER['HTTP_REFERER'])) + { + $link = parse_url($_SERVER['HTTP_REFERER']); + $link = (trim($link['host']) == $_SERVER['SERVER_NAME']); + } + $link = ($link === true ? $_SERVER['HTTP_REFERER'] : get_home_link()); + } + + return $link; +} + + +/** + * Замена некоторых символов на их сущности + * замена и исправление HTML-тегов + * + * @param string|mixed $string + * @return string|mixed + */ +function pretty_chars($string) +{ + return preg_replace(array("'©'" , "'®'"), + array('©', '®'), $string); +} + + +/** + * Подготовка текста через API Яндекса (перевод с русского на английский) + * + * @param string $text + * @return string + */ +function y_translate($text) +{ + include_once BASE_DIR.'/lib/translate/Yandex_Translate.php'; + + $translator = new Yandex_Translate(); + + $translatedText = $translator->yandexTranslate('ru', 'en', $text); + + $translatedText = strtolower($translatedText); + + $translatedText = preg_replace( + array('/^[\/-]+|[\/-]+$|^[\/_]+|[\/_]+$|[^\.a-zа-яеёA-ZА-ЯЕЁ0-9\/_-]/u', '/--+/', '/-*\/+-*/', '/\/\/+/'), + array('-', '-', '/', '/'), + $translatedText + ); + + return $translatedText; +} + + +/** + * Подготовка URL + * + * @param string $url + * @return string + */ +function prepare_url($url) +{ + $new_url = strip_tags($url); + + // спецсимволы + $table = array( + '«' => '', + '»' => '', + '—' => '', + '–' => '', + '“' => '', + '”' => '' + ); + + $new_url = str_replace(array_keys($table), array_values($table), $new_url); + + if (defined('TRANSLIT_URL') && TRANSLIT_URL) + $new_url = translit_string(trim(_strtolower($new_url))); + + $new_url = preg_replace( + array( + '/^[\/-]+|[\/-]+$|^[\/_]+|[\/_]+$|[^\.a-zа-яеёA-ZА-ЯЕЁ0-9\/_-]/u', + '/--+/', + '/-*\/+-*/', + '/\/\/+/' + ), + array( + '-', + '-', + '/', + '/' + ), + $new_url + ); + + $new_url = trim($new_url, '-'); + + if (substr(URL_SUFF, 0, 1) != '/' && substr($url, -1) == '/') + $new_url = $new_url . "/"; + + return mb_strtolower(rtrim($new_url, '.'), 'UTF-8'); +} + + +/** + * Формирование ЧПУ для документов + * + * @param string $s ссылка или текст с ссылками + * @return string + */ +function rewrite_link($s) +{ + if (!REWRITE_MODE) + return $s; + + $doc_regex = '/index.php(?:\?)id=(?:[0-9]+)&(?:amp;)*doc='.(TRANSLIT_URL ? '([\.a-z0-9\/_-]+)' : '([\.a-zа-яёїєі0-9\/_-]+)'); + $page_regex = '&(?:amp;)*(artpage|apage|page)=([{s}0-9]+)'; + + $s = preg_replace($doc_regex.$page_regex.$page_regex.$page_regex.'/', ABS_PATH.'$1/$2-$3/$4-$5/$6-$7'.URL_SUFF, $s); + $s = preg_replace($doc_regex.$page_regex.$page_regex.'/', ABS_PATH.'$1/$2-$3/$4-$5'.URL_SUFF, $s); + $s = preg_replace($doc_regex.$page_regex.'/', ABS_PATH.'$1/$2-$3'.URL_SUFF, $s); + $s = preg_replace($doc_regex.'/', ABS_PATH.'$1'.URL_SUFF, $s); + //$s = preg_replace('/'.preg_quote(URL_SUFF, '/').'[?|&](?:amp;)*print=1/', '/print'.URL_SUFF, $s); + + return $s; +} + + +/** + * Возвращаем полный домен сайта + * + * @return mixed|string + */ +function getSiteUrl() +{ + $protocol = isset($_SERVER['HTTPS']) + ? 'https' + : 'http'; + + $url = $protocol . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; + + $url = parse_url($url); + + $url = $url['scheme'] . '://' . $url['host']; + + return $url; +} + + +/** + * Преобразует первый символ в верхний регистр + * @param string $str - строка + * @param string $encoding - кодировка, по-умолчанию UTF-8 + * @return string + */ +function ucfirst_utf8($str, $encoding='utf-8') +{ + $str = mb_ereg_replace('^[\ ]+', '', $str); + $str = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, mb_strlen($str), $encoding); + return $str; +} + + +/** + * Вывод статистики + */ +function get_statistic($t=0, $m=0, $q=0, $l=0) +{ + global $AVE_DB; + + $s = ''; + + if ($t) + $s .= "\n
      Время генерации: " . number_format(microtime_diff(START_MICROTIME, microtime()), 3, ',', ' ') . ' сек.'; + + if ($m && function_exists('memory_get_peak_usage')) + $s .= "\n
      Использовано памяти: " . Debug::formatSize(memory_get_usage() - START_MEMORY); + + if ($m && function_exists('memory_get_peak_usage')) + $s .= "\n
      Пиковое значение: " . Debug::formatSize(memory_get_peak_usage()); + + if ($q && (defined('SQL_PROFILING') && SQL_PROFILING)) + $s .= "\n
      Количество запросов: " . $AVE_DB->DBProfilesGet('count') . ' шт. за ' . $AVE_DB->DBProfilesGet('time') . ' сек.'; + + if ($l && (defined('SQL_PROFILING') && SQL_PROFILING)) + $s .= $AVE_DB->DBProfilesGet('list'); + + return $s; +} + + +/** + * Комментарии в SMARTY + */ +function add_template_comment($tpl_source, &$smarty) +{ + return "\n\n\n".$tpl_source."\n\n\n"; +} + + +/** + * Получения списка стран + * + * @param int $status статус стран входящих в список + *
        + *
      • 1 - активные страны
      • + *
      • 0 - неактивные страны
      • + *
      + * если не указано возвращает список стран без учета статуса + * + * @return array + */ +function get_country_list($status = null) +{ + global $AVE_DB; + + $countries = array(); + $sql = $AVE_DB->Query(" + SELECT + country_code, + country_name, + country_status + FROM " . PREFIX . "_countries + " . (($status != '') ? "WHERE country_status = '" . $status . "'" : '') . " + ORDER BY country_name ASC + "); + while ($row = $sql->FetchRow()) array_push($countries, $row); + + return $countries; +} + + +/** + * Получение списка изображений из заданной папки + * @param string $path путь до директории с изображениями + * @return array + */ +function image_multi_import($path) +{ + $images_ext = array('jpg', 'jpeg', 'png', 'gif'); + + $dir = BASE_DIR . "/" . $path; + + if ($handle = opendir($dir)) + { + while (false !== ($file = readdir($handle))) + { + $nameParts = explode('.', $file); + $ext = strtolower(end($nameParts)); + + if ($file != "." && $file != ".." && $ext == "png" || $ext == "jpg" || $ext == "gif") + { + if (! is_dir($dir . "/" . $file)) + $files[] = $file; + } + } + closedir($handle); + } + return $files; +} + + +/** + * Получение списка файлов из заданной папки + * @param string $path путь до директории с файлами + * @return array + */ +function file_multi_import($path) +{ + $dir = BASE_DIR."/".$path; + + if ($handle = opendir($dir)) + { + while (false !== ($file = readdir($handle))) + { + $nameParts = explode('.', $file); + $ext = strtolower(end($nameParts)); + + if ($file != "." && $file != ".." && $ext == "php" || $ext == "inc") + { + if (! is_dir($dir . "/" . $file)) + $files[] = $file; + } + } + closedir($handle); + } + return $files; +} + + +/** + * Replace PHP_EOL constant + * + * @category PHP + * @package PHP_Compat + * @license LGPL - http://www.gnu.org/licenses/lgpl.html + * @copyright 2004-2007 Aidan Lister , Arpad Ray + * @link http://php.net/reserved.constants.core + * @author Aidan Lister + * @version $Revision: 1.3 $ + * @since PHP 5.0.2 + */ +if (! defined('PHP_EOL')) +{ + switch (strtoupper(substr(PHP_OS, 0, 3))) + { + // Windows + case 'WIN': + define('PHP_EOL', "\r\n"); + break; + + // Mac + case 'DAR': + define('PHP_EOL', "\r"); + break; + + // Unix + default: + define('PHP_EOL', "\n"); + } +} + + +/** + * Функция записывает в указанную папку .htaccess с содержанием "Deny from all" + * + */ +function write_htaccess_deny($dir) +{ + $file = $dir . '/.htaccess'; + if(! file_exists($file)) + { + if(! is_dir($dir)) + @mkdir($dir); + + @file_put_contents($dir . '/.htaccess','Deny from all'); + } +} + + +/** + * Функция которая паникует если приблизились к memory_limit + * + * @return bool превышение лимита использования памяти + */ + function memory_panic() + { + if (defined('MEMORY_LIMIT_PANIC') && MEMORY_LIMIT_PANIC != -1) + { + $use_mem = memory_get_usage(); + $lim = MEMORY_LIMIT_PANIC * 1024 * 1024; + return ($use_mem > $lim ? true : false); + } + else + return false; +} + + +/** + * Первод Array в Object + * + * @param array $array + * @return array obj + */ +function array2object($array) +{ + if (is_array($array)) + { + $obj = new StdClass(); + foreach ($array as $key => $val) + { + $obj->$key = $val; + } + } + else + $obj = $array; + + return $obj; +} + + +/** + * Первод Object в Array + * + * @param array $object + * @return array + */ +function object2array($object) +{ + $object = (array)$object; + + if($object === array()) + return; + + foreach($object as $key => &$value) + { + if ((is_object($value) || is_array($value))) + { + $object[$key] = object2array($value); + } + } + + return $object; +} + + +/** + * Sort a 2 dimensional array based on 1 or more indexes. + * + * msort() can be used to sort a rowset like array on one or more + * 'headers' (keys in the 2th array). + * + * @param array $array The array to sort. + * @param string|array $key The index(es) to sort the array on. + * @param int $sort_flags The optional parameter to modify the sorting + * @param string $sort_way The optional parameter to modify the sorting as DESC or ASC + * behavior. This parameter does not work when + * supplying an array in the $key parameter. + * + * @return array The sorted array. + */ +function msort($array, $key, $sort_flags = SORT_REGULAR, $sort_way = SORT_ASC) +{ + if (is_array($array) && count($array) > 0) + { + if (! empty($key)) + { + $mapping = array(); + + foreach ($array as $k => $v) + { + $sort_key = ''; + + if (!is_array($key)) + { + $sort_key = $v[$key]; + } + else + { + // @TODO This should be fixed, now it will be sorted as string + foreach ($key as $key_key) { + $sort_key .= $v[$key_key]; + } + + $sort_flags = SORT_STRING; + } + + $mapping[$k] = $sort_key; + } + + switch ($sort_way) + { + case SORT_ASC: + asort($mapping, $sort_flags); + break; + + case SORT_DESC: + arsort($mapping, $sort_flags); + break; + } + + $sorted = array(); + + foreach ($mapping as $k => $v) + { + $sorted[] = $array[$k]; + } + + return $sorted; + } + } + return $array; +} + + +/** + * Функция возвращает каноническое имя страницы + * + * @param string $url текущий УРЛ + * @return string + */ +function canonical($url) +{ + $link = preg_replace('/^(.+?)(\?.*?)?(#.*)?$/', '$1$3', $url); + return $link; +} + + +/** + * Функция поиска автора документа, для autocmplite + * + * @param string $string + * @param $limit + * @return string + */ +function findautor($string, $limit) +{ + global $AVE_DB; + + $search = " + AND (UPPER(email) LIKE UPPER('%" . $string . "%') + OR UPPER(email) = UPPER('" . $string . "') + OR Id = '" . intval($string) . "' + OR UPPER(user_name) LIKE UPPER('" . $string . "%') + OR UPPER(firstname) LIKE UPPER('" . $string . "%') + OR UPPER(lastname) LIKE UPPER('" . $string . "%')) + "; + + $limit = (!empty($limit)) ? 'LIMIT 0,'.$limit : ''; + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_users + WHERE 1" + . $search + . $limit + ); + + $users = array(); + while ($row = $sql->FetchRow()) + { + $ava=getAvatar($row->Id,40); + $users[]=array( + 'userid'=>$row->Id, + 'login'=>$row->user_name, + 'email'=>$row->email, + 'lastname'=>$row->lastname, + 'firstname'=>$row->firstname, + 'avatar'=>($ava ? $ava : ABS_PATH.'admin/templates/images/user.png') + ); + } + echo json_encode($users); +} + + +/** + * Функция поиска ключевых слов + * + * @param string $string - запрос + * @return string + */ +function searchKeywords($string) +{ + global $AVE_DB; + + $search = " + AND (UPPER(keyword) LIKE UPPER('" . $string . "%')) + "; + + $sql = $AVE_DB->Query(" + SELECT * + FROM " . PREFIX . "_document_keywords + WHERE 1" + . $search + ); + + while ($row = $sql->FetchRow()) + { + $keyword = $row->keyword; + echo "$keyword\n"; + } +} + + +/** + * Формирование строки из случайных символов + * + * @param int $length количество символов в строке + * @param string $chars набор символов для формирования строки + * @return string сформированная строка + */ +function make_random_string($length = 16, $chars = '') +{ + if ($chars == '') + { + $chars = 'abcdefghijklmnopqrstuvwxyz'; + $chars .= 'ABCDEFGHIJKLMNOPRQSTUVWXYZ'; + $chars .= '~!@#$%^&*()-_=+{[;:/?.,]}'; + $chars .= '0123456789'; + } + + $clen = strlen($chars) - 1; + + $string = ''; + while (strlen($string) < $length) $string .= $chars[mt_rand(0, $clen)]; + + return $string; +} + + +/** + * Функция preg_replace для кириллицы + * если заменять русские символы в строке UTF-8 при помощи preg_replace, то появляются вопросы + * + * @param mixed $pattern шаблон заменяемой части строки + * @param mixed $replacement на что заменяем + * @param mixed $string входящая строка + * @param int $limit максимум вхождений + * mixed preg_replace_ru ( mixed pattern, mixed replacement, mixed subject [, int limit] ) + * + * @return mixed + */ +function preg_replace_ru($pattern="", $replacement="", $string="", $limit=-1) +{ + $string = iconv('UTF-8', 'cp1251', $string); + $string = preg_replace($pattern, $replacement, $string, $limit); + return iconv('cp1251', 'UTF-8', $string); +} + + +/** + * Создание cookie + */ +function set_cookie_domain($cookie_domain = '') +{ + global $cookie_domain; + + if ($cookie_domain == '' && defined('COOKIE_DOMAIN') && COOKIE_DOMAIN != '') + { + $cookie_domain = COOKIE_DOMAIN; + } + elseif ($cookie_domain == '' && !empty($_SERVER['HTTP_HOST'])) + { + $cookie_domain = htmlspecialchars($_SERVER['HTTP_HOST'], ENT_QUOTES); + } + + // Удаляем ведущие www. и номер порта в имени домена для использования в cookie. + $cookie_domain = ltrim($cookie_domain, '.'); + if (strpos($cookie_domain, 'www.') === 0) + { + $cookie_domain = substr($cookie_domain, 4); + } + $cookie_domain = explode(':', $cookie_domain); + $cookie_domain = '.'. $cookie_domain[0]; + + // В соответствии с RFC 2109, имя домена для cookie должно быть второго или более уровня. + // Для хостов 'localhost' или указанных IP-адресом имя домена для cookie не устанавливается. + if (count(explode('.', $cookie_domain)) > 2 && !is_numeric(str_replace('.', '', $cookie_domain))) + { + ini_set('session.cookie_domain', $cookie_domain); + } + + ini_set('session.cookie_path', ABS_PATH); +} + + +/** + * Функция проверяет наличие Ajax запроса + * + * @return bool true|false - Ajax + */ +function isAjax() +{ + return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')); +} +?> \ No newline at end of file diff --git a/functions/func.custom.php b/functions/func.custom.php new file mode 100644 index 0000000..1f7460d --- /dev/null +++ b/functions/func.custom.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/functions/func.documents.php b/functions/func.documents.php new file mode 100644 index 0000000..e311cec --- /dev/null +++ b/functions/func.documents.php @@ -0,0 +1,108 @@ + 
      + // Chrome
       
      + // FF
       
      + $pages = preg_split('#
       
      #i', $text); + $total_page = @sizeof($pages); + + if ($total_page > 1) + { + $text = @$pages[get_current_page('artpage')-1]; + + $page_nav = '
      {t} '; + $page_nav = get_pagination($total_page, 'artpage', $page_nav, get_settings('navi_box')); + + $text .= rewrite_link($page_nav); + } + + $pages = ''; + + return $pages . $text; +} + +/** + * Получить идентификатор текущего документа + * + * @return int идентификатор текущего документа + */ +function get_current_document_id() +{ + $_REQUEST['id'] = (isset($_REQUEST['id']) && is_numeric($_REQUEST['id'])) ? $_REQUEST['id'] : 1; + + return $_REQUEST['id']; +} + +/** + * Получить идентификатор родительского документа + * + * @return int идентификатор родительского документа + */ +function get_parent_document_id() +{ + global $AVE_DB; + return $AVE_DB->Query("SELECT document_parent FROM " . PREFIX . "_documents WHERE Id = '".get_current_document_id()."' ")->GetCell(); +} + +/** + * Функция отдаёт основные параметры дока + * + * @param int $doc_id - номер id документа + * @param string $key - параметр документа + * + * @return string + */ +function get_document ($doc_id , $key ='') +{ + global $AVE_DB; + + $doc_id = (int)$doc_id; + if ($doc_id < 1) return array(); + + static $get_documents_data = array(); + + if (!isset ($get_documents_data[$doc_id])) + { + $get_documents_data[$doc_id] = $AVE_DB->Query(" + SELECT * FROM " . PREFIX . "_documents + WHERE Id = '" . $doc_id . "' + ")->FetchAssocArray(); + + $get_documents_data[$doc_id]['doc_title'] = $get_documents_data[$doc_id]['document_title']; + $get_documents_data[$doc_id]['feld'] = array(); + } + + if(isset($key) && $key != '') { + return $get_documents_data[$doc_id][$key]; + }else{ + return $get_documents_data[$doc_id]; + } +} +?> \ No newline at end of file diff --git a/functions/func.fields.php b/functions/func.fields.php new file mode 100644 index 0000000..d81b4c3 --- /dev/null +++ b/functions/func.fields.php @@ -0,0 +1,592 @@ +read())) + { + $field_dir = $d->path . '/' . $entry; + + if (is_dir($field_dir) && file_exists($field_dir . '/field.php')) + require_once($field_dir . '/field.php'); + } + + $d->Close(); + } + + + /** + * Проверка папок /fields/ в модулях, на наличие полей + */ + $d = dir(BASE_DIR . '/modules'); + + while (false !== ($entry = $d->read())) + { + $module_dir = $d->path . '/' . $entry; + + if (is_dir($module_dir) && file_exists($module_dir . '/field.php')) + require_once($module_dir . '/field.php'); + } + + $d->Close(); + + + /** + * Поле по умолчанию + * + * @param $field_value + * @param $action + * @param int $field_id + * @param string $tpl + * @param int $tpl_empty + * @param null $maxlength + * @param array $document_fields + * @param int $rubric_id + * @param null $default + * + * @return string + */ + function get_field_default($field_value, $action, $field_id=0, $tpl='', $tpl_empty=0, &$maxlength=null, $document_fields=array(), $rubric_id=0, $default=null) + { + switch ($action) + { + case 'edit': + return ''; + case 'doc': + case 'req': + if (!$tpl_empty) + { + $field_param = explode('|', $field_value); + $field_value = preg_replace_callback( + '/\[tag:parametr:(\d+)\]/i', + function($data) use($field_param) + { + return $field_param[(int)$data[1]]; + }, + $tpl + ); + } + return $field_value; + + default: return $field_value; + } + } + + + /** + * Возвращаем тип поля + * + * @return string + */ + function get_field_type($type = '') + { + static $fields; + + if(is_array($fields)) + return $fields; + + $arr = get_defined_functions(); + + $fields = array(); + $field = array(); + + foreach($arr['user'] as $v) + { + if(trim(substr($v, 0, strlen('get_field_'))) == 'get_field_') + { + $d = ''; + + $name = @$v('', 'name', '', '', 0, $d); + + $id = substr($v, strlen('get_field_')); + + if ($name != false && is_string($name)) + $fields[] = array('id' => $id,'name' => (isset($fields_vars[$name]) + ? $fields_vars[$name] + : $name)); + + if (! empty($type) && $id == $type) + $field = array('id' => $id,'name' => (isset($fields_vars[$name]) + ? $fields_vars[$name] + : $name)); + } + } + + $fields = msort($fields, array('name')); + + return (! empty($type)) ? $field : $fields; + } + + + /** + * Возвращаем алиас по номеру поля + * + * @param $id + * @return string + */ + function get_field_alias($id){ + global $AVE_DB; + static $alias_field_id=array(); + if(isset($alias_field_id[$id])) return $alias_field_id[$id]; + $alias_field_id[$id] = $AVE_DB->Query("SELECT rubric_field_alias FROM " . PREFIX . "_rubric_fields WHERE Id=".intval($id))->GetCell(); + return $alias_field_id[$id]; + } + + + /** + * Возвращаем номер поля по рубрике и алиасу + * + * @param $rubric_id + * @param $alias + * + * @return string + */ + function get_field_num($rubric_id, $alias){ + global $AVE_DB; + static $alias_field_id=array(); + if(isset($alias_field_id[$rubric_id][$alias])) return $alias_field_id[$rubric_id][$alias]; + $alias_field_id[$rubric_id][$alias] = $AVE_DB->Query("SELECT Id FROM " . PREFIX . "_rubric_fields WHERE (rubric_field_alias='".addslashes($alias)."' OR Id='".intval($alias)."') AND rubric_id=".intval($rubric_id))->GetCell(); + return $alias_field_id[$rubric_id][$alias]; + } + + /** + * Возвращаем + * + * @param $rubric_id + * @param $id + * + * @return string + */ + function get_field_default_value($id) + { + global $AVE_DB; + + static $alias_field_id = array(); + + if(isset($alias_field_id[$id])) + return $alias_field_id[$id]; + + $alias_field_id[$id] = $AVE_DB->Query("SELECT rubric_field_default FROM " . PREFIX . "_rubric_fields WHERE Id = ".intval($id))->GetCell(); + + return $alias_field_id[$id]; + } + + /** + * Возвращаем шаблон tpl или пусто + * + * @param string $dir + * @param int $field_id идентификатор поля + * @param string $type + * + * @return string + */ + function get_field_tpl($dir='', $field_id=0, $type='admin'){ + + $alias_field_id = get_field_alias($field_id); + + switch ($type) { + case '': + case 'admin': + default: + $tpl = (file_exists($dir.'field-'.$field_id.'.tpl')) ? $dir.'field-'.$field_id.'.tpl' : ((file_exists($dir.'field-'.$alias_field_id.'.tpl')) ? $dir.'field-'.$alias_field_id.'.tpl' : $dir.'field.tpl'); + $tpl = (@filesize($tpl)) ? $tpl : ''; + break; + + case 'doc': + $tpl = (file_exists($dir.'field-doc-'.$field_id.'.tpl')) ? $dir.'field-doc-'.$field_id.'.tpl' : ((file_exists($dir.'field-doc-'.$alias_field_id.'.tpl')) ? $dir.'field-doc-'.$alias_field_id.'.tpl' : $dir.'field-doc.tpl'); + $tpl = (@filesize($tpl)) ? $tpl : ''; + break; + + case 'req': + $tpl = (file_exists($dir.'field-req-'.$field_id.'.tpl')) ? $dir.'field-req-'.$field_id.'.tpl' : ((file_exists($dir.'field-req-'.$alias_field_id.'.tpl')) ? $dir.'field-req-'.$alias_field_id.'.tpl' : $dir.'field-req.tpl'); + $tpl = (@filesize($tpl)) ? $tpl : ''; + break; + } + + return $tpl; + } + + + /** + * Формирование поля документа в соответствии с шаблоном отображения + * + * @param int $field_id идентификатор поля + * @param int $document_id + * + * @return string + */ + function document_get_field($field_id, $document_id=null) + { + global $AVE_Core; + + if (is_array($field_id)) + $field_id = $field_id[1]; + + $document_fields = get_document_fields(empty($document_id) + ? $AVE_Core->curentdoc->Id + : intval($document_id)); + + if (! is_array($document_fields[$field_id])) + $field_id = intval($document_fields[$field_id]); + + if (empty($document_fields[$field_id])) + return ''; + + $field_value = trim($document_fields[$field_id]['field_value']); + + $tpl_field_empty = $document_fields[$field_id]['tpl_field_empty']; + + // if ($field_value == '' && $tpl_field_empty) return ''; + + $field_type = $document_fields[$field_id]['rubric_field_type']; + + $rubric_field_template = trim($document_fields[$field_id]['rubric_field_template']); + + $rubric_field_default = $document_fields[$field_id]['rubric_field_default']; + + // $field_value = parse_hide($field_value); + // $field_value = ($length != '') ? truncate_text($field_value, $length, '…', true) : $field_value; + + $func = 'get_field_' . $field_type; + + if(! is_callable($func)) + $func = 'get_field_default'; + + $field_value = $func($field_value, 'doc', $field_id, $rubric_field_template, $tpl_field_empty, $maxlength, $document_fields, RUB_ID, $rubric_field_default); + + return $field_value; + } + + + /** + * Функция получения содержимого поля для обработки в шаблоне рубрики + * + * @param int $field_id идентификатор поля, для [tag:fld:12] $field_id = 12 + * @param int $length необязательный параметр, + * количество возвращаемых символов содержимого поля. + * если данный параметр указать со знаком минус + * содержимое поля будет очищено от HTML-тегов. + * @return string + */ + function document_get_field_value($field_id, $length = 0) + { + if (!is_numeric($field_id)) return ''; + + $document_fields = get_document_fields(get_current_document_id()); + + $field_value = trim($document_fields[$field_id]['field_value']); + + if ($field_value != '') + { + $field_value = strip_tags($field_value, "

      "); + + if (is_numeric($length) && $length != 0) + { + if ($length < 0) + { + $field_value = strip_tags($field_value); + $field_value = preg_replace('/ +/', ' ', $field_value); + $field_value = trim($field_value); + $length = abs($length); + } + + $field_value = truncate_text($field_value, $length, '…', true); + } + } + + return $field_value; + } + + + /** + * Возвращаем истинное значение поля для документа + * + * @param int $document_id id документа + * @param string $field id поля или его алиас + * + * @return string + */ + function get_document_field($document_id, $field) + { + $document_fields = get_document_fields($document_id); + + if (! is_array($document_fields[$field])) + $field = intval($document_fields[$field]); + + if (empty($document_fields[$field])) + return false; + + $field_value = $document_fields[$field]['field_value']; + + return $field_value; + } + + + /** + * Функция возвращает массив со значениями полей + * + * @param $document_id + * @param array $values если надо вернуть документ с произвольными значениями - используется для ревизий документов + * @internal param int $id id документа + * @return array + */ + function get_document_fields($document_id, $values = null) + { + global $AVE_DB, $request_documents; + + static $document_fields = array(); + + if (!is_numeric($document_id)) + return false; + + if (!isset ($document_fields[$document_id])) + { + $document_fields[$document_id] = false; + + $where = "WHERE doc_field.document_id = '" . $document_id . "'"; + + $query=" + + SELECT + doc_field.Id, + doc_field.document_id, + doc_field.rubric_field_id, + rub_field.rubric_field_alias, + rub_field.rubric_field_type, + rub_field.rubric_field_default, + doc_field.field_value, + text_field.field_value as field_value_more, + doc.document_author_id, + rub_field.rubric_field_title, + rub_field.rubric_field_template, + rub_field.rubric_field_template_request + FROM + " . PREFIX . "_document_fields AS doc_field + + JOIN + " . PREFIX . "_rubric_fields AS rub_field + ON doc_field.rubric_field_id = rub_field.Id + LEFT JOIN + " . PREFIX . "_document_fields_text AS text_field + ON (doc_field.rubric_field_id = text_field.rubric_field_id AND doc_field.document_id = text_field.document_id) + JOIN + " . PREFIX . "_documents AS doc + ON doc.Id = doc_field.document_id + " . $where; + + $sql = $AVE_DB->Query($query,-1,'doc_'.$document_id); + + //Вдруг памяти мало!!!! + if (memory_panic() && (count($document_fields) > 3)) + { + $document_fields = array(); + } + + while ($row = $sql->FetchAssocArray()) + { + $row['tpl_req_empty'] = (trim($row['rubric_field_template_request']) == ''); + $row['tpl_field_empty'] = (trim($row['rubric_field_template']) == ''); + + $row['field_value']=(string)$row['field_value'].(string)$row['field_value_more']; + + if($values) + { + $row['field_value']=(isset($values[$row['rubric_field_id']]) ? $values[$row['rubric_field_id']] : $row['field_value']); + } + + if ($row['field_value'] === '') + { + $row['rubric_field_template_request'] = preg_replace('/\[tag:if_notempty](.*?)\[\/tag:if_notempty]/si', '', $row['rubric_field_template_request']); + $row['rubric_field_template_request'] = trim(str_replace(array('[tag:if_empty]','[/tag:if_empty]'), '', $row['rubric_field_template_request'])); + + $row['rubric_field_template'] = preg_replace('/\[tag:if_notempty](.*?)\[\/tag:if_notempty]/si', '', $row['rubric_field_template']); + $row['rubric_field_template'] = trim(str_replace(array('[tag:if_empty]','[/tag:if_empty]'), '', $row['rubric_field_template'])); + } + else + { + $row['rubric_field_template_request'] = preg_replace('/\[tag:if_empty](.*?)\[\/tag:if_empty]/si', '', $row['rubric_field_template_request']); + $row['rubric_field_template_request'] = trim(str_replace(array('[tag:if_notempty]','[/tag:if_notempty]'), '', $row['rubric_field_template_request'])); + + $row['rubric_field_template'] = preg_replace('/\[tag:if_empty](.*?)\[\/tag:if_empty]/si', '', $row['rubric_field_template']); + $row['rubric_field_template'] = trim(str_replace(array('[tag:if_notempty]','[/tag:if_notempty]'), '', $row['rubric_field_template'])); + } + + $document_fields[$row['document_id']][$row['rubric_field_id']] = $row; + $document_fields[$row['document_id']][$row['rubric_field_alias']] = $row['rubric_field_id']; + } + } + return $document_fields[$document_id]; + } + + + /** + * Возвращает содержимое поля документа по номеру + * + * @param int $field_id ([tag:fld:X]) - номер поля + * @param int $doc_id + * @param int $parametr ([tag:parametr:X]) - часть поля + * + * @return string + */ + function get_field($field_id, $doc_id = null, $parametr = null) + { + global $req_item_id; + + // если не передан $doc_id, то проверяем реквест + if (!$doc_id && $req_item_id) $doc_id = $req_item_id; + // или берём для текущего дока + elseif (! $doc_id && $_REQUEST['id'] > 0) + $doc_id = $_REQUEST['id']; + elseif (! $doc_id) + return; + + // забираем из базы массив полей + $field = get_document_field($doc_id, $field_id); + + // возвращаем нужную часть поля + if ($parametr !== null) + { + $field = explode("|",$field); + $field = array_values(array_diff($field, array(''))); + $field = $field[$parametr]; + } + + return $field; + } + + + /** + * Возвращает содержимое поля документа по номеру + * + * @param int $field_id ([tag:fld:X]) - номер поля + * @param int $doc_id + * @param int $parametr ([tag:parametr:X]) - часть поля + * + * @return string + */ + function get_true_field($field_id, $doc_id = null, $parametr = null) + { + global $req_item_id, $AVE_DB; + + // если не передан $doc_id, то проверяем реквест + if (! $doc_id && $req_item_id) + $doc_id = $req_item_id; + // или берём для текущего дока + elseif (! $doc_id && $_REQUEST['id'] > 0) + $doc_id = $_REQUEST['id']; + elseif (! $doc_id) + return; + + // забираем из базы массив полей + $sql = " + SELECT + doc_field.field_value, + text_field.field_value AS field_value_more + FROM + " . PREFIX . "_document_fields AS doc_field + LEFT JOIN + " . PREFIX . "_document_fields_text AS text_field + ON (doc_field.rubric_field_id = text_field.rubric_field_id AND doc_field.document_id = text_field.document_id) + WHERE + doc_field.document_id = '" . $doc_id . "' + AND + doc_field.rubric_field_id = '" . $field_id . "' + "; + + $query = $AVE_DB->Query($sql)->FetchRow(); + + $field = (string)$query->field_value . (string)$query->field_value_more; + + unset($sql, $query); + + // возвращаем нужную часть поля + if ($parametr !== null) + { + $field = explode("|", $field); + $field = array_values(array_diff($field, array(''))); + $field = $field[$parametr]; + } + + return $field; + } + + /** + * Возвращает элемент сериализованного поля по номеру и ключу + * + * @param int $field_id ([tag:fld:X]) - номер поля + * @param int $item_id - номер элемента + * @param int $doc_id ([tag:docid]) - id документа + * @param int $parametr ([tag:parametr:X]) - номер параметра элемента + * @return string + */ + function get_element($field_id, $item_id = 0, $parametr = null, $doc_id = null) + { + global $req_item_id; + + // если не передан $doc_id, то проверяем реквест + if (!$doc_id && $req_item_id) + $doc_id = $req_item_id; + // или берём для текущего дока + elseif (! $doc_id && $_REQUEST['id'] > 0) + $doc_id = $_REQUEST['id']; + elseif (! $doc_id) + return; + + // забираем из базы поле + $field = get_field($field_id, $doc_id); + $field = unserialize($field); + + // возвращаем нужную часть поля + if ($parametr !== null) + { + $field = $field[$item_id]; + $field = explode("|", $field); + $field = $field[$parametr]; + } + else + { + $field = $field[$item_id]; + $field = explode("|", $field); + $field = $field[0]; + } + + return $field; + } + + /** + * Возвращает элемент сериализованного поля по номеру и ключу, через тег [tag:fld:XXX][XXX][XXX] + * + * @return string + */ + function return_element () + { + $param = func_get_args(); + + $return = get_element($param[0][1], $param[0][2], $param[0][3]); + + return $return; + } + +?> diff --git a/functions/func.helpers.php b/functions/func.helpers.php new file mode 100644 index 0000000..9b76983 --- /dev/null +++ b/functions/func.helpers.php @@ -0,0 +1,795 @@ + c" + * - корректно обрабатывается "грязный" html, когда в значениях атрибутов тагов могут встречаться символы < > + * - корректно обрабатывается разбитый html + * - вырезаются комментарии, скрипты, стили, PHP, Perl, ASP код, MS Word таги, CDATA + * - автоматически форматируется текст, если он содержит html код + * - защита от подделок типа: "<script>alert('hi')script>" + * + * @param string $s + * @param array $allowable_tags Массив тагов, которые не будут вырезаны + * Пример: 'b' -- таг останется с атрибутами, '' -- таг останется без атрибутов + * @param bool $is_format_spaces Форматировать пробелы и переносы строк? + * Вид текста на выходе (plain) максимально приближеется виду текста в браузере на входе. + * Другими словами, грамотно преобразует text/html в text/plain. + * Текст форматируется только в том случае, если были вырезаны какие-либо таги. + * @param array $pair_tags массив имён парных тагов, которые будут удалены вместе с содержимым + * см. значения по умолчанию + * @param array $para_tags массив имён парных тагов, которые будут восприниматься как параграфы (если $is_format_spaces = true) + * см. значения по умолчанию + * @return string + */ +include (BASE_DIR . '/lib/StripTagsSmart/strip_tags_smart.php'); + + +/** + * Вычисление разницы между двумя метками времени + * + * @param string $a начальная метка + * @param string $b конечная метка + * @return int время между метками + */ +if (!function_exists('microtime_diff')){ + function microtime_diff($a, $b) + { + list($a_dec, $a_sec) = explode(' ', $a); + list($b_dec, $b_sec) = explode(' ', $b); + return $b_sec - $a_sec + $b_dec - $a_dec; + } +} + + +/** + * Функция меняет кодировку файла + * + * @param string $path + * @param string $to + */ +if (!function_exists('file_encoding')){ + function file_encoding($path, $to='utf') + { + $f = file_get_contents($path); + $f = mb_convert_encoding($f,$to == 'utf' ? 'UTF-8' : 'CP1251', $to == 'utf' ? 'CP1251' : 'UTF-8'); + file_put_contents($path, $f); + } +} + + +/** + * Replace array_combine() + * + * @category PHP + * @package PHP_Compat + * @license LGPL - http://www.gnu.org/licenses/lgpl.html + * @copyright 2004-2007 Aidan Lister , Arpad Ray + * @link http://php.net/function.array_combine + * @author Aidan Lister + * @version $Revision: 1.23 $ + * @since PHP 5 + * @require PHP 4.0.0 (user_error) + */ +function php_compat_array_combine($keys, $values) +{ + if (!is_array($keys)) { + user_error('array_combine() expects parameter 1 to be array, ' . + gettype($keys) . ' given', E_USER_WARNING); + return; + } + + if (!is_array($values)) { + user_error('array_combine() expects parameter 2 to be array, ' . + gettype($values) . ' given', E_USER_WARNING); + return; + } + + $key_count = count($keys); + $value_count = count($values); + if ($key_count !== $value_count) { + user_error('array_combine() Both parameters should have equal number of elements', E_USER_WARNING); + return false; + } + + if ($key_count === 0 || $value_count === 0) { + user_error('array_combine() Both parameters should have number of elements at least 0', E_USER_WARNING); + return false; + } + + $keys = array_values($keys); + $values = array_values($values); + + $combined = array(); + for ($i = 0; $i < $key_count; $i++) { + $combined[$keys[$i]] = $values[$i]; + } + + return $combined; +} + +// Define +if (!function_exists('array_combine')) { + function array_combine($keys, $values) + { + return php_compat_array_combine($keys, $values); + } +} + + +/** + * post() + * + * @param mixed $var + * @return string + */ +if (!function_exists('post')){ + function post($var) + { + return (isset($_POST[$var])) ? $_POST[$var] : ''; + } +} + + +/** + * get() + * + * @param mixed $var + * @return string + */ +if (!function_exists('get')){ + function get($var) + { + return (isset($_GET[$var])) ? $_GET[$var] : ''; + } +} + + +/** + * sanitize() + * + * @param mixed $string + * @param bool $trim + * @param bool $int + * @param bool $str + * @return mixed|string + */ +if (!function_exists('sanitize')){ + function sanitize($string, $trim = false, $int = false, $str = false) + { + $string = filter_var($string, FILTER_SANITIZE_STRING); + $string = trim($string); + $string = stripslashes($string); + $string = strip_tags($string); + $string = str_replace( + array( + '‘', + '’', + '“', + '”' + ), + array( + "'", + "'", + '"', + '"' + ), + $string + ); + + if ($trim) + $string = substr($string, 0, $trim); + if ($int) + $string = preg_replace("/[^0-9\s]/", "", $string); + if ($str) + $string = preg_replace("/[^a-zA-Z\s]/", "", $string); + + return $string; + } +} + + +/** + * cleanSanitize() + * + * @param mixed $string + * @param bool $trim + * @param string $end_char + * @return mixed|string + */ +if (!function_exists('cleanSanitize')){ + function cleanSanitize($string, $trim = false, $end_char = '…') + { + $string = cleanOut($string); + $string = filter_var($string, FILTER_SANITIZE_STRING); + $string = trim($string); + $string = stripslashes($string); + $string = strip_tags($string); + $string = str_replace(array( + '‘', + '’', + '“', + '”'), array( + "'", + "'", + '"', + '"'), $string); + + if ($trim) { + if (strlen($string) < $trim) { + return $string; + } + + $string = preg_replace("/\s+/", ' ', str_replace(array( + "\r\n", + "\r", + "\n"), ' ', $string)); + + if (strlen($string) <= $trim) { + return $string; + } + + $out = ""; + foreach (explode(' ', trim($string)) as $val) { + $out .= $val . ' '; + + if (strlen($out) >= $trim) { + $out = trim($out); + return (strlen($out) == strlen($string)) ? $out : $out . $end_char; + } + } + } + return $string; + } +} + + +/** + * Функция обрезает текст до заданной величины + * + * @param mixed $string + * @param int $length Длинна + * @param string $etc Окончание + * @param bool $break_words Дробить слова на символы + * @param bool $middle Вырезает середину, оставляет начало + разделитель + конец + * @return mixed|string + */ +if (!function_exists('trancate')) +{ + function truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) + { + if ($length == 0) + return ''; + + if (strlen($string) > $length) + { + $length -= min($length, strlen($etc)); + + if (! $break_words && ! $middle) + { + $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1)); + } + + if (!$middle) + { + return substr($string, 0, $length) . $etc; + } + else + { + return substr($string, 0, $length/2) . $etc . substr($string, -$length/2); + } + } + else + { + return $string; + } + } +} + + +/** + * Функция обрезает текст до заданной величины, не бьет слова + * + * @param mixed $str + * @param int $n Длинна + * @param mixed $end_char Окончание + * @return mixed|string + */ +if (!function_exists('truncate_text')) +{ + function truncate_text($str, $n = 100, $end_char = '…') + { + if (strlen($str) < $n) + { + return $str; + } + + $str = preg_replace("/\s+/", ' ', str_replace(array( + "\r\n", + "\r", + "\n"), ' ', $str)); + + if (strlen($str) <= $n) + { + return $str; + } + + $out = ""; + foreach (explode(' ', trim($str)) as $val) + { + $out .= $val . ' '; + + if (strlen($out) >= $n) + { + $out = trim($out); + return (strlen($out) == strlen($str)) ? $out : $out . $end_char; + } + } + return $str; + } +} + + +/** + * Swap named HTML entities with numeric entities. + * + * @see http://www.lazycat.org/software/html_entity_decode_full.phps + */ +function convert_entity($matches, $destroy = true) +{ + $table = array( + 'Aacute' => 'Á', 'aacute' => 'á', 'Acirc' => 'Â', 'acirc' => 'â', 'acute' => '´', + 'AElig' => 'Æ', 'aelig' => 'æ', 'Agrave' => 'À', 'agrave' => 'à', 'alefsym' => 'ℵ', + 'Alpha' => 'Α', 'alpha' => 'α', 'amp' => '&', 'and' => '∧', 'ang' => '∠', + 'Aring' => 'Å', 'aring' => 'å', 'asymp' => '≈', 'Atilde' => 'Ã', 'atilde' => 'ã', + 'Auml' => 'Ä', 'auml' => 'ä', 'bdquo' => '„', 'Beta' => 'Β', 'beta' => 'β', + 'brvbar' => '¦', 'bull' => '•', 'cap' => '∩', 'Ccedil' => 'Ç', 'ccedil' => 'ç', + 'cedil' => '¸', 'cent' => '¢', 'Chi' => 'Χ', 'chi' => 'χ', 'circ' => 'ˆ', + 'clubs' => '♣', 'cong' => '≅', 'copy' => '©', 'crarr' => '↵', 'cup' => '∪', + 'curren' => '¤', 'dagger' => '†', 'Dagger' => '‡', 'darr' => '↓', 'dArr' => '⇓', + 'deg' => '°', 'Delta' => 'Δ', 'delta' => 'δ', 'diams' => '♦', 'divide' => '÷', + 'Eacute' => 'É', 'eacute' => 'é', 'Ecirc' => 'Ê', 'ecirc' => 'ê', 'Egrave' => 'È', + 'egrave' => 'è', 'empty' => '∅', 'emsp' => ' ', 'ensp' => ' ', 'Epsilon' => 'Ε', + 'epsilon' => 'ε', 'equiv' => '≡', 'Eta' => 'Η', 'eta' => 'η', 'ETH' => 'Ð', + 'eth' => 'ð', 'Euml' => 'Ë', 'euml' => 'ë', 'euro' => '€', 'exist' => '∃', + 'fnof' => 'ƒ', 'forall' => '∀', 'frac12' => '½', 'frac14' => '¼', 'frac34' => '¾', + 'frasl' => '⁄', 'Gamma' => 'Γ', 'gamma' => 'γ', 'ge' => '≥', 'gt' => '>', + 'harr' => '↔', 'hArr' => '⇔', 'hearts' => '♥', 'hellip' => '…', 'Iacute' => 'Í', + 'iacute' => 'í', 'Icirc' => 'Î', 'icirc' => 'î', 'iexcl' => '¡', 'Igrave' => 'Ì', + 'igrave' => 'ì', 'image' => 'ℑ', 'infin' => '∞', 'int' => '∫', 'Iota' => 'Ι', + 'iota' => 'ι', 'iquest' => '¿', 'isin' => '∈', 'Iuml' => 'Ï', 'iuml' => 'ï', + 'Kappa' => 'Κ', 'kappa' => 'κ', 'Lambda' => 'Λ', 'lambda' => 'λ', 'lang' => '〈', + 'laquo' => '«', 'larr' => '←', 'lArr' => '⇐', 'lceil' => '⌈', 'ldquo' => '“', + 'le' => '≤', 'lfloor' => '⌊', 'lowast' => '∗', 'loz' => '◊', 'lrm' => '‎', + 'lsaquo' => '‹', 'lsquo' => '‘', 'lt' => '<', 'macr' => '¯', 'mdash' => '—', + 'micro' => 'µ', 'middot' => '·', 'minus' => '−', 'Mu' => 'Μ', 'mu' => 'μ', + 'nabla' => '∇', 'nbsp' => ' ', 'ndash' => '–', 'ne' => '≠', 'ni' => '∋', + 'not' => '¬', 'notin' => '∉', 'nsub' => '⊄', 'Ntilde' => 'Ñ', 'ntilde' => 'ñ', + 'Nu' => 'Ν', 'nu' => 'ν', 'Oacute' => 'Ó', 'oacute' => 'ó', 'Ocirc' => 'Ô', + 'ocirc' => 'ô', 'OElig' => 'Œ', 'oelig' => 'œ', 'Ograve' => 'Ò', 'ograve' => 'ò', + 'oline' => '‾', 'Omega' => 'Ω', 'omega' => 'ω', 'Omicron' => 'Ο', 'omicron' => 'ο', + 'oplus' => '⊕', 'or' => '∨', 'ordf' => 'ª', 'ordm' => 'º', 'Oslash' => 'Ø', + 'oslash' => 'ø', 'Otilde' => 'Õ', 'otilde' => 'õ', 'otimes' => '⊗', 'Ouml' => 'Ö', + 'ouml' => 'ö', 'para' => '¶', 'part' => '∂', 'permil' => '‰', 'perp' => '⊥', + 'Phi' => 'Φ', 'phi' => 'φ', 'Pi' => 'Π', 'pi' => 'π', 'piv' => 'ϖ', + 'plusmn' => '±', 'pound' => '£', 'prime' => '′', 'Prime' => '″', 'prod' => '∏', + 'prop' => '∝', 'Psi' => 'Ψ', 'psi' => 'ψ', 'quot' => '"', 'radic' => '√', + 'rang' => '〉', 'raquo' => '»', 'rarr' => '→', 'rArr' => '⇒', 'rceil' => '⌉', + 'rdquo' => '”', 'real' => 'ℜ', 'reg' => '®', 'rfloor' => '⌋', 'Rho' => 'Ρ', + 'rho' => 'ρ', 'rlm' => '‏', 'rsaquo' => '›', 'rsquo' => '’', 'sbquo' => '‚', + 'Scaron' => 'Š', 'scaron' => 'š', 'sdot' => '⋅', 'sect' => '§', 'shy' => '­', + 'Sigma' => 'Σ', 'sigma' => 'σ', 'sigmaf' => 'ς', 'sim' => '∼', 'spades' => '♠', + 'sub' => '⊂', 'sube' => '⊆', 'sum' => '∑', 'sup' => '⊃', 'sup1' => '¹', + 'sup2' => '²', 'sup3' => '³', 'supe' => '⊇', 'szlig' => 'ß', 'Tau' => 'Τ', + 'tau' => 'τ', 'there4' => '∴', 'Theta' => 'Θ', 'theta' => 'θ', 'thetasym' => 'ϑ', + 'thinsp' => ' ', 'THORN' => 'Þ', 'thorn' => 'þ', 'tilde' => '˜', 'times' => '×', + 'trade' => '™', 'Uacute' => 'Ú', 'uacute' => 'ú', 'uarr' => '↑', 'uArr' => '⇑', + 'Ucirc' => 'Û', 'ucirc' => 'û', 'Ugrave' => 'Ù', 'ugrave' => 'ù', 'uml' => '¨', + 'upsih' => 'ϒ', 'Upsilon' => 'Υ', 'upsilon' => 'υ', 'Uuml' => 'Ü', 'uuml' => 'ü', + 'weierp' => '℘', 'Xi' => 'Ξ', 'xi' => 'ξ', 'Yacute' => 'Ý', 'yacute' => 'ý', + 'yen' => '¥', 'Yuml' => 'Ÿ', 'yuml' => 'ÿ', 'Zeta' => 'Ζ', 'zeta' => 'ζ', + 'zwj' => '‍', 'zwnj' => '‌' + ); + + if (isset($table[$matches[1]])) return $table[$matches[1]]; + else return $destroy ? '' : $matches[0]; +} + + +/** + * stripTags() + * + * @param mixed $start + * @param mixed $end + * @param mixed $string + * @return string + */ +if (!function_exists('stripTags')) +{ + function stripTags($start, $end, $string) + { + $string = stristr($string, $start); + $doend = stristr($string, $end); + return substr($string, strlen($start), -strlen($doend)); + } +} + + +/** + * stripExt() + * + * @param mixed $filename + * @return string + */ +if (!function_exists('stripExt')){ + function stripExt($filename) + { + if (strpos($filename, ".") === false) { + return ucwords($filename); + } else + return substr(ucwords($filename), 0, strrpos($filename, ".")); + } +} + + +/** + * Очиста текста + * + * @param mixed $text + * @return string + */ +if (!function_exists('cleanOut')){ + function cleanOut($text) + { + $text = strtr($text, array( + '\r\n' => "", + '\r' => "", + '\n' => "")); + $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8'); + $text = str_replace('
      ', '
      ', $text); + return stripslashes($text); + } +} + + +/** + * Сравнение двух чисел + * + * @param mixed $float1 + * @param mixed $float2 + * @param string $operator + * @return bool + */ +if (!function_exists('compareFloatNumbers')){ + function compareFloatNumbers($float1, $float2, $operator='=') + { + // Check numbers to 5 digits of precision + $epsilon = 0.00001; + + $float1 = (float)$float1; + $float2 = (float)$float2; + + switch ($operator) + { + // equal + case "=": + case "eq": + if (abs($float1 - $float2) < $epsilon) { + return true; + } + break; + // less than + case "<": + case "lt": + if (abs($float1 - $float2) < $epsilon) { + return false; + } else { + if ($float1 < $float2) { + return true; + } + } + break; + // less than or equal + case "<=": + case "lte": + if (compareFloatNumbers($float1, $float2, '<') || compareFloatNumbers($float1, $float2, '=')) { + return true; + } + break; + // greater than + case ">": + case "gt": + if (abs($float1 - $float2) < $epsilon) { + return false; + } else { + if ($float1 > $float2) { + return true; + } + } + break; + // greater than or equal + case ">=": + case "gte": + if (compareFloatNumbers($float1, $float2, '>') || compareFloatNumbers($float1, $float2, '=')) { + return true; + } + break; + + case "<>": + case "!=": + case "ne": + if (abs($float1 - $float2) > $epsilon) { + return true; + } + break; + default: + die("Unknown operator '".$operator."' in compareFloatNumbers()"); + } + + return false; + } +} + + +/** + * Поиск значения по массиву + * + * @param $array + * @param $key + * @param bool $value + * @return bool + */ +if (!function_exists('searchforValue')){ + function searchforValue($array, $key, $value) + { + if($array) { + foreach ($array as $val) { + if ($val->$key == $value) { + return true; + } + } + } + return false; + } +} + + +/** + * Поиск в массиве + * + * @param mixed $array + * @param mixed $val1 + * @param mixed $val2 + * @return array|int + */ +if (!function_exists('findInArray')){ + function findInArray($array, $val1, $val2) + { + if($array) { + $result = array(); + foreach ($array as $val) { + if ($val->$val1 == $val2) { + $result[] = $val; + } + } + return ($result) ? $result : 0; + } + return 0; + } +} + + +/** + * Скачать файл + * + * @param $fileLocation + * @param $fileName + * @param int $maxSpeed + * @return bool + */ +if (!function_exists('downloadFile')){ + function downloadFile($fileLocation, $fileName, $maxSpeed = 5120) + { + if (connection_status() != 0) + return (false); + + $extension = strtolower(substr($fileName, strrpos($fileName, '.') + 1)); + + /* List of File Types */ + $fileTypes['swf'] = 'application/x-shockwave-flash'; + $fileTypes['pdf'] = 'application/pdf'; + $fileTypes['exe'] = 'application/octet-stream'; + $fileTypes['zip'] = 'application/zip'; + $fileTypes['doc'] = 'application/msword'; + $fileTypes['xls'] = 'application/vnd.ms-excel'; + $fileTypes['ppt'] = 'application/vnd.ms-powerpoint'; + $fileTypes['gif'] = 'image/gif'; + $fileTypes['png'] = 'image/png'; + $fileTypes['jpeg'] = 'image/jpg'; + $fileTypes['jpg'] = 'image/jpg'; + $fileTypes['rar'] = 'application/rar'; + + $fileTypes['ra'] = 'audio/x-pn-realaudio'; + $fileTypes['ram'] = 'audio/x-pn-realaudio'; + $fileTypes['ogg'] = 'audio/x-pn-realaudio'; + + $fileTypes['wav'] = 'video/x-msvideo'; + $fileTypes['wmv'] = 'video/x-msvideo'; + $fileTypes['avi'] = 'video/x-msvideo'; + $fileTypes['asf'] = 'video/x-msvideo'; + $fileTypes['divx'] = 'video/x-msvideo'; + + $fileTypes['mp3'] = 'audio/mpeg'; + $fileTypes['mp4'] = 'audio/mpeg'; + $fileTypes['mpeg'] = 'video/mpeg'; + $fileTypes['mpg'] = 'video/mpeg'; + $fileTypes['mpe'] = 'video/mpeg'; + $fileTypes['mov'] = 'video/quicktime'; + $fileTypes['swf'] = 'video/quicktime'; + $fileTypes['3gp'] = 'video/quicktime'; + $fileTypes['m4a'] = 'video/quicktime'; + $fileTypes['aac'] = 'video/quicktime'; + $fileTypes['m3u'] = 'video/quicktime'; + + $contentType = $fileTypes[$extension]; + + + header("Cache-Control: public"); + header("Content-Transfer-Encoding: binary\n"); + header('Content-Type: $contentType'); + + $contentDisposition = 'attachment'; + + if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { + $fileName = preg_replace('/\./', '%2e', $fileName, substr_count($fileName, '.') - 1); + header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); + } else { + header("Content-Disposition: $contentDisposition;filename=\"$fileName\""); + } + + header("Accept-Ranges: bytes"); + $range = 0; + $size = filesize($fileLocation); + + if (isset($_SERVER['HTTP_RANGE'])) { + list($a, $range) = explode("=", $_SERVER['HTTP_RANGE']); + str_replace($range, "-", $range); + $size2 = $size - 1; + $new_length = $size - $range; + header("HTTP/1.1 206 Partial Content"); + header("Content-Length: $new_length"); + header("Content-Range: bytes $range$size2/$size"); + } else { + $size2 = $size - 1; + header("Content-Range: bytes 0-$size2/$size"); + header("Content-Length: " . $size); + } + + if ($size == 0) { + die('Zero byte file! Aborting download'); + } + + $fp = fopen("$fileLocation", "rb"); + + fseek($fp, $range); + + while (!feof($fp) and (connection_status() == 0)) { + set_time_limit(0); + print (fread($fp, 1024 * $maxSpeed)); + flush(); + ob_flush(); + sleep(1); + } + fclose($fp); + + exit; + + return ((connection_status() == 0) and !connection_aborted()); + } +} + + + /** + * Конвертируем hex color в decimal color + * @param string $hexcolor Значение цвета в HEX. Example: #A9B7D3 + * @return array|bool + */ +if (!function_exists('color_h2d')){ + function color_h2d($hexcolor) { + if(mb_strlen($hexcolor) != 7 || mb_strpos($hexcolor, "#") === false) { + return false; + } + + return array( "r" => hexdec(mb_substr($hexcolor, 1, 2)), + "g" => hexdec(mb_substr($hexcolor, 3, 2)), + "b" => hexdec(mb_substr($hexcolor, 5, 2))); + } +} +?> \ No newline at end of file diff --git a/functions/func.hidden.php b/functions/func.hidden.php new file mode 100644 index 0000000..b103265 --- /dev/null +++ b/functions/func.hidden.php @@ -0,0 +1,50 @@ + 0) + { + for ($i=0; $i <= $count_matches; $i++) + { + + $hidden_text = substr(@$matches[$i][3], 1); + + if ($hidden_text == "") + $hidden_text = trim(get_settings('hidden_text')); + + $data = preg_replace('/\[tag:hide:(\d+,)*'. UGROUP .'(,\d+)*(:.*?)?].*?\[\/tag:hide]/s', $hidden_text, $data, 1); + } + } + + $data = preg_replace('/\[tag:hide:\d+(,\d+)*.*?](.*?)\[\/tag:hide]/s', '\\2', $data); + + return $data; +} +?> \ No newline at end of file diff --git a/functions/func.locale.php b/functions/func.locale.php new file mode 100644 index 0000000..8211bb3 --- /dev/null +++ b/functions/func.locale.php @@ -0,0 +1,851 @@ + 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Е' => 'E', + 'Ё' => 'YO', + 'Ж' => 'ZH', + 'З' => 'Z', + 'И' => 'I', + 'Й' => 'J', + 'К' => 'K', + 'Л' => 'L', + 'М' => 'M', + 'Н' => 'N', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'CH', + 'Ш' => 'SH', + 'Щ' => 'CSH', + 'Ь' => '', + 'Ы' => 'Y', + 'Ъ' => '', + 'Э' => 'E', + 'Ю' => 'YU', + 'Я' => 'YA', + //-- Строчные + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'е' => 'e', + 'ё' => 'yo', + 'ж' => 'zh', + 'з' => 'z', + 'и' => 'i', + 'й' => 'j', + 'к' => 'k', + 'л' => 'l', + 'м' => 'm', + 'н' => 'n', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'ch', + 'ш' => 'sh', + 'щ' => 'csh', + 'ь' => '', + 'ы' => 'y', + 'ъ' => '', + 'э' => 'e', + 'ю' => 'yu', + 'я' => 'ya', + ); + break; + + //болгарский + case 'bg': + $table = array( + //-- Заглавные + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Е' => 'E', + 'Ё' => 'YO', + 'Ж' => 'ZH', + 'З' => 'Z', + 'И' => 'I', + 'Й' => 'J', + 'К' => 'K', + 'Л' => 'L', + 'М' => 'M', + 'Н' => 'N', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'CH', + 'Ш' => 'SH', + 'Щ' => 'SHT', + 'Ь' => 'Y', + 'Ы' => 'Y', + 'Ъ' => 'A', + 'Э' => 'E', + 'Ю' => 'YU', + 'Я' => 'YA', + //-- Строчные + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'е' => 'e', + 'ё' => 'yo', + 'ж' => 'zh', + 'з' => 'z', + 'и' => 'i', + 'й' => 'j', + 'к' => 'k', + 'л' => 'l', + 'м' => 'm', + 'н' => 'n', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'ch', + 'ш' => 'sh', + 'щ' => 'sht', + 'ь' => 'a', + 'ы' => 'y', + 'ъ' => 'a', + 'э' => 'e', + 'ю' => 'yu', + 'я' => 'ya', + ); + break; + + //-- українська мова: + case 'ua': + $table = array( + //-- Заглавные + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Д' => 'D', + 'Е' => 'E', + 'Є' => 'IE', + 'Ж' => 'J', + 'З' => 'Z', + 'И' => 'Y', + 'І' => 'I', + 'Й' => 'I', + 'К' => 'K', + 'Л' => 'L', + 'М' => 'M', + 'Н' => 'N', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'CH', + 'Ш' => 'SH', + 'Щ' => 'CSH', + 'Ь' => '', + 'Ю' => 'IU', + 'Я' => 'IA', + //-- Строчные + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'д' => 'd', + 'е' => 'e', + 'є' => 'ie', + 'ж' => 'j', + 'з' => 'z', + 'и' => 'y', + 'і' => 'i', + 'й' => 'i', + 'к' => 'k', + 'л' => 'l', + 'м' => 'm', + 'н' => 'n', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'ch', + 'ш' => 'sh', + 'щ' => 'csh', + 'ь' => '', + 'ю' => 'iu', + 'я' => 'ia', + ); + break; + + case 'uk': + $table = array( + //-- Заглавные + 'А' => 'A', + 'Б' => 'B', + 'В' => 'V', + 'Г' => 'G', + 'Ґ' => 'G', + 'Д' => 'D', + 'Е' => 'E', + 'Є' => 'IE', + 'Ж' => 'J', + 'З' => 'Z', + 'И' => 'Y', + 'І' => 'I', + 'Й' => 'I', + 'К' => 'K', + 'Л' => 'L', + 'М' => 'M', + 'Н' => 'N', + 'О' => 'O', + 'П' => 'P', + 'Р' => 'R', + 'С' => 'S', + 'Т' => 'T', + 'У' => 'U', + 'Ф' => 'F', + 'Х' => 'H', + 'Ц' => 'C', + 'Ч' => 'CH', + 'Ш' => 'SH', + 'Щ' => 'CSH', + 'Ь' => '', + 'Ю' => 'IU', + 'Я' => 'IA', + //-- Строчные + 'а' => 'a', + 'б' => 'b', + 'в' => 'v', + 'г' => 'g', + 'ґ' => 'g', + 'д' => 'd', + 'е' => 'e', + 'є' => 'ie', + 'ж' => 'j', + 'з' => 'z', + 'и' => 'y', + 'і' => 'i', + 'й' => 'i', + 'к' => 'k', + 'л' => 'l', + 'м' => 'm', + 'н' => 'n', + 'о' => 'o', + 'п' => 'p', + 'р' => 'r', + 'с' => 's', + 'т' => 't', + 'у' => 'u', + 'ф' => 'f', + 'х' => 'h', + 'ц' => 'c', + 'ч' => 'ch', + 'ш' => 'sh', + 'щ' => 'csh', + 'ь' => '', + 'ю' => 'iu', + 'я' => 'ia', + ); + break; + + //-- polski język + case 'pl': + $table = array( + 'Ą' => 'ya', + 'ą' => 'ya', + 'Ć' => 'ya', + 'ć' => 'ya', + 'Ę' => 'ya', + 'ę' => 'ya', + 'Ł' => 'ya', + 'ł' => 'ya', + 'Ń' => 'ya', + 'ń' => 'ya', + 'Ó' => 'ya', + 'ó' => 'ya', + 'Ś' => 'ya', + 'ś' => 'ya', + 'Ź' => 'ya', + 'ź' => 'ya', + 'Ż' => 'ya', + 'ż' => 'ya', + ); + break; + } + + $string = str_replace(array_keys($table), array_values($table), $string); + + switch ($language) + { + default: + case 'ru': + $replace = array( + 'ье'=>'ye', + 'ъе'=>'ye', + 'ьи'=>'yi', + 'ъи'=>'yi', + 'ъо'=>'yo', + 'ьо'=>'yo', + 'ё'=>'yo', + 'ю'=>'yu', + 'я'=>'ya', + 'ж'=>'zh', + 'х'=>'kh', + 'ц'=>'ts', + 'ч'=>'ch', + 'ш'=>'sh', + 'щ'=>'shch', + 'ъ'=>'', + 'ь'=>'', + 'є'=>'ye' + ); + break; + + case 'bg': + $replace = array( + 'ье'=>'ye', + 'ъе'=>'ye', + 'ьи'=>'yi', + 'ъи'=>'yi', + 'ъо'=>'yo', + 'ьо'=>'yo', + 'ё'=>'yo', + 'ю'=>'yu', + 'я'=>'ya', + 'ж'=>'zh', + 'ц'=>'ts', + 'ч'=>'ch', + 'ш'=>'sh', + 'щ'=>'sht', + 'ъ'=>'a', + 'ь'=>'a' + ); + break; + } + + $string = strtr($string, $replace); + + switch ($language) + { + default: + case 'ru': + $search = 'абвгдезийклмнопрстуфыэі'; + $replace = 'abvgdeziyklmnoprstufyei'; + break; + + case 'ua': + $search = 'абвгґдеєжзиійїклмнопрстуфхцчшщьюя'; + $replace = 'abvggdeejzyiiklmnoprstufhccssua'; + break; + + case 'uk': + $search = 'абвгґдеєжзиійїклмнопрстуфхцчшщьюя'; + $replace = 'abvggdeejzyiiklmnoprstufhccssua'; + break; + + case 'bg': + $search = 'абвгдезийклмнопрстуфыэіъ'; + $replace = 'abvgdeziyklmnoprstufyeia'; + break; + } + + $string = strtr($string, $search, $replace); + + return trim($string, '-'); + } + + + /** + * Исправление форматирования даты + * Функцию можно использовать в шаблонах Smarty как модификатор + * + * @param string $string - дата отформатированная в соответствии с текущей локалью + * @param string $language - язык + * @return string + */ + function pretty_date($string, $language = '') + { + // пытаемся решить проблему для кодировки дат на лок. серверах + if (! mb_check_encoding($string, 'UTF-8')) + { + $string = iconv('Windows-1251', 'UTF-8', $string); + } + + if ($language == '') + { + $language = (defined('ACP') && ACP) + ? $_SESSION['admin_language'] + : $_SESSION['user_language']; + } + + $language = strtolower($language); + + switch ($language) + { + default: + case 'ru': + $pretty = array( + 'Январь' =>'января', 'Февраль' =>'февраля', 'Март' =>'марта', + 'Апрель' =>'апреля', 'Май' =>'мая', 'Июнь' =>'июня', + 'Июль' =>'июля', 'Август' =>'августа', 'Сентябрь'=>'сентября', + 'Октябрь' =>'октября', 'Ноябрь' =>'ноября', 'Декабрь' =>'декабря', + + 'воскресенье'=>'Воскресенье', 'понедельник'=>'Понедельник', 'вторник' =>'Вторник', + 'среда' =>'Среда', 'четверг' =>'Четверг', 'пятница' =>'Пятница', + 'суббота' =>'Суббота' + ); + break; + + case 'ua': + case 'uk': + $pretty = array( + 'Січень' =>'січня', 'Лютий' =>'лютого', 'Березень'=>'березня', + 'Квітень'=>'квітня', 'Травень' =>'травня', 'Червень' =>'червня', + 'Липень' =>'липня', 'Серпень' =>'серпня', 'Вересень'=>'вересня', + 'Жовтень'=>'жовтня', 'Листопад' =>'листопада', 'Грудень' =>'грудня', + + 'неділя' =>'Неділя', 'понеділок'=>'Понеділок', 'вівторок'=>'Вівторок', + 'середа' =>'Середа', 'четвер' =>'Четвер', 'п’ятниця'=>'П’ятниця', + 'субота' =>'Субота' + ); + break; + } + + return (isset($pretty) + ? strtr($string, $pretty) + : $string); + } + + + /** + * Функция перевода даты с en на ru + * + * @param string $data данные + * @return string + */ + function translate_date($data) + { + $language = (defined('ACP') && ACP) + ? $_SESSION['admin_language'] + : $_SESSION['user_language']; + + $language = strtolower($language); + + switch ($language) + { + default: + case 'ru': + $data = strtr($data, array( + 'January'=>'Января', + 'February'=>'Февраля', + 'March'=>'Марта', + 'April'=>'Апреля', + 'May'=>'Мая', + 'June'=>'Июня', + 'July'=>'Июля', + 'August'=>'Августа', + 'September'=>'Сентября', + 'October'=>'Октября', + 'November'=>'Ноября', + 'December'=>'Декабря', + + 'Jan'=>'Янв', + 'Feb'=>'Фев', + 'Mar'=>'Мрт', + 'Apr'=>'Апр', + 'May'=>'Май', + 'Jun'=>'Июн', + 'Jul'=>'Июл', + 'Aug'=>'Авг', + 'Sep'=>'Сен', + 'Oct'=>'Окт', + 'Nov'=>'Нбр', + 'Dec'=>'Дек', + + 'Monday'=>'Понедельник', + 'Tuesday'=>'Вторник', + 'Wednesday'=>'Среда', + 'Thursday'=>'Четверг', + 'Friday'=>'Пятница', + 'Saturday'=>'Суббота', + 'Sunday'=>'Воскресенье', + + 'Mon'=>'Пн', + 'Tue'=>'Вт', + 'Wed'=>'Ср', + 'Thu'=>'Чт', + 'Fri'=>'Пт', + 'Sat'=>'Сб', + 'Sun'=>'Вс' + )); + break; + + + case 'ua': + case 'uk': + $data = strtr($data, array( + 'January'=>'Січня', + 'February'=>'Лютого', + 'March'=>'Березня', + 'April'=>'Квітня', + 'May'=>'Травня', + 'June'=>'Червня', + 'July'=>'Липня', + 'August'=>'Серпня', + 'September'=>'Вересня', + 'October'=>'Жовтня', + 'November'=>'Листопада', + 'December'=>'Грудня', + + 'Jan'=>'Січ', + 'Feb'=>'Лют', + 'Mar'=>'Бер', + 'Apr'=>'Кві', + 'May'=>'Тра', + 'Jun'=>'Чер', + 'Jul'=>'Лип', + 'Aug'=>'Сер', + 'Sep'=>'Вер', + 'Oct'=>'Жов', + 'Nov'=>'Лис', + 'Dec'=>'Гру', + + 'Monday'=>'Понеділок', + 'Tuesday'=>'Вівторок', + 'Wednesday'=>'Середа', + 'Thursday'=>'Четвер', + 'Friday'=>'П’ятниця', + 'Saturday'=>'Субота', + 'Sunday'=>'Неділя', + + 'Mon'=>'Пн', + 'Tue'=>'Вт', + 'Wed'=>'Ср', + 'Thu'=>'Чт', + 'Fri'=>'Пт', + 'Sat'=>'Сб', + 'Sun'=>'Нд' + )); + break; + + case 'bg': + $data = strtr($data, array( + 'January'=>'Януари', + 'February'=>'Февруари', + 'March'=>'Март', + 'April'=>'Април', + 'May'=>'Май', + 'June'=>'Юни', + 'July'=>'Юли', + 'August'=>'Август', + 'September'=>'Септември', + 'October'=>'Октомври', + 'November'=>'Нември', + 'December'=>'Декември', + + 'Jan'=>'Яну', + 'Feb'=>'Фев', + 'Mar'=>'Мрт', + 'Apr'=>'Апр', + 'May'=>'Май', + 'Jun'=>'Юни', + 'Jul'=>'Юли', + 'Aug'=>'Авг', + 'Sep'=>'Сеп', + 'Oct'=>'Окт', + 'Nov'=>'Ное', + 'Dec'=>'Дек', + + 'Monday'=>'Понеделник', + 'Tuesday'=>'Вторник', + 'Wednesday'=>'Сряда', + 'Thursday'=>'Четвъртък', + 'Friday'=>'Петък', + 'Saturday'=>'Събота', + 'Sunday'=>'Неделя', + + 'Mon'=>'Пн', + 'Tue'=>'Вт', + 'Wed'=>'Ср', + 'Thu'=>'Чт', + 'Fri'=>'Пт', + 'Sat'=>'Сб', + 'Sun'=>'Нд' + )); + break; + } + + return $data; + } + + + /** + * Подготовка имени файла или директории + * + * @param string $st + * @return string + */ + function prepare_fname($st) + { + $st = strip_tags($st); + + $st = strtr($st,'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯ', + 'abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщьъыэюя'); + + $st = translit_string(trim($st)); + + $st = preg_replace(array('/[^a-z0-9_-]/', '/--+/'), '-', $st); + + return trim($st, '-'); + } + + + /** + * Отображение даты в фармате + * 25 дней/минут/секунд назад + * и т.д. + * + * @param string $date (TIMESTAMP) + * @return string + */ + function human_date($date) + { + $stf = 0; + $cur_time = time(); + $diff = $cur_time - $date; + + $language = (defined('ACP') && ACP) + ? $_SESSION['admin_language'] + : $_SESSION['user_language']; + + $language = strtolower($language); + + switch ($language) + { + default: + case 'ru': + $seconds = array('секунда', 'секунды', 'секунд'); + $minutes = array('минута', 'минуты', 'минут'); + $hours = array('час', 'часа', 'часов'); + $days = array('день', 'дня', 'дней'); + $weeks = array('неделя', 'недели', 'недель' ); + $months = array('месяц', 'месяца', 'месяцев'); + $years = array('год', 'года', 'лет'); + $decades = array('десятилетие', 'десятилетия', 'десятилетий'); + $ago = 'назад'; + break; + + case 'ua': + case 'uk': + $seconds = array('секунда', 'секунди', 'секунд'); + $minutes = array('хвилина', 'хвилини', 'хвилин'); + $hours = array('година', 'години', 'годин'); + $days = array('день', 'дня', 'днів'); + $weeks = array('тиждень', 'тижня', 'тижнів' ); + $months = array('месяць', 'місяця', 'місяців'); + $years = array('рік', 'року', 'років'); + $decades = array('десятиріччя', 'десятиріччя', 'десятиріч'); + $ago = 'назад'; + break; + + case 'en': + $seconds = array('second', 'seconds', 'seconds'); + $minutes = array('minute', 'minutes', 'minutes'); + $hours = array('hour', 'hours', 'hours'); + $days = array('day', 'days', 'days'); + $weeks = array('week', 'weeks', 'weeks' ); + $months = array('month', 'months', 'months'); + $years = array('year', 'years', 'years'); + $decades = array('decade', 'decades', 'decades'); + $ago = 'ago'; + break; + } + + $phrase = array($seconds, $minutes, $hours, $days, $weeks, $months, $years, $decades); + + $length = array(1, 60, 3600, 86400, 604800, 2630880, 31570560, 315705600); + + for ($i = sizeof($length) - 1; ($i >= 0) && (($no = $diff / $length[ $i ]) <= 1 ); $i --) + { + ; + } + + if ($i < 0) + { + $i = 0; + } + + $_time = $cur_time - ($diff % $length[$i]); + + $no = floor($no); + + $value = sprintf("%d %s ", $no, date_phrase($no, $phrase[$i])); + + if (($stf == 1) && ($i >= 1) && (($cur_time - $_time) > 0)) + { + $value .= time_ago($_time); + } + + return $value . $ago; + } + + + function date_phrase($number, $titles) + { + $cases = array( 2, 0, 1, 1, 1, 2 ); + + return $titles[($number % 100 > 4 && $number % 100 < 20) + ? 2 + : $cases[min($number % 10, 5)]]; + } +?> \ No newline at end of file diff --git a/functions/func.login.php b/functions/func.login.php new file mode 100644 index 0000000..6dddd80 --- /dev/null +++ b/functions/func.login.php @@ -0,0 +1,346 @@ +Query(" + SELECT + usr.Id, + usr.user_group, + usr.user_name, + usr.firstname, + usr.lastname, + usr.email, + usr.country, + usr.password, + usr.salt, + usr.status, + grp.user_group_permission + FROM + " . PREFIX . "_users AS usr + LEFT JOIN + " . PREFIX . "_user_groups AS grp + ON grp.user_group = usr.user_group + WHERE + email = '" . $login . "' + OR + user_name = '" . $login . "' + LIMIT 1 + ")->FetchRow(); + + if (! (isset($row->password) && $row->password == md5(md5($password . $row->salt)))) + return 2; + + if ($row->status != '1') + return 3; + + $salt = make_random_string(); + + $hash = md5(md5($password . $salt)); + + $time = time(); + + $u_ip = ($attach_ip == 1) + ? ip2long($_SERVER['REMOTE_ADDR']) + : 0; + + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_users + SET + last_visit = '" . $time . "', + password = '" . $hash . "', + salt = '" . $salt . "', + user_ip = '" . $u_ip . "' + WHERE + Id = '" . $row->Id . "' + "); + + $_SESSION['user_id'] = $row->Id; + $_SESSION['user_name'] = get_username($row->user_name, $row->firstname, $row->lastname); + $_SESSION['user_firstname'] = $row->firstname; + $_SESSION['user_lastname'] = $row->lastname; + $_SESSION['user_pass'] = $hash; + $_SESSION['user_group'] = $row->user_group; + $_SESSION['user_email'] = $row->email; + $_SESSION['user_country'] = strtoupper($row->country); + $_SESSION['user_language'] = strtolower($row->country); + $_SESSION['user_ip'] = addslashes($_SERVER['REMOTE_ADDR']); + + $user_group_permissions = explode('|', preg_replace('/\s+/', '', $row->user_group_permission)); + + foreach ($user_group_permissions as $user_group_permission) + $_SESSION[$user_group_permission] = 1; + + if ($keep_in == 1) + { + $expire = $time + COOKIE_LIFETIME; + + $auth = md5($_SERVER['HTTP_USER_AGENT'].md5($row->Id)); + + $sql = " + DELETE FROM + " . PREFIX . "_users_session + WHERE + `hash`='" . addslashes($auth) . "'"; + + $AVE_DB->Query($sql); + + $sql = " + INSERT INTO + " . PREFIX . "_users_session + (`user_id`,`hash`,`ip`,`agent`,`last_activ`) + values + ('" . $row->Id . "','" . addslashes($auth) . "','" . $u_ip . "','" . addslashes($_SERVER['HTTP_USER_AGENT']) . "','" . time() . "') + "; + + $AVE_DB->Query($sql); + + @setcookie('auth', $auth, $expire, ABS_PATH, $cookie_domain); + } + + unset($row, $user_group_permissions, $sql); + + return true; + } + + /** + * Logout + */ + function user_logout() + { + global $cookie_domain; + + // уничтожаем куку + @setcookie('auth', '', 0, ABS_PATH, $cookie_domain); + + // уничтожаем сессию + @session_destroy(); + session_unset(); + $_SESSION = array(); + } + + + /** + * Авторизация Session + * + * @return bool + */ + function auth_sessions() + { + global $AVE_DB; + + if (empty($_SESSION['user_id']) || empty($_SESSION['user_pass'])) + return false; + + $referer = false; + + if (isset($_SERVER['HTTP_REFERER'])) + { + $referer = parse_url($_SERVER['HTTP_REFERER']); + $referer = (trim($referer['host']) === $_SERVER['SERVER_NAME']); + } + + // Если не наш REFERER или изменился IP-адрес + // сверяем данные сессии с данными базы данных + if ($referer === false || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR']) + { + $verified = $AVE_DB->Query(" + SELECT 1 + FROM + " . PREFIX . "_users + WHERE + Id = '" . (int)$_SESSION['user_id'] . "' + AND + password = '" . addslashes($_SESSION['user_pass']) . "' + LIMIT 1 + ")->NumRows(); + + if (! $verified) + return false; + + $_SESSION['user_ip'] = addslashes($_SERVER['REMOTE_ADDR']); + } + + define('UID', $_SESSION['user_id']); + define('UGROUP', $_SESSION['user_group']); + define('UNAME', $_SESSION['user_name']); + + return true; + } + + + /** + * Авторизация Coockie + * + * @return bool + */ + function auth_cookie() + { + global $AVE_DB, $cookie_domain; + + if (empty($_COOKIE['auth'])) + return false; + + $sql = " + SELECT + user_id + FROM + " . PREFIX . "_users_session + WHERE + hash = '" . addslashes($_COOKIE['auth']) . "' + AND + agent = '" . addslashes($_SERVER['HTTP_USER_AGENT']) . "' + "; + + $user_id = $AVE_DB->Query($sql)->GetCell(); + + if ((int)$user_id == 0) + { + @setcookie('auth', '', 0, ABS_PATH, $cookie_domain); + return false; + } + + $row = $AVE_DB->Query(" + SELECT + usr.user_group, + usr.user_name, + usr.firstname, + usr.lastname, + usr.email, + usr.country, + usr.password, + usr.status, + usrs.ip AS ip, + grp.user_group_permission + FROM + " . PREFIX . "_users AS usr + LEFT JOIN + " . PREFIX . "_user_groups AS grp + ON grp.user_group = usr.user_group + LEFT JOIN + " . PREFIX . "_users_session AS usrs + ON usr.Id = usrs.user_id + WHERE + usr.Id = '" . $user_id . "' + AND + usrs.hash = '" . $_COOKIE['auth'] . "' + LIMIT 1 + ")->FetchRow(); + + if (empty($row)) + return false; + + $row->ip = long2ip($row->ip); + + if (USER_IP) + { + if (($row->ip !== '0.0.0.0' && $row->ip !== $_SERVER['REMOTE_ADDR'])) + { + $sql = " + DELETE FROM + " . PREFIX . "_users_session + WHERE + hash = '" . addslashes($_COOKIE['auth']) . "'"; + + $AVE_DB->Query($sql); + } + + @setcookie('auth', '', 0, ABS_PATH, $cookie_domain); + return false; + } + + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_users_session + SET + last_activ = '" . time() . "', + ip = '" . ip2long($_SERVER['REMOTE_ADDR']) . "' + WHERE + Id = '" . $row->Id . "' + "); + + $_SESSION['user_id'] = (int)$user_id; + $_SESSION['user_name'] = get_username($row->user_name, $row->firstname, $row->lastname); + $_SESSION['user_firstname'] = $row->firstname; + $_SESSION['user_lastname'] = $row->lastname; + $_SESSION['user_pass'] = $row->password; + $_SESSION['user_group'] = (int)$row->user_group; + $_SESSION['user_email'] = $row->email; + $_SESSION['user_country'] = strtoupper($row->country); + $_SESSION['user_language'] = strtolower($row->country); + $_SESSION['user_ip'] = addslashes($_SERVER['REMOTE_ADDR']); + + $user_group_permissions = explode('|', preg_replace('/\s+/', '', $row->user_group_permission)); + + foreach ($user_group_permissions as $user_group_permission) + $_SESSION[$user_group_permission] = 1; + + define('UID', $_SESSION['user_id']); + define('UGROUP', $_SESSION['user_group']); + define('UNAME', $_SESSION['user_name']); + + return true; + } + + + /** + * Удаление профиля пользователя на сайте + * + * @param string $user_id идентификатор пользователя + */ + function user_delete($user_id) + { + global $AVE_DB; + + if ($user_id == 1) + return false; + + $AVE_DB->Query(" + DELETE + FROM + " . PREFIX . "_users + WHERE + Id = '" . $user_id . "' + "); + } + +?> \ No newline at end of file diff --git a/functions/func.logs.php b/functions/func.logs.php new file mode 100755 index 0000000..2cf3b11 --- /dev/null +++ b/functions/func.logs.php @@ -0,0 +1,107 @@ +'.file_get_contents($logfile).'time(), + 'log_ip' =>$_SERVER['REMOTE_ADDR'], + 'log_url' =>$_SERVER['QUERY_STRING'], + 'log_user_id' =>(isset($_SESSION['user_id']) ? $_SESSION['user_id'] : '0'), + 'log_user_name' =>(isset($_SESSION['user_name']) ? $_SESSION['user_name'] : 'Anonymous'), + 'log_text' =>$message, + 'log_type' =>(int)$typ, + 'log_rubric' =>(int)$rub + ); + $messlimit = 1000; + $logdata = array_slice($logdata,-1*$messlimit); + file_put_contents($logfile,''); +} + +/** + * Запись события в лог для Sql ошибок + * + * @param string $message Текст сообщения + * @return + */ +function reportSqlLog($message) +{ + $logsql = array(); + + $logfile = BASE_DIR . '/cache/sql.php'; + + if(file_exists($logfile)) + @eval('?>'.file_get_contents($logfile).'time(), + 'log_ip' =>$_SERVER['REMOTE_ADDR'], + 'log_url' =>$_SERVER['QUERY_STRING'], + 'log_user_id' =>$_SESSION['user_id'], + 'log_user_name' =>$_SESSION['user_name'], + 'log_text' =>$message + ); + + $messlimit = 1000; + + $logsql = array_slice($logsql,-1*$messlimit); + + file_put_contents($logfile, ''); +} + +/** + * Запись события в лог для 404 ошибок + * + * @param string $message Текст сообщения + * @return + */ +function report404() +{ + $log404 = array(); + + $logfile = BASE_DIR . '/cache/404.php'; + + if(file_exists($logfile)) + @include($logfile); + + $log404[] = array( + 'log_time' => time(), + 'log_ip' => @$_SERVER['REMOTE_ADDR'], + 'log_query' => @$_SERVER['QUERY_STRING'], + 'log_user_agent' => @$_SERVER['HTTP_USER_AGENT'], + 'log_user_referer' => (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''), + 'log_request_uri' => @$_SERVER['REQUEST_URI'] + ); + + $messlimit = 1000; + + $log404 = array_slice($log404, -1*$messlimit); + + file_put_contents($logfile,''); +} + +?> \ No newline at end of file diff --git a/functions/func.mail.php b/functions/func.mail.php new file mode 100644 index 0000000..bcfc7f5 --- /dev/null +++ b/functions/func.mail.php @@ -0,0 +1,250 @@ +
      ' . nl2br(get_settings('mail_signature')); + } + else + { + $signature = "\r\n\r\n" . get_settings('mail_signature'); + } + } + else $signature = ''; + + // Составляем тело письма + $body = stripslashes($body) . $signature; + + if ($type == 'text/html') + { + $body = str_replace(array("\t","\r","\n"),'',$body); + $body = str_replace(array(' ','> <'),array(' ','><'),$body); + } + + // Формируем письмо + $message = Swift_Message::newInstance($subject) + -> setFrom(array($from_email => $from_name)) + -> setTo($to) + -> setContentType($type) + -> setBody($body) + -> setMaxLineLength((int)get_settings('mail_word_wrap')); + + // Прикрепляем вложения + if ($attach) + { + foreach ($attach as $attach_file) + { + $message -> attach(Swift_Attachment::fromPath(trim($attach_file))); + } + } + + // Выбираем метод отправки и формируем транспорт + switch (get_settings('mail_type')) + { + default: + case 'mail': + $transport = Swift_MailTransport::newInstance(); + break; + + case 'smtp': + $transport = Swift_SmtpTransport::newInstance(stripslashes(get_settings('mail_host')), (int)get_settings('mail_port')); + + // Добавляем шифрование + $smtp_encrypt = get_settings('mail_smtp_encrypt'); + if($smtp_encrypt) + $transport + ->setEncryption(strtolower(stripslashes($smtp_encrypt))); + + // Имя пользователя/пароль + $smtp_user = get_settings('mail_smtp_login'); + $smtp_pass = get_settings('mail_smtp_pass'); + if($smtp_user) + $transport + ->setUsername(stripslashes($smtp_user)) + ->setPassword(stripslashes($smtp_pass)); + break; + + case 'sendmail': + $transport = Swift_SendmailTransport::newInstance(get_settings('mail_sendmail_path')); + break; + } + + // Сохраняем вложения в ATTACH_DIR, если просили + if ($attach && $saveattach) + { + $attach_dir = BASE_DIR . '/' . ATTACH_DIR . '/'; + foreach ($attach as $file_path) + { + if ($file_path && file_exists($file_path)) + { + $file_name = basename($file_path); + $file_name = str_replace(' ','',mb_strtolower(trim($file_name))); + if (file_exists($attach_dir . $file_name)) + { + $file_name = rand(1000, 9999) . '_' . $file_name; + } + $file_path_new = $attach_dir . $file_name; + if (!@move_uploaded_file($file_path,$file_path_new)) + { + copy($file_path,$file_path_new); + } + } + } + } + + // Отправляем письмо + /** @var $transport TYPE_NAME */ + $mailer = Swift_Mailer::newInstance($transport); + + if (!@$mailer -> send($message, $failures)) + { + reportLog('Не удалось отправить письма следующим адресатам: ' . implode(',',$failures)); + return $failures; + } + + } +} + +if ( ! function_exists('safe_mailto')) +{ + function safe_mailto($email, $title = '', $attributes = '') + { + $title = (string) $title; + + if ($title == "") + { + $title = $email; + } + + for ($i = 0; $i < 16; $i++) + { + $x[] = substr(' $val) + { + $x[] = ' '.$key.'="'; + for ($i = 0; $i < strlen($val); $i++) + { + $x[] = "|".ord(substr($val, $i, 1)); + } + $x[] = '"'; + } + } + else + { + for ($i = 0; $i < strlen($attributes); $i++) + { + $x[] = substr($attributes, $i, 1); + } + } + } + + $x[] = '>'; + + $temp = array(); + + for ($i = 0; $i < strlen($title); $i++) + { + $ordinal = ord($title[$i]); + + if ($ordinal < 128) + { + $x[] = "|".$ordinal; + } + else + { + if (count($temp) == 0) + { + $count = ($ordinal < 224) ? 2 : 3; + } + + $temp[] = $ordinal; + if (count($temp) == $count) + { + $number = ($count == 3) ? (($temp['0'] % 16) * 4096) + (($temp['1'] % 64) * 64) + ($temp['2'] % 64) : (($temp['0'] % 32) * 64) + ($temp['1'] % 64); + $x[] = "|".$number; + $count = 1; + $temp = array(); + } + } + } + + $x[] = '<'; $x[] = '/'; $x[] = 'a'; $x[] = '>'; + + $x = array_reverse($x); + ob_start(); + + ?> \ No newline at end of file diff --git a/functions/func.modulglobals.php b/functions/func.modulglobals.php new file mode 100644 index 0000000..eb2b1db --- /dev/null +++ b/functions/func.modulglobals.php @@ -0,0 +1,71 @@ + + * tpl_dir путь к папке с шаблонами модуля + * theme_folder имя папки с файлами дизайна + * config_vars массив с языковыми переменными модуля + * + * Формирует и передаёт в шаблонизатор: + *

      + *      $tpl_dir     путь к папке с шаблонами модуля
      + *      $mod_dir     имя папки с модулями
      + *      $config_vars массив с языковыми переменными модуля
      + * 
      + * Регистрирует в шаблонизаторе функцию in_array + * + * @param string $modulepath имя папки модуля + * @param string $lang_section секция языкового файла + */ +function set_module_globals($modulepath, $lang_section = false) +{ + global $mod, $AVE_Template; + + $tpl_dir = BASE_DIR . '/modules/' . $modulepath . '/templates/'; + $lang_file = BASE_DIR . '/modules/' . $modulepath . '/lang/' . $_SESSION['user_language'] . '.txt'; + + if (!file_exists($lang_file)) + { + $lang_file = BASE_DIR . '/modules/' . $modulepath . '/lang/ru.txt'; + } + + if (!file_exists($lang_file)) + { + display_notice('Ошибка! Отсутствует языковой файл. Пожалуйста, проверьте язык, установленный по умолчанию, в файле '.ABS_PATH.'inc/config.php'); + exit; + } + + if ($lang_section === false) + { + $AVE_Template->config_load($lang_file); + } + else + { + $AVE_Template->config_load($lang_file, $lang_section); + } + $config_vars = $AVE_Template->get_config_vars(); + + $AVE_Template->assign('tpl_dir', $tpl_dir); + $AVE_Template->assign('mod_dir', BASE_DIR . '/modules'); + $AVE_Template->assign('config_vars', $config_vars); + + $mod['tpl_dir'] = $tpl_dir; + $mod['theme_folder'] = defined('THEME_FOLDER') ? THEME_FOLDER : DEFAULT_THEME_FOLDER; + $mod['config_vars'] = $config_vars; + + $AVE_Template->register_function('in_array', 'in_array'); +} + +?> \ No newline at end of file diff --git a/functions/func.navigation.php b/functions/func.navigation.php new file mode 100644 index 0000000..1fd5525 --- /dev/null +++ b/functions/func.navigation.php @@ -0,0 +1,497 @@ +user_group)) + return false; + + // Находим активный пункт (связь текущего открытого документа и навигации). Нас интересуют: + // 1) документы, которые сами связаны с пунктом меню + // 2) пункты навигации, у которых ссылка совпадает с алиасом дока + // 3) текущий level, текущий id + // возвращаем в $navi_active через запятую id пунктов: + // 1) активный пункт + // 2) родители активного пункта + // после ; через запятую все level-ы текущего пути, чтобы потом взять max + // после ; id текущего пункта + + // id текущего документа. Если не задан, то главная страница + $doc_active_id = (int)(($_REQUEST['id']) ? $_REQUEST['id'] : 1); + + // алиас текущего документа + $alias = ltrim(isset($AVE_Core->curentdoc->document_alias) ? $AVE_Core->curentdoc->document_alias : ''); + + // запрос для выборки по текущему алиасу + $sql_doc_active_alias = ''; + + if ($AVE_Core->curentdoc->Id == $doc_active_id) + { + $sql_doc_active_alias = " + OR nav.alias = '" . $alias . "' + OR nav.alias = '/" . $alias . "' + OR nav.alias = '" . $alias . URL_SUFF . "' + OR nav.alias = '/" . $alias . URL_SUFF . "' + "; + } + + $navi_active = $AVE_DB->Query(" + SELECT CONCAT_WS( + ';', + CONCAT_WS(',', nav.navigation_item_id, nav.parent_id, nav2.parent_id), + CONCAT_WS(',', nav.level), + nav.navigation_item_id + ) + FROM + " . PREFIX . "_navigation_items AS nav + JOIN + " . PREFIX . "_documents AS doc + LEFT JOIN + " . PREFIX . "_navigation_items AS nav2 + ON + nav2.navigation_item_id = nav.parent_id + WHERE + nav.status = 1 + AND + nav.navigation_id = '" . $navi_menu->navigation_id . "' + AND + doc.Id = " . $doc_active_id . " + AND ( + nav.document_id = '" . $doc_active_id . "'" . + $sql_doc_active_alias . " + OR + nav.navigation_item_id = doc.document_linked_navi_id + ) + ")->GetCell(); + + $navi_active = @explode(';', $navi_active); + + // готовим 2 переменные с путём + if ($navi_active[0]) + $navi_active_way = @explode(',', $navi_active[0]); + + $navi_active_way[] = '0'; + + $navi_active_way_str = implode(',', $navi_active_way); + + // текущий уровень + $navi_active_level = (int)max(@explode(',', (isset($navi_active[1]) + ? (int)$navi_active[1] + : 0)))+1; + + // текущий id + $navi_active_id = (isset($navi_active[2]) + ? (int)$navi_active[2] + : 0); + + // если просят вывести какие-то конкретные уровни: + $sql_navi_level = ''; + $sql_navi_active = ''; + + if($navi_print_level) + { + $sql_navi_level = ' AND level IN (' . $navi_print_level . ') '; + $sql_navi_active = ' AND parent_id IN(' . $navi_active_way_str . ') '; + } + + // обычное использование навигации + else + { + switch ($navi_menu->expand_ext) + { + // все уровни + case 1: + $navi_parent = 0; + break; + + // текущий и родительский уровни + case 0: + $sql_navi_active = ' AND parent_id IN(' . $navi_active_way_str . ') '; + $navi_parent = 0; + break; + + // только текущий уровень + case 2: + $sql_navi_level = ' AND level = ' . $navi_active_level . ' '; + $navi_parent = $navi_active_id; + break; + } + } + + + $cache_items = BASE_DIR . '/cache/sql/nav/items-' . $navi_id . '.cache'; + + $navi_items = array(); + + //-- Проверяем есть файл кеша, если есть пропускам запрос к БД + if(! file_exists($cache_items)) + { + //-- Запрос пунктов меню + $sql = " + SELECT * + FROM + " . PREFIX . "_navigation_items + WHERE + status = '1' + AND + navigation_id = '" . $navi_menu->navigation_id . "'" . + $sql_navi_level . + $sql_navi_active . " + ORDER BY + position ASC + "; + + $sql_navi_items = $AVE_DB->Query($sql); + + while ($row_navi_items = $sql_navi_items->FetchAssocArray()) + { + $navi_items[$row_navi_items['parent_id']][] = $row_navi_items; + } + + file_put_contents($cache_items, serialize($navi_items)); + } + else + { + $navi_items = unserialize(file_get_contents($cache_items)); + } + + if($navi_print_level) + { + $keys = array_keys($navi_items); + $navi_parent = ! empty($keys) + ? $keys[0] + : 0; + } + + // Парсим теги в шаблонах пунктов + $navi_item_tpl = array( + 1 => array( + 'inactive' => $navi_menu->level1, + 'active' => $navi_menu->level1_active + ), + 2 => array( + 'inactive' => $navi_menu->level2, + 'active' => $navi_menu->level2_active + ), + 3 => array( + 'inactive' => $navi_menu->level3, + 'active' => $navi_menu->level3_active + ) + ); + + // запускаем рекурсивную сборку навигации + if ($navi_items) + $navi = printNavi($navi_menu, $navi_items, $navi_active_way, $navi_item_tpl, $navi_parent); + + // преобразуем все ссылке в коде + $navi = rewrite_link($navi); + + // удаляем переводы строк и табуляции + $navi = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $navi); + $navi = str_replace(array("\n","\r"),'',$navi); + + $gen_time = microtime(true) - $gen_time; + $GLOBALS['block_generate'][] = array('NAVIGATION_' . $navi_id => $gen_time); + + return $navi; + } + + + /** + * Рекурсивная функция для формирования меню навигации + * + * @param object $navi_menu меню (шаблоны, параметры) + * @param array $navi_items (пункты по родителям) + * @param array $navi_active_way ("активный путь") + * @param array $navi_item_tpl (шаблоны пунктов) + * @param int $parent (исследуемый родитель, изначально 0 - верхний уровень) + * @return string $navi - готовый код навигации + */ + function printNavi($navi_menu, $navi_items, $navi_active_way, $navi_item_tpl, $parent = 0) + { + // выясняем уровень + $navi_item_level = $navi_items[$parent][0]['level']; + + // собираем каждый пункт в данном родителе -> в переменной $item + + $x = 0; + $items_count = count($navi_items[$parent]); + + foreach ($navi_items[$parent] as $row) + { + $x++; + $last_item = ($x == $items_count ? true : false); + $item_num = $x; + + // Проверяем пункт меню на принадлежность к "активному пути" и выбираем шаблон + $item = (in_array($row['navigation_item_id'], $navi_active_way)) ? $navi_item_tpl[$navi_item_level]['active'] : $navi_item_tpl[$navi_item_level]['inactive']; + + ################### ПАРСИМ ТЕГИ ################### + // id + @$item = str_replace('[tag:linkid]', $row['navigation_item_id'], $item); + // название + @$item = str_replace('[tag:linkname]', $row['title'], $item); + //Путь + $item = str_replace('[tag:path]', ABS_PATH, $item); + // ссылка + if ($row['document_id']) + { + //запрещаем слешь в конце ссылки + //$item = str_replace('[tag:link]', 'index.php?id=' . $row['document_id'] . "&doc=" . ((!$row['alias']) ? prepare_url($row['title']) : trim($row['alias'], '/')), $item); + //разрешаем слешь в конце ссылки + $item = str_replace('[tag:link]', 'index.php?id=' . $row['document_id'] . "&doc=" . ((!$row['alias']) ? prepare_url($row['title']) : trim($row['alias'])), $item); + + $item = str_ireplace('"//"', '"/"', str_ireplace('///', '/', rewrite_link($item))); + } + else + { + $item = str_replace('[tag:link]', $row['alias'], $item); + } + + if (start_with('www.', $row['alias'])) + $item = str_replace('www.', 'http://www.', $item); + + // target + $item = str_replace('[tag:target]', $row['target'], $item); + // описание + @$item = str_replace('[tag:desc]', stripslashes($row['description']), $item); + // изображение + @$item = str_replace('[tag:img]', stripslashes($row['image']), $item); + + if ($row['image'] != '') + { + @$img = explode(".", $row['image']); + @$row['image_act'] = $img[0]."_act.".$img[1]; + @$item = str_replace('[tag:img_act]', stripslashes($row['image_act']), $item); + } + + if ($row['css_id'] != '') + { + @$item = str_replace('[tag:css_id]', stripslashes($row['css_id']), $item); + } + else + { + @$item = str_replace('[tag:css_id]', '', $item); + } + + if ($row['css_class'] != '') + { + @$item = str_replace('[tag:css_class]', stripslashes($row['css_class']), $item); + } + else + { + @$item = str_replace('[tag:css_class]', '', $item); + } + + if ($row['css_style'] != '') + { + @$item = str_replace('[tag:css_style]', stripslashes($row['css_style']), $item); + } + else + { + @$item = str_replace('[tag:css_style]', '', $item); + } + + $item = '<'.'?php $item_num='.var_export($item_num,1).'; $last_item='.var_export($last_item,1).'?'.'>'.$item; + $item = str_replace('[tag:if_first]', '<'.'?php if(isset($item_num) && $item_num===1) { ?'.'>', $item); + $item = str_replace('[tag:if_not_first]', '<'.'?php if(isset($item_num) && $item_num!==1) { ?'.'>', $item); + $item = str_replace('[tag:if_last]', '<'.'?php if(isset($last_item) && $last_item) { ?'.'>', $item); + $item = str_replace('[tag:if_not_last]', '<'.'?php if(isset($item_num) && !$last_item) { ?'.'>', $item); + $item = preg_replace('/\[tag:if_every:([0-9-]+)\]/u', '<'.'?php if(isset($item_num) && !($item_num % $1)){ '.'?'.'>', $item); + $item = preg_replace('/\[tag:if_not_every:([0-9-]+)\]/u', '<'.'?php if(isset($item_num) && ($item_num % $1)){ '.'?'.'>', $item); + $item = str_replace('[tag:/if]', '<'.'?php } ?>', $item); + $item = str_replace('[tag:if_else]', '<'.'?php }else{ ?>', $item); + + // Удаляем ошибочные теги + @$item = preg_replace('/\[tag:([a-zA-Z0-9-_]+)\]/', '', $item); + + ################### //ПАРСИМ ТЕГИ ################## + + // Определяем тег для вставки следующего уровня + switch ($navi_item_level) + { + case 1 : + $tag = '[tag:level:2]'; + $tag_exist = '[tag:level:2:exist]'; + break; + case 2 : + $tag = '[tag:level:3]'; + $tag_exist = '[tag:level:3:exist]'; + break; + + default: + $tag = ''; + $tag_exist = 0; + } + + // Если есть подуровень, то заново запускаем для него функцию и вставляем вместо тега + if (!empty($navi_items[$row['navigation_item_id']])) + { + $item_sublevel = printNavi($navi_menu, $navi_items, $navi_active_way, $navi_item_tpl, $row['navigation_item_id']); + $item = @str_replace($tag, $item_sublevel, $item); + $item = @str_replace($tag_exist, 1, $item); + + } + // Если нет подуровня, то удаляем тег + else + { + $item = @str_replace(@$tag,'',$item); + $item = @str_replace($tag_exist, 0, $item); + } + + // Подставляем в переменную навигации готовый пункт + if (empty($navi)) + $navi = ''; + + $navi .= $item; + } + + // Вставляем все пункты уровня в шаблон уровня + switch ($navi_item_level) + { + case 1 : + $navi = str_replace("[tag:content]",$navi, $navi_menu->level1_begin); + break; + case 2 : + $navi = str_replace("[tag:content]",$navi, $navi_menu->level2_begin); + break; + case 3 : + $navi = str_replace("[tag:content]",$navi, $navi_menu->level3_begin); + break; + } + + // Возвращаем сформированный уровень + return $navi; + } + + + /** + * Возвращает меню навигации + * + * @param int $id идентификатор меню навигации + * @return string|mixed объект с навигацией по id, либо массив всех навигаций + */ + function get_navigations($id = null) + { + global $AVE_DB; + + $navigations = array(); + + if ($id) + { + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation + WHERE + " . (is_numeric($id) ? 'navigation_id' : 'alias') . " = '" . $id . "' + "); + } + else + { + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_navigation + "); + } + + while ($row = $sql->FetchRow()) + { + $row->user_group = explode(',', $row->user_group); + + if ($id) + $navigations[$id] = $row; + else + $navigations[$row->navigation_id] = $row; + } + + if ($id) + return $navigations[$id]; + else + return $navigations; + } + + + /** + * Проверка прав доступа к навигации по группе пользователя + * + * @param int $id идентификатор меню навигации + * @return boolean + */ + function check_navi_permission($id) + { + $navigation = get_navigations($id); + + if (empty($navigation->user_group)) + return false; + + if (! defined('UGROUP')) + define('UGROUP', 2); + + if (! in_array(UGROUP, $navigation->user_group)) + return false; + + return true; + } +?> \ No newline at end of file diff --git a/functions/func.pagination.php b/functions/func.pagination.php new file mode 100644 index 0000000..8f096e4 --- /dev/null +++ b/functions/func.pagination.php @@ -0,0 +1,141 @@ + 5 && $curent_page > 3) + { + $first = str_replace('data-pagination="{s}"', 'data-pagination="1"', $template_label); + + $nav .= sprintf($link_box, str_replace(array('{s}', '{t}'), $start_label, str_replace(array('&'. $type .'={s}', '&' . $type .'={s}', '/' . $type . '-{s}'), '', $first))); + if ($separator_label != '') + $nav .= sprintf($separator_box, $separator_label); + } + + // Предыдущая + if ($curent_page > 1) + { + if ($curent_page - 1 == 1) + $nav .= sprintf($link_box, str_replace(array('{s}', '{t}'), $prev_label, str_replace(array('&'. $type .'={s}', '&' . $type .'={s}', '/' . $type . '-{s}'), '', $template_label))); + else + $nav .= sprintf($link_box, str_replace('{t}', $prev_label, str_replace('{s}', ($curent_page - 1), $template_label))); + } + + foreach($pages as $val) + { + if ($val >= 1 && $val <= $total_pages) + { + if ($curent_page == $val) + { + // Текущий номер страницы (активная страница) + $nav .= sprintf($link_box, sprintf($active_box, str_replace(array('{s}', '{t}'), $val, $curent_page))); + } + else + { + if ($val == 1) + { + // Страница номер 1 + $nav .= sprintf($link_box, str_replace(array('{s}', '{t}'), $val, str_replace(array('&'.$type.'={s}','&'.$type.'={s}','/'.$type.'-{s}'), '', $template_label))); + } + else + { + // Остальные неактивные номера страниц + $nav .= sprintf($link_box, str_replace(array('{s}', '{t}'), $val, $template_label)); + } + } + } + } + + // Следующая + if ($curent_page < $total_pages) + { + $nav .= sprintf($link_box, str_replace('{t}', $next_label, str_replace('{s}', ($curent_page + 1), $template_label))); + } + + // Последняя + if ($total_pages > 5 && ($curent_page < $total_pages-2)) + { + if ($separator_label != '') + $nav .= sprintf($separator_box, $separator_label); + + $nav .= sprintf($link_box, str_replace('{t}', $end_label, str_replace('{s}', $total_pages, $template_label))); + } + + // Страница ХХХ из ХХХ + if ($nav != '') + { + if ($total_label != '') + $nav = sprintf($total_box, sprintf($total_label, $curent_page, $total_pages)) . $nav; + + // Оборачиваем в общий контейнер + if ($navi_box != '') + $nav = sprintf($navi_box, $nav); + } + + return $nav; +} + +?> \ No newline at end of file diff --git a/functions/func.parserequest.php b/functions/func.parserequest.php new file mode 100755 index 0000000..08e4990 --- /dev/null +++ b/functions/func.parserequest.php @@ -0,0 +1,1083 @@ +Query(" + SELECT * + FROM + " . PREFIX . "_request_conditions + WHERE + request_id = '" . $id . "' + AND + condition_status = '1' + ORDER BY + condition_position ASC + "); + + // Обрабатываем выпадающие списки + + if (! defined('ACP')) + { + $doc = 'doc_' . $AVE_Core->curentdoc->Id; + + if (isset($_POST['req_' . $id])) + $_SESSION[$doc]['req_' . $id] = $_POST['req_' . $id]; + elseif (isset($_SESSION[$doc]['req_' . $id])) + $_POST['req_' . $id] = $_SESSION[$doc]['req_' . $id]; + } + + if (! empty($_POST['req_' . $id]) && is_array($_POST['req_' . $id])) + { + $i = 1; + + foreach ($_POST['req_' . $id] as $fid => $val) + { + if (! ($val != '' && isset($_SESSION['val_' . $fid]) && in_array($val, $_SESSION['val_' . $fid]))) + continue; + + $from_dd[] = "%%PREFIX%%_document_fields AS t0$i, "; + + $where_dd[] = "((t0$i.document_id = a.Id) AND (t0$i.rubric_field_id = $fid AND t0$i.field_value = '$val'))"; + + ++$i; + } + } + + $i = 0; + + while ($row_ak = $sql_ak->FetchRow()) + { + // id поля рубрики + $fid = $row_ak->condition_field_id; + // значение для условия + $val = trim($row_ak->condition_value); + // если это поле используется для выпадающего списка или пустое значение для условия, пропускаем + if (isset($_POST['req_' . $id]) && isset($_POST['req_' . $id][$fid]) || $val==='') + continue; + // И / ИЛИ + if (! isset($join) && $row_ak->condition_join) + $join = $row_ak->condition_join; + // тип сравнения + $type = $row_ak->condition_compare; + + // выясняем, числовое поле или нет + if (! isset($numeric[$fid])) + { + $numeric[$fid] = (bool)$AVE_DB->Query(" + SELECT + rubric_field_numeric + FROM + " . PREFIX . "_rubric_fields + WHERE + Id = '" . $fid . "' + ")->GetCell(); + } + + $fv = $numeric[$fid] ? "t$fid.field_number_value" : "UPPER(t$fid.field_value)"; + + // подставляем название таблицы в свободные условия + $val = addcslashes(str_ireplace(array('[field]','[numeric_field]'),$fv,$val),"'"); + + // формируем выбор таблицы + // первый раз евалом проходим значение и запоминаем это в переменной $v[$i] + // как только таблица выбрана, фиксируем это в $t[$fid], чтобы не выбирать по несколько раз одни и те же таблицы + $from[] = "$val'' && !isset(\$t[$fid])) {echo \"%%PREFIX%%_document_fields AS t$fid,\"; \$t[$fid]=1;}?>"; + + // обрабатываем условия + switch ($type) + { + case 'N<':case '<': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv < UPPER('\$v[$i]'))) $join\" : ''?>"; break; + case 'N>':case '>': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv > UPPER('\$v[$i]'))) $join\" : ''?>"; break; + case 'N<=':case '<=': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv <= UPPER('\$v[$i]'))) $join\" : ''?>"; break; + case 'N>=':case '>=': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv >= UPPER('\$v[$i]'))) $join\" : ''?>"; break; + + case '==': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv = UPPER('\$v[$i]'))) $join\" : ''?>"; break; + case '!=': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv != UPPER('\$v[$i]'))) $join\" : ''?>"; break; + case '%%': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv LIKE UPPER('%\$v[$i]%'))) $join\" : ''?>"; break; + case '%': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv LIKE UPPER('\$v[$i]%'))) $join\" : ''?>"; break; + case '--': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv NOT LIKE UPPER('%\$v[$i]%'))) $join\" : ''?>"; break; + case '!-': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv NOT LIKE UPPER('\$v[$i]%'))) $join\" : ''?>"; break; + + case 'SEGMENT': $where[] = "'' && \$v[$i]{0}!=',' && \$v[$i]['seg'][0] <= \$v[$i]['seg'][1]) ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv >= '\" . \$v[$i]['seg'][0] . \"' AND $fv <= '\" . \$v[$i]['seg'][1] . \"')) $join\" : '');?>"; break; + case 'INTERVAL': $where[] = "'' && \$v[$i]{0}!=',' && \$v[$i]['seg'][0] < \$v[$i]['seg'][1]) ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv > '\" . \$v[$i]['seg'][0] . \"' AND $fv < '\" . \$v[$i]['seg'][1] . \"')) $join\" : '');?>"; break; + + case 'IN=': $where[] = "'' && \$v[$i]{0}!=',') ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv IN (\$v[$i]))) $join\" : ''?>"; break; + case 'NOTIN=': $where[] = "'' && \$v[$i]{0}!=',') ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv NOT IN (\$v[$i]))) $join\" : ''?>"; break; + + case 'ANY': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND $fv=ANY(\$v[$i]))) $join\" : ''?>"; break; + case 'FRE': $where[] = "'' ? \"(t$fid.document_id = a.id AND (t$fid.rubric_field_id = '$fid' AND (\$v[$i]))) $join\" : ''?>"; break; + } + + $i++; + } + + $retval = array(); + + if (! empty($where) || ! empty($where_dd)) + { + if (! empty($where_dd)) + { + $from = (isset($from_dd) ? array_merge($from, $from_dd) : $from); + $from = implode(' ', $from); + $where_dd = (isset($where_dd) ? ' AND ' : '') . implode(' AND ', $where_dd); + $where = implode(' ', $where) . " "; + $retval = array('from'=>$from,'where'=> $where.$where_dd); + } + else + { + $from = implode(' ', $from); + $where = implode(' ', $where) . " "; + $retval = array('from'=>$from,'where'=> $where); + } + } + + // если вызвано из админки или просили обновить, обновляем запрос в бд + if (defined('ACP') || $update_db) + { + $AVE_DB->Query(" + UPDATE + " . PREFIX . "_request + SET + request_where_cond = '" . ($retval ? addslashes(serialize($retval)) : '') . "' + WHERE + Id = '" . $id . "' + "); + } + + return @$retval; +} + + +/* +* Функция принимает строку, и возвращает +* адрес первого изображения, которую найдет +*/ + +function getImgSrc($data) +{ + preg_match_all("/()/u", $data, $images); + + $host = $images[2][0]; + + if (preg_match("/(src=)('|\")(.+?)('|\")/u", $host, $matches) == 1) + $host = $matches[3]; + + preg_match('@/index\.php\?.*thumb=(.*?)\&@i', $host, $matches); + + if (isset($matches[1])) + { + return $matches[1]; + } + else + { + preg_match('/(.+)'.THUMBNAIL_DIR.'\/(.+)-.\d+x\d+(\..+)/u', $host, $matches); + + if (isset($matches[1])) + { + return $matches[1] . $matches[2] . $matches[3]; + } + else + { + return $host; + } + } +} + +/** + * Функция обработки тэгов полей с использованием шаблонов + * в соответствии с типом поля + * + * @param int $rubric_id идентификатор рубрики + * @param int $document_id идентификатор документа + * @param int $maxlength максимальное количество символов обрабатываемого поля + * @return string + */ +function request_get_document_field($field_id, $document_id, $maxlength = '', $rubric_id=0) +{ + if (! is_numeric($document_id) || $document_id < 1) + return ''; + + $document_fields = get_document_fields($document_id); + + if (! is_array($document_fields[$field_id])) + $field_id = intval($document_fields[$field_id]); + + if (empty($document_fields[$field_id])) + return ''; + + $field_value = trim($document_fields[$field_id]['field_value']); + + if ($field_value == '' && $document_fields[$field_id]['tpl_req_empty']) + return ''; + + $func = 'get_field_' . $document_fields[$field_id]['rubric_field_type']; + + if(! is_callable($func)) + $func = 'get_field_default'; + + $field_value = $func($field_value, 'req', $field_id, $document_fields[$field_id]['rubric_field_template_request'], $document_fields[$field_id]['tpl_req_empty'], $maxlength, $document_fields, $rubric_id, $document_fields[$field_id]['rubric_field_default']); + + if ($maxlength != '') + { + if ($maxlength == 'more' || $maxlength == 'esc'|| $maxlength == 'img') + { + if($maxlength == 'more') + { + // ToDo - Вывести в настройки или в настройки самого запроса + $teaser = explode('', $field_value); + $field_value = $teaser[0]; + } + elseif($maxlength == 'esc') + { + $field_value = addslashes($field_value); + } + elseif($maxlength == 'img') + { + $field_value = getImgSrc($field_value); + } + } + elseif (is_numeric($maxlength)) + { + if ($maxlength < 0) + { + $field_value = str_replace(array("\r\n","\n","\r"), " ", $field_value); + $field_value = strip_tags($field_value, ""); + $field_value = preg_replace('/ +/', ' ', $field_value); + $field_value = trim($field_value); + $maxlength = abs($maxlength); + } + // ToDo - сделать настройки окончаний + if ($maxlength != 0) + { + $field_value = mb_substr($field_value, 0, $maxlength) . ((strlen($field_value) > $maxlength) ? '... ' : ''); + } + } + else + return false; + } + + return $field_value; +} + +function showteaser($id, $tparams = '') +{ + $item = showrequestelement($id, '', $tparams); + $item = str_replace('[tag:path]', ABS_PATH, $item); + $item = str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', $item); + + return $item; +} + +// Функция получения уникальных параметров для каждого тизера +function f_params_of_teaser($id_param_array,$num) +{ + global $params_of_teaser; + return $params_of_teaser[$id_param_array][$num]; +} + +// Функция получения элемента запроса +function showrequestelement($mixed, $template = '', $tparams = '') +{ + global $AVE_DB, $req_item_num, $params_of_teaser, $use_cache; + + if (is_array($mixed)) + $mixed = $mixed[1]; + + $row = (is_object($mixed) ? $mixed : $AVE_DB->Query(" + SELECT + a.* + FROM + " . PREFIX . "_documents AS a + WHERE + a.Id = '" . intval($mixed) . "' + GROUP BY + a.Id + LIMIT 1 + ")->FetchRow()); + + if(! $row) + return ''; + + $tparams_id = ''; + + if ($tparams != '') + { + $tparams_id = $row->Id.md5($tparams); // Создаем уникальный id для каждого набора параметров + $params_of_teaser[$tparams_id] = array(); // Для отмены лишних ворнингов + $tparams = trim($tparams,'[]:'); // Удаляем: слева ':[', справа ']' + $params_of_teaser[$tparams_id] = explode('|',$tparams); // Заносим параметры в массив уникального id + } + + $template = ($template > '' ? $template : $AVE_DB->Query( + "SELECT rubric_teaser_template FROM " . PREFIX . "_rubrics WHERE Id='" . intval($row->rubric_id) . "'" + )->GetCell()); + + $cachefile_docid = BASE_DIR . '/cache/sql/request/' . $row->Id . '/request-' . md5($template) . '.cache'; + + if(! file_exists($cachefile_docid)) + { + $template = preg_replace("/\[tag:if_notempty:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/u", '<'.'?php if((htmlspecialchars(request_get_document_field(\'$1\', '.$row->Id.', \'$2\', '.(int)$row->rubric_id.'), ENT_QUOTES)) != \'\') { '.'?'.'>', $template); + $template = preg_replace("/\[tag:if_empty:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/u", '<'.'?php if((htmlspecialchars(request_get_document_field(\'$1\', '.$row->Id.', \'$2\', '.(int)$row->rubric_id.'), ENT_QUOTES)) == \'\') { '.'?'.'>', $template); + $template = str_replace('[tag:if:else]', '', $template); + $template = str_replace('[tag:/if]', '', $template); + + // Парсим теги визуальных блоков + $item = preg_replace_callback('/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_block', $template); + + // Парсим теги системных блоков + $item = preg_replace_callback('/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_sysblock', $item); + + $item = preg_replace_callback( + '/\[tag:rfld:([a-zA-Z0-9-_]+)]\[(more|esc|img|[0-9-]+)]/', + create_function( + '$m', + 'return request_get_document_field($m[1], ' . $row->Id . ', $m[2], ' . (int)$row->rubric_id . ');' + ), + $item + ); + + // Возвращаем поле из БД документа + $item = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + return isset($row->{$match[1]}) + ? $row->{$match[1]} + : null; + }, + $item + ); + + // Если пришел вызов на активацию языковых файлов + $item = preg_replace_callback( + '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + global $AVE_Template; + + return $AVE_Template->get_config_vars($match[1]); + }, + $item + ); + + $item = str_replace('[tag:path]', ABS_PATH, $item); + $item = str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) + ? DEFAULT_THEME_FOLDER + : THEME_FOLDER) + . '/', $item); + + // Watermarks + $item = preg_replace_callback( + '/\[tag:watermark:(.+?):([a-zA-Z]+):([0-9]+)\]/', + create_function( + '$m', + 'watermarks($m[1], $m[2], $m[3]);' + ), + $item + ); + + // Удаляем ошибочные теги полей документа в шаблоне рубрики + $item = preg_replace('/\[tag:doc:\d*\]/', '', $item); + $item = preg_replace('/\[tag:langfile:\d*\]/', '', $item); + + $item = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $item); + + if ($tparams != '') + { + // Заменяем tparam в тизере + // $item = preg_replace('/\[tparam:([0-9]+)\]/', '<'.'?php echo $params_of_teaser["'.$tparams_id.'"][$1]'.'?'.'>', $item); // косячная версия, пока оставил + $item = preg_replace_callback( + '/\[tparam:([0-9]+)\]/', + create_function( + '$m', + 'return f_params_of_teaser('.$tparams_id.', $m[1]);' + ), + $item + ); + } + else + { + // Если чистый запрос тизера, просто вытираем tparam + $item = preg_replace('/\[tparam:([0-9]+)\]/', '', $item); + } + + // Блок для проверки передачи параметров тизеру + /* + if (count($params_of_teaser[$tparams_id])) + { + Debug::echo($params_of_teaser); + Debug::echo($row_Id_mas); + Debug::echo($item, true); + } + */ + + $link = rewrite_link('index.php?id=' . $row->Id . '&doc=' . (empty($row->document_alias) ? prepare_url($row->document_title) : $row->document_alias)); + $item = str_replace('[tag:link]', $link, $item); + $item = str_replace('[tag:docid]', $row->Id, $item); + $item = str_replace('[tag:docitemnum]', $req_item_num, $item); + $item = str_replace('[tag:adminlink]', 'index.php?do=docs&action=edit&rubric_id=' . $row->rubric_id . '&Id=' . $row->Id . '&cp=' . session_id() . '', $item); + $item = str_replace('[tag:doctitle]', stripslashes(htmlspecialchars_decode($row->document_title)), $item); + $item = str_replace('[tag:docparent]', $row->document_parent, $item); + $item = str_replace('[tag:doclang]', $row->document_lang, $item); + $item = str_replace('[tag:docdate]', pretty_date(strftime(DATE_FORMAT, $row->document_published)), $item); + $item = str_replace('[tag:doctime]', pretty_date(strftime(TIME_FORMAT, $row->document_published)), $item); + $item = str_replace('[tag:humandate]', human_date($row->document_published), $item); + $item = preg_replace_callback( + '/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', + create_function('$m','return translate_date(date($m[1], '.$row->document_published.')); + '), + $item + ); + + if (preg_match('/\[tag:docauthor]/u', $item)) + { + $item = str_replace('[tag:docauthor]', get_username_by_id($row->document_author_id), $item); + } + + $item = str_replace('[tag:docauthorid]', $row->document_author_id, $item); + + $item = preg_replace_callback( + '/\[tag:docauthoravatar:(\d+)\]/', + create_function( + '$m', + 'return getAvatar('.intval($row->document_author_id).', $m[1]);' + ), + $item + ); + + if (isset($use_cache) && $use_cache == 1) + { + // Кеширование элементов запроса + if(! file_exists(dirname($cachefile_docid))) + @mkdir(dirname($cachefile_docid), 0777, true); + + file_put_contents($cachefile_docid, $item); + } + } + else + { + $item = file_get_contents($cachefile_docid); + } + + $item = str_replace('[tag:docviews]', $row->document_count_view, $item); + $item = str_replace('[tag:doccomments]', isset($row->nums) ? $row->nums : '', $item); + + unset($row); + + return $item; +} + +/** + * Обработка тега запроса. + * Возвращает список документов удовлетворяющих параметрам запроса + * оформленный с использованием шаблона + * + * @param int $id идентификатор запроса + * @return string + */ +function request_parse($id, $params = array()) +{ + global $AVE_Core, $AVE_DB, $request_documents; + + // Если id пришёл из тега, берём нужную часть массива + if (is_array($id)) + $id = $id[1]; + + $t = array(); + $a = array(); + $v = array(); + + // Получаем информацию о запросе + $request = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_request + WHERE + " . (is_numeric($id) ? 'Id' : 'request_alias') . " = '" . $id . "' + ")->FetchRow(); + + // Выходим, если нет запроса + if (! is_object($request)) + return ''; + + // Фиксируем время начала генерации запроса + Debug::startTime('request_' . $id); + + // Массив для полей SELECT + $request_select = array(); + // Массив для присоединения таблиц JOIN + $request_join = array(); + // Массив для добавления условий WHERE + $request_where = array(); + // Массив для сортировки результатов ORDER BY + $request_order = array(); + // Массив для сортировки результатов ORDER BY + $request_order_fields = array(); + + $request_order_str = ''; + $request_select_str = ''; + + // Сортировка по полям из переданных параметров + if (empty($params['SORT']) && ! empty($_REQUEST['requestsort_' . $id]) && ! is_array($_REQUEST['requestsort_' . $id])) + { + // Разрешаем перебор полей для сортировки через ";" + $sort = explode(';', $_REQUEST['requestsort_'.$id]); + + foreach($sort as $v) + { + $v1 = explode('=', $v); + // Если хотим сортировку DESC то пишем alias = 0 + $params['SORT'][$v1[0]] = (isset($v1[1]) && $v1[1] == 0 + ? 'DESC' + : 'ASC'); + } + } + + // Сортировка по полям + if (! empty($params['SORT']) && is_array($params['SORT'])) + { + foreach($params['SORT'] as $fid => $sort) + { + $fid = (int)get_field_num($request->rubric_id, $fid); + + if ((int)$fid <= 0) + continue; + + $sort = strtolower($sort); + + $request_join[$fid] = ""; + + $asc_desc = strpos(strtolower($sort),'asc') !== false ? 'ASC' : 'DESC'; + + $request_order['field-'.$fid] = "t$fid.field_value " . $asc_desc; + + $request_order_fields[] = $fid; + } + } + // Сортировка по полю из настроек (только если не передана другая в параметрах) + elseif ($request->request_order_by_nat) + { + $fid = (int)$request->request_order_by_nat; + // Добавляем с учётом переменной $t из условий, чтобы не выбирать те же таблиы заново - это оптимизирует время + $request_join[$fid] = ""; + + $request_order['field-' . $fid] = "t$fid.field_value " . $request->request_asc_desc; + $request_order_fields[] = $fid; + } + + // Вторичная сортировка по параметру документа - добавляем в конец сортировок + if (! empty($params['RANDOM'])) + { + $request_order['sort'] = ($params['RANDOM'] == 1) + ? 'RAND()' + : ''; + } + elseif ($request->request_order_by) + { + $request_order['sort'] = ($request->request_order_by == 'RAND()') + ? 'RAND()' + : 'a.' . $request->request_order_by . ' ' . $request->request_asc_desc; + } + + // Заменяем field_value на field_number_value во всех полях для сортировки, если поле числовое + if (! empty($request_order_fields)) + { + $sql_numeric = $AVE_DB->Query(" + SELECT + Id + FROM + " . PREFIX . "_rubric_fields + WHERE + Id IN (" . implode(',', $request_order_fields) . ") + AND + rubric_field_numeric = '1' + "); + + if ($sql_numeric->_result->num_rows > 0) + { + while ($fid = (int)$sql_numeric->FetchRow()->Id) + $request_order['field-' . $fid] = str_replace('field_value','field_number_value', $request_order['field-' . $fid]); + } + } + + // Статус: если в параметрах, то его ставим. иначе выводим только активные доки + $request_where[] = "a.document_status = '" . ((isset($params['STATUS'])) + ? (int)$params['STATUS'] + : '1') . "'"; + + // Не выводить текущий документ + if ($request->request_hide_current) + $request_where[] = "a.Id != '" . get_current_document_id() . "'"; + + // Язык + if ($request->request_lang) + $request_where[] = "a.document_lang = '" . $_SESSION['user_language'] . "'"; + + // Дата публикации документов + if (get_settings('use_doctime')) + $request_where[] = "a.document_published <= UNIX_TIMESTAMP() AND (a.document_expire = 0 OR a.document_expire >= UNIX_TIMESTAMP())"; + + // Условия запроса + // если используется выпадающий список, получаем строку без сохранения + if (! empty($_POST['req_' . $id]) || !empty($_SESSION['doc_' . $AVE_Core->curentdoc->Id]['req_' . $id])) + $where_cond = request_get_condition_sql_string($request->Id, false); + // если условия пустые, получаем строку с сохранением её в бд + elseif (! $request->request_where_cond) + $where_cond = request_get_condition_sql_string($request->Id, true); + // иначе, берём из запроса + else $where_cond = unserialize($request->request_where_cond); + + $where_cond['from'] = (isset($where_cond['from'])) + ? str_replace('%%PREFIX%%', PREFIX, $where_cond['from']) + : ''; + + if (isset($where_cond['where'])) $request_where[] = $where_cond['where']; + + // Родительский документ + if (isset($params['PARENT']) && (int)$params['PARENT'] > 0) + $request_where[] = "a.document_parent = '" . (int)$params['PARENT'] . "'"; + + // Автор + // Если задано в параметрах + if (isset($params['USER_ID'])) + $user_id = (int)$params['USER_ID']; + // Если стоит галка, показывать только СВОИ документы в настройках + // Аноним не увидит ничего, так как 0 юзера нет + elseif ($request->request_only_owner == '1') + $user_id = (int)$_SESSION['user_id']; + + // Если что-то добавили, пишем + if (isset($user_id)) + $request_where[] = "a.document_author_id = '" . $user_id . "'"; + + // Произвольные условия WHERE + if (isset($params['USER_WHERE']) && $params['USER_WHERE'] > '') + { + if (is_array($params['USER_WHERE'])) + $request_where = array_merge($request_where,$params['USER_WHERE']); + else + $request_where[] = $params['USER_WHERE']; + } + + // Готовим строку с условиями + array_unshift($request_where," + a.Id != '1' AND a.Id != '" . PAGE_NOT_FOUND_ID . "' AND + a.rubric_id = '" . $request->rubric_id . "' AND + a.document_deleted != '1'"); + + $request_where_str = '(' . implode(') AND (',$request_where) . ')'; + + // Количество выводимых доков + $params['LIMIT']=(! empty($params['LIMIT']) + ? $params['LIMIT'] + : (!empty($_REQUEST['requestlimiter_'.$id]) + ? $_REQUEST['requestlimiter_'.$id] + : (int)$request->request_items_per_page)); + + $limit = (isset($params['LIMIT']) && is_numeric($params['LIMIT']) && $params['LIMIT'] > '') + ? (int)$params['LIMIT'] + : (int)$request->request_items_per_page; + + $start = (isset($params['START'])) + ? (int)$params['START'] + : (($request->request_show_pagination == 1) + ? get_current_page('apage') * $limit - $limit + : 0); + + $limit_str = ($limit > 0) + ? "LIMIT " . $start . "," . $limit + : ''; + + // Готовим строку с сортировкой + if ($request_order) + $request_order_str = "ORDER BY " . implode(', ',$request_order); + + // Готовим строку с полями + if ($request_select) + $request_select_str = ',' . implode(",\r\n",$request_select); + + unset($a, $t, $v); + + // Составляем запрос к БД + $sql = " ?> + SELECT STRAIGHT_JOIN SQL_CALC_FOUND_ROWS + a.Id, + a.rubric_id, + a.document_title, + a.document_parent, + a.document_alias, + a.document_published, + a.document_expire, + a.document_changed, + a.document_author_id, + a.document_in_search, + a.document_status, + a.document_count_print, + a.document_count_view, + a.document_linked_navi_id, + a.document_lang + " . $request_select_str . " + FROM + " . $where_cond['from'] . " + " . (isset($params['USER_FROM']) ? $params['USER_FROM'] : '') . " + " . PREFIX . "_documents AS a + " . implode(' ', $request_join) . " + " . (isset($params['USER_JOIN']) ? $params['USER_FROM'] : '') . " + WHERE + " . $request_where_str . " + GROUP BY a.Id + " . $request_order_str . " + " . $limit_str . " + 0) + { + $sql_request = str_replace($search, '', $sql_request); + } + } + + // Если просили просто показать сформированный запрос + if ((isset($params['DEBUG']) && $params['DEBUG'] == 1) || $request->request_show_sql == 1) + { + $return = Debug::_print($sql_request); + + return $return; + } + + // Выполняем запрос к бд + $sql = $AVE_DB->Query($sql_request, (int)$request->request_cache_lifetime, 'rub_' . $request->rubric_id); + + // Если просили просто вернуть запрос, возвращаем результат + if (isset($params['RETURN_SQL']) && $params['RETURN_SQL'] == 1) + return $sql; + + // Если есть вывод пагинации, то выполняем запрос на получение кол-ва элементов + if ($request->request_show_pagination == 1 || (isset($params['SHOW']) && $params['SHOW'] == 1)) + { + $num_items = $AVE_DB->NumAllRows($sql_request, (int)$request->request_cache_lifetime, 'rub_' . $request->rubric_id); + } + else + { + $num_items = $AVE_DB->GetFoundRows(); + } + + unset($sql_request); + + // Приступаем к обработке шаблона + $main_template = $request->request_template_main; + + //-- Если кол-во элементов больше 0 + if ($num_items > 0) + { + $main_template = preg_replace('/\[tag:if_empty](.*?)\[\/tag:if_empty]/si', '', $main_template); + $main_template = str_replace (array('[tag:if_notempty]','[/tag:if_notempty]'), '', $main_template); + } + else + { + $main_template = preg_replace('/\[tag:if_notempty](.*?)\[\/tag:if_notempty]/si', '', $main_template); + $main_template = str_replace (array('[tag:if_empty]','[/tag:if_empty]'), '', $main_template); + } + + $pagination = ''; + + // Кол-во страниц + $num_pages = ($limit > 0) + ? ceil($num_items / $limit) + : 0; + + // Собираем пагинацию, еслиесть указание ее выводить + if ($request->request_show_pagination == 1 || (isset($params['SHOW']) && $params['SHOW'] == 1)) + { + // Если в запросе пришел номер страницы и он больше, чем кол-во страниц + // Делаем перенаправление + if (isset($_REQUEST['apage']) && is_numeric($_REQUEST['apage']) && $_REQUEST['apage'] > $num_pages) + { + $redirect_link = rewrite_link('index.php?id=' . $AVE_Core->curentdoc->Id + . '&doc=' . (empty($AVE_Core->curentdoc->document_alias) + ? prepare_url($AVE_Core->curentdoc->document_title) + : $AVE_Core->curentdoc->document_alias) + . ((isset($_REQUEST['artpage']) && is_numeric($_REQUEST['artpage'])) + ? '&artpage=' . $_REQUEST['artpage'] + : '') + . ((isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) + ? '&page=' . $_REQUEST['page'] + : '')); + + header('Location:' . $redirect_link); + exit; + } + + // Запоминаем глобально + @$GLOBALS['page_id'][$_REQUEST['id']]['apage'] = (@$GLOBALS['page_id'][$_REQUEST['id']]['apage'] > $num_pages + ? @$GLOBALS['page_id'][$_REQUEST['id']]['apage'] + : $num_pages); + + $pagination = ''; + + if ($num_pages > 1) + { + $queries = ''; + + // Добавляем GET-запрос в пагинацию если пришло ADD_GET + // или указанов настройках запроса + if ($request->request_use_query == 1 || (isset($params['ADD_GET']) && $params['ADD_GET'] == 1)) + $queries = ($_SERVER['QUERY_STRING']) + ? '?' . $_SERVER['QUERY_STRING'] + : ''; + + $pagination = 'index.php?id=' + . $AVE_Core->curentdoc->Id + + . '&doc=' . (empty($AVE_Core->curentdoc->document_alias) + ? prepare_url($AVE_Core->curentdoc->document_title) + : $AVE_Core->curentdoc->document_alias) + + . '&apage={s}' + + . ((isset($_REQUEST['artpage']) && is_numeric($_REQUEST['artpage'])) + ? '&artpage=' . $_REQUEST['artpage'] + : '') + + . ((isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])) + ? '&page=' . $_REQUEST['page'] + : '') + + // Добавляем GET-запрос в пагинацию + . clean_php($queries) + ; + + // ID пагинации + $pagination_id = (isset($params['PAGINATION']) && $params['PAGINATION'] > 0) + ? $params['PAGINATION'] + : $request->request_pagination; + + // Собираем пагинацию + $pagination = AVE_Paginations::getPagination($num_pages, 'apage', $pagination, $pagination_id); + + // Костыли для Главной страницы + $pagination = str_ireplace('"//"', '"/"', str_ireplace('///', '/', rewrite_link($pagination))); + $pagination = str_ireplace('"//' . URL_SUFF . '"', '"/"', $pagination); + } + } + + // Элементы запроса + $rows = array(); + + // id найденных документов + $request_documents = array(); + + while ($row = $sql->FetchRow()) + { + // Собираем Id документов + array_push($request_documents, $row->Id); + // Собираем оставшуюся информацию + array_push($rows, $row); + } + + // Обрабатываем шаблоны элементов + $items = ''; + $x = 0; + $items_count = count($rows); + + global $req_item_num, $use_cache; + + $use_cache = $request->request_cache_elements; + + $item = ''; + + foreach ($rows as $row) + { + $x++; + $last_item = ($x == $items_count ? true : false); + $item_num = $x; + $req_item_num = $item_num; + $item = showrequestelement($row, $request->request_template_item); + $item = '<'.'?php $item_num='.var_export($item_num,1).'; $last_item='.var_export($last_item,1).'?'.'>'.$item; + $item = 'Id . ';?>' . $item; + $item = str_replace('[tag:if_first]', '<'.'?php if(isset($item_num) && $item_num===1) { ?'.'>', $item); + $item = str_replace('[tag:if_not_first]', '<'.'?php if(isset($item_num) && $item_num!==1) { ?'.'>', $item); + $item = str_replace('[tag:if_last]', '<'.'?php if(isset($last_item) && $last_item) { ?'.'>', $item); + $item = str_replace('[tag:if_not_last]', '<'.'?php if(isset($item_num) && !$last_item) { ?'.'>', $item); + $item = preg_replace('/\[tag:if_every:([0-9-]+)\]/u', '<'.'?php if(isset($item_num) && !($item_num % $1)){ '.'?'.'>', $item); + $item = preg_replace('/\[tag:if_not_every:([0-9-]+)\]/u', '<'.'?php if(isset($item_num) && ($item_num % $1)){ '.'?'.'>', $item); + $item = str_replace('[tag:/if]', '<'.'?php } ?>', $item); + $item = str_replace('[tag:if_else]', '<'.'?php }else{ ?>', $item); + $items .= $item; + } + + // Обрабатываем теги запроса + + // Парсим теги визуальных блоков + $main_template = preg_replace_callback('/\[tag:block:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_block', $main_template); + + // Парсим теги системных блоков + $main_template = preg_replace_callback('/\[tag:sysblock:([A-Za-z0-9-_]{1,20}+)\]/', 'parse_sysblock', $main_template); + + //-- Заменяем тег пагинации на пагинацию + $main_template = str_replace('[tag:pages]', $pagination, $main_template); + + $main_template = preg_replace_callback( + '/\[tag:date:([a-zA-Z0-9-. \/]+)\]/', + create_function('$m','return translate_date(date($m[1], '.$AVE_Core->curentdoc->document_published.')); + '), + $main_template + ); + + $main_template = str_replace('[tag:humandate]', human_date($AVE_Core->curentdoc->document_published), $main_template); + $main_template = str_replace('[tag:docdate]', pretty_date(strftime(DATE_FORMAT, $AVE_Core->curentdoc->document_published)), $main_template); + $main_template = str_replace('[tag:doctime]', pretty_date(strftime(TIME_FORMAT, $AVE_Core->curentdoc->document_published)), $main_template); + + if (preg_match('/\[tag:docauthor]/u', $item)) + { + $main_template = str_replace('[tag:docauthor]', get_username_by_id($AVE_Core->curentdoc->document_author_id), $main_template); + } + + //-- Общее число элементов запроса + $main_template = str_replace('[tag:doctotal]', $num_items, $main_template); + //-- Показано элементов запроса на странице + $main_template = str_replace('[tag:doconpage]', $x, $main_template); + + //-- Номер страницы пагинации + $main_template = str_replace('[tag:pages:curent]', get_current_page('apage'), $main_template); + //-- Общее кол-во страниц пагинации + $main_template = str_replace('[tag:pages:total]', $num_pages, $main_template); + + $main_template = str_replace('[tag:pagetitle]', stripslashes(htmlspecialchars_decode($AVE_Core->curentdoc->document_title)), $main_template); + $main_template = str_replace('[tag:alias]', (isset($AVE_Core->curentdoc->document_alias) ? $AVE_Core->curentdoc->document_alias : ''), $main_template); + + // Возвращаем параметр документа из БД + $main_template = preg_replace_callback('/\[tag:doc:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + return isset($row->{$match[1]}) + ? $row->{$match[1]} + : null; + }, + $main_template + ); + + // Если пришел вызов на активацию языковых файлов + $main_template = preg_replace_callback( + '/\[tag:langfile:([a-zA-Z0-9-_]+)\]/u', + function ($match) + { + global $AVE_Template; + + return $AVE_Template->get_config_vars($match[1]); + }, + $main_template + ); + + // Вставляем элементы запроса + $return = str_replace('[tag:content]', $items, $main_template); + + // Парсим тег [hide] + $return = parse_hide($return); + + $return = str_replace('[tag:path]', ABS_PATH, $return); + $return = str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', $return); + + // Парсим модули + $return = $AVE_Core->coreModuleTagParse($return); + + // Фиксируем время генерации запроса + $GLOBALS['block_generate'][] = array('REQUEST_' . $id => Debug::endTime('request_' . $id)); + + // Статистика + if ($request->request_show_statistic) + $return .= "

      Найдено: $num_items
      Показано: $items_count
      Время генерации: " . Debug::endTime('request_' . $id) . " сек
      Пиковое значение: ".number_format(memory_get_peak_usage()/1024, 0, ',', ' ') . ' Kb
      '; + + return $return; +} + +/** + * Функция получения содержимого поля для обработки в шаблоне запроса + *
      + * Пример использования в шаблоне:
      + *	
    36. + * + *
    37. + *
      + * + * @param int $rubric_id идентификатор поля, для [tag:rfld:12][150] $rubric_id = 12 + * @param int $document_id идентификатор документа к которому принадлежит поле. + * @param int $maxlength необязательный параметр, количество возвращаемых символов. + * Если данный параметр указать со знаком минус + * содержимое поля будет очищено от HTML-тегов. + * @return string + */ +function request_get_document_field_value($rubric_id, $document_id, $maxlength = 0) +{ + + if (!is_numeric($rubric_id) || $rubric_id < 1 || !is_numeric($document_id) || $document_id < 1) return ''; + + $document_fields = get_document_fields($document_id); + + $field_value = isset($document_fields[$rubric_id]) ? $document_fields[$rubric_id]['field_value'] : ''; + + if (!empty($field_value)) + { + $field_value = strip_tags($field_value, '

      '); + $field_value = str_replace('[tag:mediapath]', ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', $field_value); + } + + if (is_numeric($maxlength) && $maxlength != 0) + { + if ($maxlength < 0) + { + $field_value = str_replace(array("\r\n", "\n", "\r"), ' ', $field_value); + $field_value = strip_tags($field_value, ""); + $field_value = preg_replace('/ +/', ' ', $field_value); + $maxlength = abs($maxlength); + } + + $field_value = mb_substr($field_value, 0, $maxlength) . (strlen($field_value) > $maxlength ? '... ' : ''); + } + + return $field_value; +} +?> \ No newline at end of file diff --git a/functions/func.sysblock.php b/functions/func.sysblock.php new file mode 100644 index 0000000..4699424 --- /dev/null +++ b/functions/func.sysblock.php @@ -0,0 +1,95 @@ +Query(" + SELECT + sysblock_text + FROM + " . PREFIX . "_sysblocks + WHERE + " . (is_numeric($id) ? 'id' : 'sysblock_alias') . " = '" . $id . "' + LIMIT 1 + ")->GetCell(); + + file_put_contents($cache_file,$return); + } + + //-- парсим теги + $search = array( + '[tag:mediapath]', + '[tag:path]', + '[tag:docid]' + ); + + $replace = array( + ABS_PATH . 'templates/' . ((defined('THEME_FOLDER') === false) ? DEFAULT_THEME_FOLDER : THEME_FOLDER) . '/', + ABS_PATH, + get_current_document_id() + ); + + $return = str_replace($search, $replace, $return); + + $return = preg_replace_callback('/\[tag:home]/', 'get_home_link', $return); + $return = preg_replace_callback('/\[tag:breadcrumb]/', 'get_breadcrumb', $return); + $return = preg_replace_callback('/\[tag:request:([A-Za-z0-9-_]{1,20}+)\]/', 'request_parse', $return); + + if (isset($_REQUEST['id']) && $_REQUEST['id'] != '') + { + //-- парсим теги полей документа в шаблоне рубрики + $return = preg_replace_callback('/\[tag:fld:([a-zA-Z0-9-_]+)\]/', 'document_get_field', $return); + $return = preg_replace_callback('/\[tag:([r|c|f|t]\d+x\d+r*):(.+?)]/', 'callback_make_thumbnail', $return); + } + + if ($eval_sysblock) + $return = eval2var('?'.'>' . $return . '<'.'?'); + + $gen_time = Debug::endTime('SYSBLOCK_' . $id); + + $GLOBALS['block_generate'][] = array('SYSBLOCK_'. $id => $gen_time); + + return $return; + } +} +?> \ No newline at end of file diff --git a/functions/func.thumbnails.php b/functions/func.thumbnails.php new file mode 100644 index 0000000..c432758 --- /dev/null +++ b/functions/func.thumbnails.php @@ -0,0 +1,82 @@ + + *

    38. link путь к оригиналу
    39. + *
    40. size размер миниатюры
    41. + * + * @return string + */ +function make_thumbnail($params) +{ + if (empty($params['link'])) return false; + if((strpos($params['link'],'/http://')===0 || strpos($params['link'],'/https://')===0)) { + + $md5 = md5($params['link']); + + $path = BASE_DIR . ABS_PATH . UPLOAD_DIR . '/ext/' . substr($md5, 0, 4); + + if(!is_dir($path)){ + if(!is_dir(dirname($path))) mkdir(dirname($path), 0777); + mkdir($path, 0777); + } + + $link = ABS_PATH . UPLOAD_DIR . '/ext/' . substr($md5,0,4) . '/' . $md5 . '.jpg'; + + if(!file_exists(BASE_DIR.$link)){ + file_put_contents(BASE_DIR . $link . '.tmp', $params['link']); + } + + $params['link']=$link; + } + + if (isset($params['size'])) + { + $size = $params['size']; + + if (!preg_match('/^[r|c|f|t]\d+x\d+r*$/', $size)) return false; + } + else + { + $size = 't128x128'; + } + + $nameParts = explode('.', basename($params['link'])); + + $countParts = count($nameParts); + + if ($countParts < 2) return false; + + $nameParts[$countParts-2] .= '-' . $size; + + return dirname($params['link']) . '/' . THUMBNAIL_DIR . '/' . implode('.', $nameParts); +} + +/** + * Формирование ссылки на миниатюру определённого размера + * + * @param array $params параметры + * @return string + */ +function callback_make_thumbnail($params) +{ + return ((is_array($params) && isset($params[2])) ? make_thumbnail(array('size' => $params[1], 'link' => $params[2])) : ''); +} + +?> \ No newline at end of file diff --git a/functions/func.users.php b/functions/func.users.php new file mode 100644 index 0000000..f57c390 --- /dev/null +++ b/functions/func.users.php @@ -0,0 +1,240 @@ +user_name); + $ava = (file_exists(BASE_DIR.$ava.'.jpg') ? $ava.'.jpg' : (file_exists(BASE_DIR.$ava.'.png') ? $ava.'.png' : (file_exists(BASE_DIR.$ava.'.gif') ? $ava.'.gif' : ''))); + $result[$id]=$ava; + } + + $ava=$result[$id]; + + $src = (file_exists(BASE_DIR.$ava) ? + make_thumbnail(array('link' => $ava,'size' => 'c' . $size . 'x' . $size)): + make_thumbnail(array('link' => $AVE_DB->Query("SELECT default_avatar FROM " . PREFIX . "_user_groups WHERE user_group=" . (int)$user->user_group)->GetCell(), 'size' => 'c' . $size . 'x' . $size)) + ); + + return $src; +} + + +/** + * Устанавливаем аватар пользователю + * + * @param int $id Ид пользователя + * @param string $avatar путь до картинки которая будет аватаром + * @return bool установился аватар или нет + */ +function SetAvatar($id, $avatar) +{ + if ($id === null) $id = $_SESSION['user_id']; + + $user = get_user_rec_by_id($id); + + $file_ext = pathinfo($avatar, PATHINFO_EXTENSION); + + if (! file_exists($avatar)) + return false; + + $new_ava = BASE_DIR . '/' . UPLOAD_DIR . '/avatars/' . md5($user->user_name) . '.' . strtolower($file_ext); + + foreach (glob(BASE_DIR . '/' . UPLOAD_DIR . '/avatars/' . md5($user->user_name) . '.*') as $filename) + { + @unlink($filename); + } + + //Чистим превьюшки + foreach (glob(BASE_DIR . '/' . UPLOAD_DIR . '/avatars/' . THUMBNAIL_DIR . '/' . md5($user->user_name) . '*.*') as $filename) + { + @unlink($filename); + } + + @file_put_contents($new_ava, file_get_contents($avatar)); + @unlink($avatar); + + return true; +} + + +/** + * Формирование строки имени пользователя + * При наличии всех параметров пытается сформировать строку Имя Фамилия + * Если задать $short=1 - формирует короткую форму И. Фамилия + * Когда отсутствует информация о Имени или Фамилии пытается сформировать + * строку на основе имеющихся данных, а если данных нет вообще - выводит + * имя анонимного пользователя которое задается в основных настройках системы. + * + * @todo добавить параметр 'anonymous' в настройки + * + * @param string $login логин пользователя + * @param string $first_name имя пользователя + * @param string $last_name фамилия пользователя + * @param int $short {0|1} признак формирования короткой формы + * @return string + */ +function get_username($login = '', $first_name = '', $last_name = '', $short = 1) +{ + if ($first_name != '' && $last_name != '') + { + if ($short == 1) $first_name = mb_substr($first_name, 0, 1, 'utf-8') . '.'; + return ucfirst_utf8(mb_strtolower($first_name)) . ' ' . ucfirst_utf8(mb_strtolower($last_name)); + return ucfirst_utf8(mb_strtolower($login)); + } + elseif ($first_name != '' && $last_name == '') + { + return ucfirst_utf8(mb_strtolower($first_name)); + } + elseif ($first_name == '' && $last_name != '') + { + return ucfirst_utf8(mb_strtolower($last_name)); + } + elseif ($login != '') + { + return ucfirst_utf8(mb_strtolower($login)); + } + + return 'Anonymous'; +} + + +/** + * Возвращает запись для пользователя по идентификатору + * не делает лишних запросов + * + * @param int $id - идентификатор пользователя + * @return object + */ +function get_user_rec_by_id($id){ + global $AVE_DB; + + static $users = array(); + + if (!isset($users[$id])) + { + $row = $AVE_DB->Query(" + SELECT + * + FROM " . PREFIX . "_users + WHERE Id = '" . (int)$id . "' + ")->FetchRow(); + + $users[$id] = $row; + } + + return $users[$id]; +} + + +/** + * Возвращает параметры группы пользователей по идентификатору + * не делает лишних запросов + * + * @param int $id - идентификатор группы + * @return object + */ +function get_usergroup_rec_by_id($id){ + global $AVE_DB; + + static $usergroups = array(); + + if (!isset($usergroups[$id])) + { + $row = $AVE_DB->Query(" + SELECT + * + FROM " . PREFIX . "_user_groups + WHERE user_group = '" . (int)$id . "' + ")->FetchRow(); + + $usergroups[$id] = $row; + } + return $usergroups[$id]; + +} + + +/** + * Возвращает login пользователя по его идентификатору + * + * @param int $id - идентификатор пользователя + * @return string + */ +function get_userlogin_by_id($id) +{ + $rec = get_user_rec_by_id($id); + + return $rec->user_name; +} + + +/** + * Возвращает имя группы пользователя по его идентификатору + * + * @param int $id - идентификатор группы пользователя + * @return string + */ +function get_usergroup_by_id($id) +{ + $rec = get_usergroup_rec_by_id($id); + + return $rec->user_group_name; +} + + +/** + * Возвращает email пользователя по его идентификатору + * + * @param int $id - идентификатор пользователя + * @return string + */ +function get_useremail_by_id($id) +{ + $rec = get_user_rec_by_id($id); + + return $rec->email; +} + + +/** + * Возвращает имя пользователя по его идентификатору + * + * @param int $id - идентификатор пользователя + * @param int $param - Сокрашать имя (1 - да, 0 - нет) + * + * @return string + */ +function get_username_by_id($id, $param = 1) +{ + $row = get_user_rec_by_id($id); + $row = !empty($row) ? get_username($row->user_name, $row->firstname, $row->lastname, $param) : get_username(); + return $row; +} + +?> \ No newline at end of file diff --git a/functions/func.watermarks.php b/functions/func.watermarks.php new file mode 100644 index 0000000..dc4e03c --- /dev/null +++ b/functions/func.watermarks.php @@ -0,0 +1,213 @@ +> 8) . chr($length & 0xFF); + } + else + { + $retval .= chr(0x80) . + chr(0x04) . + chr(($length >> 24) & 0xFF) . + chr(($length >> 16) & 0xFF) . + chr(($length >> 8) & 0xFF) . + chr($length & 0xFF); + } + + return $retval . $value; +} + +/** + * Функция накладывает watermark на заданный файл + * + * @param string $file URL Файла + * @param string $position Позиция + * @param int $transparency Прозарчность + * @return string link + */ +function watermarks($file, $position='center', $transparency=100) { + + global $AVE_DB; + + if (!defined('WATERMARKS_DIR') || !defined('WATERMARKS_FILE')) exit(0); + + $save = true; + + $margin = 10; + + $file_info = pathinfo($file); + + $watermarkFile = BASE_DIR . '/' . WATERMARKS_FILE; + $watermarkDir = BASE_DIR . '/' . WATERMARKS_DIR; + + $imagePath = BASE_DIR . '/' . trim($file_info['dirname'], '/'); + $imageName = $file_info['basename']; + + $copyPath = $watermarkDir . '/' . trim($file_info['dirname'], '/'); + $copyName = $imageName; + + if(!is_dir($watermarkDir)) { + @mkdir($watermarkDir, 0777, true); + write_htaccess_deny($watermarkDir); + } + + if(file_exists("$copyPath/$copyName") || !file_exists("$imagePath/$imageName")){ + $save = false; + } + + if(file_exists($watermarkFile) && file_exists("$imagePath/$imageName")){ + + $size_image = getimagesize("$imagePath/$imageName"); + $size_wtmrk = getimagesize($watermarkFile); + + list($xImage, $yImage) = $size_image; + list($xWtmrk, $yWtmrk) = $size_wtmrk; + + if ($xImage < $xWtmrk || $yImage < $yWtmrk) { + $save = false; + } else { + $save = true; + } + } + + if (file_exists("$copyPath/$copyName")) $save = false; + + if ($save){ + if (!is_dir($copyPath) && !@mkdir($copyPath, 0777, true)) exit(0); + require_once BASE_DIR.'/class/class.thumbnail.php'; + $watermark = new Image_Toolbox("$imagePath/$imageName"); + + if (rename("$imagePath/$imageName", "$copyPath/$copyName")) + { + $old = umask(0); + chmod("$copyPath/$copyName", 0777); + umask($old); + } + + switch ($position) + { + case 'top': + case 'topcenter': + $xLogoPosition = 'center -'; + $yLogoPosition = 'top +'.$margin; + break; + + case 'topleft': + $xLogoPosition = 'left +'.$margin; + $yLogoPosition = 'top +'.$margin; + break; + + case 'topright': + $xLogoPosition = 'right -'.$margin; + $yLogoPosition = 'top +'.$margin; + break; + + case 'center': + $xLogoPosition = 'center -'; + $yLogoPosition = 'center -'; + break; + + case 'centerleft': + $xLogoPosition = 'left +'.$margin; + $yLogoPosition = 'center -'; + break; + + case 'centerright': + $xLogoPosition = 'right -'.$margin; + $yLogoPosition = 'center -'; + break; + + case 'bottom': + case 'bottomcenter': + $xLogoPosition = 'center -'; + $yLogoPosition = 'bottom -'.$margin; + break; + + case 'bottomleft': + $xLogoPosition = 'left +'.$margin; + $yLogoPosition = 'bottom -'.$margin; + break; + + case 'bottomright': + $xLogoPosition = 'right -'.$margin; + $yLogoPosition = 'bottom -'.$margin; + break; + + case 'repeat': + $xLogoPosition = 'repeat '; + $yLogoPosition = 'repeat '; + break; + + default: + $xLogoPosition = 'center -'; + $yLogoPosition = 'center -'; + break; + } + + $watermark->addImage($watermarkFile); + $watermark->blend($xLogoPosition, $yLogoPosition, IMAGE_TOOLBOX_BLEND_COPY, $transparency); + $watermark->save("$imagePath/$imageName"); + + if($watermark->_img['main']['type']==2){ + $image = getimagesize("$imagePath/$imageName", $info); + if(!isset($info['APP13'])) + { + + $sitename = get_settings('site_name'); + + // установка IPTC тэгов + $iptc = array( + '2#120' => iconv("UTF-8","WINDOWS-1251",$sitename), + '2#116' => "http://".$_SERVER['SERVER_NAME'] + ); + + // Преобразование IPTC тэгов в двоичный код + $data = ''; + + foreach($iptc as $tag => $string) + { + $tag = substr($tag, 2); + $data .= iptc_make_tag(2, $tag, $string); + } + + // Встраивание IPTC данных + $content = iptcembed($data, "$imagePath/$imageName"); + + // запись нового изображения в файл + $fp = fopen("$imagePath/$imageName", "wb"); + fwrite($fp, $content); + fclose($fp); + } + } + + unset($watermark); + } + + return $file; +} + +?> diff --git a/inc/antispam.php b/inc/antispam.php new file mode 100644 index 0000000..232fcac --- /dev/null +++ b/inc/antispam.php @@ -0,0 +1,77 @@ + \ No newline at end of file diff --git a/inc/captcha.php b/inc/captcha.php new file mode 100644 index 0000000..d388f56 --- /dev/null +++ b/inc/captcha.php @@ -0,0 +1,25 @@ +getKeyString(); +?> \ No newline at end of file diff --git a/inc/config.inc.php b/inc/config.inc.php new file mode 100644 index 0000000..e69de29 diff --git a/inc/config.php b/inc/config.php new file mode 100755 index 0000000..475042b --- /dev/null +++ b/inc/config.php @@ -0,0 +1,145 @@ +Ave-Cms.Ru
      '.'© 2007-' . date('Y')); + + $GLOBALS['CMS_CONFIG']['USER_IP'] = array('DESCR' =>'Использовать IP для автологина на сайте','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['REWRITE_MODE'] = array('DESCR' =>'Использовать ЧПУ Адреса вида index.php будут преобразованы в /home/','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['TRANSLIT_URL'] = array('DESCR' =>'Использовать транслит в ЧПУ адреса вида /страница/ поменяються на /page/','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['URL_SUFF'] = array('DESCR' =>'Cуффикс ЧПУ','default'=>'','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['URL_YANDEX'] = array('DESCR' =>'Использовать для формирования ЧПУ API Яндекс Переводчика','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + + $themes = array(); + + foreach (glob(dirname(dirname(__FILE__)) . '/templates/*') as $filename) + { + if (is_dir($filename)) + $themes[]=basename($filename); + } + + $GLOBALS['CMS_CONFIG']['DEFAULT_THEME_FOLDER'] = array('DESCR' =>'Тема публичной части','default'=>$themes[0],'TYPE'=>'dropdown','VARIANT'=>$themes); + + $GLOBALS['CMS_CONFIG']['DEFAULT_THEME_FOLDER_COLOR'] = array('DESCR' =>'Цвет панели администратора','default'=>'default', 'TYPE'=>'dropdown','VARIANT'=>array('default')); + + $GLOBALS['CMS_CONFIG']['CODEMIRROR_THEME'] = array( + 'DESCR' => 'Цветовая схема Codemirror', + 'default' => 'default', + 'TYPE' => 'dropdown', + 'VARIANT' => array( + 'default', + '3024-day', + '3024-night', + 'abcdef', + 'ambiance', + 'base16-dark', + 'base16-light', + 'bespin', + 'blackboard', + 'cobalt', + 'colorforth', + 'dracula', + 'duotone-dark', + 'duotone-light', + 'eclipse', + 'elegant', + 'erlang-dark', + 'hopscotch', + 'icecoder', + 'isotope', + 'lesser-dark', + 'liquibyte', + 'material', + 'mbo', + 'mdn-like', + 'midnight', + 'monokai', + 'neat', + 'neo', + 'night', + 'panda-syntax', + 'paraiso-dark', + 'paraiso-light', + 'pastel-on-dark', + 'railscasts', + 'rubyblue', + 'seti', + 'solarized', + 'the-matrix', + 'tomorrow-night-bright', + 'tomorrow-night-eighties', + 'ttcn', + 'twilight', + 'vibrant-ink', + 'xq-dark', + 'xq-light', + 'yeti', + 'zenburn' + ) + ); + + $GLOBALS['CMS_CONFIG']['ADMIN_MENU'] = array('DESCR' =>'Использовать плавующее боковое меню','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['ADMIN_CAPTCHA'] = array('DESCR' =>'Использовать капчу при входе в админку','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['ADMIN_EDITMENU'] = array('DESCR' =>'Использовать всплывающие "Действия" в системе','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['ATTACH_DIR'] = array('DESCR' =>'Директория для хранения вложений','default'=>'cache/attachments','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['UPLOAD_DIR'] = array('DESCR' =>'Директория для хранения файлов','default'=>'uploads','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['UPLOAD_SHOP_DIR'] = array('DESCR' =>'Директория для хранения миниатюр Магазина','default'=>'uploads/shop','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['UPLOAD_GALLERY_DIR'] = array('DESCR' =>'Директория для хранения миниатюр Галерей','default'=>'uploads/gallery','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['THUMBNAIL_DIR'] = array('DESCR' =>'Директория для хранения миниатюр изображений','default'=>'thumbnail','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['WATERMARKS_DIR'] = array('DESCR' =>'Директория для хранения оригиналов изображений (watermark)','default'=>'watermarks','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['WATERMARKS_FILE'] = array('DESCR' =>'Файл watermark','default'=>'uploads/watermark.png','TYPE'=>'string','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['SESSION_SAVE_HANDLER'] = array('DESCR' =>'Хранить сессии в БД','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['SESSION_LIFETIME'] = array('DESCR' =>'Время жизни сессии (Значение по умолчанию 24 часа)','default'=>60*60*24,'TYPE'=>'integer','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['COOKIE_LIFETIME'] = array('DESCR' =>'Время жизни cookie автологина (60*60*24*14 - 2 недели)','default'=>60*60*24*14,'TYPE'=>'integer','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['USERS_TIME_SHOW'] = array('DESCR' =>'Показывать кто был онлайн в течении: (Значение по умолчанию 24 часа)','default'=>60*60*24,'TYPE'=>'integer','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['PROFILING'] = array('DESCR' =>'Вывод статистики','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['SQL_PROFILING'] = array('DESCR' =>'Вывод статистики выполненых запросов','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['SEND_SQL_ERROR'] = array('DESCR' =>'Отправка писем с ошибками MySQL','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['PHP_DEBUGGING_FILE'] = array('DESCR' =>'Включить обработку ошибок PHP через обработчик cms','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['PHP_DEBUGGING'] = array('DESCR' =>'Включить стандартную обработку ошибок PHP','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['SMARTY_DEBUGGING'] = array('DESCR' =>'Консоль отладки Smarty','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['MEMORY_LIMIT_PANIC'] = array('DESCR' =>'Пытаться очистить память если выходит за пределы ("-1" выключенно) в Мегабайтах (увеличивается нагрузка на MySQL)','default'=>-1,'TYPE'=>'dropdown','VARIANT'=>array('-1','6','12','28','54','100')); + + $GLOBALS['CMS_CONFIG']['SMARTY_COMPILE_CHECK'] = array('DESCR' =>'Контролировать изменения tpl файлов После настройки сайта установить - false','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['SMARTY_USE_SUB_DIRS'] = array('DESCR' =>'Создание папок для кэширования Установите это в false если ваше окружение PHP не разрешает создание директорий от имени Smarty. Поддиректории более эффективны, так что используйте их, если можете.','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['CACHE_DOC_TPL'] = array('DESCR' =>'Кэширование скомпилированных шаблонов документов','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['CACHE_DOC_FILE'] = array('DESCR' =>'Кэширование скомпилированных шаблонов документов в файлах','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['SYSTEM_CACHE_LIFETIME'] = array('DESCR' =>'Время жизни кеша запроса к настройкам системы (60*60*24*14 - 2 недели)','default'=>0,'TYPE'=>'integer','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['YANDEX_MAP_API_KEY'] = array('DESCR' =>'Yandex MAP API REY','default'=>'','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['GOOGLE_MAP_API_KEY'] = array('DESCR' =>'Google MAP API REY','default'=>'','TYPE'=>'string','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['Memcached_Server'] = array('DESCR' =>'Адрес Memcached сервера','default'=>'','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['Memcached_Port'] = array('DESCR' =>'Порт Memcached сервера','default'=>'','TYPE'=>'string','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['DB_EXPORT_GZ'] = array('DESCR' =>'Создание резервной копии базы данных со сжатием','default'=>false,'TYPE'=>'bool','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['DB_EXPORT_TPL'] = array('DESCR' =>'Шаблон имени файла экспорта бд (%SERVER%,%DATE%,%TIME%)','default'=>'%SERVER%_DB_BackUP_%DATE%_%TIME%','TYPE'=>'string','VARIANT'=>''); + $GLOBALS['CMS_CONFIG']['DB_EXPORT_PREFIX'] = array('DESCR' =>'Использовать префикс при экспорте бд','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + + $GLOBALS['CMS_CONFIG']['CHECK_VERSION'] = array('DESCR' =>'Проверка наличия новых версий','default'=>true,'TYPE'=>'bool','VARIANT'=>''); + + include_once(dirname(dirname(__FILE__)) . '/inc/config.inc.php'); + + foreach($GLOBALS['CMS_CONFIG'] as $k => $v) + { + if(! defined($k)) + define($k, $v['default']); + } +?> \ No newline at end of file diff --git a/inc/db.config.php b/inc/db.config.php new file mode 100644 index 0000000..e69de29 diff --git a/inc/dump.php b/inc/dump.php new file mode 100644 index 0000000..32c42fa --- /dev/null +++ b/inc/dump.php @@ -0,0 +1,30 @@ + + + + +Plupload - Form dump + + + +

      Post dump

      + + + + + + + + + + + $value) { ?> + + + + + + +
      NameValue
      + + + diff --git a/inc/errors.php b/inc/errors.php new file mode 100644 index 0000000..3df046f --- /dev/null +++ b/inc/errors.php @@ -0,0 +1,104 @@ +%s

      Message: %s
      File: %s
      Line: %s + ', $error_level, nl2br($error_message), $error_file, $error_line); + + switch ($error_level) { + case E_ERROR: + case E_CORE_ERROR: + case E_COMPILE_ERROR: + case E_PARSE: + $color = '#f05050'; + errorLogs($error, "Fatal", $color); + break; + case E_USER_ERROR: + case E_RECOVERABLE_ERROR: + $color = '#f05050'; + errorLogs($error, "Error", $color); + break; + case E_WARNING: + case E_CORE_WARNING: + case E_COMPILE_WARNING: + case E_USER_WARNING: + $color = '#fad733'; + errorLogs($error, "Warning", $color); + break; + case E_NOTICE: + case E_USER_NOTICE: + $color = '#23b7e5'; + errorLogs($error, "Info", $color); + break; + case E_STRICT: + $color = '#edf1f2'; + errorLogs($error, "Debug", $color); + break; + default: + $color = '#fad733'; + errorLogs($error, "Warning", $color); + } + } + + function shutdownHandler() + { + $lasterror = error_get_last(); + + switch ($lasterror['type']) + { + case E_ERROR: + case E_CORE_ERROR: + case E_COMPILE_ERROR: + case E_USER_ERROR: + case E_RECOVERABLE_ERROR: + case E_CORE_WARNING: + case E_COMPILE_WARNING: + case E_PARSE: + $color = '#f05050'; + $error = + sprintf(' + [SHUTDOWN] Lvl: %s
      Message: %s
      File: %s
      Line: %s + ', $lasterror['type'], nl2br($lasterror['message']), $lasterror['file'], $lasterror['line']); + errorLogs($error, "Fatal", $color); + } + } + + function errorLogs($error, $errlvl, $color) + { + $render = ' +
      +
      + ' . $errlvl .' +
      +
      ' + . $error . + '
      +
      + '; + + echo $render; + } +?> \ No newline at end of file diff --git a/inc/fonts/ft16.ttf b/inc/fonts/ft16.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d2f8b671f523066385ea0485145d4b5e685eba9d GIT binary patch literal 19156 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 OX?hJXN59QI^}hi<53MQy literal 0 HcmV?d00001 diff --git a/inc/index.php b/inc/index.php new file mode 100644 index 0000000..cab759a --- /dev/null +++ b/inc/index.php @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/inc/init.php b/inc/init.php new file mode 100644 index 0000000..af0ef74 --- /dev/null +++ b/inc/init.php @@ -0,0 +1,408 @@ +1, '_GET'=>1, '_POST'=>1, '_COOKIE'=>1, '_FILES'=>1, '_SERVER'=>1, '_REQUEST'=>1, 'GLOBALS'=>1); + + foreach ($GLOBALS as $key => $value) + { + if (!isset($allowed[$key])) unset($GLOBALS[$key]); + } + } + + unsetGlobals(); + + if (isset($HTTP_POST_VARS)) + { + $_GET = $HTTP_GET_VARS; + $_POST = $HTTP_POST_VARS; + $_REQUEST = array_merge($_POST, $_GET); + $_COOKIE = $HTTP_COOKIE_VARS; + } + + /** + * Слешевание (для глобальных массивов) + * рекурсивно обрабатывает вложенные массивы + * + * @param array $array обрабатываемый массив + * @return array обработанный массив + */ + function add_slashes($array=array()) + { + @reset($array); + + while (list($key, $val) = @each($array)) + { + if (is_string($val)) + $array[$key] = addslashes($val); + elseif (is_array($val)) + $array[$key] = add_slashes($val); + } + + return $array; + } + + + if (! get_magic_quotes_gpc()) + { + $_GET = add_slashes($_GET); + $_POST = add_slashes($_POST); + $_REQUEST = array_merge($_POST, $_GET); + $_COOKIE = add_slashes($_COOKIE); + } + + + function is_ssl() + { + if (isset($_SERVER['HTTPS'])) + { + if ('on' == strtolower($_SERVER['HTTPS'])) + return true; + + if ('1' == $_SERVER['HTTPS']) + return true; + } + elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) + { + return true; + } + + return false; + } + + + function set_host() + { + if (isset($_SERVER['HTTP_HOST'])) + { + // Все символы $_SERVER['HTTP_HOST'] приводим к строчным и проверяем + // на наличие запрещённых символов в соответствии с RFC 952 и RFC 2181. + $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']); + if (! preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $_SERVER['HTTP_HOST'])) + { + // $_SERVER['HTTP_HOST'] не соответствует спецификациям. + // Возможно попытка взлома, даём отлуп статусом 400. + header('HTTP/1.1 400 Bad Request'); + exit; + } + } + else + { + $_SERVER['HTTP_HOST'] = ''; + } + + $ssl = is_ssl(); + $schema = ($ssl) ? 'https://' : 'http://'; + $host = str_replace(':' . $_SERVER['SERVER_PORT'], '', $_SERVER['HTTP_HOST']); + $port = ($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443' || $ssl) + ? '' + : ':' . $_SERVER['SERVER_PORT']; + + define('HOST', $schema . $host . $port); + + $abs_path = dirname((!strstr($_SERVER['PHP_SELF'], $_SERVER['SCRIPT_NAME']) && (@php_sapi_name() == 'cgi')) + ? $_SERVER['PHP_SELF'] + : $_SERVER['SCRIPT_NAME']); + + if (defined('ACP')) + $abs_path = dirname($abs_path); + define('ABS_PATH', rtrim(str_replace("\\", "/", $abs_path), '/') . '/'); + } + + set_host(); + + set_include_path(get_include_path() . '/' . BASE_DIR . '/lib'); + + ini_set('arg_separator.output', '&'); + ini_set('session.cache_limiter', 'none'); + ini_set('session.cookie_lifetime', 60*60*24*14); + ini_set('session.gc_maxlifetime', 60*24); + ini_set('session.use_cookies', 1); + ini_set('session.use_only_cookies', 1); + ini_set('session.use_trans_sid', 0); + ini_set('url_rewriter.tags', ''); + + + // Переключение для нормальной работы с русскими буквами в некоторых функциях + mb_internal_encoding("UTF-8"); + + + // Вкл/Выкл отображения ошибок php + if (! PHP_DEBUGGING_FILE) + { + if (! PHP_DEBUGGING) + { + error_reporting(E_ERROR); + ini_set('display_errors', 7); + } + else + { + error_reporting(E_ALL); + ini_set('display_errors', 1); + } + } + + + /** + * Подкючаем необходимые файлы функций + */ + require_once(BASE_DIR . '/functions/func.breadcrumbs.php'); // Хлебные крошки + require_once(BASE_DIR . '/functions/func.common.php'); // Основные функции + require_once(BASE_DIR . '/functions/func.locale.php'); // Языковые функции + require_once(BASE_DIR . '/functions/func.documents.php'); // Функции по работе с документами + require_once(BASE_DIR . '/functions/func.fields.php'); // Функции по работе с полями + require_once(BASE_DIR . '/functions/func.helpers.php'); // Второстепенные функции + require_once(BASE_DIR . '/functions/func.hidden.php'); // Парс тега [hide] + require_once(BASE_DIR . '/functions/func.login.php'); // Авторизация пользователей + require_once(BASE_DIR . '/functions/func.logs.php'); // Системные сообщения + require_once(BASE_DIR . '/functions/func.mail.php'); // Отправка писем + require_once(BASE_DIR . '/functions/func.navigation.php'); // Функции по работе с меню навигации + require_once(BASE_DIR . '/functions/func.pagination.php'); // Постраничная навигация + require_once(BASE_DIR . '/functions/func.parserequest.php'); // Функции по работе с запросами + require_once(BASE_DIR . '/functions/func.block.php'); // Функции по работе с визуальными блоками + require_once(BASE_DIR . '/functions/func.sysblock.php'); // Функции по работе с системными блоками + require_once(BASE_DIR . '/functions/func.thumbnails.php'); // Функции по работе с превьюшками изображений + require_once(BASE_DIR . '/functions/func.users.php'); // Функции по работе с пользователями + require_once(BASE_DIR . '/functions/func.watermarks.php'); // Функции по работе с водными знаками + + + /** + * Создание папок и файлов + */ + foreach(array('cache', 'backup', 'session') as $dir) + { + write_htaccess_deny(BASE_DIR . '/' . $dir); + } + + foreach(array('attachments', 'combine', 'module', 'redactor', 'smarty', 'sql', 'tpl') as $dir) + { + write_htaccess_deny(BASE_DIR . '/cache/' . $dir); + } + + global $AVE_DB; + + // Класс для работы с MySQL (Global $AVE_DB) + require_once(BASE_DIR . '/class/class.database.php'); + + // Если не существует объекта по работе с БД + if (! isset($AVE_DB)) + { + // Подключаем конфигурационный файл с параметрами подключения + require_once(BASE_DIR . '/inc/db.config.php'); + + // Если параметры не указаны, прерываем работу + if (! isset($config)) exit; + + // Если константа префикса таблиц не задана, принудительно определяем ее на основании параметров в файле db.config.php + if (! defined('PREFIX')) define('PREFIX', $config['dbpref']); + + // Создаем объект для работы с БД + try { + $AVE_DB = AVE_DB::getInstance($config) + // Назначаем кодировку + ->setCharset('utf8') + // Назначаем БД + ->setDatabaseName($config['dbname']); + } + catch (AVE_DB_Exception $e) + { + ob_start(); + header('HTTP/1.1 503 Service Temporarily Unavailable'); + header('Status: 503 Service Temporarily Unavailable'); + header('Retry-After: 3600'); + header('X-Powered-By:'); + echo $e->getMessage(); + die; + } + + unset($config); + } + + // Устанавливаем обновления системы + if ($AVE_DB) + { + $updaters = (glob(BASE_DIR . "/cache/*.update.php")); + + if ($updaters) + { + sort($updaters); + + foreach ($updaters as $ufile) + { + @eval('?>' . @file_get_contents($ufile) . 'Query(" + UPDATE " . PREFIX . "_users + SET last_visit = '" . time() . "' + WHERE Id = '" . intval($_SESSION['user_id']) . "' + "); + } + + //Запоминаем язык браузера + $browlang = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + $browlang = explode("-", $browlang); + $browlang = $browlang[0]; + + $_SESSION['accept_langs'] = array(); + + $sql = $AVE_DB->Query(" + SELECT + * + FROM + " . PREFIX . "_settings_lang + WHERE + lang_status = '1' + ORDER BY + lang_default ASC + ", SYSTEM_CACHE_LIFETIME); + + while($row = $sql->FetchRow()) + { + if(trim($row->lang_key) > '') + { + $_SESSION['accept_langs'][trim($row->lang_key)] = trim($row->lang_alias_pref); + + if(! @defined('DEFAULT_LANGUAGE') && $row->lang_default == 1) + define('DEFAULT_LANGUAGE', trim($row->lang_key)); + } + } + + + $_SESSION['user_language'] = (! empty($_SESSION['user_language']) + ? $_SESSION['user_language'] + :(isset($_SESSION['accept_langs'][$browlang]) + ? $browlang + : DEFAULT_LANGUAGE)); + + + define('DATE_FORMAT', get_settings('date_format')); + define('TIME_FORMAT', get_settings('time_format')); + define('PAGE_NOT_FOUND_ID', intval(get_settings('page_not_found_id'))); + + + // Вывод данных документа без общего шаблона + if (isset($_REQUEST['onlycontent']) && 1 == $_REQUEST['onlycontent']) + { + define('ONLYCONTENT', 1); + } + + // Язык системы + set_locale(); + + // Класс Шаблонов SMARTY + require(BASE_DIR . '/class/class.template.php'); + + // Класс пагинации + require(BASE_DIR . '/class/class.paginations.php'); + + // Класс Модулей + require(BASE_DIR . '/class/class.modules.php'); + $AVE_Module = new AVE_Module; + + // Debug + require(BASE_DIR . '/class/class.debug.php'); + $Debug = new Debug; + + // Hooks + require(BASE_DIR . '/class/class.hooks.php'); + $Hooks = new Hooks; +?> \ No newline at end of file diff --git a/inc/rss.php b/inc/rss.php new file mode 100644 index 0000000..01f75dd --- /dev/null +++ b/inc/rss.php @@ -0,0 +1,141 @@ +Query(" + SELECT + rss.*, + rubric_title + FROM + " . PREFIX . "_module_rss AS rss + LEFT JOIN + " . PREFIX . "_rubrics AS rub + ON rub.Id = rss.rss_rubric_id + WHERE + rss.id = '" . $_GET['id'] . "' +")->FetchRow(); + +if ($rss_settings !== false) +{ + $rss_settings->rss_site_name = htmlspecialchars($rss_settings->rss_site_name, ENT_QUOTES); + $rss_settings->rss_site_description = htmlspecialchars($rss_settings->rss_site_description, ENT_QUOTES); + + $doctime = get_settings('use_doctime') + ? ("AND document_published <= " . time() . " AND (document_expire = 0 OR document_expire >= " . time() . ")") : ''; + + // Получаем ID, URL и Дату публикации для документов, которые соответсвуют нашей рубрики + // Количество выборки ограничиваем значением установленным для канала + $sql_doc = $AVE_DB->Query(" + SELECT + Id, + document_title, + document_alias, + document_published + FROM " . PREFIX . "_documents + WHERE Id != 1 + AND Id != '" . PAGE_NOT_FOUND_ID . "' + AND rubric_id = '" . $rss_settings->rss_rubric_id . "' + AND document_status = '1' + AND document_deleted != '1' + " . $doctime . " + ORDER BY document_published DESC, Id DESC + LIMIT " . $rss_settings->rss_item_on_page + ); + + // Формируем массивы, которые будут хранить инфу + $rss_item = array(); + $rss_items = array(); + + // Выполянем обработку полученных из БД данных + while ($row_doc = $sql_doc->FetchRow()) + { + $sql_fields = $AVE_DB->Query(" + SELECT + rubric_field_id, + field_value + FROM " . PREFIX . "_document_fields + WHERE document_id = '" . $row_doc->Id . "' + AND (rubric_field_id = '" . $rss_settings->rss_title_id . "' + OR rubric_field_id = '" . $rss_settings->rss_description_id . "') + "); + while ($row_fields = $sql_fields->FetchRow()) + { + if ($row_fields->rubric_field_id == $rss_settings->rss_title_id) + { + $rss_item['Title'] = $row_fields->field_value; + } + + if ($row_fields->rubric_field_id == $rss_settings->rss_description_id) + { + if ($rss_settings->rss_description_lenght == 0) + { + $teaser = explode('', $row_fields->field_value); + $rss_item['description'] = $teaser[0]; + } + else + { + if (mb_strlen($row_fields->field_value) > $rss_settings->rss_description_lenght) + { + $rss_item['description'] = mb_substr($row_fields->field_value, 0, $rss_settings->rss_description_lenght) . '…'; + } + else + { + $rss_item['description'] = $row_fields->field_value; + } + } + $rss_item['description'] = parse_hide($rss_item['description']); + } + } + + $link_doc = !empty($row_doc->document_alias) ? $row_doc->document_alias : prepare_url($row_doc->document_title); + $link = rewrite_link('index.php?id=' . $row_doc->Id . '&doc=' . $link_doc); + $rss_item['link'] = $rss_settings->rss_site_url . mb_substr($link, mb_strlen(ABS_PATH)); + + $rss_item['pubDate'] = $row_doc->document_published ? date('r', $row_doc->document_published) : date('r', time()); + + array_push($rss_items, $rss_item); + } +} + +// Ну а тут собственно шлем заголовок, что у нас документ XML и в путь... выводим данные +header("Content-Type: application/xml"); +header("Cache-Control: no-cache"); +header("Pragma: no-cache"); +echo ''; +?> + + + +<?php echo $rss_settings->rss_site_name; ?> +rss_site_url; ?> +ru-ru +rss_site_description; ?> +rubric_title; ?>]]> +AVE.cms + + + <![CDATA[<?php echo $rss_item['Title']; ?>]]> + + + ]]> + + + + + diff --git a/inc/sitemap.php b/inc/sitemap.php new file mode 100644 index 0000000..0e7abed --- /dev/null +++ b/inc/sitemap.php @@ -0,0 +1,99 @@ +'; +?> + + + UNIX_TIMESTAMP()' : ''; + + $sql = " + SELECT + doc.Id, + doc.document_alias, + doc.document_changed, + doc.document_sitemap_freq, + doc.document_sitemap_pr + FROM " . PREFIX . "_documents doc + LEFT JOIN " . PREFIX . "_rubrics rub + ON rub.Id = doc.rubric_id + LEFT JOIN " . PREFIX . "_rubric_permissions rubperm + ON rubperm.rubric_id = doc.rubric_id + WHERE + rub.rubric_template NOT LIKE '' + AND doc.document_status = 1 + AND doc.document_deleted = 1 + $publish + AND doc.Id != " . PAGE_NOT_FOUND_ID . " + AND (document_meta_robots NOT LIKE '%noindex%' or document_meta_robots NOT LIKE '%nofollow%') + AND (rubperm.user_group_id = 2 AND rubperm.rubric_permission LIKE '%docread%') + ORDER BY doc.Id ASC, doc.document_changed DESC + "; + + $changefreq = array( + '0' => 'always', + '1' => 'hourly', + '2' => 'daily', + '3' => 'weekly', + '4' => 'monthly', + '5' => 'yearly', + '6' => 'never' + ); + + $res = $AVE_DB->Query($sql); + + while($row = $res->FetchAssocArray()): + $document_alias = ABS_PATH . $row['document_alias'] . URL_SUFF; + $document_alias = $domain . str_ireplace(ABS_PATH . '/' . URL_SUFF, '/', $document_alias); + $date = $row["document_changed"] ? date("Y-m-d", $row["document_changed"]) : date("Y-m-d"); +?> + + + + + + + + \ No newline at end of file diff --git a/inc/stdimage/gear.css b/inc/stdimage/gear.css new file mode 100644 index 0000000..7adc336 --- /dev/null +++ b/inc/stdimage/gear.css @@ -0,0 +1,41 @@ +/** + * @file + * Stylesheet for the Contextual module. + */ + +/** + * Contextual links. + */ +div.contextual-links-wrapper:hover { + background: #F9F9F9; + outline: #EFEFEF dashed 1px; +} +html div.contextual-links-wrapper { + display: block; + position: relative; +} +a.contextual-links-trigger { + display: block; + background: #E0E0E0 url(gear.png) no-repeat 2px 0; + border: 1px solid transparent; + height: 18px; + margin: 0; + padding: 0 2px; + outline: none; + text-indent: 34px; /* LTR */ + width: 20px; + overflow: hidden; + position: absolute; + -khtml-border-radius: 4px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + right: 0px; + opacity: 0.7; +} + +a.contextual-links-trigger:hover, +div.contextual-links-active a.contextual-links-trigger { + background: #EFEFEF url(gear.png) no-repeat 2px -18px; +} + diff --git a/inc/stdimage/gear.png b/inc/stdimage/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..48eedcc05938f3bf9d6216b5e76f5f9b503d4ae5 GIT binary patch literal 607 zcmV-l0-*hgP)#ybGF9D0{Zo~% zvDs`mg&v%w3h?Mq()*+Z{03G)*O>TE?T)-phTbO~eS8VDfR6sg`=sxEGA`b0gzrcX zd;-?MH{cRzYB~kxLF|<=@wCd?553R=UKDc8AeI8(E3Fw5FSL_T3;l$e8x#L3wdQ^D z5EujRwIhIc#>5lNzXfiCj&6XdG4Z5cA|UM9&@}_WrfpMZ8bGvOBTtMfZc)%$WFjc(1rePk^8N-JL3>z*C*_ zo;84HS|kN#`W;@*Vog1ptGGvBfY-o> 8) . chr($length & 0xFF); + } + else + { + $retval .= chr(0x80) . + chr(0x04) . + chr(($length >> 24) & 0xFF) . + chr(($length >> 16) & 0xFF) . + chr(($length >> 8) & 0xFF) . + chr($length & 0xFF); + } + + return $retval . $value; + } + } + + /** + * Creates directory + * + * @param string $path Path to create + * @param integer $mode Optional permissions + * @return boolean Success + */ + function _mkdir($path, $mode = 0777) + { + $old = umask(0); + $res = @mkdir($path, $mode); + umask($old); + + return $res; + } + + /** + * Creates directories recursively + * + * @param string $path Path to create + * @param integer $mode Optional permissions + * @return boolean Success + */ + function rmkdir($path, $mode = 0777) + { + return is_dir($path) || (mkdir(dirname($path), $mode) && _mkdir($path, $mode)); + } + + require(dirname(__FILE__).'/config.php'); + + $allowedExt = array('jpg', 'jpeg', 'png', 'gif', 'JPG', 'JPEG', 'PNG', 'GIF'); + + $imagefile = urldecode($_SERVER['REQUEST_URI']); + + if(! empty($_REQUEST['thumb'])) + { + $imagefile = '/'. + rtrim( + dirname($_REQUEST['thumb']) + .'/'.THUMBNAIL_DIR.'/' + .(str_replace( + '.', + (empty($_REQUEST['mode']) ? '-c' : '-'.$_REQUEST['mode']).((empty($_REQUEST['width'])&& empty($_REQUEST['height'])) ? '128' : intval(@$_REQUEST['width'])).'x'.((empty($_REQUEST['width'])&& empty($_REQUEST['height'])) ? '128' : intval(@$_REQUEST['height'])).'.', + basename($_REQUEST['thumb']) + ) + ), + '/'); + } + + if($_SERVER['REQUEST_URI'] == '/inc/thumb.php') + die('No image'); + + $baseDir = str_replace("\\", "/", dirname(dirname(__FILE__))); + + if(file_exists($baseDir . $imagefile)) + { + $img_data = @getimagesize($baseDir . $imagefile); + header('Content-Type:' . $img_data['mime'], true); + header("Last-Modified: " . gmdate("D, d M Y H:i:s".filemtime($baseDir . $imagefile))." GMT"); + header("Content-Length: " . (string) filesize($baseDir . $imagefile), true); + readfile($baseDir . $imagefile); + exit; + } + + list(, $thumbPath) = explode('/' . UPLOAD_DIR . '/', dirname($imagefile), 2); + + $lenThumbDir = strlen(THUMBNAIL_DIR); + + if ($lenThumbDir && substr($thumbPath, -$lenThumbDir) != THUMBNAIL_DIR) + exit(0); + + $thumbPath = $baseDir . '/' . UPLOAD_DIR . '/' . $thumbPath; + $imagePath = $lenThumbDir ? dirname($thumbPath) : $thumbPath; + + $thumbName = basename($imagefile); + $nameParts = explode('.', $thumbName); + $countParts = count($nameParts); + + if ($countParts < 2 || !in_array(strtolower(end($nameParts)), $allowedExt)) + exit(0); + + $matches = array(); + preg_match('/-(r|c|f|t)(\d+)x(\d+)(r)*$/i', $nameParts[$countParts-2], $matches); + + + if (!isset($matches[0])) + { + header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found'); + exit(0); + } + if (isset($matches[4])) + { + list($size, $method, $width, $height, $rotate) = $matches; + } + else + { + list($size, $method, $width, $height) = $matches; + $rotate = false; + } + + $nameParts[$countParts-2] = substr($nameParts[$countParts-2], 0, -strlen($size)); + $imageName = implode('.', $nameParts); + + $save = true; + + if (! file_exists("$imagePath/$imageName")) + { + $l= "$imagePath/$imageName"; + + if(file_exists($l.'.tmp')) + { + include_once(BASE_DIR.'/functions/func.common.php'); + + $abs_path = dirname((!strstr($_SERVER['PHP_SELF'], $_SERVER['SCRIPT_NAME']) && (@php_sapi_name() == 'cgi')) ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME']); + + define('ABS_PATH', rtrim(str_replace("\\", "/", $abs_path), '/') . '/'); + + $url = trim(file_get_contents($l.'.tmp'),ABS_PATH); + + $img=CURL_file_get_contents($url); + + if($img) + { + file_put_contents("$imagePath/$imageName",$img); + + setEXIFF("$imagePath/$imageName"); + $save = true; + } + + @unlink($l.'.tmp'); + } + + } + + if (! file_exists("$imagePath/$imageName")) + { + header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found'); + $imageName = 'noimage.gif'; + if (!file_exists("$imagePath/$imageName")) + { + $imagePath = $baseDir . '/' . UPLOAD_DIR . '/images'; + } + if (!file_exists("$imagePath/$imageName")) exit(0); + + $save = false; + } + + require $baseDir.'/class/class.thumbnail.php'; + + $thumb = new Image_Toolbox("$imagePath/$imageName"); + + switch ($method) + { + case 'r': + $thumb->newOutputSize((int)$width, (int)$height, 0, (boolean)$rotate); + break; + + case 'c': + $thumb->newOutputSize((int)$width, (int)$height, 1, (boolean)$rotate); + break; + + case 'f': + $thumb->newOutputSize((int)$width, (int)$height, 2, false, '#ffffff'); + break; + case 't': + $thumb->newOutputSize((int)$width, (int)$height, 3, false); + break; + } + + //Blend + //$thumb->addImage(BASE_DIR . '/' . 'uploads/gallery/watermark.gif'); + //$thumb->blend('right -10', 'bottom -10', IMAGE_TOOLBOX_BLEND_COPY, 70); + + //Text + //$thumb->addText('Мой текст', BASE_DIR . '/inc/fonts/ft16.ttf', 16, '#709536', 'right -10', 'bottom -10'); + //if ($width > 200){ + // $thumb->addImage(BASE_DIR . '/' . 'uploads/gallery/watermark.gif'); + // $thumb->blend('right -10', 'bottom -10', IMAGE_TOOLBOX_BLEND_COPY, 70); + //} + + $thumb->output(); + + if ($save) + { + if (!file_exists($thumbPath) && !mkdir($thumbPath, 0777)) exit(0); + if ($thumb->save("$thumbPath/$thumbName")) + { + $old = umask(0); + chmod("$thumbPath/$thumbName", 0777); + umask($old); + } + if($thumb->_img['main']['type']==2){ + $image = getimagesize("$thumbPath/$thumbName", $info); + if(!isset($info['APP13'])) + { + if(!isset($AVE_DB)){ + @require(BASE_DIR . '/class/class.database.php'); + $sitename=@$AVE_DB->Query("SELECT site_name FROM " . PREFIX . "_settings LIMIT 1")->GetCell(); + } + + // установка IPTC тэгов + $iptc = array( + '2#120' => iconv("UTF-8","WINDOWS-1251",$sitename), + '2#116' => "http://".$_SERVER['SERVER_NAME'] + ); + + // Преобразование IPTC тэгов в двоичный код + $data = ''; + + foreach($iptc as $tag => $string) + { + $tag = substr($tag, 2); + $data .= iptc_make_tag(2, $tag, $string); + } + + // Встраивание IPTC данных + $content = iptcembed($data, "$thumbPath/$thumbName"); + + // запись нового изображения в файл + $fp = fopen("$thumbPath/$thumbName", "wb"); + fwrite($fp, $content); + fclose($fp); + } + } + } + +?> \ No newline at end of file diff --git a/inc/upload.php b/inc/upload.php new file mode 100644 index 0000000..eb8fe0c --- /dev/null +++ b/inc/upload.php @@ -0,0 +1,146 @@ + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100755 index 0000000..1b5d1f6 --- /dev/null +++ b/index.php @@ -0,0 +1,154 @@ +coreUrlParse($_SERVER['REQUEST_URI']); + + $GLOBALS['page_id'] = array((isset($_REQUEST['id']) + ? $_REQUEST['id'] + : '') + => array('apage' => floatval(0))); + + // Если пришел вызов на показ ревизии документа + if (! empty($_REQUEST['revission'])) + { + $res = $AVE_DB->Query(" + SELECT + doc_data + FROM + " . PREFIX . "_document_rev + WHERE + doc_id = '" . (int)$_REQUEST['id'] . "' + AND + doc_revision = '" . (int)$_REQUEST['revission'] . "' + LIMIT 1 + ")->GetCell(); + + $res = @unserialize($res); + + $flds = get_document_fields((int)$_REQUEST['id'], $res); + } + + // Собираем страницу + $AVE_Core->coreSiteFetch(get_current_document_id()); + + $content = ob_get_clean(); + + ob_start(); + + eval('?>' . $content . ' @$GLOBALS['page_id'][$_REQUEST['id']]['page'])) + ) + OR + ( + isset($_REQUEST['apage']) + && is_numeric($_REQUEST['apage']) + && ($_REQUEST['apage'] < 2 OR ($_REQUEST['apage'] > @$GLOBALS['page_id'][$_REQUEST['id']]['apage'])) + ) + OR + ( + isset($_REQUEST['artpage']) + && is_numeric($_REQUEST['artpage']) + && ($_REQUEST['artpage'] < 2 OR ($_REQUEST['artpage'] > @$GLOBALS['page_id'][$_REQUEST['id']]['artpage'])) + ) + ) + ) + { + if ($_REQUEST['id'] == 1) + header('Location:' . ABS_PATH); + else + header('Location:' . ABS_PATH . $AVE_Core->curentdoc->document_alias . URL_SUFF); + exit; + } + + // Тут заменяем [tag:rubheader] + // на собранный $GLOBALS["user_header"] + $rubheader = (empty($GLOBALS["user_header"]) + ? "" + : implode(chr(10), $GLOBALS["user_header"])); + + $render = str_replace('[tag:rubheader]', $rubheader, $render); + + //Вывод конечного результата + echo $render; + + //Вывод статистики загрузки и запросов SQL (только для администраторов) + if (! defined('ONLYCONTENT') && UGROUP == 1 && defined('PROFILING') && PROFILING) + echo get_statistic(1, 1, 1, 1); +?> \ No newline at end of file diff --git a/install/.htaccess b/install/.htaccess new file mode 100644 index 0000000..c995ef0 --- /dev/null +++ b/install/.htaccess @@ -0,0 +1,27 @@ +###################### AVE.CMS_HTACCESS_BEGIN ########################## +# Options: +# -MultiViews: Turns off multiviews so it doesn't interfer with our rewrite rules +# -Indexes: Stop directory listings +# +FollowSymlinks: Let out rewrite rules work + +Options -Indexes +FollowSymLinks +AddDefaultCharset utf-8 + + + php_value default_charset utf-8 + + # Этот параметр устанавливает максимальное время в секундах, позволяющее скрипту запускаться прежде, чем он завершается синтаксическим анализатором. + php_value max_execution_time 3000 + + # Максимальное время загрузки данных для скрипта, в том числе и файлов из формы + php_value max_input_time 3000 + + # Ограничивает максимальный объем данных, получаемых от пользователя методом POST + php_value post_max_size 32M + + # Устанавливает максимальный размер файла, который может быть получен методом POST (меньше, чем post_max_size) + php_value upload_max_filesize 32M + + + +####################### AVE.CMS_HTACCESS_END ########################### \ No newline at end of file diff --git a/install/data_base.sql b/install/data_base.sql new file mode 100755 index 0000000..69309f0 --- /dev/null +++ b/install/data_base.sql @@ -0,0 +1,341 @@ +INSERT INTO `%%PRFX%%_countries` VALUES + (1, 'AF', 'Афганистан', '2', '2'), + (2, 'AL', 'Албания', '2', '2'), + (3, 'DZ', 'Алжир', '2', '2'), + (4, 'AS', 'Американское Самоа', '2', '2'), + (5, 'AD', 'Андорра', '2', '2'), + (6, 'AO', 'Ангола', '2', '2'), + (7, 'AI', 'Ангвилла', '2', '2'), + (8, 'AQ', 'Антарктика', '2', '2'), + (9, 'AG', 'Антигуа и Барбуда', '2', '2'), + (10, 'AR', 'Аргентина', '2', '2'), + (11, 'AM', 'Армения', '2', '2'), + (12, 'AW', 'Аруба', '2', '2'), + (13, 'AU', 'Австралия', '2', '2'), + (14, 'AT', 'Австрия', '2', '1'), + (15, 'AZ', 'Азербайджан', '2', '2'), + (16, 'BS', 'Содружество Багамских островов', '2', '2'), + (17, 'BH', 'Бахрейн', '2', '2'), + (18, 'BD', 'Бангладеш', '2', '2'), + (19, 'BB', 'Барбадос', '2', '2'), + (20, 'BY', 'Беларусь', '1', '2'), + (21, 'BE', 'Бельгия', '2', '1'), + (22, 'BZ', 'Белиц', '2', '2'), + (23, 'BJ', 'Бенин', '2', '2'), + (24, 'BM', 'Бермудские острова', '2', '2'), + (25, 'BT', 'Бутан', '2', '2'), + (26, 'BO', 'Боливия', '2', '2'), + (27, 'BA', 'Босния и Герцеговина', '2', '1'), + (28, 'BW', 'Ботсвана', '2', '2'), + (29, 'BV', 'Остров Бювет', '2', '2'), + (30, 'BR', 'Бразилия', '2', '2'), + (31, 'IO', 'Британские территории в Индийском океане', '2', '2'), + (32, 'VG', 'Виргинские острова (Британия)', '2', '2'), + (33, 'BN', 'Бруней Дарусаллам', '2', '2'), + (34, 'BG', 'Болгария', '2', '2'), + (35, 'BF', 'Буркина-Фасо', '2', '2'), + (36, 'BI', 'Бурунди', '2', '2'), + (37, 'KH', 'Камбоджа', '2', '2'), + (38, 'CM', 'Камерун', '2', '2'), + (39, 'CA', 'Канада', '2', '2'), + (40, 'CV', 'Кейп-Верд', '2', '2'), + (41, 'KY', 'Кайманские острова', '2', '2'), + (42, 'CF', 'Центральная Африканская Республика', '2', '2'), + (43, 'TD', 'Чад', '2', '2'), + (44, 'CL', 'Чили', '2', '2'), + (45, 'CN', 'Китай', '2', '2'), + (46, 'CX', 'Рождественские острова', '2', '2'), + (47, 'CC', 'Кокосовые острова', '2', '2'), + (48, 'CO', 'Колумбия', '2', '2'), + (49, 'KM', 'Коморос', '2', '2'), + (50, 'CG', 'Конго', '2', '2'), + (51, 'CK', 'Острова Кука', '2', '2'), + (52, 'CR', 'Коста-Рика', '2', '2'), + (53, 'CI', 'Кот-д Ивуар (Берег Слоновой Кости)', '2', '2'), + (54, 'HR', 'Хорватия', '2', '1'), + (55, 'CU', 'Куба', '2', '2'), + (56, 'CY', 'Кипр', '2', '2'), + (57, 'CZ', 'Чешская Республика', '2', '1'), + (58, 'DK', 'Дания', '2', '1'), + (59, 'DJ', 'Джибути', '2', '2'), + (60, 'DM', 'Доминика', '2', '2'), + (61, 'DO', 'Доминиканская Республика', '2', '2'), + (62, 'TP', 'Восточный Тимор', '2', '2'), + (63, 'EC', 'Эквадор', '2', '2'), + (64, 'EG', 'Египет', '2', '2'), + (65, 'SV', 'Эль-Сальвадор', '2', '2'), + (66, 'GQ', 'Экваториальная Гвинея', '2', '2'), + (67, 'ER', 'Эритрея', '2', '2'), + (68, 'EE', 'Эстония', '2', '1'), + (69, 'ET', 'Эфиопия', '2', '2'), + (70, 'FK', 'Фолклендские острова', '2', '2'), + (71, 'FO', 'Острова Фаро', '2', '2'), + (72, 'FJ', 'Фиджи', '2', '2'), + (73, 'FI', 'Финляндия', '2', '2'), + (74, 'FR', 'Франция', '2', '1'), + (75, 'FX', 'Франция, Столица', '2', '1'), + (76, 'GF', 'Французская Гвиана', '2', '2'), + (77, 'PF', 'Французская Полинезия', '2', '2'), + (78, 'TF', 'Французские южные территории', '2', '2'), + (79, 'GA', 'Габон', '2', '2'), + (80, 'GM', 'Гамбия', '2', '2'), + (81, 'GE', 'Грузия', '2', '2'), + (82, 'DE', 'Германия', '2', '1'), + (83, 'GH', 'Гана', '2', '2'), + (84, 'GI', 'Гибралтар', '2', '2'), + (85, 'GR', 'Греция', '2', '1'), + (86, 'GL', 'Гренландия', '2', '2'), + (87, 'GD', 'Гренада', '2', '2'), + (88, 'GP', 'Гваделупа', '2', '2'), + (89, 'GU', 'Гуам', '2', '2'), + (90, 'GT', 'Гватемала', '2', '2'), + (91, 'GN', 'Гвинея', '2', '2'), + (92, 'GW', 'Гвинея-Биссау', '2', '2'), + (93, 'GY', 'Гайана', '2', '2'), + (94, 'HT', 'Гаити', '2', '2'), + (95, 'HM', 'Острова Хирт и Макдоналдс', '2', '2'), + (96, 'HN', 'Гондурас', '2', '2'), + (97, 'HK', 'Гонгконг', '2', '2'), + (98, 'HU', 'Венгрия', '2', '2'), + (99, 'IS', 'Исландия', '2', '2'), + (100, 'IN', 'Индия', '2', '2'), + (101, 'ID', 'Индонезия', '2', '2'), + (102, 'IQ', 'Ирак', '2', '2'), + (103, 'IE', 'Ирландия', '2', '1'), + (104, 'IR', 'Иран', '2', '2'), + (105, 'IL', 'Израиль', '2', '2'), + (106, 'IT', 'Италия', '2', '1'), + (107, 'JM', 'Ямайка', '2', '2'), + (108, 'JP', 'Япония', '2', '2'), + (109, 'JO', 'Иордан', '2', '2'), + (110, 'KZ', 'Казахстан', '2', '2'), + (111, 'KE', 'Кения', '2', '2'), + (112, 'KI', 'Кирибати', '2', '2'), + (113, 'KP', 'КНДР', '2', '2'), + (114, 'KR', 'Республика Корея', '2', '2'), + (115, 'KW', 'Кувейт', '2', '2'), + (116, 'KG', 'Киргизстан', '2', '2'), + (117, 'LA', 'Лаосская НДР', '2', '2'), + (118, 'LV', 'Латвия', '2', '2'), + (119, 'LB', 'Ливан', '2', '2'), + (120, 'LS', 'Лесото', '2', '2'), + (121, 'LR', 'Либерия', '2', '2'), + (122, 'LY', 'Ливийская Арабская Джамахерия', '2', '2'), + (123, 'LI', 'Лихтенштейн', '2', '1'), + (124, 'LT', 'Литва', '2', '2'), + (125, 'LU', 'Люксембург', '2', '1'), + (126, 'MO', 'Макао', '2', '2'), + (127, 'MK', 'Македония', '2', '1'), + (128, 'MG', 'Мадагаскар', '2', '2'), + (129, 'MW', 'Малави', '2', '2'), + (130, 'MY', 'Малайзия', '2', '2'), + (131, 'MV', 'Мальдивы', '2', '2'), + (132, 'ML', 'Мали', '2', '2'), + (133, 'MT', 'Мальта', '2', '2'), + (134, 'MH', 'Маршалловы острова', '2', '2'), + (135, 'MQ', 'Мартиника', '2', '2'), + (136, 'MR', 'Мавритания', '2', '2'), + (137, 'MU', 'Маврикий', '2', '2'), + (138, 'YT', 'Майотта', '2', '2'), + (139, 'MX', 'Мексика', '2', '2'), + (140, 'FM', 'Микронезия', '2', '2'), + (141, 'MD', 'Молдова', '2', '2'), + (142, 'MC', 'Монако', '2', '2'), + (143, 'MN', 'Монголия', '2', '2'), + (144, 'MS', 'Монтсеррат', '2', '2'), + (145, 'MA', 'Марокко', '2', '2'), + (146, 'MZ', 'Мозамбик', '2', '2'), + (147, 'MM', 'Мьянма', '2', '2'), + (148, 'NA', 'Намибия', '2', '2'), + (149, 'NR', 'Науру', '2', '2'), + (150, 'NP', 'Непал', '2', '2'), + (151, 'NL', 'Нидерланды', '2', '1'), + (152, 'AN', 'Антильские острова', '2', '2'), + (153, 'NC', 'Новая Каледония', '2', '2'), + (154, 'NZ', 'Новая Зеландия', '2', '2'), + (155, 'NI', 'Никарагуа', '2', '2'), + (156, 'NE', 'Нигер', '2', '2'), + (157, 'NG', 'Нигерия', '2', '2'), + (158, 'NU', 'Нию', '2', '2'), + (159, 'NF', 'Остров Норфолк', '2', '2'), + (160, 'MP', 'Остров Северной марины', '2', '2'), + (161, 'NO', 'Норвегия', '2', '1'), + (162, 'OM', 'Оман', '2', '2'), + (163, 'PK', 'Пакистан', '2', '2'), + (164, 'PW', 'Палау', '2', '2'), + (165, 'PA', 'Панама', '2', '2'), + (166, 'PG', 'Папуа-Новая Гвинея', '2', '2'), + (167, 'PY', 'Парагвай', '2', '2'), + (168, 'PE', 'Перу', '2', '2'), + (169, 'PH', 'Филипинны', '2', '2'), + (170, 'PN', 'Остров Питкаирн', '2', '2'), + (171, 'PL', 'Польша', '2', '1'), + (172, 'PT', 'Португалия', '2', '1'), + (173, 'PR', 'Пуэрто-Рико', '2', '2'), + (174, 'QA', 'Катар', '2', '2'), + (175, 'RE', 'Остров Воссоединения', '2', '2'), + (176, 'RO', 'Румыния', '2', '1'), + (177, 'RU', 'Россия', '1', '2'), + (178, 'RW', 'Руанда', '2', '2'), + (179, 'LC', 'Остров Святого Луки', '2', '2'), + (180, 'WS', 'Самоа', '2', '2'), + (181, 'SM', 'Сан-Марино', '2', '1'), + (182, 'ST', 'Сан-Томе и Принсипи', '2', '2'), + (183, 'SA', 'Саудовская Аравия', '2', '2'), + (184, 'SN', 'Сенегал', '2', '2'), + (185, 'SC', 'Сейшельские Острова', '2', '2'), + (186, 'SL', 'Сьерра Леоне', '2', '2'), + (187, 'SG', 'Сингапур', '2', '2'), + (188, 'SK', 'Словацкая Республика', '2', '1'), + (189, 'SI', 'Словения', '2', '1'), + (190, 'SB', 'Соломоновы Острова', '2', '2'), + (191, 'SO', 'Сомали', '2', '2'), + (192, 'ZA', 'Южная Африка', '2', '2'), + (193, 'ES', 'Испания', '2', '1'), + (194, 'LK', 'Шри-Ланка', '2', '2'), + (195, 'SH', 'Остров Святой Елены', '2', '2'), + (196, 'KN', 'Сент-Кикс и Невис', '2', '2'), + (197, 'PM', 'Остров Святого Петра', '2', '2'), + (198, 'VC', 'Сент-Винсент и Гренадины', '2', '2'), + (199, 'SD', 'Cудан', '2', '2'), + (200, 'SR', 'Суринам', '2', '2'), + (201, 'SJ', 'Острова Свалбард и Жан-Мейен', '2', '2'), + (202, 'SZ', 'Свазиленд', '2', '2'), + (203, 'SE', 'Швеция', '2', '1'), + (204, 'CH', 'Швейцария', '2', '2'), + (205, 'SY', 'Сирийская Арабская Республика', '2', '2'), + (206, 'TW', 'Тайвань', '2', '2'), + (207, 'TJ', 'Таджикистан', '2', '2'), + (208, 'TZ', 'Танзания', '2', '2'), + (209, 'TH', 'Таиланд', '2', '2'), + (210, 'TG', 'Того', '2', '2'), + (211, 'TK', 'Токелау', '2', '2'), + (212, 'TO', 'Тонга', '2', '2'), + (213, 'TT', 'Тринидад и Тобаго', '2', '2'), + (214, 'TN', 'Тунис', '2', '2'), + (215, 'TR', 'Турция', '2', '1'), + (216, 'TM', 'Туркменистан', '2', '2'), + (217, 'TC', 'Острова Теркс и Кайкос', '2', '2'), + (218, 'TV', 'Тувалу', '2', '2'), + (219, 'UG', 'Уганда', '2', '2'), + (220, 'UA', 'Украина', '1', '2'), + (221, 'AE', 'Объединённые Арабские Эмираты', '2', '2'), + (222, 'GB', 'Великобритания', '2', '1'), + (223, 'US', 'Соединённые Штаты Америки', '2', '2'), + (224, 'VI', 'Виргинские острова (США)', '2', '2'), + (225, 'UY', 'Уругвай', '2', '2'), + (226, 'UZ', 'Узбекистан', '2', '2'), + (227, 'VU', 'Вануату', '2', '2'), + (228, 'VA', 'Ватикан', '2', '2'), + (229, 'VE', 'Венесуэла', '2', '2'), + (230, 'VN', 'Вьетнам', '2', '2'), + (231, 'WF', 'Острова Уэльс и Фортуны', '2', '2'), + (232, 'EH', 'Западная Сахара', '2', '2'), + (233, 'YE', 'Йемен', '2', '2'), + (234, 'YU', 'Югославия', '2', '2'), + (235, 'ZR', 'Заир', '2', '2'), + (236, 'ZM', 'Замбия', '2', '2'), + (237, 'ZW', 'Зимбабве', '2', '2');#inst# + +INSERT INTO `%%PRFX%%_document_fields` VALUES + (1, 1, 1, 0, 'Поздравляем!', '0'), + (2, 2, 1, 0, '

      Установка %%SITENAME%% прошла успешно!

      ', '0'), + (3, 1, 2, 0, 'Ошибка 404', '0'), + (4, 2, 2, 0, 'Извините, запрошенный Вами документ не найден.', '0');#inst# + +INSERT INTO `%%PRFX%%_documents` VALUES + (1, 1, 0, 0, '/', '0','Главная', 'Главная страница', 0, 0, 0, 1, '0', '', '', 'index,follow', '3', '0.5', '1', '0', 0, 0, 0, '', '', 'ru', '1', ''), + (2, 1, 0, 0, '404-not-found', '0', '404 - Документ не найден', 'Ошибка 404', 0, 0, 0, 1, '0', '', '', 'noindex,nofollow', '6', '0', '1', '0', 0, 0, 0, '', '', 'ru', '2', '');#inst# + +INSERT INTO `%%PRFX%%_navigation` VALUES + (1, 'main', 'Основное меню', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '1,2,3,4,5', '1');#inst# + +INSERT INTO `%%PRFX%%_rubric_fields` VALUES + (1, 1, 0, 'header', 'Заголовок', 'single_line', 0, 1, '', '', '', '', ''), + (2, 1, 0, 'text', 'Текст', 'multi_line', 0, 2, '', '', '', '', '');#inst# + +INSERT INTO `%%PRFX%%_rubric_permissions` VALUES + (1, 1, 1, 'alles'), + (2, 1, 2, 'docread'), + (3, 1, 3, 'docread'), + (4, 1, 4, 'docread'), + (5, 1, 5, 'docread');#inst# + +INSERT INTO `%%PRFX%%_rubrics` VALUES + (1, 'Основные страницы', '', '0', '

      [tag:fld:header]

      [tag:fld:text]', 1, 1, 0, 1, '', '', '', '', '', '', '0', '', '0', '');#inst# + +INSERT INTO `%%PRFX%%_settings` VALUES + ( + '1', + '%%SITENAME%%', + 'mail', + 'text/plain', + '465', + 'smtp.gmail.com', + 'yourusername@gmail.com', + 'yourpassword', + 'ssl', + '/usr/sbin/sendmail', + '800', + '%%EMAIL%%', + '%%USERNAME%%', + 'Здравствуйте %NAME%,\r\nВаша регистрация на сайте %HOST%. \r\n\r\nТеперь Вы можете войти на %HOST% со следующими данными:: \r\n\r\nПароль: %PASSWORD%\r\nE-Mail: %EMAIL%\r\n\r\n--------------------------------------------------\r\n%EMAILSIGNATURE%\r\n\r\n', + 'С уважением,\r\nслужба поддержки AVE.CMS\r\nsupport@ave-cms.ru | www.ave-cms.ru', + '2', + '

      Ошибка...

      \r\n
      \r\nУ Вас нет прав на просмотр этого документа!.', + '
        %s
      ', + 'Первая «', + '» Последняя', + '…', + '»', + '«', + 'Страница %d из %d', + '
    42. %s
    43. ', + '%s', + '%s', + '
    44. %s
    45. ', + '
        %s
      ', + '1', + '0', + '
    46.  → 
    47. ', + '0', + '
    48. %s
    49. ', + '[name]', + '
    50. %s
    51. ', + '1', + '%d %B %Y', + '%d %B %Y, %H:%M', + 'RU', + '0', + '0', + '
      \n Содержимое скрыто. Пожалуйста, зарегистрируйтесь\n
      ' +);#inst# + +INSERT INTO `%%PRFX%%_settings_lang` VALUES + (1, 'ru', 'Русский', 'ru', '1', '1'), + (2, 'en', 'English', 'en', '0', '1'), + (3, 'ua', 'Українська', 'ua', '0', '1'), + (4, 'de', 'Deutsch', 'de', '0', '0'), + (5, 'it', 'Italian', 'it', '0', '0'), + (6, 'fr', 'France', 'fr', '0', '0'), + (7, 'sp', 'Spanish', 'sp', '0', '0'), + (8, 'kz', 'Казахский', 'kz', '0', '0'), + (9, 'by', 'Беларуская', 'by', '0', '0'), + (10, 'pl', 'Polski', 'pl', '0', '0');#inst# + +INSERT INTO `%%PRFX%%_templates` VALUES + (1, 'Основной шаблон', '\n\n\t\n\t\t[tag:title] - [tag:sitename]\n\n\t\t\n\n\t\t\n\t\t\n\t\t\n\n\t\t\n\n\t\t\n\t\t\n\t\t\n\t\t\n\n\t\t\n\n\t\t\n\t\t\n\t\t\n\t\t[tag:rubheader]\n\n\t\n\t\n\t\t
      \n\t\t\t
      \n\t\t\t\t\n\t\t\t\t
      \n\t\t\t\t\t[tag:maincontent]\n\t\t\t\t
      \n\t\t\t
      \n\t\t
      \n\t\n', 1, 0);#inst# + +INSERT INTO `%%PRFX%%_user_groups` VALUES + (1, 'Администраторы', '1', '0', '', 'alles'), + (2, 'Анонимные пользователи', '1', '0', '', ''), + (3, 'Модераторы', '1', '0', '', ''), + (4, 'Зарегистрированные', '1', '0', '', ''), + (5, 'Через логинзу', '1', '0', '', '');#inst# + +INSERT INTO `%%PRFX%%_users` VALUES + (1, '%%PASS%%', '%%EMAIL%%', '', '', '', '', '', '', '', '', '', '%%USERNAME%%', 1, '', '', '1', '', 'RU', '', '0', '0', '0', '0', '', '', '', '%%SALT%%', '', 0);#inst# + +INSERT INTO `%%PRFX%%_paginations` (`id`, `pagination_name`, `pagination_box`, `pagination_start_label`, `pagination_end_label`, `pagination_separator_box`, `pagination_separator_label`, `pagination_next_label`, `pagination_prev_label`, `pagination_link_box`, `pagination_active_link_box`, `pagination_link_template`, `pagination_link_active_template`) +VALUES + (1, 'Общий шаблон', '
        %s
      ', '', '', '
    52. %s
    53. ', '…', '', '', '
    54. %s
    55. ', '
    56. %s
    57. ', '[name]', '[name]');#inst# \ No newline at end of file diff --git a/install/eula/bg.tpl b/install/eula/bg.tpl new file mode 100644 index 0000000..153ecbd --- /dev/null +++ b/install/eula/bg.tpl @@ -0,0 +1,100 @@ +
      + +AVE.cms - Web publishing software (Content managment system) +

      +Copyright 2014 by the contributors +

      +AVE.cms is released under the GPL +

      + + GNU GENERAL PUBLIC LICENSE
      + Версия 2, июнь 1991г. +

      +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +

      +Всеки може да копира и разпространява буквални копия на този лиценз, но промяната му не се допуска. +

      +
      +

      Преамбула

      +

      +Лицензите за повечето програми са направени така, че да Ви отнемат свободата за ползването и промяната им. В контраст на това GNU GPL е предназначен да гарантира Вашата свобода да споделяте и променяте свободния софтуер - да осигурите този софтуер да бъде свободен за всичките му потребители. Този общ публичен лиценз защитава повечето програми на Фондацията за свободен софтуер и всеки друг софтуер, за който авторите му решат да използват лиценза. (Другите програми на Фондацията за свободен софтуер се защитават от GNU LGPL.) Вие също можете да го прилагате към програмите си. +

      +Когато говорим за свободен софтуер, имаме предвид свободата, а не цената. Нашият GPL е направен така, че да Ви осигури свободата да разпространявате копия на свободен софтуер (и да взимате такса за тази услуга, ако желаете), също да Ви предостави изходните текстове на програмите или възможността да ги получите, ако искате, също да Ви позволи да променяте софтуера или да използвате части от него за създаването на нови свободни програми; също и да сте наясно как да правите тези неща. +

      +За да защитим Вашите права, се налага да направим ограничения, които забраняват на който и да е да Ви откаже тези права или да Ви помоли да се откажете от тях. Тези ограничения водят и до определени отговорности за Вас, ако разпространявате копия на свободен софтуер, или ако го променяте. +

      +Например, ако разпространявате копия на някаква програма, безплатно или срещу заплащане, трябва да предоставите на получателя всички права, които имате и Вие. Трябва да сте сигурен, че той, както и Вие, ще получи или може да получи изходните текстове на програмата. Освен това трябва да му покажете тези условия, за да може той да си знае правата. +

      +Ние защитаваме Вашите права по два начина: (1) чрез авторски права за софтуера и (2) предлагаме Ви това Разрешение, което дава законно основание за копиране, разпространение и/или промяна на софтуера. +

      +Също, за защита на всички автори и всеки от нас, ние искаме да сме сигурни, че всеки разбира, че няма никаква гаранция за работата на свободния софтуер. Ако програмата е променена от някой и предоставена на друг, ние изискваме получателят да знае, че това което има не е оригинала, тъй че всички проблеми, предизвикани от промените не трябва да се отразят на репутацията на оригиналния автор. +

      +Накрая, всяка свободна програма се третира еднакво от софтуерните патенти. Искаме да предотвратим опасността разпространителите на свободни програми да придобият патентни разрешения, приватизирайки по този начин програмите. За да се предпазим от това, ние искаме всеки издаден патент да разрешава свободно ползване от всички, или да не се издава въобще. +

      Правилата, условията и изисквания за копиране, разпространяване и промяна на свободния софтуер следват: +

      +Условия за копиране, разпространение и модификация според GNU Общ Публичен Лиценз +

      +0. Този Лиценз е приложим за всяка програма или друг продукт, които съдържат бележка, поставена от притежателя на авторското право, казваща, че те могат да бъдат разпространявани под условията на този Общ Публичен Лиценз. Под "Програмата" по нататък се има предвид всяка такава програма или продукт, а "продукт базиран на Програмата" означава или самата Програма, или всякакъв друг продукт. произхождащ от програмата според закона за авторското право, т.е. например, продукт съдържащ Програмата или част от нея, или дословно, или с модификации и/или преведена на друг език.(От тук нататък преводът се включва без ограничения в термина модификация). Обръщението към всеки обхванат от този лиценз е "Вие". +

      +Дейности различаващи се от копиране, разпространение и модификация не са обхванати от този лиценз, т.е. те са извън неговата сфера на действие.Акта на стартиране на Програмата не е ограничен, а изходната информация на Програмата се обхваща само ако нейното съдържание се състои от продукт базиран на Програмата(независим от получения при стартиране на Програмата) . Дали това е така зависи от това какво прави Програмата. +

      +1. Вие можете да копирате и разпространиявате дословни копия от изходния код на Програмата такъв, какъвто го получавате, на всякаква среда, при условие, че поставите на всяко копие подходяща бележка за авторските права и отказ от даване на гаранция, че прилагате всички бележки отнасящи се до този Лиценз и до липсата на всякаква гаранция, и че всеки получател на Програмата получава и копие от този Лиценз заедно с нея. +

      +Вие можете да таксувате физическия акт на прехвърляне на копие и по свое усмотрение да предлагате гаранция в замяна на тази такса. . +

      +2. Вие можете да модифицирате вашето копие или копия на Програмата или някаква част от нея, създавайки по този начин продукт базиран на Програмата, и да разпространявате такива модификации или продукти под условията, упоменати в Част 1 по горе, при условие че спазвате и следните условия: +

      +а) Вие трябва да направите така, че модифицираните файлове да съдържат на видно място бележки указващи, че Вие сте модифицирали файловете и датата на всяка модификация. +

      +b) Вие трябва да направите така, че всеки продукт или работа, които разпространявате или публикувате, които като цяло или в отделни свои части съдържат или ца произлезли от Програмата или някоя нейна част да бъдат лицензирани цялостно като безплатни за всички според условията на този Лиценз. +

      +c)Ако модифицираната програма нормално приема команди интерактивно по време на работа Вие трябва да направите така, че при започване на работа за такава интерактивна употреба по най-обикновения начин, тя да изписва съобщение включващо подходяща бележка за авторските права и бележка, че не се дава никаква гаранция (или че Вие давате гаранция) и че потребителите могат да разпространяват програмата съгласно тук упоменатите условия и обяснение как може да се види копие на този Лиценз.(Изключение: ако самата Програма е интерактивна но нормално не изписва такова съобщение не е задължително вашият продукт базиран на Програмата да изписва съобщението.) +

      +Тези изисквания са приложими за модифицираната работа като цяло. Ако различими части от тази работа не са произлезли от Програмата и могат да бъдат считани за независими и отделни продукти тогава този Лиценз и неговите условия не важат за тези части ако Вие ги разпространявате като отделен продукт. Ако, обаче, Вие разпространявате гореспоменатите части като част от продукт, базиран на Програмата то разпространението на този продукт трябва да се извършва според условията на този Лиценз и по този начин всяко лице, обхванато от него да притежава всички гарантирани от него права върху цялата програма и всички нейни части независимо кой ги е написал. +

      +По този начин целта на тази секция е не да оспорва или предявява претенции за правата върху софтуера написан изцяло от вас, а да упражнява контрол върху разпространението на продукти произхождащи от една или повече Програми. +

      +В допълнение, простото натрупване на други продукти небазирани на Програмата заедно с Програмата (или продукт, базиран на Програмата) на една и съща единица от среда за съхранение или разпространение на информация не вкарва другите продукти в обхвата на този Лиценз. +

      +3. Вие можете да копирате или разпространявате Програмата (или продукт, базиран на нея според условията на Част 2) във вид на обектен код или в изпълнима форма съобразявайки се с условията поставени в Части 1 и 2 по-горе като спазвате и следните условия: +

      +a) Да я разпространявате с пълния и, машинно читаем изходен код, който трябва да бъде разпространяван в съгласие с условията поставени в Части 1 и 2 по-горе, на среда обикновено използвана за размяна на софтуер или +

      +b) Да я разпространявате с писмено предложение, важащо поне за три години, даващо право на всеки да получи от вас и разпространява по условията на Части 1 и 2 пълно машинно читаемо копие от съответния изходен код, на цена не по-голяма от вашите разходи по физическото възпроизвеждане на кода или +

      +c) Да я разпространявате с информацията за предложението за разпространение на съответния изходен код, което сте получили.( Това е позволено само за некомерсиални дистрибуции и само ако Вие сте получили програмата във вид на обектен код или в изпълним вид придружена от такова предложение в съответствие със секция б по-горе.) +

      +Под изходен код на продукта се има предвид тази форма на продукта която е предпочитана за извършването на модификации върху него. За продукт в изпълним вид под пълен изходен код се има предвид целия изходен код на всички модули, които продукта съдържа заедно с всички свързани с продукта файлове определящи интерфейса и скриптовете използвани за контрол над компилирането и инсталирането на продукта в изпълним вид. Изключение представляват всички модули, които обикновено се разпространяват (или като изходен код или в изпълним вид) заедно с основни компоненти (компилатор, ядро и т.н.) на операционната система, за която е предназначен продукта в изпълним вид, чиито изходен код може да не придружава продукта освен ако някой от тях не придружава самия продукт. +

      +Ако разпространението на изпълними файлове или обектен код се извършва чрез предлагане на достъп с разрешение за копиране от определено място то трябва да се предлага еквивалентен достъп с възможност за копиране на изходния код, въпреки че трети лица не са задължени да копират изходния код заедно с обектния такъв. +

      +4. Вие не можете да копирате, разпространявате, променяте или прелицензирате Програмата по всякакъв друг начин, който не е изрично представен в този Лиценз. Всякакъв друг опит за промяна, прелицензиране, копиране и разпространение на Програмате е забранен и автоматично елиминира правата, които този Лиценз Ви дава. Лица, които са получили копия или права от вас по условията на този Лиценз ще запазят правата си дотогава докато се придържат към него. +

      +5. Вие не сте длъжен да приемате този Лиценз, тъй като не сте го подписвали. Разбира се, нищо друго не ви дава права да модифицирате или разпространявате Програмата или продукти произхождащи от нея. Тези действия са забранени от закона ако вие не приемете този Лиценз. Ето защо, модифицирайки или разпространявайки Програмата( или продукт базиран на Програмата) Вие автоматично приемате всички условия на този Лиценз за копиране, модифициране и разпространение на Програмата и продукти базирани на нея. +

      +6. Всеки път, когато Вие разпространявате Програмата(или продукт, базиран на Програмата) получателят и автоматично получава разрешение от оригиналния притежател на лиценза да копира, разпространява или модифицира Програмата обект на тези условия. Вие не можете да налагате каквито и да било ограничения възпрепятстващи получателя да упражнява правата гарантирани му тук. Вие не сте отговорен за налагане на подчинение на този Лиценз на трети лица. +

      +7. Ако като последствие от съдебно решение или обвинение в нарушение на патента или по някаква друга причина (неограничена само до въпроси свързани с патента) Ви е наложено спазването на условия (дали чрез съдебна заповед, съглашение или по друг начин), които противоречат на условията на лицензен този, те не ви освобождават от условията на този Лиценз. Ако Вие не можете да разпространявате Програмата по начин, който удовлетворява задълженията Ви по този Лиценз и всякакви други уместни задължения, то като последствие Вие не можете да разпространявате Програмата въобще. Например ако патентен лизенз не позволява безплатно разпространение на Програмата от тези, които получават нейни копия директно или индиретно чрез Вас единственият начин по който можете да удовлетворите него и този Лиценз е да се оттеглите изцяло от разпространението на Програмата. +

      +Ако някаква част от тази секция е невалидна или неприложима при определени обстоятелства, духът на тази секция е считан за приложим и секцията като цяло е считана за приложима при други условия. +

      +Целта на тази секция не е да ви подбужда да нарушавате някакви патентни или други права за собственост, а да защити цялостта на системата за разпространение на безплатен софтуер наложена от практиката на публичните лицензи. Много хора са дали своя щедър принос към широкообхватния софтуер, разпространяван в съответствие с последователното приложение на тази система, но само авторът може да избира дали той или тя ще разпространява софтуер чрез някаква друга система, а потребителите на лицнеза не могат да налагат този избор. +

      +Целта на тази секция е да направи абсолиутно ясно това, което е считано за следствие от останалата част на този Лиценз. +

      +8. Ако разпространението или употребата на Програмата е ограничено в определени страни или чрез патенти или чрез авторско право на интерфейса, оригиналният притежател на авторското право, който поставя Програмата под този Лиценз, може да добави изрично ограничение за географското разпространение изключващо тези страни така че разпространението е позволено само във или между страни не изключени по този начин. В този случай този Лиценз се обединява ограничението все едно то е включено в текста му. +

      +9. Фондацията за Безплатен Софтуер си запазва правото да публикува ревизирани и/или нови версии на Общия Публичен Лиценз. Такива нови версии ще бъдат подобни по смисъл с настоящата версия, но могат да се различават по отделни свои детайли, които касаят нововъзникнали проблеми. +

      +Всяка версия има номер, отличаващ я от другите. Ако Програмата уточнява номер на версия на този Лиценз, който се отнася до него и "всяка следваща версия" Вие имате избора да следвате условията на споменатата версия или на всяка следваща версия публикувана от Фондацията за Безплатен Софтуер. Ако Програмата не определя номер на версия на този Лиценз Вие можете да изберете всяка версия някога публикувана от Фондацията за Безплатен Софтуер. +

      +10. Ако желаете да съчетаете части от Програмата с други безплатни програми, разпространявани под други условия, контактувайте с авторите им и ги питайте за разрешение. За софтуер, чиито авторски права са притежание на Фондацията за Безплатен Софтуер пишете на Фондацията - понякога правим изключения. Нашето решение ще бъде повлияно от постигането на две цели - запазването на свободния статус на нашия безплатен софтуер и подпомагането на обмяната и преизползването на софтуер като цяло. +

      +НЯМА ГАРАНЦИЯ +

      +11. ТЪЙ КАТО ПРОГРАМАТА Е ЛИЦЕНЗИРАНА КАТО СВОБОДНА НЕ СЕ ДАВА НИКАКВА ГАРАНЦИЯ ЗА НЕЯ ДО СТЕПЕНТА ПОЗВОЛЕНА ОТ СЪОТВЕТНИЯ ЗАКОН. ПРИТЕЖАТЕЛИТЕ НА АВТОРСКИТЕ ПРАВА И/ИЛИ ДРУГИ ЛИЦА ПРЕДОСТАВЯТ ПРОГРАМАТА "КАКВАТО Е" БЕЗ КАКВАТО И ДА Е ГАРАНЦИЯ ПРЯКО ИЗРАЗЕНА ИЛИ ПО ПОДРАЗБИРАНЕ, ВКЛЮЧВАЩА, НО НЕ ОГРАНИЧЕНА ДО, ГАРАНЦИИТЕ ПО ПОДРАЗБИРАНЕ НАЛОЖЕНИ ОТ ПРОДАВАЕМОСТТА ИЛИ ПРИЛОЖИМОСТТА ЗА ОПРЕДЕЛЕНА ЦЕЛ, ОСВЕН АКО ОБРАТНОТО НЕ Е ПИСМЕНО ПОТВЪРДЕНО. ВИЕ ПОЕМАТЕ ЦЕЛИЯ РИСК ЗА КАЧЕСТВОТО И ПРЕДСТАВЯНЕТО НА ПРОГРАМАТА. АКО ПРОГРАМАТА СЕ ОКАЖЕ ДЕФЕКТНА ВИЕ ПОЕМАТЕ ЦЕНАТА НА ЦЯЛОТО НЕОБХОДИМО ОБСЛУЖВАНЕ, ВЪЗСТАНОВЯВАНЕ ИЛИ ПОПРАВКА. +

      +12. ПРИ НИКАКВИ ОБСТОЯТЕЛСТВА, ОСВЕН ПРИ СКЛЮЧЕНО ПИСМЕНО СЪГЛАШЕНИЕ ИЛИ ПРИ НАЛИЧИЕ НА СЪОТВЕТНОТО ИЗИСКВАНЕ В СЪЩЕСТВУВАЩИЯ ЗАКОН, НИКОЙ ОТ СОБСТВЕНИЦИТЕ НА АВТОРСКИТЕ ПРАВА ИЛИ КОЕТО И ДА Е ДРУГО ЛИЦЕ, ИМАЩО ПРАВО ДА РАЗПРОСТРАНЯВА ИЛИ МОДИФИЦИРА ПРОГРАМАТА СПОРЕД ИЗЛОЖЕНИТЕ ПО-ГОРЕ УСЛОВИЯ НЯМА ДА НОСИ ЗАДЪЛЖЕНИЯ КЪМ ВАС ЗАРАДИ ЩЕТИТЕ, КОИТО СТЕ ПОНЕСЛИ В СЛЕДСТВИЕ НА ВСЯКАКВИ ОБЩИ, СПЕЦИФИЧНИ И ИНЦИДЕНТНИ ПОРАЖЕНИЯ, ИЛИ ТАКИВА ВЪЗНИКНАЛИ ЗАРАДИ НЕВЪЗМОЖНОСТ ДА СЕ ИЗПОЛЗВА ПРОГРАМАТА. ПОРАЖЕНИяТА ВКЛЮЧВАТ, НО НЕ СА ОГРАНИЧЕНИ ДО: ЗАГУБА НА ДАННИ, НЕПРАВИЛНО ПРЕДСТАВЕНА ИНФОРМАЦИЯ, ЗАГУБИ ПРЕТЪРПЕНИ ОТ ВАС ИЛИ ДРУГИ ЛИЦА ИЛИ НЕВЪЗМОЖНОСТ НА ПРОГРАМАТА ДА РАБОТИ С ВСЯКАКВИ ДРУГИ ПРОГРАМИ. ГОРНОТО Е В СИЛА ДОРИ АКО СОБСТВЕНИКА НА АВТОРСКИТЕ ПРАВА ИЛИ ЛИЦАТА, РАЗПРОСТРАНЯВАЛИ И МОДИФИЦИРАЛИ ПРОГРАМАТА, СПОРЕД ТОЗИ ЛИЦЕНЗ СА БИЛИ УВЕДОМЕНИ ЗА ВЪЗМОЖНОСТТА ДА БЪДАТ НАНЕСЕНИ ТАКИВА ПОРАЖЕНИЯ. +

      +
      \ No newline at end of file diff --git a/install/eula/ru.tpl b/install/eula/ru.tpl new file mode 100644 index 0000000..0daeab6 --- /dev/null +++ b/install/eula/ru.tpl @@ -0,0 +1,321 @@ +
      + +AVE.cms - Web publishing software (Content managment system) +

      +Copyright 2014 by the contributors +

      +AVE.cms is released under the GPL +

      + + GNU GENERAL PUBLIC LICENSE
      + Версия 2, июнь 1991г. +

      +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +

      +Каждый вправе копировать и распространять экземпляры настоящей Лицензии без +внесения изменений в ее текст. +

      +
      +

      Преамбула

      +

      +Большинство лицензий на программное обеспечение лишаeт вас права распространять и +вносить изменения в это программное обеспечение. Стандартная Общественная Лицензия +GNU, напротив, разработана с целью гарантировать вам право совместно использовать и +вносить изменения в свободное программное обеспечение, т.е. обеспечить свободный +доступ к программному обеспечению для всех пользователей. Условия настоящей +Стандартной Общественной Лицензии применяются к большей части программного +обеспечения Free Software Foundation, а также к любому другому программному обеспечению +по желанию его автора. (К некоторому программному обеспечению Free Software Foundation +применяются условия Стандартной Общественной Лицензии GNU для Библиотек). Вы также +можете применять Стандартную Общественную Лицензию к разработанному вами +программному обеспечению. +

      +Говоря о свободном программном обеспечении, мы имеем в виду свободу, а не +безвозмездность. Настоящая Стандартная Общественная Лицензия разработана с целью +гарантировать вам право распространять экземпляры свободного программного +обеспечения (и при желании получать за это вознаграждение), право получать исходный +текст программного обеспечения или иметь возможность его получить, право вносить +изменения в программное обеспечение или использовать его части в новом свободном +программном обеспечении, а также право знать, что вы имеете все вышеперечисленные +права. +

      +Чтобы защитить ваши права, мы вводим ряд ограничений с тем, чтобы никто не имел +возможности лишить вас этих прав или обратиться к вам с предложением отказаться от +этих прав. Данные ограничения налагают на вас определенные обязанности в случае, +если вы распространяете экземпляры программного обеспечения или модифицируете +программное обеспечение. +

      +Например, если вы распространяете экземпляры такого программного обеспечения за +плату или бесплатно, вы обязаны передать новым обладателям все права в том же объеме, +в каком они принадлежат вам. Вы обязаны обеспечить получение новыми обладателями +программы ее исходного текста или возможность его получить. Вы также обязаны +ознакомить их с условиями настоящей Лицензии. +

      +Для защиты ваших прав мы: (1) оставляем за собой авторские права на программное +обеспечение и (2) предлагаем вам использовать настоящую Лицензию, в соответствии +с условиями которой вы вправе воспроизводить, распространять и/или модифицировать +программное обеспечение. +

      +Кроме того, для защиты как нашей репутации, так и репутации других авторов +программного обеспечения, мы уведомляем всех пользователей, что на данное +программное обеспечение никаких гарантий не предоставляется. Те, кто приобрел +программное обеспечение, с внесенными в него третьими лицами изменениями, должны +знать, что они получают не оригинал, в силу чего автор оригинала не несет +ответственности за ошибки в работе программного обеспечения, допущенные третьими +лицами при внесении изменений. +

      +Наконец, программное обеспечение перестает быть свободным в случае, если лицо +приобретает на него исключительные права [1]. Недопустимо, чтобы лица, +распространяющие свободное программное обеспечение, могли приобрести +исключительные права на использование данного программного обеспечения и +зарегистрировать их в Патентном ведомстве. Чтобы избежать этого, мы заявляем, что +обладатель исключительных прав обязан предоставить любому лицу права на +использование программного обеспечения либо не приобретать исключительных прав +вообще. +

      +Ниже изложены условия воспроизведения, распространения и модификации программного +обеспечения. +

      +Условия воспроизведения, распространения и модификации +

      +0. Условия настоящей Лицензии применяются ко всем видам программного обеспечения +или любому иному произведению, которое содержит указание правообладателя на то, что +данное произведение может распространяться на условиях Стандартной Общественной +Лицензии. Под термином "Программа" далее понимается любое подобное программное +обеспечение или иное произведение. Под термином "произведение, производное от +Программы" понимается Программа или любое иное производное произведение в +соответствии с законодательством об авторском праве [2], т.е. произведение, +включающее в себя Программу или ее часть, как с внесенными в ее текст изменениями, +так и без них и/или переведенную на другой язык. (Здесь и далее, понятие "модификация" +включает в себя понятие перевода в самом широком смысле). Каждый приобретатель +экземпляра Программы именуется в дальнейшем "Лицензиат". +

      +Действие настоящей Лицензии не распространяется на осуществление иных прав, кроме +воспроизведения, распространения и модификации программного обеспечения. Не +устанавливается ограничений на запуск Программы. Условия Лицензии +распространяются на выходные данные из Программы только в том случае, если их +содержание составляет произведение, производное от Программы (независимо от того, +было ли такое произведение создано в результате запуска Программы). Это зависит от +того, какие функции выполняет Программа. +

      +1. Лицензиат вправе изготовлять и распространять экземпляры исходного текста +Программы в том виде, в каком он его получил, без внесения в него изменений на любом +носителе, при соблюдении следующих условий: на каждом экземпляре помещен знак +охраны авторского права и уведомление об отсутствии гарантий; оставлены без +изменений все уведомления, относящиеся к настоящей Лицензии и отсутствию гарантий; +вместе с экземпляром Программы приобретателю передается копия настоящей Лицензии. +

      +Лицензиат вправе взимать плату за передачу экземпляра Программы, а также вправе за +плату оказывать услуги по гарантийной поддержке Программы. +

      +2. Лицензиат вправе модифицировать свой экземпляр или экземпляры Программы +полностью или любую ее часть. Данные действия Лицензиата влекут за собой создание +произведения, производного от Программы. Лицензиат вправе изготовлять и +распространять экземпляры такого произведения, производного от Программы, или +собственно экземпляры изменений в соответствии с пунктом 1 настоящей Лицензии при +соблюдении следующих условий: +

      +а) файлы, измененные Лицензиатом, должны содержать хорошо заметную пометку, что они +были изменены, а также дату внесения изменений; +

      +b) при распространении или публикации Лицензиатом любого произведения, которое +содержит Программу или ее часть или является производным от Программы или от ее +части, Лицензиат обязан передавать права на использование данного произведения +третьим лицам на условиях настоящей Лицензии, при этом Лицензиат не вправе +требовать уплаты каких-либо лицензионных платежей. Распространяемое произведение +лицензируется как одно целое; +

      +c) если модифицированная Программа при запуске обычно читает команды в +интерактивном режиме, Лицензиат обязан обеспечить вывод на экран дисплея или +печатающее устройство сообщения, которое должно включать в себя: +знак охраны авторского права; +уведомление об отсутствии гарантий на Программу (или иное, если Лицензиат +предоставляет гарантии); +указание на то, что пользователи вправе распространять экземпляры Программы в +соответствии с условиями настоящей Лицензии, а также на то, каким образом +пользователь может ознакомиться с текстом настоящей Лицензии. (Исключение: если +оригинальная Программа является интерактивной, но не выводит в своем обычном режиме +работы сообщение такого рода, то вывод подобного сообщения произведением, +производным от Программы, в этом случае не обязателен). +

      +Вышеуказанные условия применяются к модифицированному произведению, производному +от Программы, в целом. В случае если отдельные части данного произведения не +являются производными от Программы, являются результатом творческой деятельности и +могут быть использованы как самостоятельное произведение, Лицензиат вправе +распространять отдельно такое произведение на иных лицензионных условиях. В случае +если Лицензиат распространяет вышеуказанные части в составе произведения, +производного от Программы, то условия настоящей Лицензии применяются к +произведению в целом, при этом права, приобретаемые сублицензиатами на основании +Лицензии, передаются им в отношении всего произведения, включая все его части, +независимо от того, кто является их авторами. +

      +Целью настоящего пункта 2 не является заявление прав или оспаривание прав на +произведение, созданное исключительно Лицензиатом. Целью настоящего пункта +является обеспечение права контролировать распространение произведений, +производных от Программы, и составных произведений, производных от Программы. +

      +Размещение произведения, которое не является производным от Программы, на одном +устройстве для хранения информации или носителе вместе с Программой или +произведением, производным от Программы, не влечет за собой распространения условий +настоящей Лицензии на такое произведение. +

      +3. Лицензиат вправе воспроизводить и распространять экземпляры Программы или +произведения, которое является производным от Программы, в соответствии с пунктом 2 +настоящей Лицензии, в виде объектного кода или в исполняемой форме в соответствии с +условиями п.п.1 и 2 настоящей Лицензии при соблюдении одного из перечисленных ниже +условий: +

      +а) к экземпляру должен прилагаться соответствующий полный исходный текст в +машиночитаемой форме, который должен распространяться в соответствии с условиями +п.п. 1 и 2 настоящей Лицензии на носителе, обычно используемом для передачи +программного обеспечения, либо +

      +b) к экземпляру должно прилагаться действительное в течение трех лет предложение в +письменной форме к любому третьему лицу передать за плату, не превышающую стоимость +осуществления собственно передачи, экземпляр соответствующего полного исходного +текста в машиночитаемой форме в соответствии с условиями п.п. 1 и 2 настоящей Лицензии +на носителе, обычно используемом для передачи программного обеспечения, либо +

      +c) к экземпляру должна прилагаться полученная Лицензиатом информация о предложении, +в соответствии с которым можно получить соответствующий исходный текст. (Данное +положение применяется исключительно в том случае, если Лицензиат осуществляет +некоммерческое распространение программы, при этом программа была получена самим +Лицензиатом в виде объектного кода или в исполняемой форме и сопровождалась +предложением, соответствующим условиям пп.b п.3 настоящей Лицензии). +

      +Под исходным текстом произведения понимается такая форма произведения, которая +наиболее удобна для внесения изменений. Под полным исходным текстом исполняемого +произведения понимается исходный текст всех составляющих произведение модулей, а +также всех файлов, связанных с описанием интерфейса, и сценариев, предназначенных +для управления компиляцией и установкой исполняемого произведения. Однако, в +качестве особого исключения, распространяемый исходный текст может не включать +того, что обычно распространяется (в виде исходного текста или в бинарной форме) с +основными компонентами (компилятор, ядро и т.д.) операционной системы, в которой +работает исполняемое произведение, за исключением случаев, когда исполняемое +произведение сопровождается таким компонентом. +

      +В случае если произведение в виде объектного кода или в исполняемой форме +распространяется путем предоставления доступа для копирования его из +определенного места, обеспечение равноценного доступа для копирования исходного +текста из этого же места удовлетворяет требованиям распространения исходного +текста, даже если третьи лица при этом не обязаны копировать исходный текст вместе с +объектным кодом произведения. +

      +4. Лицензиат вправе воспроизводить, модифицировать, распространять или передавать +права на использование Программы только на условиях настоящей Лицензии. Любое +воспроизведение, модификация, распространение или передача прав на иных условиях +являются недействительными и автоматически ведут к расторжению настоящей Лицензии +и прекращению всех прав Лицензиата, предоставленных ему настоящей Лицензией. При +этом права третьих лиц, которым Лицензиат в соответствии с настоящей Лицензией +передал экземпляры Программы или права на нее, сохраняются в силе при условии +полного соблюдения ими настоящей Лицензии. +

      +5. Лицензиат не обязан присоединяться к настоящей Лицензии, поскольку он ее не +подписал. Однако только настоящая Лицензия предоставляет право распространять или +модифицировать Программу или произведение, производное от Программы. Подобные +действия нарушают действующее законодательство, если они не осуществляются в +соответствии с настоящей Лицензией. Если Лицензиат внес изменения или осуществил +распространение экземпляров Программы или произведения, производного от Программы, +Лицензиат тем самым подтвердил свое присоединение к настоящей Лицензии в целом, +включая условия, определяющие порядок воспроизведения, распространения или +модификации Программы или произведения, производного от Программы. +

      +6. При распространении экземпляров Программы или произведения, производного от +Программы, первоначальный лицензиар автоматически передает приобретателю такого +экземпляра право воспроизводить, распространять и модифицировать Программу в +соответствии с условиями настоящей Лицензии. Лицензиат не вправе ограничивать +каким-либо способом осуществление приобретателями полученных ими прав. Лицензиат +не несет ответственности за несоблюдение условий настоящей Лицензии третьими +лицами. +

      +7. Лицензиат не освобождается от исполнения обязательств в соответствии с настоящей +Лицензией в случае, если в результате решения суда или заявления о нарушении +исключительных прав или в связи с наступлением иных обстоятельств, не связанных +непосредственно с нарушением исключительных прав, на Лицензиата на основании +решения суда, договора или ином основании возложены обязательства, которые +противоречат условиям настоящей Лицензии. В этом случае Лицензиат не вправе +распространять экземпляры Программы, если он не может одновременно исполнить +условия настоящей Лицензии и возложенные на него указанным выше способом +обязательства. Например, если по условиям лицензионного соглашения сублицензиатам +не может быть предоставлено право бесплатного распространения экземпляров +Программы, которые они приобрели напрямую или через третьих лиц у Лицензиата, то в +этом случае Лицензиат обязан отказаться от распространения экземпляров Программы. +

      +Если любое положение настоящего пункта при наступлении конкретных обстоятельств +будет признано недействительным или неприменимым, настоящий пункт применяется за +исключением такого положения. Настоящий пункт применяется в целом при прекращении +вышеуказанных обстоятельств или их отсутствии. +

      +Целью данного пункта не является принуждение Лицензиата к нарушению патента или +заявления на иные права собственности или к оспариванию действительности такого +заявления. Единственной целью данного пункта является защита неприкосновенности +системы распространения свободного программного обеспечения, которая +обеспечивается за счет общественного лицензирования. Многие люди внесли свой +щедрый вклад в создание большого количества программного обеспечения, которое +распространяется через данную систему в надежде на ее длительное и +последовательное применение. Лицензиат не вправе вынуждать автора распространять +программное обеспечение через данную систему. Право выбора системы распространения +программного обеспечения принадлежит исключительно его автору. +

      +Настоящий пункт 7 имеет целью четко определить те цели, которые преследуют все +остальные положения настоящей Лицензии. +

      +8. В том случае если распространение и/или использование Программы в отдельных +государствах ограничено соглашениями в области патентных или авторских прав, +первоначальный правообладатель, распространяющий Программу на условиях настоящей +Лицензии, вправе ограничить территорию распространения Программы, указав только те +государства, на территории которых допускается распространение Программы без +ограничений, обусловленных такими соглашениями. В этом случае такое указание в +отношении территорий определенных государств признается одним из условий +настоящей Лицензии. +

      +9. Free Software Foundation может публиковать исправленные и/или новые версии настоящей +Стандартной Общественной Лицензии. Такие версии могут быть дополнены различными +нормами, регулирующими правоотношения, которые возникли после опубликования +предыдущих версий, однако в них будут сохранены основные принципы, закрепленные в +настоящей версии. +

      +Каждой версии присваивается свой собственный номер. Если указано, что Программа +распространяется в соответствии с определенной версией, т.е. указан ее номер, или +любой более поздней версией настоящей Лицензии, Лицензиат вправе присоединиться к +любой из этих версий Лицензии, опубликованных Free Software Foundation. Если Программа не +содержит такого указания на номер версии Лицензии Лицензиат вправе присоединиться +к любой из версий Лицензии, опубликованных когда-либо Free Software Foundation. +

      +10. В случае если Лицензиат намерен включить часть Программы в другое свободное +программное обеспечение, которое распространяется на иных условиях, чем в настоящей +Лицензии, ему следует испросить письменное разрешение на это у автора программного +обеспечения. Разрешение в отношении программного обеспечения, права на которое +принадлежат Free Software Foundation, следует испрашивать у Free Software Foundation. +В некоторых случаях Free Software Foundation делает исключения. При принятии решения +Free Software Foundation будет руководствоваться двумя целями: сохранение статуса свободного +для любого произведения, производного от свободного программного обеспечения Free Software +Foundation и обеспечение наиболее широкого совместного использования программного +обеспечения. +

      +
      +

      ОТСУТСТВИЕ ГАРАНТИЙНЫХ ОБЯЗАТЕЛЬСТВ

      +

      +11. ПОСКОЛЬКУ НАСТОЯЩАЯ ПРОГРАММА РАСПРОСТРАНЯЕТСЯ БЕСПЛАТНО, ГАРАНТИИ НА НЕЕ НЕ +ПРЕДОСТАВЛЯЮТСЯ В ТОЙ СТЕПЕНИ, В КАКОЙ ЭТО ДОПУСКАЕТСЯ ПРИМЕНИМЫМ ПРАВОМ. НАСТОЯЩАЯ +ПРОГРАММА ПОСТАВЛЯЕТСЯ НА УСЛОВИЯХ "КАК ЕСТЬ". ЕСЛИ ИНОЕ НЕ УКАЗАНО В ПИСЬМЕННОЙ +ФОРМЕ, АВТОР И/ИЛИ ИНОЙ ПРАВООБЛАДАТЕЛЬ НЕ ПРИНИМАЕТ НА СЕБЯ НИКАКИХ ГАРАНТИЙНЫХ +ОБЯЗАТЕЛЬСТВ, КАК ЯВНО ВЫРАЖЕННЫХ, ТАК И ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ПРОГРАММЫ, В +ТОМ ЧИСЛЕ ПОДРАЗУМЕВАЕМУЮ ГАРАНТИЮ ТОВАРНОГО СОСТОЯНИЯ ПРИ ПРОДАЖЕ И ПРИГОДНОСТИ +ДЛЯ ИСПОЛЬЗОВАНИЯ В КОНКРЕТНЫХ ЦЕЛЯХ, А ТАКЖЕ ЛЮБЫЕ ИНЫЕ ГАРАНТИИ. ВСЕ РИСКИ, +СВЯЗАННЫЕ С КАЧЕСТВОМ И ПРОИЗВОДИТЕЛЬНОСТЬЮ ПРОГРАММЫ, НЕСЕТ ЛИЦЕНЗИАТ. В СЛУЧАЕ +ЕСЛИ В ПРОГРАММЕ БУДУТ ОБНАРУЖЕНЫ НЕДОСТАТКИ, ВСЕ РАСХОДЫ, СВЯЗАННЫЕ С ТЕХНИЧЕСКИМ +ОБСЛУЖИВАНИЕМ, РЕМОНТОМ ИЛИ ИСПРАВЛЕНИЕМ ПРОГРАММЫ, НЕСЕТ ЛИЦЕНЗИАТ. +

      +12. ЕСЛИ ИНОЕ НЕ ПРЕДУСМОТРЕНО ПРИМЕНЯЕМЫМ ПРАВОМ ИЛИ НЕ СОГЛАСОВАНО СТОРОНАМИ В +ДОГОВОРЕ В ПИСЬМЕННОЙ ФОРМЕ, АВТОР И/ИЛИ ИНОЙ ПРАВООБЛАДАТЕЛЬ, КОТОРЫЙ МОДИФИЦИРУЕТ +И/ИЛИ РАСПРОСТРАНЯЕТ ПРОГРАММУ НА УСЛОВИЯХ НАСТОЯЩЕЙ ЛИЦЕНЗИИ, НЕ НЕСЕТ +ОТВЕТСТВЕННОСТИ ПЕРЕД ЛИЦЕНЗИАТОМ ЗА УБЫТКИ, ВКЛЮЧАЯ ОБЩИЕ, РЕАЛЬНЫЕ, ПРЕДВИДИМЫЕ И +КОСВЕННЫЕ УБЫТКИ (В ТОМ ЧИСЛЕ УТРАТУ ИЛИ ИСКАЖЕНИЕ ИНФОРМАЦИИ, УБЫТКИ, ПОНЕСЕННЫЕ +ЛИЦЕНЗИАТОМ ИЛИ ТРЕТЬИМИ ЛИЦАМИ, НЕВОЗМОЖНОСТЬ РАБОТЫ ПРОГРАММЫ С ЛЮБОЙ ДРУГОЙ +ПРОГРАММОЙ И ИНЫЕ УБЫТКИ). АВТОР И/ИЛИ ИНОЙ ПРАВООБЛАДАТЕЛЬ В СООТВЕТСТВИИ С +НАСТОЯЩИМ ПУНКТОМ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ДАЖЕ В ТОМ СЛУЧАЕ, ЕСЛИ ОНИ БЫЛИ +ПРЕДУПРЕЖДЕНЫ О ВОЗМОЖНОСТИ ВОЗНИКНОВЕНИЯ ТАКИХ УБЫТКОВ. +

      +
      \ No newline at end of file diff --git a/install/exit.html b/install/exit.html new file mode 100644 index 0000000..701ee7d --- /dev/null +++ b/install/exit.html @@ -0,0 +1,67 @@ + + + + + + + Установка AVE.cms отменена... + + + + + + + + + +
      +
      +
      Установка AVE.cms отменена...
      +
      +
      + + \ No newline at end of file diff --git a/install/index.php b/install/index.php new file mode 100644 index 0000000..08a0873 --- /dev/null +++ b/install/index.php @@ -0,0 +1,533 @@ + 0) + { + $cLastAlpha = strtolower(substr($str, -1)); + $size = intval($str); + switch($cLastAlpha) + { + case 't': + $size *= 1024; + case 'g': + $size *= 1024; + case 'm': + $size *= 1024; + case 'k': + $size *= 1024; + } + } + else + { + $size = 0; + } + return $size; +} + +/** + * Get GD version + * @return string + */ +function getGdVersion() +{ + if (function_exists('gd_info')) + { + $gd_info = @gd_info(); + return preg_replace('/[^0-9\.]/', '', $gd_info['GD Version']); + } + + return NULL; +} + +/** + * Get PCRE version + * @return string + */ +function getPcreVersion() +{ + defined('PCRE_VERSION') + ? list($version) = explode(' ', constant('PCRE_VERSION')) + : $version = NULL; + + return $version; +} + +/** + * Get MySQL version + * @return string + */ +function getMySQLVersion() { + $output = mysqli_get_client_info(); + preg_match('@[0-9]+\.[0-9]+\.[0-9]+@', $output, $version); + return $version[0]; +} + +function check_param($level, $text) +{ + $level = intval($level); + + switch ($level) + { + //Параметр не соответствует. + case 2: + $img = 'ico_delete'; + break; + //Несоответствие, не влияющее на функционирование системы. + case 1: + $img = 'ico_ok'; + break; + //Параметр соответствует. + case 0: + $img = 'ico_ok_green'; + break; + //По умолчанию + default: + $img = 'ico_ok_noproblem'; + break; + } + return $img; +} + + +/** + * @subpackage install + */ + error_reporting(E_ERROR); + ini_set('display_errors', 7); + +global $config; + +ob_start(); + +define('SETUP', 1); + +define('BASE_DIR', str_replace("\\", "/", dirname(dirname(__FILE__)))); + +if (!is_writable(BASE_DIR . '/cache/smarty/')) die('Cache folder is not writeable!'); + +include(BASE_DIR . '/inc/db.config.php'); +include(BASE_DIR . '/inc/config.php'); +include(BASE_DIR . '/functions/func.common.php'); +include(BASE_DIR . '/functions/func.helpers.php'); +include(BASE_DIR . '/class/class.template.php'); + +$AVE_Template = new AVE_Template(BASE_DIR . '/install/tpl/'); + +$lang_file = BASE_DIR . '/install/lang/ru.txt'; + +$AVE_Template->config_load($lang_file); + +$ver = APP_NAME . ' v' . APP_VERSION; + +$db_connect = check_db_connect($config['dbhost'], $config['dbuser'], $config['dbpass'], $config['dbname']); +$check_installed = check_installed($config['dbpref']); + +if ((true === $db_connect) && $_REQUEST['step'] != 'finish' && check_installed($config['dbpref'])) { + echo '
      ' . $AVE_Template->get_config_vars('installed') . '
      '; + exit; +}; + +$error_is_required = array(); + +check_required(); +check_writable(); + +// include_once(BASE_DIR . '/inc/errors.php'); + +$count_error = sizeof((array) $error_is_required); +if (1 == $count_error) +{ + $AVE_Template->assign('error_header', $AVE_Template->get_config_vars('erroro')); +} +elseif ($count_error > 1) +{ + $AVE_Template->assign('error_header', $AVE_Template->get_config_vars('erroro_more')); +} + +if ($count_error > 0 && ! (isset($_REQUEST['force']) && 1 == $_REQUEST['force'])) +{ + $AVE_Template->assign('error_is_required', $error_is_required); + $AVE_Template->display('error.tpl'); + exit; +} + +$_REQUEST['step'] = isset($_REQUEST['step']) ? $_REQUEST['step'] : ''; + +// Минимальные требования к системе +define('PHP_version', '5.2.2'); +define('MySQL_version', '5.0.0'); +define('GD_version', '2.0'); +define('PCRE_version', '7.0'); +define('JSON', $AVE_Template->get_config_vars('mess_on')); +define('MbString', $AVE_Template->get_config_vars('mess_on')); +define('SimpleXML', $AVE_Template->get_config_vars('mess_on')); +define('Iconv', $AVE_Template->get_config_vars('mess_on')); +define('XSLT', $AVE_Template->get_config_vars('mess_supported')); +define('Data_limit', '2'); // Mb +define('TIME_limit', '30'); // Sec +define('DISC_space', '30'); // Mb +define('RAM_space', '32M'); // Mb +define('SAFE_MODE', $AVE_Template->get_config_vars('mess_off')); +define('REGISTER_GLOBALS', $AVE_Template->get_config_vars('mess_off')); +define('MAGIC_QUOTES_GPC', $AVE_Template->get_config_vars('mess_off')); + +switch ($_REQUEST['step']) +{ + //Начало + case '' : + + //Шаг 1 + case '1' : + $AVE_Template->display('step1.tpl'); + break; + + //Шаг 2 + case '2' : + $AVE_Template->display('step2.tpl'); + break; + + //Шаг 3 + case '3' : + $test['php_version'] = phpversion(); + $test['mysql_version'] = getMySQLVersion(); + $test['gd_version'] = getGdVersion(); + $test['pcre_version'] = getPcreVersion(); + $test['json'] = function_exists('json_encode') ? $AVE_Template->get_config_vars('mess_on') : $AVE_Template->get_config_vars('mess_off'); + $test['simplexml'] = function_exists('simplexml_load_string') ? $AVE_Template->get_config_vars('mess_on') : $AVE_Template->get_config_vars('mess_off'); + $test['mbstring'] = function_exists('mb_internal_encoding') ? $AVE_Template->get_config_vars('mess_on') : $AVE_Template->get_config_vars('mess_off'); + $test['iconv'] = function_exists('iconv') ? $AVE_Template->get_config_vars('mess_on') : $AVE_Template->get_config_vars('mess_off'); + $test['xslt'] = (function_exists('xslt_create') || function_exists('domxml_xslt_stylesheet') || (class_exists('DomDocument') && class_exists('XsltProcessor'))) ? XSLT : $AVE_Template->get_config_vars('mess_unsupported'); + $test['data_limit'] = ini_get('post_max_size') ? ini_get('post_max_size') : $AVE_Template->get_config_vars('mess_undefined'); + $test['time_limit'] = ini_get('max_execution_time') ? ini_get('max_execution_time') : $AVE_Template->get_config_vars('mess_undefined'); + $test['disk_space'] = round(@disk_free_space($_SERVER['DOCUMENT_ROOT']) / 1024 / 1024, 2); + $test['memmory_limit'] = ini_get('memory_limit') ? ini_get('memory_limit') : $AVE_Template->get_config_vars('mess_undefined'); + $test['s_m'] = (ini_get('safe_mode') == 1) ? $AVE_Template->get_config_vars('mess_on') : $AVE_Template->get_config_vars('mess_off'); + $test['r_g'] = (ini_get('register_globals') == 1) ? $AVE_Template->get_config_vars('mess_on') : $AVE_Template->get_config_vars('mess_off'); + $test['m_q'] = (ini_get('magic_quotes_gpc') == 1 || ini_get('magic_quotes_runtime') == 1 || ini_get('magic_quotes_sybase') == 1) ? $AVE_Template->get_config_vars('mess_on') : $AVE_Template->get_config_vars('mess_off'); + + $check['php_version'] = check_param(version_compare(phpversion(), PHP_version, ">=") ? 0 : 2, $test['php_version']); + $check['mysql_version'] = check_param(version_compare(getMySQLVersion(), MySQL_version, ">=") ? 0 : 2, $test['mysql_version']); + $check['gd_version'] = check_param(version_compare($test['gd_version'], GD_version, ">=") ? 0 : 2, $test['gd_version']); + $check['pcre_version'] = check_param(version_compare($test['pcre_version'], PCRE_version, ">=") ? 0 : 2, $test['pcre_version']); + $check['mbstring'] = check_param(function_exists('mb_internal_encoding') ? 0 : 2, $test['mbstring']); + $check['json'] = check_param(function_exists('json_encode') ? 0 : 2, $test['json']); + $check['simplexml'] = check_param(function_exists('simplexml_load_string') ? 0 : 2, $test['simplexml']); + $check['iconv'] = check_param(function_exists('iconv') ? 0 : 2, $test['iconv']); + $check['xslt'] = check_param(($test['xslt'] == XSLT) ? 0 : 2, $test['xslt']); + $check['data_limit'] = check_param(($test['data_limit'] != $AVE_Template->get_config_vars('mess_undefined') && version_compare($test['data_limit'], Data_limit, ">=")) ? 0 : 2, $test['data_limit']); + $check['time_limit'] = check_param(($test['time_limit'] != $AVE_Template->get_config_vars('mess_undefined') && $test['time_limit'] >= TIME_limit) ? 0 : 2, ($test['time_limit'] != $AVE_Template->get_config_vars('mess_undefined')) ? $test['time_limit'] . " " . $AVE_Template->get_config_vars('seconds') : $t_l); + $check['disk_space'] = check_param(($test['disk_space'] != $AVE_Template->get_config_vars('mess_undefined') && $test['disk_space'] >= DISC_space) ? 0 : 2, ($test['disk_space'] != $AVE_Template->get_config_vars('mess_undefined')) ? $test['disk_space'].$AVE_Template->get_config_vars('megabytes') : $test['disk_space']); + $check['memmory_limit'] = check_param(($test['memmory_limit'] != $AVE_Template->get_config_vars('mess_undefined') && convertSizeToBytes($test['memmory_limit']) >= convertSizeToBytes(RAM_space)) ? 0 : (($test['memmory_limit'] != $AVE_Template->get_config_vars('mess_undefined')) ? 2 : 1), $test['memmory_limit']); + $check['s_m'] = check_param(($test['s_m'] == SAFE_MODE) ? 0 : 1, $test['s_m']); + $check['r_g'] = check_param(($test['r_g'] == REGISTER_GLOBALS) ? 0 : 1, $test['r_g']); + $check['m_q'] = check_param(($test['m_q'] == MAGIC_QUOTES_GPC) ? 0 : 1, $test['m_q']); + + $AVE_Template->assign('check', $check); + $AVE_Template->assign('test', $test); + $AVE_Template->display('step3.tpl'); + break; + + //Шаг 4 + case '4' : + if (!empty($_POST['dbname']) && !empty($_POST['dbprefix'])) + { + $db_connect = check_db_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass'], $_POST['dbname']); + + if (true === $db_connect) { + $mysql_connect = @mysqli_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass']); + @mysqli_select_db($mysql_connect, $_POST['dbname']); + } + + // Очищаем бд (по префиксу) + if (isset($_REQUEST["dbclean"]) && $_REQUEST["dbclean"] == "1") { + clean_db($_POST['dbname'], $_POST['dbprefix'], $mysql_connect); + } + + // Создать новую БД + if(isset($_REQUEST['dbcreat'])){ + + $link = check_mysql_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass']); + + if (false === $link) { + $AVE_Template->assign('warning', 'Ошибка соединения: ' . mysqli_error()); + } else { + $mysqli_connect = @mysqli_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass']); + } + + if(false === $db_connect) { + @mysqli_query($mysqli_connect, "SET collation_server = 'utf8_general_ci'"); + @mysqli_query($mysqli_connect, "SET character_set_server = 'utf8'"); + + $sql = 'CREATE DATABASE ' . $_POST['dbname']; + + if (false === check_mysql_query($mysqli_connect, $sql)) { + $AVE_Template->assign('warning', 'Ошибка при создании базы данных: ' . mysqli_error() . "\n"); + } + } + } + + $check_installed = check_installed($_POST['dbprefix']); + + $connect = check_db_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass'], $_POST['dbname']); + + if (true === $connect && false === $check_installed) + { + if (! @is_writeable(BASE_DIR . '/inc/db.config.php')) + { + $AVE_Template->assign('config_isnt_writeable', 1); + $AVE_Template->display('error.tpl'); + exit; + } + + $fp = @fopen(BASE_DIR . '/inc/db.config.php', 'w+'); + @fwrite($fp, "" + ); + @fclose($fp); + + $filename = BASE_DIR . '/install/structure_base.sql'; + + $handle = fopen($filename, 'r'); + $db_structure = fread($handle, filesize($filename)); + fclose($handle); + + $db_structure = str_replace('%%PRFX%%', $_POST['dbprefix'], $db_structure); + + $mysql_connect = @mysqli_connect($_POST['dbhost'], $_POST['dbuser'], $_POST['dbpass'], $_POST['dbname']); + @mysqli_select_db($mysql_connect, $_POST['dbname']); + + $ar = explode('#inst#', $db_structure); + + foreach ($ar as $in) + { + @mysqli_query($mysql_connect, "$in"); + } + + $AVE_Template->display('step5.tpl'); + exit; + } + elseif (true === $connect && true === $check_installed) + { + $AVE_Template->assign('installed', $AVE_Template->get_config_vars('database_installed')); + } + else + { + $AVE_Template->assign('warning', $AVE_Template->get_config_vars('database_not_connect')); + } + + } + else + { + $dbpref = make_random_string(5, 'abcdefghijklmnopqrstuvwxyz0123456789'); + $AVE_Template->assign('dbpref', $dbpref); + } + + $AVE_Template->display('step4.tpl'); + break; + + case '5' : + $_POST['email'] = chop($_POST['email']); + $_POST['username'] = chop($_POST['username']); + + $regex_username = '/[^\w-]/'; + $regex_password = '/[^\x20-\xFF]/'; + $regex_email = '/^[\w.-]+@[a-z0-9.-]+\.(?:[a-z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum)$/i'; + + $errors = array(); + if ($_POST['email'] == '') array_push($errors, $AVE_Template->get_config_vars('noemail')); + if (! preg_match($regex_email, $_POST['email'])) array_push($errors, $AVE_Template->get_config_vars('email_no_specialchars')); + if (empty($_POST['pass']) || preg_match($regex_password, $_POST['pass'])) array_push($errors, $AVE_Template->get_config_vars('check_pass')); + if (strlen($_POST['pass']) < 5) array_push($errors, $AVE_Template->get_config_vars('pass_too_small')); + if (empty($_POST['username']) || preg_match($regex_username, $_POST['username'])) array_push($errors, $AVE_Template->get_config_vars('check_username')); + + $AVE_Template->assign('errors', $errors); + + if (true === $db_connect && ! sizeof($errors)) + { + if (isset($_POST['demo']) && 1 == $_POST['demo']) + { + $filename = BASE_DIR . '/install/data_demo.sql'; + } + else + { + $filename = BASE_DIR . '/install/data_base.sql'; + } + + $mysql_connect = @mysqli_connect($config['dbhost'], $config['dbuser'], $config['dbpass']); + @mysqli_select_db($mysql_connect, $config['dbname']); + + $handle = fopen($filename, 'r'); + $dbin = fread($handle, filesize($filename)); + fclose($handle); + + $salt = make_random_string(); + $hash = md5(md5($_POST['pass'] . $salt)); + + $dbin = str_replace('%%SITENAME%%', $ver, $dbin); + $dbin = str_replace('%%PRFX%%', $config['dbpref'], $dbin); + $dbin = str_replace('%%EMAIL%%', $_POST['email'], $dbin); + $dbin = str_replace('%%SALT%%', $salt, $dbin); + $dbin = str_replace('%%PASS%%', $hash, $dbin); + $dbin = str_replace('%%TIME%%', time(), $dbin); + $dbin = str_replace('%%FIRSTNAME%%', $_POST['firstname'], $dbin); + $dbin = str_replace('%%LASTNAME%%', $_POST['lastname'], $dbin); + $dbin = str_replace('%%USERNAME%%', $_POST['username'], $dbin); + $dbin = str_replace('%%PHONE%%', $_POST['fon'], $dbin); + $dbin = str_replace('%%FAX%%', $_POST['fax'], $dbin); + $dbin = str_replace('%%ZIP%%', $_POST['zip'], $dbin); + $dbin = str_replace('%%TOWN%%', $_POST['town'], $dbin); + $dbin = str_replace('%%STREET%%', $_POST['street'], $dbin); + $dbin = str_replace('%%HNR%%', $_POST['hnr'], $dbin); + + $ar = explode('#inst#', $dbin); + + foreach ($ar as $in) + { + @mysqli_query($mysql_connect, "SET NAMES 'utf8'"); + @mysqli_query($mysql_connect, "SET COLLATION_CONNECTION = 'utf8_general_ci'"); + @mysqli_query($mysql_connect, $in); + } +/* + $auth = base64_encode(serialize(array('id' => '1', 'hash'=>$hash))); + @setcookie('auth', $auth); +*/ + $AVE_Template->display('step6.tpl'); + exit; + } + + $AVE_Template->display('step5.tpl'); + break; +} + +?> \ No newline at end of file diff --git a/install/lang/bg.js b/install/lang/bg.js new file mode 100644 index 0000000..7528f34 --- /dev/null +++ b/install/lang/bg.js @@ -0,0 +1,2 @@ +var cancelTitle = "Прекъсване на инсталацията"; +var cancelConfirm = "Сигурни ли сте, че желаете да прекратите инсталацията?"; \ No newline at end of file diff --git a/install/lang/bg.txt b/install/lang/bg.txt new file mode 100644 index 0000000..7208d97 --- /dev/null +++ b/install/lang/bg.txt @@ -0,0 +1,128 @@ +install = "Инсталиране" + +oficial_site = "Сайт" +support = "Техническа поддръжка" + +bread_information = "Информация за система за управление на сайт AVE.CMS" +bread_lictexttitle = "Лицензно съглашение" +bread_server = "Проверка за съответствие на сървъра" +bread_database_setting = "Настройка на параметрите за свързване с базата данни" +bread_install_type = "Избор на типа на инсталация" +bread_stepstatus = "Създаване на Администраторски профил" +bread_install_finish = "Инсталацията завърши успешно!" + +step_info = "Информация за система за управление на сайт AVE.CMS" +step_data_1 = "Инсталационната прогрма ще провери дали софтера на сървъра отговаря на системните изисквания на AVE.CMS, ще инсталира и конфигурира системата." +step_data_2 = "При възникнали проблеми, моля обърнете си към техническата поддръжка." +step_data_3 = "Благодарим за избора на системата за управление на сайтове AVE.CMS!" + +database_setting_desc = "Моля, въведете параметрите, необходими за връзка с данновия сървър." +install_help = "Помощ за инсталацията" +install_step = "Стъпка" + +install_demo = "Демо съдържание" +install_clear = "Празна версия на системата" +install_setting_desc = "Изберете типа на исталация на системата" + +loginstar = "Полета обозначени с * са задължителни за попълване." + +field_host = "В полето трябва да се въведе името или IP адреса на данновия сървър. По подразбиране се използва "localhost"." +field_user = "В полето трябва да се въведе името на потребителя за връзка с данновия сървър. По подразбиране "root"." +field_pass = "В полето трябва да се въведе паролата за връзка с данновия сървър. По подразбиране "без парола"." +field_name = "В полето трябва да въведе наименованието на базата данни." +field_prf = "В полето трябва да се въведе префикса за всички таблици в базата данни. Може да използвате произволно буквеноцифрова комбинация. По подразбиране се генерира случайна комбинация." +field_setting_desc = "Демо съдържание - системата се инсталира с модули и примерни данни. Препоръчва се за първоначално запознаване със системата." +database_setting = "Моля, въведете параметрите за връзка с данновия сървър." +database_setting_foot = "Ако всички параметри са верно въведени и вие сте готови да продължите инсталацията, натиснете "Запази и продължи". За прекратяване на инсталацията натиснете "Прекъсни инсталацията"." +database_clean = "При изчистване на базата данни, цялата информация в нея ще бъде изтрита!" +database_setting_save = "Запази и продължи" +database_not_checked = "Не установявайте този флаг, ако базата е вече създадена!" + +exit = "Прекъсни инсталацията" + +lic_text = "Моля, внимателно прочетете лицензионното съглашение, преди да продължите инсталацията." +lic_agree = "Приемам лицензионното съглашение." +lic_msg = "Ако приемате лицензионното съглашение, натиснете "Продължи инсталацията". За прекратяване на инсталацията натиснете "Прекъсни инсталацията"." +lic_ok = "Продължи инсталацията" + +dbserver = "Адрес на данновия сървър:" +dbuser = "Потребител на базата данни:" +dbname = "Наименование на базата данни:" +dbpass = "Парола за базата данни:" +dbprefix = "Префикс за таблиците:" +dbcreat = "Създай базата данни:" +dbclear = "Изчистване на базата данни:" + +admin_create = "Административния профил е успешно създаден." +header_logindata = "Моля, бъдете много внимателни при попълването на полетата." +login_data = "Данни за профила:" +login_field = "Полетата, маркирани с * са задължителни за попълване." +username = "Име на потребител" +email = "Имейл" +password = "Парола" + + +noemail = "Моля, въведете имейл адрес." +email_no_specialchars = "Грешка! Имейла съдържа недопустими символи." +nopass = "Моля, въведете парола" +pass_no_specialchars = "Грешка! Паролата съдържа специални символи." +install_finish_body = "
      • Задължително изтрийте папка
        /install/

      • • За преход в административния панел натиснете тук

        • За преход към сайта натиснете тук
      " + +structure = "Създаване на структурата на базата данни:" +erroro = "Възникна грешка..." +erroro_more = "Възникнаха грешки..." +secondchance = "Моля, отстранете всички грешки и пробвайте отново." +warning_force = "Внимание! Ако продължите инсталацията, въпреки предупрежденията, системата може да не работи правилно." +button_setup_next = "Продължи инсталацията" +button_setup_final = "Завърши инсталацията" +help_icon = "" +confirm_exit = "Сигурни ли сте, че желаете да прекъснете инсталацията?" + +templates_c_notwritable = "
      Ошибка!
      Инсталацията не може да продължи защото липсват права за запис в папка /cache/smarty/.
      Моля, променете правата с помощта на вашия FTP клиент." + +database_not_connect = "Не може да се установи съединение с базата данни. Моля проверете параметрите." +database_installed = "• Установена е връзка с базата данни, но в нея са открити таблици с въведения от вас префикс.
      • Моля, променете префикса, или установете флага 'Изчистване на базата данни' (ще бъдат изтрити само таблиците с указания от вас префикс)." +installed = "Внимание, системата е вече инсталирана. Ако е необходимо да направите допълнителна инсталация, моля използвайте друга база данни.

      За преминете към сайта, Натиснете тук" +error_is_required = "Файл '" +error_is_required_2 = "' не съществува." +error_is_writeable = "Папката '" +error_is_writeable_2 = "' няма права за запис." +phpversion_toold = "Текущата PHP версия е остаряла. За работата на системата е необхДля работы системы требуется версия не по-ниска от: " +force = "Игнорирай предупрежденията" +force_impossibly = "невъзможно!" +config_isnt_writeable = "Грешка! Файлът '/inc/db.config.php' няма права за запис.
      Моля, променете правата на файла с помощта на вашия FTP-клиент." +check_pass = "Моля, проверете паролата." +pass_too_small = "Въведената парола е много къса, минималната дължина на паролата е 5 символа." +check_username = "Моля, проверете Името на потребителя." +check_name = "Моля, проверете вашето Име." +check_last_name = "Моля, проверете вашата Фамилия." +error_reload = "Проба за продължаване на инсталацията" + +mess_on = "Включено" +mess_off = "Изключено" +mess_supported = "Поддържа се" +mess_unsupported = "Не се поддържа" +mess_undefined = "Неопределено" +seconds = "сек." +megabytes = "М" + +col_parametr = "Параметър" +col_requered = "Изисква се" +col_have = "Открито" + +php_version = "Версия PHP" +mysql_version = "Версия MySQL" +gd_version = "Версия GD" +prce_version = "Версия PCRE" +mbstring = "Multibyte String" +json = "JSON" +simple_xml = "SimpleXML" +iconv = "Iconv" +xslt = "Поддръка на XSLT" +max_upload = "Максимален размер за качване" +max_time = "Максимално време за изпълнение" +disk_space = "Дисково пространство" +memmory_limit = "Обем памет" +php_safe = "Защитен режим на PHP" +register_globals = "Глобални променливи" +magic_qoutes = "Магически кавички" \ No newline at end of file diff --git a/install/lang/ru.js b/install/lang/ru.js new file mode 100644 index 0000000..50221d9 --- /dev/null +++ b/install/lang/ru.js @@ -0,0 +1,2 @@ +var cancelTitle = "Отмена установки"; +var cancelConfirm = "Вы уверены, что хотите отменить установку?"; \ No newline at end of file diff --git a/install/lang/ru.txt b/install/lang/ru.txt new file mode 100644 index 0000000..a3df71d --- /dev/null +++ b/install/lang/ru.txt @@ -0,0 +1,128 @@ +install = "Установка" + +oficial_site = "Официальный сайт" +support = "Служба технической поддержки" + +bread_information = "Информация о системе управления сайтом AVE.CMS" +bread_lictexttitle = "Лицензионное соглашение" +bread_server = "Проверка соответствия параметров сервера" +bread_database_setting = "Настройка параметров для соединения с базой данных" +bread_install_type = "Выбор типа установки" +bread_stepstatus = "Создание учетной записи Администратора" +bread_install_finish = "Установка успешно завершена!" + +step_info = "Информация о системе управления сайтом AVE.CMS" +step_data_1 = "Программа установки проверит соответствие программного обеспечения на сервере системным требованиям AVE.CMS, произведет установку и первоначальное конфигурирование системы управления сайтом AVE.CMS." +step_data_2 = "В случае возникновения вопросов или неточностей в работе системы управления сайтом AVE.CMS, просим обращаться в службу технической поддержки." +step_data_3 = "Благодарим за выбор системы управления сайтом AVE.CMS!" + +database_setting_desc = "Пожалуйста, укажите параметры, необходимые для установки соединения с сервером базы данных." +install_help = "Помощь в установке" +install_step = "Шаг" + +install_demo = "Демонстрационный контент" +install_clear = "Чистая версия системы" +install_setting_desc = "Выберите тип установки системы" + +loginstar = "Поля отмеченные * обязательны для заполнения." + +field_host = "В данном поле необходимо указать имя или IP адрес сервера базы данных. По умолчанию используется "localhost"." +field_user = "В данном поле необходимо указать имя пользователя для соединения с базой данных. По умолчанию "root"." +field_pass = "В данном поле необходимо указать пароль для соединения с базой данных. По умолчанию "без пароля"." +field_name = "В данном поле необходимо указать название используемой базы данных." +field_prf = "В данном поле необходимо указать префикс, который будет установлен для всех таблиц в базе данных. Вы можете использоваь любое, буквенно - цифровое значение. По умолчанию значение сгенерировано случайно." +field_setting_desc = "Демонстрационный контент - система с установленными модулями и некоторыми примерами данных. Рекомендуется для первой установки и ознакомления с системой." +database_setting = "Пожалуйста, укажите параметры, необходимые для установки соединения с сервером базы данных." +database_setting_foot = "Если все параметры указаны верно и вы готовы продолжить установку, нажмите "Сохранить и продолжить". Для прекращения установки нажмите "Отменить установку"." +database_clean = "При очищении базы данных все данные из нее будут удалены!" +database_setting_save = "Сохранить и продолжить" +database_not_checked = "Не устанавливайте этот флажок, если база данных уже создана!" + +exit = "Отменить установку" + +lic_text = "Пожалуйста, внимательно прочитайте лицензионное соглашение, прежде чем продолжить установку." +lic_agree = "Принимаю лицензионное соглашение." +lic_msg = "Если вы принимаете лицензионное соглашение, нажмите "Продолжить установку". Для прекращения установки нажмите "Отменить установку"." +lic_ok = "Продолжить установку" + +dbserver = "Адрес сервера базы данных:" +dbuser = "Имя пользователя базы данных:" +dbname = "Название базы данных:" +dbpass = "Пароль базы данных:" +dbprefix = "Префикс для таблиц:" +dbcreat = "Создать базу данных:" +dbclear = "Очистить базу данных:" + +admin_create = "Учетная запись Администратора успешно создана." +header_logindata = "Пожалуйста, будьте предельно внимательны при заполнении полей." +login_data = "Данные для учетной записи:" +login_field = "Поля отмеченные * обязательны для заполнения." +username = "Имя пользователя" +email = "E-mail" +password = "Пароль" + + +noemail = "Пожалуйста, укажите E-mail адрес." +email_no_specialchars = "Ошибка! E-mail адрес содержит недопустимые символы." +nopass = "Пожалуйста, укажите пароль" +pass_no_specialchars = "Ошибка! Пароль содержит специальные символы." +install_finish_body = "
      • Удалите, пожалуйста, папку
        /install/

      • • Для перехода в панель управления нажмите здесь

        • Для перехода на сайт нажмите здесь
      " + +structure = "Создание структуры базы данных:" +erroro = "Возникла ошибка..." +erroro_more = "Возникли ошибки..." +secondchance = "Пожалуйста, устраните все ошибки и попробуйте снова." +warning_force = "Внимание! Если вы продолжите установку, несмотря на все предупреждения об ошибках, программное обеспечение может работать некорректно." +button_setup_next = "Продолжить установку" +button_setup_final = "Завершить установку" +help_icon = "" +confirm_exit = "Вы уверены, что хотите отменить установку?" + +templates_c_notwritable = "
      Ошибка!
      Невозможно продолжить установку системы по причине отсутствия прав на запись в папку /cache/smarty/.
      Пожалуйста, измените права с помощью Вашего FTP клиента." + +database_not_connect = "Невозможно установить соединение с базой данных. Пожалуйста, проверьте параметры." +database_installed = "• Соединение с базой данных установлено, однако в ней обнаружены таблицы с указанным Вами префиксом.
      • Пожалуйста, измените префикс либо отметьте галочкой 'Очистить базу данных' (будут удалены только таблицы с указанным Вами префиксом)." +installed = "Внимание, система уже установлена. Если вам необходимо выполнить дополнительную установку, пожалуйста, используйте другую базу данных.

      Чтобы перейти на сайт, нажмите здесь" +error_is_required = "Файл '" +error_is_required_2 = "' не существует." +error_is_writeable = "Папка '" +error_is_writeable_2 = "' не имеет прав на запись." +phpversion_toold = "Текущая версия PHP устарела. Для работы системы требуется версия не ниже: " +force = "Игнорировать предупреждения" +force_impossibly = "невозможно!" +config_isnt_writeable = "Ошибка! Файл '/inc/db.config.php' не имеет прав на запись.
      Пожалуйста, измените права на файл с помощью вашего FTP-клиента." +check_pass = "Пожалуйста, проверьте пароль." +pass_too_small = "Указанный пароль слишком короткий, минимальная длина пароля должна быть не менее 5 символов." +check_username = "Пожалуйста, проверьте Имя пользователя." +check_name = "Пожалуйста, проверьте Ваше Имя." +check_last_name = "Пожалуйста, проверьте Вашу Фамилию." +error_reload = "Попытаться продолжить установку" + +mess_on = "Включено" +mess_off = "Отключено" +mess_supported = "Поддерживается" +mess_unsupported = "Не поддерживается" +mess_undefined = "Неопределено" +seconds = "сек." +megabytes = "М" + +col_parametr = "Параметр" +col_requered = "Требуется" +col_have = "Имеется" + +php_version = "Версия PHP" +mysql_version = "Версия MySQL" +gd_version = "Версия GD" +prce_version = "Версия PCRE" +mbstring = "Multibyte String" +json = "JSON" +simple_xml = "SimpleXML" +iconv = "Iconv" +xslt = "Поддержка XSLT" +max_upload = "Максимальный размер загружаемых данных" +max_time = "Максимальное время исполнения" +disk_space = "Дисковое пространство" +memmory_limit = "Объем памяти" +php_safe = "Защищённый режим PHP" +register_globals = "Глобальные переменные" +magic_qoutes = "Магические кавычки" \ No newline at end of file diff --git a/install/structure_base.sql b/install/structure_base.sql new file mode 100755 index 0000000..fad24c5 --- /dev/null +++ b/install/structure_base.sql @@ -0,0 +1,511 @@ +CREATE TABLE `%%PRFX%%_blocks` ( + `id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `block_name` varchar(255) NOT NULL, + `block_description` tinytext NOT NULL, + `block_alias` varchar(20) NOT NULL, + `block_text` longtext NOT NULL, + `block_active` enum('0','1') NOT NULL DEFAULT '1', + `block_author_id` int(10) unsigned NOT NULL DEFAULT '1', + `block_created` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8;#inst# + +CREATE TABLE `%%PRFX%%_countries` ( + `Id` mediumint(5) unsigned NOT NULL auto_increment, + `country_code` char(2) NOT NULL default 'RU', + `country_name` char(50) NOT NULL, + `country_status` enum('1','2') NOT NULL default '2', + `country_eu` enum('1','2') NOT NULL default '2', + PRIMARY KEY (`Id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8;#inst# + +CREATE TABLE `%%PRFX%%_document_fields` ( + `Id` int(10) unsigned NOT NULL auto_increment, + `rubric_field_id` mediumint(5) unsigned NOT NULL default '0', + `document_id` int(10) unsigned NOT NULL default '0', + `field_number_value` decimal(18,4) NOT NULL default '0.0000', + `field_value` varchar(500) NOT NULL, + `document_in_search` enum('1','0') NOT NULL default '1', + PRIMARY KEY (`Id`), + KEY `document_id` (`document_id`), + KEY `rubric_field_id` (`rubric_field_id`,`document_in_search`), + KEY `field_value` (`field_value`(333)) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_document_fields_text` ( + `Id` int(10) unsigned NOT NULL auto_increment, + `rubric_field_id` mediumint(5) unsigned NOT NULL DEFAULT '0', + `document_id` int(10) unsigned NOT NULL default '0', + `field_value` longtext NOT NULL, + PRIMARY KEY (`Id`), + KEY `document_id` (`document_id`), + KEY `rubric_field_id` (`rubric_field_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_document_keywords` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `document_id` int(11) NOT NULL, + `keyword` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + KEY `document_id` (`document_id`), + KEY `keyword` (`keyword`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_document_remarks` ( + `Id` int(10) unsigned NOT NULL auto_increment, + `document_id` int(10) unsigned NOT NULL default '0', + `remark_first` enum('0','1') NOT NULL default '0', + `remark_title` varchar(255) NOT NULL, + `remark_text` text NOT NULL, + `remark_author_id` int(10) unsigned NOT NULL default '1', + `remark_published` int(10) unsigned NOT NULL default '0', + `remark_status` enum('1','0') NOT NULL default '1', + `remark_author_email` varchar(255) NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_document_rev` ( + `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `doc_id` mediumint(5) unsigned NOT NULL DEFAULT '0', + `doc_revision` int(10) unsigned NOT NULL DEFAULT '0', + `doc_data` longtext NOT NULL, + `user_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`Id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_documents` ( + `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `rubric_id` mediumint(5) unsigned NOT NULL DEFAULT '0', + `rubric_tmpl_id` mediumint(5) unsigned NOT NULL DEFAULT '0', + `document_parent` int(10) unsigned NOT NULL DEFAULT '0', + `document_alias` varchar(255) NOT NULL, + `document_alias_history` enum('0','1','2') NOT NULL DEFAULT '0', + `document_title` varchar(255) NOT NULL, + `document_breadcrum_title` varchar(255) NOT NULL, + `document_published` int(10) unsigned NOT NULL DEFAULT '0', + `document_expire` int(10) unsigned NOT NULL DEFAULT '0', + `document_changed` int(10) unsigned NOT NULL DEFAULT '0', + `document_author_id` mediumint(5) unsigned NOT NULL DEFAULT '1', + `document_in_search` enum('1','0') NOT NULL DEFAULT '1', + `document_meta_keywords` text NOT NULL, + `document_meta_description` text NOT NULL, + `document_meta_robots` enum('index,follow','index,nofollow','noindex,nofollow') NOT NULL DEFAULT 'index,follow', + `document_sitemap_freq` tinyint(1) NOT NULL DEFAULT '3', + `document_sitemap_pr` float NOT NULL DEFAULT '0.5', + `document_status` enum('1','0') NOT NULL DEFAULT '1', + `document_deleted` enum('0','1') NOT NULL DEFAULT '0', + `document_count_print` int(10) unsigned NOT NULL DEFAULT '0', + `document_count_view` int(10) unsigned NOT NULL DEFAULT '0', + `document_linked_navi_id` mediumint(5) unsigned NOT NULL DEFAULT '0', + `document_teaser` text NOT NULL, + `document_tags` text NOT NULL, + `document_lang` varchar(5) NOT NULL, + `document_lang_group` int(10) NOT NULL DEFAULT '0', + `document_property` text NOT NULL, + PRIMARY KEY (`Id`), + UNIQUE KEY `document_alias` (`document_alias`), + KEY `rubric_id` (`rubric_id`), + KEY `document_status` (`document_status`), + KEY `document_published` (`document_published`), + KEY `document_expire` (`document_expire`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_document_alias_history` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `document_id` int(10) unsigned NOT NULL default '0', + `document_alias` varchar(255) NOT NULL, + `document_alias_author` mediumint(5) unsigned NOT NULL DEFAULT '1', + `document_alias_changed` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`Id`), + UNIQUE KEY `document_alias` (`document_alias`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_document_tags` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `document_id` int(11) NOT NULL, + `tag` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + KEY `document_id` (`document_id`), + KEY `tag` (`tag`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_module` ( + `Id` smallint(3) unsigned NOT NULL auto_increment, + `ModuleName` char(50) NOT NULL, + `ModuleStatus` enum('1','0') NOT NULL default '1', + `ModuleAveTag` char(255) NOT NULL, + `ModulePHPTag` char(255) NOT NULL, + `ModuleFunction` char(255) NOT NULL, + `ModuleIsFunction` enum('1','0') NOT NULL default '1', + `ModuleSysName` char(50) NOT NULL, + `ModuleVersion` char(20) NOT NULL default '1.0', + `ModuleTemplate` smallint(3) unsigned NOT NULL default '1', + `ModuleAdminEdit` enum('0','1') NOT NULL default '0', + `ModuleSettings` text default NULL, + PRIMARY KEY (`Id`), + UNIQUE KEY `ModuleName` (`ModuleName`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_modules_aliases` ( + `id` tinyint(5) unsigned NOT NULL AUTO_INCREMENT, + `module_name` char(50) NOT NULL DEFAULT '', + `module_action` varchar(255) NOT NULL DEFAULT '', + `module_link` varchar(500) NOT NULL DEFAULT '', + `module_link_name` varchar(255) NOT NULL DEFAULT '', + `module_url` varchar(255) NOT NULL DEFAULT '', + `module_admin` enum('0','1') NOT NULL DEFAULT '1', + PRIMARY KEY (`id`), + UNIQUE KEY `module_url` (`module_url`), + KEY `module_name` (`module_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_navigation` ( + `navigation_id` smallint(3) unsigned NOT NULL AUTO_INCREMENT, + `alias` varchar(20) NOT NULL, + `title` varchar(255) NOT NULL, + `level1` text NOT NULL, + `level2` text NOT NULL, + `level3` text NOT NULL, + `level1_active` text NOT NULL, + `level2_active` text NOT NULL, + `level3_active` text NOT NULL, + `level1_begin` text NOT NULL, + `level1_end` text NOT NULL, + `level2_begin` text NOT NULL, + `level2_end` text NOT NULL, + `level3_begin` text NOT NULL, + `level3_end` text NOT NULL, + `begin` text NOT NULL, + `end` text NOT NULL, + `user_group` text NOT NULL, + `expand_ext` enum('0','1','2') DEFAULT '1', + PRIMARY KEY (`navigation_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_navigation_items` ( + `navigation_item_id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `navigation_id` smallint(3) unsigned NOT NULL DEFAULT '0', + `document_id` int(11) DEFAULT NULL, + `alias` char(255) NOT NULL, + `title` char(255) NOT NULL, + `description` text NOT NULL, + `target` enum('_blank','_self','_parent','_top') NOT NULL DEFAULT '_self', + `image` varchar(255) NOT NULL, + `css_style` varchar(255) DEFAULT NULL, + `css_id` varchar(50) DEFAULT NULL, + `css_class` varchar(50) DEFAULT NULL, + `parent_id` mediumint(5) unsigned NOT NULL, + `level` enum('1','2','3') NOT NULL DEFAULT '1', + `position` smallint(3) unsigned NOT NULL DEFAULT '1', + `status` enum('1','0') NOT NULL DEFAULT '1', + PRIMARY KEY (`navigation_item_id`), + KEY `navi_id` (`navigation_id`), + KEY `document_alias` (`document_id`), + KEY `navi_item_status` (`status`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_paginations` ( + `id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT, + `pagination_name` tinytext, + `pagination_box` varchar(255) NOT NULL, + `pagination_start_label` varchar(255) NOT NULL, + `pagination_end_label` varchar(255) NOT NULL, + `pagination_separator_box` varchar(255) NOT NULL, + `pagination_separator_label` varchar(255) NOT NULL, + `pagination_next_label` varchar(255) NOT NULL, + `pagination_prev_label` varchar(255) NOT NULL, + `pagination_link_box` varchar(255) NOT NULL, + `pagination_active_link_box` varchar(255) NOT NULL, + `pagination_link_template` varchar(255) DEFAULT NULL, + `pagination_link_active_template` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_request` ( + `Id` smallint(3) unsigned NOT NULL AUTO_INCREMENT, + `rubric_id` smallint(3) unsigned NOT NULL, + `request_alias` varchar(20) NOT NULL, + `request_items_per_page` smallint(3) unsigned NOT NULL, + `request_title` varchar(255) NOT NULL, + `request_template_item` text NOT NULL, + `request_template_main` text NOT NULL, + `request_order_by` varchar(255) NOT NULL, + `request_order_by_nat` int(10) NOT NULL DEFAULT '0', + `request_author_id` int(10) unsigned NOT NULL DEFAULT '1', + `request_created` int(10) unsigned NOT NULL, + `request_description` tinytext NOT NULL, + `request_asc_desc` enum('ASC','DESC') NOT NULL DEFAULT 'DESC', + `request_show_pagination` enum('0','1') NOT NULL DEFAULT '0', + `request_pagination` smallint(3) unsigned NOT NULL DEFAULT '1', + `request_use_query` enum('0','1') NOT NULL DEFAULT '0', + `request_where_cond` text NOT NULL, + `request_hide_current` enum('0','1') NOT NULL DEFAULT '1', + `request_only_owner` enum('0','1') NOT NULL DEFAULT '0', + `request_cache_lifetime` int(11) NOT NULL DEFAULT '0', + `request_lang` enum('1','0') NOT NULL DEFAULT '0', + `request_cache_elements` enum('0','1') NOT NULL DEFAULT '0', + `request_show_statistic` enum('0','1') NOT NULL DEFAULT '0', + `request_external` enum('0','1') NOT NULL DEFAULT '0', + `request_ajax` enum('0','1') NOT NULL DEFAULT '0', + `request_show_sql` enum('0','1') NOT NULL DEFAULT '0', + PRIMARY KEY (`Id`), + KEY `request_alias` (`request_alias`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_request_conditions` ( + `Id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `request_id` smallint(3) unsigned NOT NULL, + `condition_compare` char(30) NOT NULL, + `condition_field_id` int(10) NOT NULL, + `condition_value` varchar(1000) NOT NULL, + `condition_join` enum('OR','AND') NOT NULL DEFAULT 'AND', + `condition_position` smallint(3) unsigned NOT NULL DEFAULT '1', + `condition_status` enum('0','1') NOT NULL DEFAULT '1', + PRIMARY KEY (`Id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_rubric_fields` ( + `Id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `rubric_id` smallint(3) unsigned NOT NULL, + `rubric_field_group` smallint(3) unsigned NOT NULL, + `rubric_field_alias` varchar(20) NOT NULL, + `rubric_field_title` varchar(255) NOT NULL, + `rubric_field_type` varchar(75) NOT NULL, + `rubric_field_numeric` enum('0','1') default '0' NOT NULL, + `rubric_field_position` smallint(3) unsigned NOT NULL DEFAULT '1', + `rubric_field_default` text NOT NULL, + `rubric_field_search` enum('0','1') default '1' NOT NULL, + `rubric_field_template` text NOT NULL, + `rubric_field_template_request` text NOT NULL, + `rubric_field_description` text NOT NULL, + PRIMARY KEY (`Id`), + KEY `rubric_id` (`rubric_id`), + KEY `rubric_field_type` (`rubric_field_type`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_rubric_fields_group` ( + `Id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `rubric_id` smallint(3) unsigned NOT NULL, + `group_position` smallint(3) unsigned NOT NULL, + `group_title` varchar(255) NOT NULL, + `group_description` text NOT NULL, + PRIMARY KEY (`Id`), + KEY `rubric_id` (`rubric_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_rubric_permissions` ( + `Id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `rubric_id` smallint(3) unsigned NOT NULL, + `user_group_id` smallint(3) unsigned NOT NULL, + `rubric_permission` char(255) NOT NULL, + PRIMARY KEY (`Id`), + KEY `rubric_id` (`rubric_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_rubric_template_cache` ( + `id` bigint(15) unsigned NOT NULL AUTO_INCREMENT, + `hash` char(32) NOT NULL, + `rub_id` smallint(3) NOT NULL, + `rub_tmpl_id` mediumint(5) NOT NULL, + `grp_id` smallint(3) NOT NULL DEFAULT '2', + `doc_id` int(10) NOT NULL, + `wysiwyg` enum('0','1') NOT NULL DEFAULT '0', + `expire` int(10) unsigned DEFAULT '0', + `compiled` longtext NOT NULL, + PRIMARY KEY (`id`), + KEY `rubric_id` (`rub_id`,`doc_id`,`wysiwyg`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_rubrics` ( + `Id` smallint(3) unsigned NOT NULL AUTO_INCREMENT, + `rubric_title` varchar(255) NOT NULL, + `rubric_alias` varchar(255) NOT NULL, + `rubric_alias_history` enum('0','1') default '0' NOT NULL, + `rubric_template` text NOT NULL, + `rubric_template_id` smallint(3) unsigned NOT NULL DEFAULT '1', + `rubric_author_id` int(10) unsigned NOT NULL DEFAULT '1', + `rubric_created` int(10) unsigned NOT NULL DEFAULT '0', + `rubric_docs_active` int(1) unsigned NOT NULL DEFAULT '1', + `rubric_start_code` text NOT NULL, + `rubric_code_start` text NOT NULL, + `rubric_code_end` text NOT NULL, + `rubric_teaser_template` text NOT NULL, + `rubric_admin_teaser_template` text NOT NULL, + `rubric_header_template` text NOT NULL, + `rubric_linked_rubric` varchar(255) NOT NULL DEFAULT '0', + `rubric_description` text NOT NULL, + `rubric_meta_gen` enum('0','1') default '0' NOT NULL, + `rubric_position` int(11) unsigned NOT NULL DEFAULT '100', + PRIMARY KEY (`Id`), + KEY `rubric_template_id` (`rubric_template_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_rubric_templates` ( + `id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `rubric_id` smallint(3) unsigned NOT NULL, + `title` varchar(255) NOT NULL, + `template` text NOT NULL, + `author_id` int(10) unsigned NOT NULL DEFAULT '1', + `created` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `rubric_id` (`rubric_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_sessions` ( + `sesskey` varchar(32) NOT NULL, + `expiry` int(10) unsigned NOT NULL DEFAULT '0', + `value` text NOT NULL, + `Ip` varchar(35) NOT NULL, + `expire_datum` varchar(25) NOT NULL, + PRIMARY KEY (`sesskey`), + KEY `expiry` (`expiry`), + KEY `expire_datum` (`expire_datum`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8;#inst# + +CREATE TABLE `%%PRFX%%_settings` ( + `Id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT, + `site_name` varchar(255) NOT NULL, + `mail_type` enum('mail','smtp','sendmail') NOT NULL DEFAULT 'mail', + `mail_content_type` enum('text/plain','text/html') NOT NULL DEFAULT 'text/plain', + `mail_port` smallint(3) unsigned NOT NULL DEFAULT '25', + `mail_host` varchar(255) NOT NULL, + `mail_smtp_login` varchar(255) NOT NULL, + `mail_smtp_pass` varchar(255) NOT NULL, + `mail_smtp_encrypt` varchar(255) DEFAULT NULL, + `mail_sendmail_path` varchar(255) NOT NULL DEFAULT '/usr/sbin/sendmail', + `mail_word_wrap` smallint(3) NOT NULL DEFAULT '50', + `mail_from` varchar(255) NOT NULL, + `mail_from_name` varchar(255) NOT NULL, + `mail_new_user` text NOT NULL, + `mail_signature` text NOT NULL, + `page_not_found_id` int(10) unsigned NOT NULL DEFAULT '2', + `message_forbidden` text NOT NULL, + `navi_box` varchar(255) NOT NULL, + `start_label` varchar(255) NOT NULL, + `end_label` varchar(255) NOT NULL, + `separator_label` varchar(255) NOT NULL, + `next_label` varchar(255) NOT NULL, + `prev_label` varchar(255) NOT NULL, + `total_label` varchar(255) NOT NULL, + `link_box` varchar(255) NOT NULL, + `total_box` varchar(255) NOT NULL, + `active_box` varchar(255) NOT NULL, + `separator_box` varchar(255) NOT NULL, + `bread_box` varchar(500) NOT NULL DEFAULT '', + `bread_show_main` enum('1','0') NOT NULL DEFAULT '1', + `bread_show_host` enum('1','0') NOT NULL DEFAULT '1', + `bread_sepparator` varchar(255) NOT NULL, + `bread_sepparator_use` enum('1','0') NOT NULL DEFAULT '1', + `bread_link_box` varchar(500) NOT NULL DEFAULT '', + `bread_link_template` varchar(500) NOT NULL DEFAULT '', + `bread_self_box` varchar(500) NOT NULL DEFAULT '', + `bread_link_box_last` enum('1','0') NOT NULL DEFAULT '1', + `date_format` varchar(25) NOT NULL DEFAULT '%d.%m.%Y', + `time_format` varchar(25) NOT NULL DEFAULT '%d.%m.%Y, %H:%M', + `default_country` char(2) NOT NULL DEFAULT 'RU', + `use_editor` int(1) unsigned NOT NULL DEFAULT '0', + `use_doctime` enum('1','0') NOT NULL DEFAULT '1', + `hidden_text` text NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8;#inst# + +CREATE TABLE `%%PRFX%%_settings_lang` ( + `Id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `lang_key` varchar(2) NOT NULL DEFAULT 'ru', + `lang_name` char(50) NOT NULL, + `lang_alias_pref` varchar(10) NOT NULL, + `lang_default` enum('1','0') NOT NULL DEFAULT '0', + `lang_status` enum('1','0') NOT NULL, + PRIMARY KEY (`Id`), + UNIQUE KEY `lang_key` (`lang_key`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8;#inst# + +CREATE TABLE `%%PRFX%%_sysblocks` ( + `id` mediumint(5) unsigned NOT NULL AUTO_INCREMENT, + `sysblock_name` varchar(255) NOT NULL, + `sysblock_description` varchar(255) DEFAULT NULL, + `sysblock_alias` varchar(20) NOT NULL, + `sysblock_text` longtext NOT NULL, + `sysblock_active` enum('0','1') NOT NULL DEFAULT '1', + `sysblock_external` enum('0','1') NOT NULL DEFAULT '0', + `sysblock_ajax` enum('0','1') NOT NULL DEFAULT '0', + `sysblock_visual` enum('0','1') NOT NULL DEFAULT '0', + `sysblock_author_id` int(10) unsigned NOT NULL DEFAULT '1', + `sysblock_created` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `sysblock_alias` (`sysblock_alias`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8;#inst# + +CREATE TABLE `%%PRFX%%_templates` ( + `Id` smallint(3) unsigned NOT NULL AUTO_INCREMENT, + `template_title` varchar(255) NOT NULL, + `template_text` longtext NOT NULL, + `template_author_id` int(10) unsigned NOT NULL DEFAULT '1', + `template_created` int(10) unsigned NOT NULL, + PRIMARY KEY (`Id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_user_groups` ( + `user_group` smallint(3) unsigned NOT NULL AUTO_INCREMENT, + `user_group_name` char(50) NOT NULL, + `status` enum('1','0') NOT NULL DEFAULT '1', + `set_default_avatar` enum('1','0') NOT NULL DEFAULT '0', + `default_avatar` char(255) NOT NULL, + `user_group_permission` longtext NOT NULL, + PRIMARY KEY (`user_group`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8;#inst# + +CREATE TABLE `%%PRFX%%_users` ( + `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `password` char(32) NOT NULL, + `email` char(100) NOT NULL, + `street` char(100) NOT NULL, + `street_nr` char(10) NOT NULL, + `zipcode` char(15) NOT NULL, + `city` char(100) NOT NULL, + `phone` char(35) NOT NULL, + `telefax` char(35) NOT NULL, + `description` char(255) NOT NULL, + `firstname` char(50) NOT NULL, + `lastname` char(50) NOT NULL, + `user_name` char(50) NOT NULL, + `user_group` smallint(3) unsigned NOT NULL DEFAULT '4', + `user_group_extra` char(255) NOT NULL, + `reg_time` int(10) unsigned NOT NULL, + `status` enum('1','0') NOT NULL DEFAULT '1', + `last_visit` int(10) unsigned NOT NULL, + `country` char(2) NOT NULL DEFAULT 'RU', + `birthday` char(10) NOT NULL, + `deleted` enum('0','1') NOT NULL DEFAULT '0', + `del_time` int(10) unsigned NOT NULL, + `emc` char(32) NOT NULL, + `reg_ip` char(20) NOT NULL, + `new_pass` char(32) NOT NULL, + `company` char(255) NOT NULL, + `taxpay` enum('0','1') NOT NULL DEFAULT '0', + `salt` char(16) NOT NULL, + `new_salt` char(16) NOT NULL, + `user_ip` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`Id`), + UNIQUE KEY `email` (`email`), + UNIQUE KEY `user_name` (`user_name`), + KEY `user_group` (`user_group`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_users_session` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `hash` varchar(255) NOT NULL, + `ip` int(32) unsigned NOT NULL, + `agent` varchar(255) NOT NULL, + `last_activ` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# + +CREATE TABLE `%%PRFX%%_view_count` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `document_id` int(11) NOT NULL, + `day_id` int(11) NOT NULL, + `count` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 PACK_KEYS=0;#inst# diff --git a/install/tpl/css/fix.css b/install/tpl/css/fix.css new file mode 100644 index 0000000..2bae458 --- /dev/null +++ b/install/tpl/css/fix.css @@ -0,0 +1,4 @@ +.rowElem > label { + padding: 0 0 0 5px; + width: 20%; +} \ No newline at end of file diff --git a/install/tpl/error.tpl b/install/tpl/error.tpl new file mode 100644 index 0000000..1aaad0d --- /dev/null +++ b/install/tpl/error.tpl @@ -0,0 +1,183 @@ + + + + + + + + {$version_setup} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + +
      + +
      +
      + +
      + +
      {#install#} {$version_setup}
      + + + + +
      +
      {$error_header}
      +
      + +
      + {foreach from=$error_is_required item="inc"} +
        +
      • + {$inc} +
      • +
      + {/foreach} +
      + + {if $config_isnt_writeable == 1} +
        +
      • + {#config_isnt_writeable#} +
      • +
      +
      + {/if} + +
        +
      • + {#secondchance#} +
      • +
      + + +
      +
      +
        +
      • + {#warning_force#} +
      • +
      +
      + +
      +
      +
      +   +
      +
      +
      + +
      +
      + +   + +
      +
      + + {if $config_isnt_writeable != 1} + + {/if} + +
      +
      + +
      +
      + + + + + \ No newline at end of file diff --git a/install/tpl/js/main.js b/install/tpl/js/main.js new file mode 100644 index 0000000..8f10ce0 --- /dev/null +++ b/install/tpl/js/main.js @@ -0,0 +1,135 @@ +/* + * Name: Ave.cms Install Scripts + * Written by: Ave.cms - (http://www.ave-cms.ru) + * Version: 1.0a + */ + +(function($) { + $.fn.addTipsy = function() { + this.find(' .topDir').tipsy({fade: false, gravity: 's', opacity: 0.9}); + this.find(' .topleftDir').tipsy({fade: false, gravity: 'se', opacity: 0.9}); + this.find(' .toprightDir').tipsy({fade: false, gravity: 'sw', opacity: 0.9}); + this.find(' .botDir').tipsy({fade: false, gravity: 'n', opacity: 0.9}); + this.find(' .bottomDir').tipsy({fade: false, gravity: 'n', opacity: 0.9}); + this.find(' .botleftDir').tipsy({fade: false, gravity: 'ne', opacity: 0.9}); + this.find(' .botrightDir').tipsy({fade: false, gravity: 'nw', opacity: 0.9}); + this.find(' .leftDir').tipsy({fade: false, gravity: 'e', opacity: 0.9}); + this.find(' .rightDir').tipsy({fade: false, gravity: 'w', opacity: 0.9}); + }; +})(jQuery); + +var AveInstall = { + + initialized: false, + + initialize: function() { + + if (this.initialized) return; + this.initialized = true; + + this.build(); + this.events(); + + }, + + build: function() { + + this.add_tipsy(); + this.placeholder(); + this.transform(); + this.ui_totop(); + this.link_hover(); + this.cancel(); + + }, + + events: function() { + + $.ajaxSetup({ + cache: false, + error: function(jqXHR, exception) { + if (jqXHR.status === 0) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus,{theme: 'error'}); + } else if (jqXHR.status == 404) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus404,{theme: 'error'}); + } else if (jqXHR.status == 401) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus401,{theme: 'error'}); + } else if (jqXHR.status == 500) { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatus500,{theme: 'error'}); + } else if (exception === 'parsererror') { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusJSON,{theme: 'error'}); + } else if (exception === 'timeout') { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusTimeOut,{theme: 'error'}); + } else if (exception === 'abort') { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusAbort,{theme: 'error'}); + } else { + $.alerts._overlay('hide'); + $.jGrowl(ajaxErrorStatusMess + jqXHR.responseText,{theme: 'error'}); + } + } + }); + + }, + + + ui_totop: function() { + + $().UItoTop({ easingType: 'easeOutQuart' }); + }, + + link_hover: function() { + $('.actions a').hover(function(){ + $(this).animate({opacity: 1.0},100); + },function(){ + $(this).animate({opacity: 0.5},100); + }); + }, + + placeholder: function() { + $('input[placeholder], textarea[placeholder]').placeholder(); + }, + + transform: function() { + $(".mainForm").jqTransform({imgPath:"../images"}); + }, + + cancel: function() { + + $("#ask-cancel").click( function(e) { + e.preventDefault(); + var thisHref = 'exit.html'; + var title = cancelTitle; + var confirm = cancelConfirm; + jConfirm( + confirm, + title, + function(b){ + if (b){ + $.alerts._overlay('hide'); + $.alerts._overlay('show'); + window.location = thisHref; + } + } + ); + }); + }, + + add_tipsy: function() { + $('body').addTipsy(); + } + +}; + + +$(window).load(function () { + + AveInstall.initialize(); + +}); \ No newline at end of file diff --git a/install/tpl/step1.tpl b/install/tpl/step1.tpl new file mode 100644 index 0000000..df9bcd4 --- /dev/null +++ b/install/tpl/step1.tpl @@ -0,0 +1,125 @@ + + + + + + + + {$version_setup} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      + +
      {#install#} {$version_setup}
      + + + + +
      +
      {#bread_information#}
      {#install_step#} 1
      +
      +

      {#step_info#}

      +

      {#step_data_1#}

      +

      {#step_data_2#}

      +

      {#step_data_3#}

      +
      +
      + +
      +
      + +   + +
      +
      + + + + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/install/tpl/step2.tpl b/install/tpl/step2.tpl new file mode 100644 index 0000000..b51dd67 --- /dev/null +++ b/install/tpl/step2.tpl @@ -0,0 +1,139 @@ + + + + + + + + {$version_setup} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      + +
      {#install#} {$version_setup}
      + + + +
      +
      {#bread_lictexttitle#}
      {#install_step#} 2
      +
      + {include file="../eula/ru.tpl"} +
      +
      +
      + +
      +
      + +
      +
      + +   + +
      +
      + + + + +
      +
      + +
      +
      + + + + + + + + + \ No newline at end of file diff --git a/install/tpl/step3.tpl b/install/tpl/step3.tpl new file mode 100644 index 0000000..e052837 --- /dev/null +++ b/install/tpl/step3.tpl @@ -0,0 +1,241 @@ + + + + + + + + {$version_setup} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      + +
      {#install#} {$version_setup}
      + + + +
      +
      {#bread_server#}
      {#install_step#} 3
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {* + + + + + + + *} + + + + + + + + + + + + + {* + + + + + + + *} + + + + + + + {* + + + + + + + *} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#col_parametr#}{#col_requered#}{#col_have#}
      {#php_version#}:{$smarty.const.PHP_version}{$test.php_version}
      {#mysql_version#}:{$smarty.const.MySQL_version}{$test.mysql_version}
      {#gd_version#}:{$smarty.const.GD_version}{$test.gd_version}
      {#prce_version#}:{$smarty.const.PCRE_version}{$test.pcre_version}
      {#mbstring#}:{$smarty.const.MbString}{$test.mbstring}
      {#json#}:{$smarty.const.JSON}{$test.json}
      {#simple_xml#}:{$smarty.const.SimpleXML}{$test.simplexml}
      {#iconv#}:{$smarty.const.Iconv}{$test.iconv}
      {#xslt#}:{$smarty.const.XSLT}{$test.xslt}
      {#max_upload#}:{$smarty.const.Data_limit}M{$test.data_limit}
      {#max_time#}:{$smarty.const.TIME_limit} {#seconds#}{$test.time_limit} {#seconds#}
      {#disk_space#}:{$smarty.const.DISC_space}M{$test.disk_space}M
      {#memmory_limit#}:{$smarty.const.RAM_space}{$test.memmory_limit}
      {#php_safe#}:{$smarty.const.SAFE_MODE}{$test.s_m}
      {#register_globals#}:{$smarty.const.REGISTER_GLOBALS}{$test.r_g}
      {#magic_qoutes#}:{$smarty.const.MAGIC_QUOTES_GPC}{$test.m_q}
      + + +
      + +
      +
      + +   + +
      +
      + + + + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/install/tpl/step4.tpl b/install/tpl/step4.tpl new file mode 100644 index 0000000..a9bb644 --- /dev/null +++ b/install/tpl/step4.tpl @@ -0,0 +1,193 @@ + + + + + + + + {$version_setup} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      + +
      {#install#} {$version_setup}
      + + + +
      + {if $warning} +
        +
      • + {$warning} +
      • +
      + {elseif $installed} +
        +
      • + {$installed} +
      • +
      + {/if} +
      + +
      +
      {#bread_database_setting#}
      {#install_step#} 4
      +
      {#database_setting#}
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      ?{#col_parametr#}{#col_requered#}
      [?]{#dbserver#}
      [?]{#dbuser#}
      [?]{#dbpass#}
      [?]{#dbname#}
      [?]{#dbprefix#}
      [?]{#dbcreat#}
      [?]{#dbclear#}
      +
        +
      • {#database_setting_foot#}
      • +
      +
      + + +
      + +
      +
      + +   + +
      +
      + + + + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/install/tpl/step5.tpl b/install/tpl/step5.tpl new file mode 100644 index 0000000..680e119 --- /dev/null +++ b/install/tpl/step5.tpl @@ -0,0 +1,166 @@ + + + + + + + + {$version_setup} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      + +
      {#install#} {$version_setup}
      + + + +
      + {if $errors} +
        + +
      • + {foreach from=$errors item="error"} + • {$error}
        + {/foreach} +
      • + +
      + {/if} +
      + +
      +
      {#bread_stepstatus#}
      {#install_step#} 5
      +
      {#header_logindata#}
      + + + + + + + + + + + + + + + + + + + + + + + + + + +
      {#col_parametr#}{#col_requered#}
      * {#username#}:
      * {#email#}:
      * {#password#}:
      +
        +
      • {#loginstar#}
      • +
      +
      + + +
      + +
      +
      + +   + +
      +
      + + + + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/install/tpl/step6.tpl b/install/tpl/step6.tpl new file mode 100644 index 0000000..c8f2399 --- /dev/null +++ b/install/tpl/step6.tpl @@ -0,0 +1,106 @@ + + + + + + + + {$version_setup} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + +
      + +
      {#install#} {$version_setup}
      + + + +
      + {#install_finish_body#} +
      + +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/lib/Smarty/.htaccess b/lib/Smarty/.htaccess new file mode 100755 index 0000000..3418e55 --- /dev/null +++ b/lib/Smarty/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/lib/Smarty/Config_File.class.php b/lib/Smarty/Config_File.class.php new file mode 100755 index 0000000..9eb9d57 --- /dev/null +++ b/lib/Smarty/Config_File.class.php @@ -0,0 +1,393 @@ + + * @access public + * @package Smarty + */ + +/* $Id: Config_File.class.php 3149 2009-05-23 20:59:25Z monte.ohrt $ */ + +/** + * Config file reading class + * @package Smarty + */ +class Config_File { + /**#@+ + * Options + * @var boolean + */ + /** + * Controls whether variables with the same name overwrite each other. + */ + var $overwrite = true; + + /** + * Controls whether config values of on/true/yes and off/false/no get + * converted to boolean values automatically. + */ + var $booleanize = true; + + /** + * Controls whether hidden config sections/vars are read from the file. + */ + var $read_hidden = true; + + /** + * Controls whether or not to fix mac or dos formatted newlines. + * If set to true, \r or \r\n will be changed to \n. + */ + var $fix_newlines = true; + /**#@-*/ + + /** @access private */ + var $_config_path = ""; + var $_config_data = array(); + /**#@-*/ + + /** + * Constructs a new config file class. + * + * @param string $config_path (optional) path to the config files + */ + function __construct($config_path = NULL) + { + if (isset($config_path)) + $this->set_path($config_path); + } + + + /** + * Set the path where configuration files can be found. + * + * @param string $config_path path to the config files + */ + function set_path($config_path) + { + if (!empty($config_path)) { + if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) { + $this->_trigger_error_msg("Bad config file path '$config_path'"); + return; + } + if(substr($config_path, -1) != DIRECTORY_SEPARATOR) { + $config_path .= DIRECTORY_SEPARATOR; + } + + $this->_config_path = $config_path; + } + } + + + /** + * Retrieves config info based on the file, section, and variable name. + * + * @param string $file_name config file to get info for + * @param string $section_name (optional) section to get info for + * @param string $var_name (optional) variable to get info for + * @return string|array a value or array of values + */ + function get($file_name, $section_name = NULL, $var_name = NULL) + { + if (empty($file_name)) { + $this->_trigger_error_msg('Empty config file name'); + return; + } else { + $file_name = $this->_config_path . $file_name; + if (!isset($this->_config_data[$file_name])) + $this->load_file($file_name, false); + } + + if (!empty($var_name)) { + if (empty($section_name)) { + return $this->_config_data[$file_name]["vars"][$var_name]; + } else { + if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name])) + return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]; + else + return array(); + } + } else { + if (empty($section_name)) { + return (array)$this->_config_data[$file_name]["vars"]; + } else { + if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"])) + return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"]; + else + return array(); + } + } + } + + + /** + * Retrieves config info based on the key. + * + * @param $file_name string config key (filename/section/var) + * @return string|array same as get() + * @uses get() retrieves information from config file and returns it + */ + function &get_key($config_key) + { + list($file_name, $section_name, $var_name) = explode('/', $config_key, 3); + $result = &$this->get($file_name, $section_name, $var_name); + return $result; + } + + /** + * Get all loaded config file names. + * + * @return array an array of loaded config file names + */ + function get_file_names() + { + return array_keys($this->_config_data); + } + + + /** + * Get all section names from a loaded file. + * + * @param string $file_name config file to get section names from + * @return array an array of section names from the specified file + */ + function get_section_names($file_name) + { + $file_name = $this->_config_path . $file_name; + if (!isset($this->_config_data[$file_name])) { + $this->_trigger_error_msg("Unknown config file '$file_name'"); + return; + } + + return array_keys($this->_config_data[$file_name]["sections"]); + } + + + /** + * Get all global or section variable names. + * + * @param string $file_name config file to get info for + * @param string $section_name (optional) section to get info for + * @return array an array of variables names from the specified file/section + */ + function get_var_names($file_name, $section = NULL) + { + if (empty($file_name)) { + $this->_trigger_error_msg('Empty config file name'); + return; + } else if (!isset($this->_config_data[$file_name])) { + $this->_trigger_error_msg("Unknown config file '$file_name'"); + return; + } + + if (empty($section)) + return array_keys($this->_config_data[$file_name]["vars"]); + else + return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]); + } + + + /** + * Clear loaded config data for a certain file or all files. + * + * @param string $file_name file to clear config data for + */ + function clear($file_name = NULL) + { + if ($file_name === NULL) + $this->_config_data = array(); + else if (isset($this->_config_data[$file_name])) + $this->_config_data[$file_name] = array(); + } + + + /** + * Load a configuration file manually. + * + * @param string $file_name file name to load + * @param boolean $prepend_path whether current config path should be + * prepended to the filename + */ + function load_file($file_name, $prepend_path = true) + { + if ($prepend_path && $this->_config_path != "") + $config_file = $this->_config_path . $file_name; + else + $config_file = $file_name; + + ini_set('track_errors', true); + $fp = @fopen($config_file, "r"); + if (!is_resource($fp)) { + $this->_trigger_error_msg("Could not open config file '$config_file'"); + return false; + } + + $contents = ($size = filesize($config_file)) ? fread($fp, $size) : ''; + fclose($fp); + + $this->_config_data[$config_file] = $this->parse_contents($contents); + return true; + } + + /** + * Store the contents of a file manually. + * + * @param string $config_file file name of the related contents + * @param string $contents the file-contents to parse + */ + function set_file_contents($config_file, $contents) + { + $this->_config_data[$config_file] = $this->parse_contents($contents); + return true; + } + + /** + * parse the source of a configuration file manually. + * + * @param string $contents the file-contents to parse + */ + function parse_contents($contents) + { + if($this->fix_newlines) { + // fix mac/dos formatted newlines + $contents = preg_replace('!\r\n?!', "\n", $contents); + } + + $config_data = array(); + $config_data['sections'] = array(); + $config_data['vars'] = array(); + + /* reference to fill with data */ + $vars =& $config_data['vars']; + + /* parse file line by line */ + preg_match_all('!^.*\r?\n?!m', $contents, $match); + $lines = $match[0]; + for ($i=0, $count=count($lines); $i<$count; $i++) { + $line = $lines[$i]; + if (empty($line)) continue; + + if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) { + /* section found */ + if (substr($match[1], 0, 1) == '.') { + /* hidden section */ + if ($this->read_hidden) { + $section_name = substr($match[1], 1); + } else { + /* break reference to $vars to ignore hidden section */ + unset($vars); + $vars = array(); + continue; + } + } else { + $section_name = $match[1]; + } + if (!isset($config_data['sections'][$section_name])) + $config_data['sections'][$section_name] = array('vars' => array()); + $vars =& $config_data['sections'][$section_name]['vars']; + continue; + } + + if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) { + /* variable found */ + $var_name = rtrim($match[1]); + if (strpos($match[2], '"""') === 0) { + /* handle multiline-value */ + $lines[$i] = substr($match[2], 3); + $var_value = ''; + while ($i<$count) { + if (($pos = strpos($lines[$i], '"""')) === false) { + $var_value .= $lines[$i++]; + } else { + /* end of multiline-value */ + $var_value .= substr($lines[$i], 0, $pos); + break; + } + } + $booleanize = false; + + } else { + /* handle simple value */ + $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', rtrim($match[2])); + $booleanize = $this->booleanize; + + } + $this->_set_config_var($vars, $var_name, $var_value, $booleanize); + } + /* else unparsable line / means it is a comment / means ignore it */ + } + return $config_data; + } + + /**#@+ @access private */ + /** + * @param array &$container + * @param string $var_name + * @param mixed $var_value + * @param boolean $booleanize determines whether $var_value is converted to + * to true/false + */ + function _set_config_var(&$container, $var_name, $var_value, $booleanize) + { + if (substr($var_name, 0, 1) == '.') { + if (!$this->read_hidden) + return; + else + $var_name = substr($var_name, 1); + } + + if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) { + $this->_trigger_error_msg("Bad variable name '$var_name'"); + return; + } + + if ($booleanize) { + if (preg_match("/^(on|true|yes)$/i", $var_value)) + $var_value = true; + else if (preg_match("/^(off|false|no)$/i", $var_value)) + $var_value = false; + } + + if (!isset($container[$var_name]) || $this->overwrite) + $container[$var_name] = $var_value; + else { + settype($container[$var_name], 'array'); + $container[$var_name][] = $var_value; + } + } + + /** + * @uses trigger_error() creates a PHP warning/error + * @param string $error_msg + * @param integer $error_type one of + */ + function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING) + { + trigger_error("Config_File error: $error_msg", $error_type); + } + /**#@-*/ +} + +?> diff --git a/lib/Smarty/Smarty.class.php b/lib/Smarty/Smarty.class.php new file mode 100755 index 0000000..3da9744 --- /dev/null +++ b/lib/Smarty/Smarty.class.php @@ -0,0 +1,1968 @@ + + * @author Andrei Zmievski + * @package Smarty + * @version 2.6.30 + */ + +/* $Id$ */ + +/** + * DIR_SEP isn't used anymore, but third party apps might + */ +if(!defined('DIR_SEP')) { + define('DIR_SEP', DIRECTORY_SEPARATOR); +} + +/** + * set SMARTY_DIR to absolute path to Smarty library files. + * if not defined, include_path will be used. Sets SMARTY_DIR only if user + * application has not already defined it. + */ + +if (!defined('SMARTY_DIR')) { + define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR); +} + +if (!defined('SMARTY_CORE_DIR')) { + define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR); +} + +define('SMARTY_PHP_PASSTHRU', 0); +define('SMARTY_PHP_QUOTE', 1); +define('SMARTY_PHP_REMOVE', 2); +define('SMARTY_PHP_ALLOW', 3); + +/** + * @package Smarty + */ +class Smarty +{ + /**#@+ + * Smarty Configuration Section + */ + + /** + * The name of the directory where templates are located. + * + * @var string + */ + var $template_dir = 'templates'; + + /** + * The directory where compiled templates are located. + * + * @var string + */ + var $compile_dir = 'cache/smarty'; + + /** + * The directory where config files are located. + * + * @var string + */ + var $config_dir = 'configs'; + + /** + * An array of directories searched for plugins. + * + * @var array + */ + var $plugins_dir = array('plugins'); + + /** + * If debugging is enabled, a debug console window will display + * when the page loads (make sure your browser allows unrequested + * popup windows) + * + * @var boolean + */ + var $debugging = false; + + /** + * When set, smarty does uses this value as error_reporting-level. + * + * @var integer + */ + var $error_reporting = null; + + /** + * This is the path to the debug console template. If not set, + * the default one will be used. + * + * @var string + */ + var $debug_tpl = ''; + + /** + * This determines if debugging is enable-able from the browser. + *
        + *
      • NONE => no debugging control allowed
      • + *
      • URL => enable debugging when SMARTY_DEBUG is found in the URL.
      • + *
      + * @link http://www.foo.dom/index.php?SMARTY_DEBUG + * @var string + */ + var $debugging_ctrl = 'NONE'; + + /** + * This tells Smarty whether to check for recompiling or not. Recompiling + * does not need to happen unless a template or config file is changed. + * Typically you enable this during development, and disable for + * production. + * + * @var boolean + */ + var $compile_check = true; + + /** + * This forces templates to compile every time. Useful for development + * or debugging. + * + * @var boolean + */ + var $force_compile = false; + + /** + * This enables template caching. + *
        + *
      • 0 = no caching
      • + *
      • 1 = use class cache_lifetime value
      • + *
      • 2 = use cache_lifetime in cache file
      • + *
      + * @var integer + */ + var $caching = 0; + + /** + * The name of the directory for cache files. + * + * @var string + */ + var $cache_dir = 'cache'; + + /** + * This is the number of seconds cached content will persist. + *
        + *
      • 0 = always regenerate cache
      • + *
      • -1 = never expires
      • + *
      + * + * @var integer + */ + var $cache_lifetime = 3600; + + /** + * Only used when $caching is enabled. If true, then If-Modified-Since headers + * are respected with cached content, and appropriate HTTP headers are sent. + * This way repeated hits to a cached page do not send the entire page to the + * client every time. + * + * @var boolean + */ + var $cache_modified_check = false; + + /** + * This determines how Smarty handles "" tags in templates. + * possible values: + *
        + *
      • SMARTY_PHP_PASSTHRU -> print tags as plain text
      • + *
      • SMARTY_PHP_QUOTE -> escape tags as entities
      • + *
      • SMARTY_PHP_REMOVE -> remove php tags
      • + *
      • SMARTY_PHP_ALLOW -> execute php tags
      • + *
      + * + * @var integer + */ + var $php_handling = SMARTY_PHP_PASSTHRU; + + /** + * This enables template security. When enabled, many things are restricted + * in the templates that normally would go unchecked. This is useful when + * untrusted parties are editing templates and you want a reasonable level + * of security. (no direct execution of PHP in templates for example) + * + * @var boolean + */ + var $security = false; + + /** + * This is the list of template directories that are considered secure. This + * is used only if {@link $security} is enabled. One directory per array + * element. {@link $template_dir} is in this list implicitly. + * + * @var array + */ + var $secure_dir = array(); + + /** + * These are the security settings for Smarty. They are used only when + * {@link $security} is enabled. + * + * @var array + */ + var $security_settings = array( + 'PHP_HANDLING' => false, + 'IF_FUNCS' => array('array', 'list', + 'isset', 'empty', + 'count', 'sizeof', + 'in_array', 'is_array', + 'true', 'false', 'null'), + 'INCLUDE_ANY' => false, + 'PHP_TAGS' => false, + 'MODIFIER_FUNCS' => array('count'), + 'ALLOW_CONSTANTS' => false, + 'ALLOW_SUPER_GLOBALS' => true + ); + + /** + * This is an array of directories where trusted php scripts reside. + * {@link $security} is disabled during their inclusion/execution. + * + * @var array + */ + var $trusted_dir = array(); + + /** + * The left delimiter used for the template tags. + * + * @var string + */ + var $left_delimiter = '{'; + + /** + * The right delimiter used for the template tags. + * + * @var string + */ + var $right_delimiter = '}'; + + /** + * The order in which request variables are registered, similar to + * variables_order in php.ini E = Environment, G = GET, P = POST, + * C = Cookies, S = Server + * + * @var string + */ + var $request_vars_order = 'EGPCS'; + + /** + * Indicates wether $HTTP_*_VARS[] (request_use_auto_globals=false) + * are uses as request-vars or $_*[]-vars. note: if + * request_use_auto_globals is true, then $request_vars_order has + * no effect, but the php-ini-value "gpc_order" + * + * @var boolean + */ + var $request_use_auto_globals = true; + + /** + * Set this if you want different sets of compiled files for the same + * templates. This is useful for things like different languages. + * Instead of creating separate sets of templates per language, you + * set different compile_ids like 'en' and 'de'. + * + * @var string + */ + var $compile_id = null; + + /** + * This tells Smarty whether or not to use sub dirs in the cache/ and + * templates_c/ directories. sub directories better organized, but + * may not work well with PHP safe mode enabled. + * + * @var boolean + * + */ + var $use_sub_dirs = false; + + /** + * This is a list of the modifiers to apply to all template variables. + * Put each modifier in a separate array element in the order you want + * them applied. example: array('escape:"htmlall"'); + * + * @var array + */ + var $default_modifiers = array(); + + /** + * This is the resource type to be used when not specified + * at the beginning of the resource path. examples: + * $smarty->display('file:index.tpl'); + * $smarty->display('db:index.tpl'); + * $smarty->display('index.tpl'); // will use default resource type + * {include file="file:index.tpl"} + * {include file="db:index.tpl"} + * {include file="index.tpl"} {* will use default resource type *} + * + * @var array + */ + var $default_resource_type = 'file'; + + /** + * The function used for cache file handling. If not set, built-in caching is used. + * + * @var null|string function name + */ + var $cache_handler_func = null; + + /** + * This indicates which filters are automatically loaded into Smarty. + * + * @var array array of filter names + */ + var $autoload_filters = array(); + + /**#@+ + * @var boolean + */ + /** + * This tells if config file vars of the same name overwrite each other or not. + * if disabled, same name variables are accumulated in an array. + */ + var $config_overwrite = true; + + /** + * This tells whether or not to automatically booleanize config file variables. + * If enabled, then the strings "on", "true", and "yes" are treated as boolean + * true, and "off", "false" and "no" are treated as boolean false. + */ + var $config_booleanize = true; + + /** + * This tells whether hidden sections [.foobar] are readable from the + * tempalates or not. Normally you would never allow this since that is + * the point behind hidden sections: the application can access them, but + * the templates cannot. + */ + var $config_read_hidden = false; + + /** + * This tells whether or not automatically fix newlines in config files. + * It basically converts \r (mac) or \r\n (dos) to \n + */ + var $config_fix_newlines = true; + /**#@-*/ + + /** + * If a template cannot be found, this PHP function will be executed. + * Useful for creating templates on-the-fly or other special action. + * + * @var string function name + */ + var $default_template_handler_func = ''; + + /** + * The file that contains the compiler class. This can a full + * pathname, or relative to the php_include path. + * + * @var string + */ + var $compiler_file = 'Smarty_Compiler.class.php'; + + /** + * The class used for compiling templates. + * + * @var string + */ + var $compiler_class = 'Smarty_Compiler'; + + /** + * The class used to load config vars. + * + * @var string + */ + var $config_class = 'Config_File'; + +/**#@+ + * END Smarty Configuration Section + * There should be no need to touch anything below this line. + * @access private + */ + /** + * where assigned template vars are kept + * + * @var array + */ + var $_tpl_vars = array(); + + /** + * stores run-time $smarty.* vars + * + * @var null|array + */ + var $_smarty_vars = null; + + /** + * keeps track of sections + * + * @var array + */ + var $_sections = array(); + + /** + * keeps track of foreach blocks + * + * @var array + */ + var $_foreach = array(); + + /** + * keeps track of tag hierarchy + * + * @var array + */ + var $_tag_stack = array(); + + /** + * configuration object + * + * @var Config_file + */ + var $_conf_obj = null; + + /** + * loaded configuration settings + * + * @var array + */ + var $_config = array(array('vars' => array(), 'files' => array())); + + /** + * md5 checksum of the string 'Smarty' + * + * @var string + */ + var $_smarty_md5 = 'f8d698aea36fcbead2b9d5359ffca76f'; + + /** + * Smarty version number + * + * @var string + */ + var $_version = '2.6.30'; + + /** + * current template inclusion depth + * + * @var integer + */ + var $_inclusion_depth = 0; + + /** + * for different compiled templates + * + * @var string + */ + var $_compile_id = null; + + /** + * text in URL to enable debug mode + * + * @var string + */ + var $_smarty_debug_id = 'SMARTY_DEBUG'; + + /** + * debugging information for debug console + * + * @var array + */ + var $_smarty_debug_info = array(); + + /** + * info that makes up a cache file + * + * @var array + */ + var $_cache_info = array(); + + /** + * default file permissions + * + * @var integer + */ + var $_file_perms = 0644; + + /** + * default dir permissions + * + * @var integer + */ + var $_dir_perms = 0771; + + /** + * registered objects + * + * @var array + */ + var $_reg_objects = array(); + + /** + * table keeping track of plugins + * + * @var array + */ + var $_plugins = array( + 'modifier' => array(), + 'function' => array(), + 'block' => array(), + 'compiler' => array(), + 'prefilter' => array(), + 'postfilter' => array(), + 'outputfilter' => array(), + 'resource' => array(), + 'insert' => array()); + + + /** + * cache serials + * + * @var array + */ + var $_cache_serials = array(); + + /** + * name of optional cache include file + * + * @var string + */ + var $_cache_include = null; + + /** + * indicate if the current code is used in a compiled + * include + * + * @var string + */ + var $_cache_including = false; + + /** + * plugin filepath cache + * + * @var array + */ + var $_filepaths_cache = array(); + /**#@-*/ + /** + * The class constructor. + */ + public function __construct() + { + $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] + : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']); + } + + /** + * assigns values to template variables + * + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to assign + */ + function assign($tpl_var, $value = null) + { + if (is_array($tpl_var)){ + foreach ($tpl_var as $key => $val) { + if ($key != '') { + $this->_tpl_vars[$key] = $val; + } + } + } else { + if ($tpl_var != '') + $this->_tpl_vars[$tpl_var] = $value; + } + } + + /** + * assigns values to template variables by reference + * + * @param string $tpl_var the template variable name + * @param mixed $value the referenced value to assign + */ + function assign_by_ref($tpl_var, &$value) + { + if ($tpl_var != '') + $this->_tpl_vars[$tpl_var] = &$value; + } + + /** + * appends values to template variables + * + * @param array|string $tpl_var the template variable name(s) + * @param mixed $value the value to append + */ + function append($tpl_var, $value=null, $merge=false) + { + if (is_array($tpl_var)) { + // $tpl_var is an array, ignore $value + foreach ($tpl_var as $_key => $_val) { + if ($_key != '') { + if(!@is_array($this->_tpl_vars[$_key])) { + settype($this->_tpl_vars[$_key],'array'); + } + if($merge && is_array($_val)) { + foreach($_val as $_mkey => $_mval) { + $this->_tpl_vars[$_key][$_mkey] = $_mval; + } + } else { + $this->_tpl_vars[$_key][] = $_val; + } + } + } + } else { + if ($tpl_var != '' && isset($value)) { + if(!@is_array($this->_tpl_vars[$tpl_var])) { + settype($this->_tpl_vars[$tpl_var],'array'); + } + if($merge && is_array($value)) { + foreach($value as $_mkey => $_mval) { + $this->_tpl_vars[$tpl_var][$_mkey] = $_mval; + } + } else { + $this->_tpl_vars[$tpl_var][] = $value; + } + } + } + } + + /** + * appends values to template variables by reference + * + * @param string $tpl_var the template variable name + * @param mixed $value the referenced value to append + */ + function append_by_ref($tpl_var, &$value, $merge=false) + { + if ($tpl_var != '' && isset($value)) { + if(!@is_array($this->_tpl_vars[$tpl_var])) { + settype($this->_tpl_vars[$tpl_var],'array'); + } + if ($merge && is_array($value)) { + foreach($value as $_key => $_val) { + $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key]; + } + } else { + $this->_tpl_vars[$tpl_var][] = &$value; + } + } + } + + + /** + * clear the given assigned template variable. + * + * @param string $tpl_var the template variable to clear + */ + function clear_assign($tpl_var) + { + if (is_array($tpl_var)) + foreach ($tpl_var as $curr_var) + unset($this->_tpl_vars[$curr_var]); + else + unset($this->_tpl_vars[$tpl_var]); + } + + + /** + * Registers custom function to be used in templates + * + * @param string $function the name of the template function + * @param string $function_impl the name of the PHP function to register + */ + function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null) + { + $this->_plugins['function'][$function] = + array($function_impl, null, null, false, $cacheable, $cache_attrs); + + } + + /** + * Unregisters custom function + * + * @param string $function name of template function + */ + function unregister_function($function) + { + unset($this->_plugins['function'][$function]); + } + + /** + * Registers object to be used in templates + * + * @param string $object name of template object + * @param object &$object_impl the referenced PHP object to register + * @param null|array $allowed list of allowed methods (empty = all) + * @param boolean $smarty_args smarty argument format, else traditional + * @param null|array $block_functs list of methods that are block format + */ + function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) + { + settype($allowed, 'array'); + settype($smarty_args, 'boolean'); + $this->_reg_objects[$object] = + array(&$object_impl, $allowed, $smarty_args, $block_methods); + } + + /** + * Unregisters object + * + * @param string $object name of template object + */ + function unregister_object($object) + { + unset($this->_reg_objects[$object]); + } + + + /** + * Registers block function to be used in templates + * + * @param string $block name of template block + * @param string $block_impl PHP function to register + */ + function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null) + { + $this->_plugins['block'][$block] = + array($block_impl, null, null, false, $cacheable, $cache_attrs); + } + + /** + * Unregisters block function + * + * @param string $block name of template function + */ + function unregister_block($block) + { + unset($this->_plugins['block'][$block]); + } + + /** + * Registers compiler function + * + * @param string $function name of template function + * @param string $function_impl name of PHP function to register + */ + function register_compiler_function($function, $function_impl, $cacheable=true) + { + $this->_plugins['compiler'][$function] = + array($function_impl, null, null, false, $cacheable); + } + + /** + * Unregisters compiler function + * + * @param string $function name of template function + */ + function unregister_compiler_function($function) + { + unset($this->_plugins['compiler'][$function]); + } + + /** + * Registers modifier to be used in templates + * + * @param string $modifier name of template modifier + * @param string $modifier_impl name of PHP function to register + */ + function register_modifier($modifier, $modifier_impl) + { + $this->_plugins['modifier'][$modifier] = + array($modifier_impl, null, null, false); + } + + /** + * Unregisters modifier + * + * @param string $modifier name of template modifier + */ + function unregister_modifier($modifier) + { + unset($this->_plugins['modifier'][$modifier]); + } + + /** + * Registers a resource to fetch a template + * + * @param string $type name of resource + * @param array $functions array of functions to handle resource + */ + function register_resource($type, $functions) + { + if (count($functions)==4) { + $this->_plugins['resource'][$type] = + array($functions, false); + + } elseif (count($functions)==5) { + $this->_plugins['resource'][$type] = + array(array(array(&$functions[0], $functions[1]) + ,array(&$functions[0], $functions[2]) + ,array(&$functions[0], $functions[3]) + ,array(&$functions[0], $functions[4])) + ,false); + + } else { + $this->trigger_error("malformed function-list for '$type' in register_resource"); + + } + } + + /** + * Unregisters a resource + * + * @param string $type name of resource + */ + function unregister_resource($type) + { + unset($this->_plugins['resource'][$type]); + } + + /** + * Registers a prefilter function to apply + * to a template before compiling + * + * @param callback $function + */ + function register_prefilter($function) + { + $this->_plugins['prefilter'][$this->_get_filter_name($function)] + = array($function, null, null, false); + } + + /** + * Unregisters a prefilter function + * + * @param callback $function + */ + function unregister_prefilter($function) + { + unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]); + } + + /** + * Registers a postfilter function to apply + * to a compiled template after compilation + * + * @param callback $function + */ + function register_postfilter($function) + { + $this->_plugins['postfilter'][$this->_get_filter_name($function)] + = array($function, null, null, false); + } + + /** + * Unregisters a postfilter function + * + * @param callback $function + */ + function unregister_postfilter($function) + { + unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]); + } + + /** + * Registers an output filter function to apply + * to a template output + * + * @param callback $function + */ + function register_outputfilter($function) + { + $this->_plugins['outputfilter'][$this->_get_filter_name($function)] + = array($function, null, null, false); + } + + /** + * Unregisters an outputfilter function + * + * @param callback $function + */ + function unregister_outputfilter($function) + { + unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]); + } + + /** + * load a filter of specified type and name + * + * @param string $type filter type + * @param string $name filter name + */ + function load_filter($type, $name) + { + switch ($type) { + case 'output': + $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false))); + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); + smarty_core_load_plugins($_params, $this); + break; + + case 'pre': + case 'post': + if (!isset($this->_plugins[$type . 'filter'][$name])) + $this->_plugins[$type . 'filter'][$name] = false; + break; + } + } + + /** + * clear cached content for the given template and cache id + * + * @param string $tpl_file name of template file + * @param string $cache_id name of cache_id + * @param string $compile_id name of compile_id + * @param string $exp_time expiration time + * @return boolean + */ + function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null) + { + + if (!isset($compile_id)) + $compile_id = $this->compile_id; + + if (!isset($tpl_file)) + $compile_id = null; + + $_auto_id = $this->_get_auto_id($cache_id, $compile_id); + + if (!empty($this->cache_handler_func)) { + return call_user_func_array($this->cache_handler_func, + array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time)); + } else { + $_params = array('auto_base' => $this->cache_dir, + 'auto_source' => $tpl_file, + 'auto_id' => $_auto_id, + 'exp_time' => $exp_time); + require_once(SMARTY_CORE_DIR . 'core.rm_auto.php'); + return smarty_core_rm_auto($_params, $this); + } + + } + + + /** + * clear the entire contents of cache (all templates) + * + * @param string $exp_time expire time + * @return boolean results of {@link smarty_core_rm_auto()} + */ + function clear_all_cache($exp_time = null) + { + return $this->clear_cache(null, null, null, $exp_time); + } + + + /** + * test to see if valid cache exists for this template + * + * @param string $tpl_file name of template file + * @param string $cache_id + * @param string $compile_id + * @return string|false results of {@link _read_cache_file()} + */ + function is_cached($tpl_file, $cache_id = null, $compile_id = null) + { + if (!$this->caching) + return false; + + if (!isset($compile_id)) + $compile_id = $this->compile_id; + + $_params = array( + 'tpl_file' => $tpl_file, + 'cache_id' => $cache_id, + 'compile_id' => $compile_id + ); + require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php'); + return smarty_core_read_cache_file($_params, $this); + } + + + /** + * clear all the assigned template variables. + * + */ + function clear_all_assign() + { + $this->_tpl_vars = array(); + } + + /** + * clears compiled version of specified template resource, + * or all compiled template files if one is not specified. + * This function is for advanced use only, not normally needed. + * + * @param string $tpl_file + * @param string $compile_id + * @param string $exp_time + * @return boolean results of {@link smarty_core_rm_auto()} + */ + function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null) + { + if (!isset($compile_id)) { + $compile_id = $this->compile_id; + } + $_params = array('auto_base' => $this->compile_dir, + 'auto_source' => $tpl_file, + 'auto_id' => $compile_id, + 'exp_time' => $exp_time, + 'extensions' => array('.inc', '.php')); + require_once(SMARTY_CORE_DIR . 'core.rm_auto.php'); + return smarty_core_rm_auto($_params, $this); + } + + /** + * Checks whether requested template exists. + * + * @param string $tpl_file + * @return boolean + */ + function template_exists($tpl_file) + { + $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false); + return $this->_fetch_resource_info($_params); + } + + /** + * Returns an array containing template variables + * + * @param string $name + * @param string $type + * @return array + */ + function &get_template_vars($name=null) + { + if(!isset($name)) { + return $this->_tpl_vars; + } elseif(isset($this->_tpl_vars[$name])) { + return $this->_tpl_vars[$name]; + } else { + // var non-existant, return valid reference + $_tmp = null; + return $_tmp; + } + } + + /** + * Returns an array containing config variables + * + * @param string $name + * @param string $type + * @return array + */ + function &get_config_vars($name=null) + { + if(!isset($name) && is_array($this->_config[0])) { + return $this->_config[0]['vars']; + } else if(isset($this->_config[0]['vars'][$name])) { + return $this->_config[0]['vars'][$name]; + } else { + // var non-existant, return valid reference + $_tmp = null; + return $_tmp; + } + } + + /** + * trigger Smarty error + * + * @param string $error_msg + * @param integer $error_type + */ + function trigger_error($error_msg, $error_type = E_USER_WARNING) + { + $msg = htmlentities($error_msg); + trigger_error("Smarty error: $msg", $error_type); + } + + + /** + * executes & displays the template results + * + * @param string $resource_name + * @param string $cache_id + * @param string $compile_id + */ + function display($resource_name, $cache_id = null, $compile_id = null) + { + $this->fetch($resource_name, $cache_id, $compile_id, true); + } + + /** + * executes & returns or displays the template results + * + * @param string $resource_name + * @param string $cache_id + * @param string $compile_id + * @param boolean $display + */ + function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false) + { + static $_cache_info = array(); + + $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting) + ? $this->error_reporting : error_reporting() & ~E_NOTICE); + + if (!$this->debugging && $this->debugging_ctrl == 'URL') { + $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING']; + if (@strstr($_query_string, $this->_smarty_debug_id)) { + if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) { + // enable debugging for this browser session + @setcookie('SMARTY_DEBUG', true); + $this->debugging = true; + } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) { + // disable debugging for this browser session + @setcookie('SMARTY_DEBUG', false); + $this->debugging = false; + } else { + // enable debugging for this page + $this->debugging = true; + } + } else { + $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']); + } + } + + if ($this->debugging) { + // capture time for debugging info + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $_debug_start_time = smarty_core_get_microtime($_params, $this); + $this->_smarty_debug_info[] = array('type' => 'template', + 'filename' => $resource_name, + 'depth' => 0); + $_included_tpls_idx = count($this->_smarty_debug_info) - 1; + } + + if (!isset($compile_id)) { + $compile_id = $this->compile_id; + } + + $this->_compile_id = $compile_id; + $this->_inclusion_depth = 0; + + if ($this->caching) { + // save old cache_info, initialize cache_info + array_push($_cache_info, $this->_cache_info); + $this->_cache_info = array(); + $_params = array( + 'tpl_file' => $resource_name, + 'cache_id' => $cache_id, + 'compile_id' => $compile_id, + 'results' => null + ); + require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php'); + if (smarty_core_read_cache_file($_params, $this)) { + $_smarty_results = $_params['results']; + if (!empty($this->_cache_info['insert_tags'])) { + $_params = array('plugins' => $this->_cache_info['insert_tags']); + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); + smarty_core_load_plugins($_params, $this); + $_params = array('results' => $_smarty_results); + require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php'); + $_smarty_results = smarty_core_process_cached_inserts($_params, $this); + } + if (!empty($this->_cache_info['cache_serials'])) { + $_params = array('results' => $_smarty_results); + require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php'); + $_smarty_results = smarty_core_process_compiled_include($_params, $this); + } + + + if ($display) { + if ($this->debugging) + { + // capture time for debugging info + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time; + require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); + $_smarty_results .= smarty_core_display_debug_console($_params, $this); + } + if ($this->cache_modified_check) { + $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; + $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3); + $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT'; + if (@count($this->_cache_info['insert_tags']) == 0 + && !$this->_cache_serials + && $_gmt_mtime == $_last_modified_date) { + if (php_sapi_name()=='cgi') + header('Status: 304 Not Modified'); + else + header('HTTP/1.1 304 Not Modified'); + + } else { + header('Last-Modified: '.$_gmt_mtime); + echo $_smarty_results; + } + } else { + echo $_smarty_results; + } + error_reporting($_smarty_old_error_level); + // restore initial cache_info + $this->_cache_info = array_pop($_cache_info); + return true; + } else { + error_reporting($_smarty_old_error_level); + // restore initial cache_info + $this->_cache_info = array_pop($_cache_info); + return $_smarty_results; + } + } else { + $this->_cache_info['template'][$resource_name] = true; + if ($this->cache_modified_check && $display) { + header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT'); + } + } + } + + // load filters that are marked as autoload + if (count($this->autoload_filters)) { + foreach ($this->autoload_filters as $_filter_type => $_filters) { + foreach ($_filters as $_filter) { + $this->load_filter($_filter_type, $_filter); + } + } + } + + $_smarty_compile_path = $this->_get_compile_path($resource_name); + + // if we just need to display the results, don't perform output + // buffering - for speed + $_cache_including = $this->_cache_including; + $this->_cache_including = false; + if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) { + if ($this->_is_compiled($resource_name, $_smarty_compile_path) + || $this->_compile_resource($resource_name, $_smarty_compile_path)) + { + include($_smarty_compile_path); + } + } else { + ob_start(); + if ($this->_is_compiled($resource_name, $_smarty_compile_path) + || $this->_compile_resource($resource_name, $_smarty_compile_path)) + { + include($_smarty_compile_path); + } + $_smarty_results = ob_get_contents(); + ob_end_clean(); + + foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) { + $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this)); + } + } + + if ($this->caching) { + $_params = array('tpl_file' => $resource_name, + 'cache_id' => $cache_id, + 'compile_id' => $compile_id, + 'results' => $_smarty_results); + require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php'); + smarty_core_write_cache_file($_params, $this); + require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php'); + $_smarty_results = smarty_core_process_cached_inserts($_params, $this); + + if ($this->_cache_serials) { + // strip nocache-tags from output + $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s' + ,'' + ,$_smarty_results); + } + // restore initial cache_info + $this->_cache_info = array_pop($_cache_info); + } + $this->_cache_including = $_cache_including; + + if ($display) { + if (isset($_smarty_results)) { echo $_smarty_results; } + if ($this->debugging) { + // capture time for debugging info + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time); + require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); + echo smarty_core_display_debug_console($_params, $this); + } + error_reporting($_smarty_old_error_level); + return; + } else { + error_reporting($_smarty_old_error_level); + if (isset($_smarty_results)) { return $_smarty_results; } + } + } + + /** + * load configuration values + * + * @param string $file + * @param string $section + * @param string $scope + */ + function config_load($file, $section = null, $scope = 'global') + { + require_once($this->_get_plugin_filepath('function', 'config_load')); + smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this); + } + + /** + * return a reference to a registered object + * + * @param string $name + * @return object + */ + function &get_registered_object($name) { + if (!isset($this->_reg_objects[$name])) + $this->_trigger_fatal_error("'$name' is not a registered object"); + + if (!is_object($this->_reg_objects[$name][0])) + $this->_trigger_fatal_error("registered '$name' is not an object"); + + return $this->_reg_objects[$name][0]; + } + + /** + * clear configuration values + * + * @param string $var + */ + function clear_config($var = null) + { + if(!isset($var)) { + // clear all values + $this->_config = array(array('vars' => array(), + 'files' => array())); + } else { + unset($this->_config[0]['vars'][$var]); + } + } + + /** + * get filepath of requested plugin + * + * @param string $type + * @param string $name + * @return string|false + */ + function _get_plugin_filepath($type, $name) + { + $_params = array('type' => $type, 'name' => $name); + require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php'); + return smarty_core_assemble_plugin_filepath($_params, $this); + } + + /** + * test if resource needs compiling + * + * @param string $resource_name + * @param string $compile_path + * @return boolean + */ + function _is_compiled($resource_name, $compile_path) + { + if (!$this->force_compile && file_exists($compile_path)) { + if (!$this->compile_check) { + // no need to check compiled file + return true; + } else { + // get file source and timestamp + $_params = array('resource_name' => $resource_name, 'get_source'=>false); + if (!$this->_fetch_resource_info($_params)) { + return false; + } + if ($_params['resource_timestamp'] <= filemtime($compile_path)) { + // template not expired, no recompile + return true; + } else { + // compile template + return false; + } + } + } else { + // compiled template does not exist, or forced compile + return false; + } + } + + /** + * compile the template + * + * @param string $resource_name + * @param string $compile_path + * @return boolean + */ + function _compile_resource($resource_name, $compile_path) + { + + $_params = array('resource_name' => $resource_name); + if (!$this->_fetch_resource_info($_params)) { + return false; + } + + $_source_content = $_params['source_content']; + $_cache_include = substr($compile_path, 0, -4).'.inc'; + + if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) { + // if a _cache_serial was set, we also have to write an include-file: + if ($this->_cache_include_info) { + require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php'); + smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)), $this); + } + + $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content); + require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php'); + smarty_core_write_compiled_resource($_params, $this); + + return true; + } else { + return false; + } + + } + + /** + * compile the given source + * + * @param string $resource_name + * @param string $source_content + * @param string $compiled_content + * @return boolean + */ + function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null) + { + if (file_exists(SMARTY_DIR . $this->compiler_file)) { + require_once(SMARTY_DIR . $this->compiler_file); + } else { + // use include_path + require_once($this->compiler_file); + } + + + $smarty_compiler = new $this->compiler_class; + + $smarty_compiler->template_dir = $this->template_dir; + $smarty_compiler->compile_dir = $this->compile_dir; + $smarty_compiler->plugins_dir = $this->plugins_dir; + $smarty_compiler->config_dir = $this->config_dir; + $smarty_compiler->force_compile = $this->force_compile; + $smarty_compiler->caching = $this->caching; + $smarty_compiler->php_handling = $this->php_handling; + $smarty_compiler->left_delimiter = $this->left_delimiter; + $smarty_compiler->right_delimiter = $this->right_delimiter; + $smarty_compiler->_version = $this->_version; + $smarty_compiler->security = $this->security; + $smarty_compiler->secure_dir = $this->secure_dir; + $smarty_compiler->security_settings = $this->security_settings; + $smarty_compiler->trusted_dir = $this->trusted_dir; + $smarty_compiler->use_sub_dirs = $this->use_sub_dirs; + $smarty_compiler->_reg_objects = &$this->_reg_objects; + $smarty_compiler->_plugins = &$this->_plugins; + $smarty_compiler->_tpl_vars = &$this->_tpl_vars; + $smarty_compiler->default_modifiers = $this->default_modifiers; + $smarty_compiler->compile_id = $this->_compile_id; + $smarty_compiler->_config = $this->_config; + $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals; + + if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) { + $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path]; + } + $smarty_compiler->_cache_include = $cache_include_path; + + + $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content); + + if ($smarty_compiler->_cache_serial) { + $this->_cache_include_info = array( + 'cache_serial'=>$smarty_compiler->_cache_serial + ,'plugins_code'=>$smarty_compiler->_plugins_code + ,'include_file_path' => $cache_include_path); + + } else { + $this->_cache_include_info = null; + + } + + return $_results; + } + + /** + * Get the compile path for this resource + * + * @param string $resource_name + * @return string results of {@link _get_auto_filename()} + */ + function _get_compile_path($resource_name) + { + return $this->_get_auto_filename($this->compile_dir, $resource_name, + $this->_compile_id) . '.php'; + } + + /** + * fetch the template info. Gets timestamp, and source + * if get_source is true + * + * sets $source_content to the source of the template, and + * $resource_timestamp to its time stamp + * @param string $resource_name + * @param string $source_content + * @param integer $resource_timestamp + * @param boolean $get_source + * @param boolean $quiet + * @return boolean + */ + + function _fetch_resource_info(&$params) + { + if(!isset($params['get_source'])) { $params['get_source'] = true; } + if(!isset($params['quiet'])) { $params['quiet'] = false; } + + $_return = false; + $_params = array('resource_name' => $params['resource_name']) ; + if (isset($params['resource_base_path'])) + $_params['resource_base_path'] = $params['resource_base_path']; + else + $_params['resource_base_path'] = $this->template_dir; + + if ($this->_parse_resource_name($_params)) { + $_resource_type = $_params['resource_type']; + $_resource_name = $_params['resource_name']; + switch ($_resource_type) { + case 'file': + if ($params['get_source']) { + $params['source_content'] = $this->_read_file($_resource_name); + } + $params['resource_timestamp'] = filemtime($_resource_name); + $_return = is_file($_resource_name) && is_readable($_resource_name); + break; + + default: + // call resource functions to fetch the template source and timestamp + if ($params['get_source']) { + $_source_return = isset($this->_plugins['resource'][$_resource_type]) && + call_user_func_array($this->_plugins['resource'][$_resource_type][0][0], + array($_resource_name, &$params['source_content'], &$this)); + } else { + $_source_return = true; + } + + $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) && + call_user_func_array($this->_plugins['resource'][$_resource_type][0][1], + array($_resource_name, &$params['resource_timestamp'], &$this)); + + $_return = $_source_return && $_timestamp_return; + break; + } + } + + if (!$_return) { + // see if we can get a template with the default template handler + if (!empty($this->default_template_handler_func)) { + if (!is_callable($this->default_template_handler_func)) { + $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist."); + } else { + $_return = call_user_func_array( + $this->default_template_handler_func, + array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this)); + } + } + } + + if (!$_return) { + if (!$params['quiet']) { + $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"'); + } + } else if ($_return && $this->security) { + require_once(SMARTY_CORE_DIR . 'core.is_secure.php'); + if (!smarty_core_is_secure($_params, $this)) { + if (!$params['quiet']) + $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed'); + $params['source_content'] = null; + $params['resource_timestamp'] = null; + return false; + } + } + return $_return; + } + + + /** + * parse out the type and name from the resource + * + * @param string $resource_base_path + * @param string $resource_name + * @param string $resource_type + * @param string $resource_name + * @return boolean + */ + + function _parse_resource_name(&$params) + { + + // split tpl_path by the first colon + $_resource_name_parts = explode(':', $params['resource_name'], 2); + + if (count($_resource_name_parts) == 1) { + // no resource type given + $params['resource_type'] = $this->default_resource_type; + $params['resource_name'] = $_resource_name_parts[0]; + } else { + if(strlen($_resource_name_parts[0]) == 1) { + // 1 char is not resource type, but part of filepath + $params['resource_type'] = $this->default_resource_type; + $params['resource_name'] = $params['resource_name']; + } else { + $params['resource_type'] = $_resource_name_parts[0]; + $params['resource_name'] = $_resource_name_parts[1]; + } + } + + if ($params['resource_type'] == 'file') { + if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) { + // relative pathname to $params['resource_base_path'] + // use the first directory where the file is found + foreach ((array)$params['resource_base_path'] as $_curr_path) { + $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name']; + if (file_exists($_fullpath) && is_file($_fullpath)) { + $params['resource_name'] = $_fullpath; + return true; + } + // didn't find the file, try include_path + $_params = array('file_path' => $_fullpath); + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); + if(smarty_core_get_include_path($_params, $this)) { + $params['resource_name'] = $_params['new_file_path']; + return true; + } + } + return false; + } else { + /* absolute path */ + return file_exists($params['resource_name']); + } + } elseif (empty($this->_plugins['resource'][$params['resource_type']])) { + $_params = array('type' => $params['resource_type']); + require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php'); + smarty_core_load_resource_plugin($_params, $this); + } + + return true; + } + + + /** + * Handle modifiers + * + * @param string|null $modifier_name + * @param array|null $map_array + * @return string result of modifiers + */ + function _run_mod_handler() + { + $_args = func_get_args(); + list($_modifier_name, $_map_array) = array_splice($_args, 0, 2); + list($_func_name, $_tpl_file, $_tpl_line) = + $this->_plugins['modifier'][$_modifier_name]; + + $_var = $_args[0]; + foreach ($_var as $_key => $_val) { + $_args[0] = $_val; + $_var[$_key] = call_user_func_array($_func_name, $_args); + } + return $_var; + } + + /** + * Remove starting and ending quotes from the string + * + * @param string $string + * @return string + */ + function _dequote($string) + { + if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') && + substr($string, -1) == substr($string, 0, 1)) + return substr($string, 1, -1); + else + return $string; + } + + + /** + * read in a file + * + * @param string $filename + * @return string + */ + function _read_file($filename) + { + if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) { + $contents = ''; + while (!feof($fd)) { + $contents .= fread($fd, 8192); + } + fclose($fd); + return $contents; + } else { + return false; + } + } + + /** + * get a concrete filename for automagically created content + * + * @param string $auto_base + * @param string $auto_source + * @param string $auto_id + * @return string + * @staticvar string|null + * @staticvar string|null + */ + function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null) + { + $_compile_dir_sep = $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^'; + $_return = $auto_base . DIRECTORY_SEPARATOR; + + if(isset($auto_id)) { + // make auto_id safe for directory names + $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id))); + // split into separate directories + $_return .= $auto_id . $_compile_dir_sep; + } + + if(isset($auto_source)) { + // make source name safe for filename + $_filename = urlencode(basename($auto_source)); + $_crc32 = sprintf('%08X', crc32($auto_source)); + // prepend %% to avoid name conflicts with + // with $params['auto_id'] names + $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep . + substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32; + $_return .= '%%' . $_crc32 . '%%' . $_filename; + } + + return $_return; + } + + /** + * unlink a file, possibly using expiration time + * + * @param string $resource + * @param integer $exp_time + */ + function _unlink($resource, $exp_time = null) + { + if(isset($exp_time)) { + if(time() - @filemtime($resource) >= $exp_time) { + return @unlink($resource); + } + } else { + return @unlink($resource); + } + } + + /** + * returns an auto_id for auto-file-functions + * + * @param string $cache_id + * @param string $compile_id + * @return string|null + */ + function _get_auto_id($cache_id=null, $compile_id=null) { + if (isset($cache_id)) + return (isset($compile_id)) ? $cache_id . '|' . $compile_id : $cache_id; + elseif(isset($compile_id)) + return $compile_id; + else + return null; + } + + /** + * trigger Smarty plugin error + * + * @param string $error_msg + * @param string $tpl_file + * @param integer $tpl_line + * @param string $file + * @param integer $line + * @param integer $error_type + */ + function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null, + $file = null, $line = null, $error_type = E_USER_ERROR) + { + if(isset($file) && isset($line)) { + $info = ' ('.basename($file).", line $line)"; + } else { + $info = ''; + } + if (isset($tpl_line) && isset($tpl_file)) { + $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type); + } else { + $this->trigger_error($error_msg . $info, $error_type); + } + } + + + /** + * callback function for preg_replace, to call a non-cacheable block + * @return string + */ + function _process_compiled_include_callback($match) { + $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3]; + ob_start(); + $_func($this); + $_ret = ob_get_contents(); + ob_end_clean(); + return $_ret; + } + + + /** + * called for included templates + * + * @param string $_smarty_include_tpl_file + * @param string $_smarty_include_vars + */ + + // $_smarty_include_tpl_file, $_smarty_include_vars + + function _smarty_include($params) + { + if ($this->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $debug_start_time = smarty_core_get_microtime($_params, $this); + $this->_smarty_debug_info[] = array('type' => 'template', + 'filename' => $params['smarty_include_tpl_file'], + 'depth' => ++$this->_inclusion_depth); + $included_tpls_idx = count($this->_smarty_debug_info) - 1; + } + + $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']); + + // config vars are treated as local, so push a copy of the + // current ones onto the front of the stack + array_unshift($this->_config, $this->_config[0]); + + $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']); + + + if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path) + || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path)) + { + include($_smarty_compile_path); + } + + // pop the local vars off the front of the stack + array_shift($this->_config); + + $this->_inclusion_depth--; + + if ($this->debugging) { + // capture time for debugging info + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time; + } + + if ($this->caching) { + $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true; + } + } + + + /** + * get or set an array of cached attributes for function that is + * not cacheable + * @return array + */ + function &_smarty_cache_attrs($cache_serial, $count) { + $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count]; + + if ($this->_cache_including) { + /* return next set of cache_attrs */ + $_return = current($_cache_attrs); + next($_cache_attrs); + return $_return; + + } else { + /* add a reference to a new set of cache_attrs */ + $_cache_attrs[] = array(); + return $_cache_attrs[count($_cache_attrs)-1]; + + } + + } + + + /** + * wrapper for include() retaining $this + * @return mixed + */ + function _include($filename, $once=false, $params=null) + { + if ($once) { + return include_once($filename); + } else { + return include($filename); + } + } + + + /** + * wrapper for eval() retaining $this + * @return mixed + */ + function _eval($code, $params=null) + { + return eval($code); + } + + /** + * Extracts the filter name from the given callback + * + * @param callback $function + * @return string + */ + function _get_filter_name($function) + { + if (is_array($function)) { + $_class_name = (is_object($function[0]) ? + get_class($function[0]) : $function[0]); + return $_class_name . '_' . $function[1]; + } + else { + return $function; + } + } + + /**#@-*/ + +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/Smarty_Compiler.class.php b/lib/Smarty/Smarty_Compiler.class.php new file mode 100755 index 0000000..0060215 --- /dev/null +++ b/lib/Smarty/Smarty_Compiler.class.php @@ -0,0 +1,2365 @@ + + * @author Andrei Zmievski + * @version 2.6.25-dev + * @copyright 2001-2005 New Digital Group, Inc. + * @package Smarty + */ + +/* $Id$ */ + +/** + * Template compiling class + * @package Smarty + */ +class Smarty_Compiler extends Smarty { + + // internal vars + /**#@+ + * @access private + */ + var $_folded_blocks = array(); // keeps folded template blocks + var $_current_file = null; // the current template being compiled + var $_current_line_no = 1; // line number for error messages + var $_capture_stack = array(); // keeps track of nested capture buffers + var $_plugin_info = array(); // keeps track of plugins to load + var $_init_smarty_vars = false; + var $_permitted_tokens = array('true','false','yes','no','on','off','null'); + var $_db_qstr_regexp = null; // regexps are setup in the constructor + var $_si_qstr_regexp = null; + var $_qstr_regexp = null; + var $_func_regexp = null; + var $_reg_obj_regexp = null; + var $_var_bracket_regexp = null; + var $_num_const_regexp = null; + var $_dvar_guts_regexp = null; + var $_dvar_regexp = null; + var $_cvar_regexp = null; + var $_svar_regexp = null; + var $_avar_regexp = null; + var $_mod_regexp = null; + var $_var_regexp = null; + var $_parenth_param_regexp = null; + var $_func_call_regexp = null; + var $_obj_ext_regexp = null; + var $_obj_start_regexp = null; + var $_obj_params_regexp = null; + var $_obj_call_regexp = null; + var $_cacheable_state = 0; + var $_cache_attrs_count = 0; + var $_nocache_count = 0; + var $_cache_serial = null; + var $_cache_include = null; + + var $_strip_depth = 0; + var $_additional_newline = "\n"; + + /**#@-*/ + /** + * The class constructor. + */ + public function __construct() + { + // matches double quoted strings: + // "foobar" + // "foo\"bar" + $this->_db_qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"'; + + // matches single quoted strings: + // 'foobar' + // 'foo\'bar' + $this->_si_qstr_regexp = '\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; + + // matches single or double quoted strings + $this->_qstr_regexp = '(?:' . $this->_db_qstr_regexp . '|' . $this->_si_qstr_regexp . ')'; + + // matches bracket portion of vars + // [0] + // [foo] + // [$bar] + $this->_var_bracket_regexp = '\[\$?[\w\.]+\]'; + + // matches numerical constants + // 30 + // -12 + // 13.22 + $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)'; + + // matches $ vars (not objects): + // $foo + // $foo.bar + // $foo.bar.foobar + // $foo[0] + // $foo[$bar] + // $foo[5][blah] + // $foo[5].bar[$foobar][4] + $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))'; + $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]'; + $this->_dvar_guts_regexp = '\w+(?:' . $this->_var_bracket_regexp + . ')*(?:\.\$?\w+(?:' . $this->_var_bracket_regexp . ')*)*(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?'; + $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp; + + // matches config vars: + // #foo# + // #foobar123_foo# + $this->_cvar_regexp = '\#\w+\#'; + + // matches section vars: + // %foo.bar% + $this->_svar_regexp = '\%\w+\.\w+\%'; + + // matches all valid variables (no quotes, no modifiers) + $this->_avar_regexp = '(?:' . $this->_dvar_regexp . '|' + . $this->_cvar_regexp . '|' . $this->_svar_regexp . ')'; + + // matches valid variable syntax: + // $foo + // $foo + // #foo# + // #foo# + // "text" + // "text" + $this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')'; + + // matches valid object call (one level of object nesting allowed in parameters): + // $foo->bar + // $foo->bar() + // $foo->bar("text") + // $foo->bar($foo, $bar, "text") + // $foo->bar($foo, "foo") + // $foo->bar->foo() + // $foo->bar->foo->bar() + // $foo->bar($foo->bar) + // $foo->bar($foo->bar()) + // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar)) + $this->_obj_ext_regexp = '\->(?:\$?' . $this->_dvar_guts_regexp . ')'; + $this->_obj_restricted_param_regexp = '(?:' + . '(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . '(?:\((?:(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')' + . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . '))*)?\))?)*)'; + $this->_obj_single_param_regexp = '(?:\w+|' . $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|' + . $this->_var_regexp . $this->_obj_restricted_param_regexp . ')))*)'; + $this->_obj_params_regexp = '\((?:' . $this->_obj_single_param_regexp + . '(?:\s*,\s*' . $this->_obj_single_param_regexp . ')*)?\)'; + $this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)'; + $this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?)'; + + // matches valid modifier syntax: + // |foo + // |@foo + // |foo:"bar" + // |foo:$bar + // |foo:"bar":$foobar + // |foo|bar + // |foo:$foo->bar + $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . $this->_num_const_regexp . '|' + . $this->_obj_call_regexp . '|' . $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)'; + + // matches valid function name: + // foo123 + // _foo_bar + $this->_func_regexp = '[a-zA-Z_]\w*'; + + // matches valid registered object: + // foo->bar + $this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*'; + + // matches valid parameter values: + // true + // $foo + // $foo|bar + // #foo# + // #foo#|bar + // "text" + // "text"|bar + // $foo->bar + $this->_param_regexp = '(?:\s*(?:' . $this->_obj_call_regexp . '|' + . $this->_var_regexp . '|' . $this->_num_const_regexp . '|\w+)(?>' . $this->_mod_regexp . '*)\s*)'; + + // matches valid parenthesised function parameters: + // + // "text" + // $foo, $bar, "text" + // $foo|bar, "foo"|bar, $foo->bar($foo)|bar + $this->_parenth_param_regexp = '(?:\((?:\w+|' + . $this->_param_regexp . '(?:\s*,\s*(?:(?:\w+|' + . $this->_param_regexp . ')))*)?\))'; + + // matches valid function call: + // foo() + // foo_bar($foo) + // _foo_bar($foo,"bar") + // foo123($foo,$foo->bar(),"foo") + $this->_func_call_regexp = '(?:' . $this->_func_regexp . '\s*(?:' + . $this->_parenth_param_regexp . '))'; + } + + /** + * compile a resource + * + * sets $compiled_content to the compiled source + * @param string $resource_name + * @param string $source_content + * @param string $compiled_content + * @return true + */ + function _compile_file($resource_name, $source_content, &$compiled_content) + { + + if ($this->security) { + // do not allow php syntax to be executed unless specified + if ($this->php_handling == SMARTY_PHP_ALLOW && + !$this->security_settings['PHP_HANDLING']) { + $this->php_handling = SMARTY_PHP_PASSTHRU; + } + } + + $this->_load_filters(); + + $this->_current_file = $resource_name; + $this->_current_line_no = 1; + $ldq = preg_quote($this->left_delimiter, '~'); + $rdq = preg_quote($this->right_delimiter, '~'); + + // run template source through prefilter functions + if (count($this->_plugins['prefilter']) > 0) { + foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) { + if ($prefilter === false) continue; + if ($prefilter[3] || is_callable($prefilter[0])) { + $source_content = call_user_func_array($prefilter[0], + array($source_content, &$this)); + $this->_plugins['prefilter'][$filter_name][3] = true; + } else { + $this->_trigger_fatal_error("[plugin] prefilter '$filter_name' is not implemented"); + } + } + } + + /* fetch all special blocks */ + $search = "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s*/literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{$rdq}~s"; + + preg_match_all($search, $source_content, $match, PREG_SET_ORDER); + $this->_folded_blocks = $match; + reset($this->_folded_blocks); + + /* replace special blocks by "{php}" */ + $source_content = preg_replace_callback($search, create_function ('$matches', "return '" + . $this->_quote_replace($this->left_delimiter) . 'php' + . "' . str_repeat(\"\n\", substr_count('\$matches[1]', \"\n\")) .'" + . $this->_quote_replace($this->right_delimiter) + . "';") + , $source_content); + + /* Gather all template tags. */ + preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", $source_content, $_match); + $template_tags = $_match[1]; + /* Split content by template tags to obtain non-template content. */ + $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", $source_content); + + /* loop through text blocks */ + for ($curr_tb = 0, $for_max = count($text_blocks); $curr_tb < $for_max; $curr_tb++) { + /* match anything resembling php tags */ + if (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?\s*php\s*[\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) { + /* replace tags with placeholders to prevent recursive replacements */ + $sp_match[1] = array_unique($sp_match[1]); + usort($sp_match[1], '_smarty_sort_length'); + for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) { + $text_blocks[$curr_tb] = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$text_blocks[$curr_tb]); + } + /* process each one */ + for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) { + if ($this->php_handling == SMARTY_PHP_PASSTHRU) { + /* echo php contents */ + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', ''."\n", $text_blocks[$curr_tb]); + } else if ($this->php_handling == SMARTY_PHP_QUOTE) { + /* quote php tags */ + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', htmlspecialchars($sp_match[1][$curr_sp]), $text_blocks[$curr_tb]); + } else if ($this->php_handling == SMARTY_PHP_REMOVE) { + /* remove php tags */ + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]); + } else { + /* SMARTY_PHP_ALLOW, but echo non php starting tags */ + $sp_match[1][$curr_sp] = preg_replace('~(<\?(?!php|=|$))~i', ''."\n", $sp_match[1][$curr_sp]); + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', $sp_match[1][$curr_sp], $text_blocks[$curr_tb]); + } + } + } + } + + /* Compile the template tags into PHP code. */ + $compiled_tags = array(); + for ($i = 0, $for_max = count($template_tags); $i < $for_max; $i++) { + $this->_current_line_no += substr_count($text_blocks[$i], "\n"); + $compiled_tags[] = $this->_compile_tag($template_tags[$i]); + $this->_current_line_no += substr_count($template_tags[$i], "\n"); + } + if (count($this->_tag_stack)>0) { + list($_open_tag, $_line_no) = end($this->_tag_stack); + $this->_syntax_error("unclosed tag \{$_open_tag} (opened line $_line_no).", E_USER_ERROR, __FILE__, __LINE__); + return; + } + + /* Reformat $text_blocks between 'strip' and '/strip' tags, + removing spaces, tabs and newlines. */ + $strip = false; + for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) { + if ($compiled_tags[$i] == '{strip}') { + $compiled_tags[$i] = ''; + $strip = true; + /* remove leading whitespaces */ + $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]); + } + if ($strip) { + /* strip all $text_blocks before the next '/strip' */ + for ($j = $i + 1; $j < $for_max; $j++) { + /* remove leading and trailing whitespaces of each line */ + $text_blocks[$j] = preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $text_blocks[$j]); + if ($compiled_tags[$j] == '{/strip}') { + /* remove trailing whitespaces from the last text_block */ + $text_blocks[$j] = rtrim($text_blocks[$j]); + } + $text_blocks[$j] = ""\'", "\\"=>"\\\\")) . "'; ?>"; + if ($compiled_tags[$j] == '{/strip}') { + $compiled_tags[$j] = "\n"; /* slurped by php, but necessary + if a newline is following the closing strip-tag */ + $strip = false; + $i = $j; + break; + } + } + } + } + $compiled_content = ''; + + $tag_guard = '%%%SMARTYOTG' . md5(uniqid(rand(), true)) . '%%%'; + + /* Interleave the compiled contents and text blocks to get the final result. */ + for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) { + if ($compiled_tags[$i] == '') { + // tag result empty, remove first newline from following text block + $text_blocks[$i+1] = preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]); + } + // replace legit PHP tags with placeholder + $text_blocks[$i] = str_replace('\n", $compiled_content); + $compiled_content = preg_replace("~(?\n", $compiled_content); + + // recover legit tags + $compiled_content = str_replace($tag_guard, '_cache_serial)) { + $compiled_content = "_cache_serials['".$this->_cache_include."'] = '".$this->_cache_serial."'; ?>" . $compiled_content; + } + + // run compiled template through postfilter functions + if (count($this->_plugins['postfilter']) > 0) { + foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) { + if ($postfilter === false) continue; + if ($postfilter[3] || is_callable($postfilter[0])) { + $compiled_content = call_user_func_array($postfilter[0], + array($compiled_content, &$this)); + $this->_plugins['postfilter'][$filter_name][3] = true; + } else { + $this->_trigger_fatal_error("Smarty plugin error: postfilter '$filter_name' is not implemented"); + } + } + } + + // put header at the top of the compiled template + $template_header = "_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n"; + $template_header .= " compiled from ".strtr(urlencode($resource_name), array('%2F'=>'/', '%3A'=>':'))." */ ?>\n"; + + /* Emit code to load needed plugins. */ + $this->_plugins_code = ''; + if (count($this->_plugin_info)) { + $_plugins_params = "array('plugins' => array("; + foreach ($this->_plugin_info as $plugin_type => $plugins) { + foreach ($plugins as $plugin_name => $plugin_info) { + $_plugins_params .= "array('$plugin_type', '$plugin_name', '" . strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . "', $plugin_info[1], "; + $_plugins_params .= $plugin_info[2] ? 'true),' : 'false),'; + } + } + $_plugins_params .= '))'; + $plugins_code = "\n"; + $template_header .= $plugins_code; + $this->_plugin_info = array(); + $this->_plugins_code = $plugins_code; + } + + if ($this->_init_smarty_vars) { + $template_header .= "\n"; + $this->_init_smarty_vars = false; + } + + $compiled_content = $template_header . $compiled_content; + return true; + } + + /** + * Compile a template tag + * + * @param string $template_tag + * @return string + */ + function _compile_tag($template_tag) + { + /* Matched comment. */ + if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*') + return ''; + + /* Split tag into two three parts: command, command modifiers and the arguments. */ + if(! preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp + . '|\/?' . $this->_reg_obj_regexp . '|\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*)) + (?:\s+(.*))?$ + ~xs', $template_tag, $match)) { + $this->_syntax_error("unrecognized tag: $template_tag", E_USER_ERROR, __FILE__, __LINE__); + } + + $tag_command = $match[1]; + $tag_modifier = isset($match[2]) ? $match[2] : null; + $tag_args = isset($match[3]) ? $match[3] : null; + + if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) { + /* tag name is a variable or object */ + $_return = $this->_parse_var_props($tag_command . $tag_modifier); + return "" . $this->_additional_newline; + } + + /* If the tag name is a registered object, we process it. */ + if (preg_match('~^\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) { + return $this->_compile_registered_object_tag($tag_command, $this->_parse_attrs($tag_args), $tag_modifier); + } + + switch ($tag_command) { + case 'include': + return $this->_compile_include_tag($tag_args); + + case 'include_php': + return $this->_compile_include_php_tag($tag_args); + + case 'if': + $this->_push_tag('if'); + return $this->_compile_if_tag($tag_args); + + case 'else': + list($_open_tag) = end($this->_tag_stack); + if ($_open_tag != 'if' && $_open_tag != 'elseif') + $this->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__); + else + $this->_push_tag('else'); + return ''; + + case 'elseif': + list($_open_tag) = end($this->_tag_stack); + if ($_open_tag != 'if' && $_open_tag != 'elseif') + $this->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__); + if ($_open_tag == 'if') + $this->_push_tag('elseif'); + return $this->_compile_if_tag($tag_args, true); + + case '/if': + $this->_pop_tag('if'); + return ''; + + case 'capture': + return $this->_compile_capture_tag(true, $tag_args); + + case '/capture': + return $this->_compile_capture_tag(false); + + case 'ldelim': + return $this->left_delimiter; + + case 'rdelim': + return $this->right_delimiter; + + case 'section': + $this->_push_tag('section'); + return $this->_compile_section_start($tag_args); + + case 'sectionelse': + $this->_push_tag('sectionelse'); + return ""; + break; + + case '/section': + $_open_tag = $this->_pop_tag('section'); + if ($_open_tag == 'sectionelse') + return ""; + else + return ""; + + case 'foreach': + $this->_push_tag('foreach'); + return $this->_compile_foreach_start($tag_args); + break; + + case 'foreachelse': + $this->_push_tag('foreachelse'); + return ""; + + case '/foreach': + $_open_tag = $this->_pop_tag('foreach'); + if ($_open_tag == 'foreachelse') + return ""; + else + return ""; + break; + + case 'strip': + case '/strip': + if (substr($tag_command, 0, 1)=='/') { + $this->_pop_tag('strip'); + if (--$this->_strip_depth==0) { /* outermost closing {/strip} */ + $this->_additional_newline = "\n"; + return '{' . $tag_command . '}'; + } + } else { + $this->_push_tag('strip'); + if ($this->_strip_depth++==0) { /* outermost opening {strip} */ + $this->_additional_newline = ""; + return '{' . $tag_command . '}'; + } + } + return ''; + + case 'php': + /* handle folded tags replaced by {php} */ + list(, $block) = each($this->_folded_blocks); + $this->_current_line_no += substr_count($block[0], "\n"); + /* the number of matched elements in the regexp in _compile_file() + determins the type of folded tag that was found */ + switch (count($block)) { + case 2: /* comment */ + return ''; + + case 3: /* literal */ + return ""\'", "\\"=>"\\\\")) . "'; ?>" . $this->_additional_newline; + + case 4: /* php */ + if ($this->security && !$this->security_settings['PHP_TAGS']) { + $this->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__); + return; + } + return ''; + } + break; + + case 'insert': + return $this->_compile_insert_tag($tag_args); + + default: + if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) { + return $output; + } else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) { + return $output; + } else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) { + return $output; + } else { + $this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__); + } + + } + } + + + /** + * compile the custom compiler tag + * + * sets $output to the compiled custom compiler tag + * @param string $tag_command + * @param string $tag_args + * @param string $output + * @return boolean + */ + function _compile_compiler_tag($tag_command, $tag_args, &$output) + { + $found = false; + $have_function = true; + + /* + * First we check if the compiler function has already been registered + * or loaded from a plugin file. + */ + if (isset($this->_plugins['compiler'][$tag_command])) { + $found = true; + $plugin_func = $this->_plugins['compiler'][$tag_command][0]; + if (!is_callable($plugin_func)) { + $message = "compiler function '$tag_command' is not implemented"; + $have_function = false; + } + } + /* + * Otherwise we need to load plugin file and look for the function + * inside it. + */ + else if ($plugin_file = $this->_get_plugin_filepath('compiler', $tag_command)) { + $found = true; + + include_once $plugin_file; + + $plugin_func = 'smarty_compiler_' . $tag_command; + if (!is_callable($plugin_func)) { + $message = "plugin function $plugin_func() not found in $plugin_file\n"; + $have_function = false; + } else { + $this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null, null, true); + } + } + + /* + * True return value means that we either found a plugin or a + * dynamically registered function. False means that we didn't and the + * compiler should now emit code to load custom function plugin for this + * tag. + */ + if ($found) { + if ($have_function) { + $output = call_user_func_array($plugin_func, array($tag_args, &$this)); + if($output != '') { + $output = '_push_cacheable_state('compiler', $tag_command) + . $output + . $this->_pop_cacheable_state('compiler', $tag_command) . ' ?>'; + } + } else { + $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__); + } + return true; + } else { + return false; + } + } + + + /** + * compile block function tag + * + * sets $output to compiled block function tag + * @param string $tag_command + * @param string $tag_args + * @param string $tag_modifier + * @param string $output + * @return boolean + */ + function _compile_block_tag($tag_command, $tag_args, $tag_modifier, &$output) + { + if (substr($tag_command, 0, 1) == '/') { + $start_tag = false; + $tag_command = substr($tag_command, 1); + } else + $start_tag = true; + + $found = false; + $have_function = true; + + /* + * First we check if the block function has already been registered + * or loaded from a plugin file. + */ + if (isset($this->_plugins['block'][$tag_command])) { + $found = true; + $plugin_func = $this->_plugins['block'][$tag_command][0]; + if (!is_callable($plugin_func)) { + $message = "block function '$tag_command' is not implemented"; + $have_function = false; + } + } + /* + * Otherwise we need to load plugin file and look for the function + * inside it. + */ + else if ($plugin_file = $this->_get_plugin_filepath('block', $tag_command)) { + $found = true; + + include_once $plugin_file; + + $plugin_func = 'smarty_block_' . $tag_command; + if (!function_exists($plugin_func)) { + $message = "plugin function $plugin_func() not found in $plugin_file\n"; + $have_function = false; + } else { + $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true); + + } + } + + if (!$found) { + return false; + } else if (!$have_function) { + $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__); + return true; + } + + /* + * Even though we've located the plugin function, compilation + * happens only once, so the plugin will still need to be loaded + * at runtime for future requests. + */ + $this->_add_plugin('block', $tag_command); + + if ($start_tag) + $this->_push_tag($tag_command); + else + $this->_pop_tag($tag_command); + + if ($start_tag) { + $output = '_push_cacheable_state('block', $tag_command); + $attrs = $this->_parse_attrs($tag_args); + $_cache_attrs=''; + $arg_list = $this->_compile_arg_list('block', $tag_command, $attrs, $_cache_attrs); + $output .= "$_cache_attrs\$this->_tag_stack[] = array('$tag_command', array(".implode(',', $arg_list).')); '; + $output .= '$_block_repeat=true;' . $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat);'; + $output .= 'while ($_block_repeat) { ob_start(); ?>'; + } else { + $output = '_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $_block_content, $this, $_block_repeat)'; + if ($tag_modifier != '') { + $this->_parse_modifiers($_out_tag_text, $tag_modifier); + } + $output .= '$_block_repeat=false;echo ' . $_out_tag_text . '; } '; + $output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>'; + } + + return true; + } + + + /** + * compile custom function tag + * + * @param string $tag_command + * @param string $tag_args + * @param string $tag_modifier + * @return string + */ + function _compile_custom_tag($tag_command, $tag_args, $tag_modifier, &$output) + { + $found = false; + $have_function = true; + + /* + * First we check if the custom function has already been registered + * or loaded from a plugin file. + */ + if (isset($this->_plugins['function'][$tag_command])) { + $found = true; + $plugin_func = $this->_plugins['function'][$tag_command][0]; + if (!is_callable($plugin_func)) { + $message = "custom function '$tag_command' is not implemented"; + $have_function = false; + } + } + /* + * Otherwise we need to load plugin file and look for the function + * inside it. + */ + else if ($plugin_file = $this->_get_plugin_filepath('function', $tag_command)) { + $found = true; + + include_once $plugin_file; + + $plugin_func = 'smarty_function_' . $tag_command; + if (!function_exists($plugin_func)) { + $message = "plugin function $plugin_func() not found in $plugin_file\n"; + $have_function = false; + } else { + $this->_plugins['function'][$tag_command] = array($plugin_func, null, null, null, true); + + } + } + + if (!$found) { + return false; + } else if (!$have_function) { + $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__); + return true; + } + + /* declare plugin to be loaded on display of the template that + we compile right now */ + $this->_add_plugin('function', $tag_command); + + $_cacheable_state = $this->_push_cacheable_state('function', $tag_command); + $attrs = $this->_parse_attrs($tag_args); + $_cache_attrs = ''; + $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs); + + $output = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)"; + if($tag_modifier != '') { + $this->_parse_modifiers($output, $tag_modifier); + } + + if($output != '') { + $output = '_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline; + } + + return true; + } + + /** + * compile a registered object tag + * + * @param string $tag_command + * @param array $attrs + * @param string $tag_modifier + * @return string + */ + function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier) + { + if (substr($tag_command, 0, 1) == '/') { + $start_tag = false; + $tag_command = substr($tag_command, 1); + } else { + $start_tag = true; + } + + list($object, $obj_comp) = explode('->', $tag_command); + + $arg_list = array(); + if(count($attrs)) { + $_assign_var = false; + foreach ($attrs as $arg_name => $arg_value) { + if($arg_name == 'assign') { + $_assign_var = $arg_value; + unset($attrs['assign']); + continue; + } + if (is_bool($arg_value)) + $arg_value = $arg_value ? 'true' : 'false'; + $arg_list[] = "'$arg_name' => $arg_value"; + } + } + + if($this->_reg_objects[$object][2]) { + // smarty object argument format + $args = "array(".implode(',', (array)$arg_list)."), \$this"; + } else { + // traditional argument format + $args = implode(',', array_values($attrs)); + if (empty($args)) { + $args = ''; + } + } + + $prefix = ''; + $postfix = ''; + $newline = ''; + if(!is_object($this->_reg_objects[$object][0])) { + $this->_trigger_fatal_error("registered '$object' is not an object" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__); + } elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) { + $this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'", $this->_current_file, $this->_current_line_no, __FILE__, __LINE__); + } elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) { + // method + if(in_array($obj_comp, $this->_reg_objects[$object][3])) { + // block method + if ($start_tag) { + $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); "; + $prefix .= "\$_block_repeat=true; \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); "; + $prefix .= "while (\$_block_repeat) { ob_start();"; + $return = null; + $postfix = ''; + } else { + $prefix = "\$_obj_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;"; + $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$_obj_block_content, \$this, \$_block_repeat)"; + $postfix = "} array_pop(\$this->_tag_stack);"; + } + } else { + // non-block method + $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)"; + } + } else { + // property + $return = "\$this->_reg_objects['$object'][0]->$obj_comp"; + } + + if($return != null) { + if($tag_modifier != '') { + $this->_parse_modifiers($return, $tag_modifier); + } + + if(!empty($_assign_var)) { + $output = "\$this->assign('" . $this->_dequote($_assign_var) ."', $return);"; + } else { + $output = 'echo ' . $return . ';'; + $newline = $this->_additional_newline; + } + } else { + $output = ''; + } + + return '" . $newline; + } + + /** + * Compile {insert ...} tag + * + * @param string $tag_args + * @return string + */ + function _compile_insert_tag($tag_args) + { + $attrs = $this->_parse_attrs($tag_args); + $name = $this->_dequote($attrs['name']); + + if (empty($name)) { + return $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__); + } + + if (!preg_match('~^\w+$~', $name)) { + return $this->_syntax_error("'insert: 'name' must be an insert function name", E_USER_ERROR, __FILE__, __LINE__); + } + + if (!empty($attrs['script'])) { + $delayed_loading = true; + } else { + $delayed_loading = false; + } + + foreach ($attrs as $arg_name => $arg_value) { + if (is_bool($arg_value)) + $arg_value = $arg_value ? 'true' : 'false'; + $arg_list[] = "'$arg_name' => $arg_value"; + } + + $this->_add_plugin('insert', $name, $delayed_loading); + + $_params = "array('args' => array(".implode(', ', (array)$arg_list)."))"; + + return "" . $this->_additional_newline; + } + + /** + * Compile {include ...} tag + * + * @param string $tag_args + * @return string + */ + function _compile_include_tag($tag_args) + { + $attrs = $this->_parse_attrs($tag_args); + $arg_list = array(); + + if (empty($attrs['file'])) { + $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__); + } + + foreach ($attrs as $arg_name => $arg_value) { + if ($arg_name == 'file') { + $include_file = $arg_value; + continue; + } else if ($arg_name == 'assign') { + $assign_var = $arg_value; + continue; + } + if (is_bool($arg_value)) + $arg_value = $arg_value ? 'true' : 'false'; + $arg_list[] = "'$arg_name' => $arg_value"; + } + + $output = '_tpl_vars;\n"; + + + $_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))"; + $output .= "\$this->_smarty_include($_params);\n" . + "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" . + "unset(\$_smarty_tpl_vars);\n"; + + if (isset($assign_var)) { + $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n"; + } + + $output .= ' ?>'; + + return $output; + + } + + /** + * Compile {include ...} tag + * + * @param string $tag_args + * @return string + */ + function _compile_include_php_tag($tag_args) + { + $attrs = $this->_parse_attrs($tag_args); + + if (empty($attrs['file'])) { + $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__); + } + + $assign_var = (empty($attrs['assign'])) ? '' : $this->_dequote($attrs['assign']); + $once_var = (empty($attrs['once']) || $attrs['once']=='false') ? 'false' : 'true'; + + $arg_list = array(); + foreach($attrs as $arg_name => $arg_value) { + if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') { + if(is_bool($arg_value)) + $arg_value = $arg_value ? 'true' : 'false'; + $arg_list[] = "'$arg_name' => $arg_value"; + } + } + + $_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', $arg_list)."))"; + + return "" . $this->_additional_newline; + } + + + /** + * Compile {section ...} tag + * + * @param string $tag_args + * @return string + */ + function _compile_section_start($tag_args) + { + $attrs = $this->_parse_attrs($tag_args); + $arg_list = array(); + + $output = '_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__); + } + + $output .= "unset(\$this->_sections[$section_name]);\n"; + $section_props = "\$this->_sections[$section_name]"; + + foreach ($attrs as $attr_name => $attr_value) { + switch ($attr_name) { + case 'loop': + $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n"; + break; + + case 'show': + if (is_bool($attr_value)) + $show_attr_value = $attr_value ? 'true' : 'false'; + else + $show_attr_value = "(bool)$attr_value"; + $output .= "{$section_props}['show'] = $show_attr_value;\n"; + break; + + case 'name': + $output .= "{$section_props}['$attr_name'] = $attr_value;\n"; + break; + + case 'max': + case 'start': + $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n"; + break; + + case 'step': + $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n"; + break; + + default: + $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__); + break; + } + } + + if (!isset($attrs['show'])) + $output .= "{$section_props}['show'] = true;\n"; + + if (!isset($attrs['loop'])) + $output .= "{$section_props}['loop'] = 1;\n"; + + if (!isset($attrs['max'])) + $output .= "{$section_props}['max'] = {$section_props}['loop'];\n"; + else + $output .= "if ({$section_props}['max'] < 0)\n" . + " {$section_props}['max'] = {$section_props}['loop'];\n"; + + if (!isset($attrs['step'])) + $output .= "{$section_props}['step'] = 1;\n"; + + if (!isset($attrs['start'])) + $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n"; + else { + $output .= "if ({$section_props}['start'] < 0)\n" . + " {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" . + "else\n" . + " {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n"; + } + + $output .= "if ({$section_props}['show']) {\n"; + if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) { + $output .= " {$section_props}['total'] = {$section_props}['loop'];\n"; + } else { + $output .= " {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n"; + } + $output .= " if ({$section_props}['total'] == 0)\n" . + " {$section_props}['show'] = false;\n" . + "} else\n" . + " {$section_props}['total'] = 0;\n"; + + $output .= "if ({$section_props}['show']):\n"; + $output .= " + for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1; + {$section_props}['iteration'] <= {$section_props}['total']; + {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n"; + $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n"; + $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n"; + $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n"; + $output .= "{$section_props}['first'] = ({$section_props}['iteration'] == 1);\n"; + $output .= "{$section_props}['last'] = ({$section_props}['iteration'] == {$section_props}['total']);\n"; + + $output .= "?>"; + + return $output; + } + + + /** + * Compile {foreach ...} tag. + * + * @param string $tag_args + * @return string + */ + function _compile_foreach_start($tag_args) + { + $attrs = $this->_parse_attrs($tag_args); + $arg_list = array(); + + if (empty($attrs['from'])) { + return $this->_syntax_error("foreach: missing 'from' attribute", E_USER_ERROR, __FILE__, __LINE__); + } + $from = $attrs['from']; + + if (empty($attrs['item'])) { + return $this->_syntax_error("foreach: missing 'item' attribute", E_USER_ERROR, __FILE__, __LINE__); + } + $item = $this->_dequote($attrs['item']); + if (!preg_match('~^\w+$~', $item)) { + return $this->_syntax_error("foreach: 'item' must be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__); + } + + if (isset($attrs['key'])) { + $key = $this->_dequote($attrs['key']); + if (!preg_match('~^\w+$~', $key)) { + return $this->_syntax_error("foreach: 'key' must to be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__); + } + $key_part = "\$this->_tpl_vars['$key'] => "; + } else { + $key = null; + $key_part = ''; + } + + if (isset($attrs['name'])) { + $name = $attrs['name']; + } else { + $name = null; + } + + $output = '_foreach[$name]"; + $output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n"; + $output .= "if ({$foreach_props}['total'] > 0):\n"; + $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n"; + $output .= " {$foreach_props}['iteration']++;\n"; + } else { + $output .= "if (count(\$_from)):\n"; + $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n"; + } + $output .= '?>'; + + return $output; + } + + + /** + * Compile {capture} .. {/capture} tags + * + * @param boolean $start true if this is the {capture} tag + * @param string $tag_args + * @return string + */ + + function _compile_capture_tag($start, $tag_args = '') + { + $attrs = $this->_parse_attrs($tag_args); + + if ($start) { + $buffer = isset($attrs['name']) ? $attrs['name'] : "'default'"; + $assign = isset($attrs['assign']) ? $attrs['assign'] : null; + $append = isset($attrs['append']) ? $attrs['append'] : null; + + $output = ""; + $this->_capture_stack[] = array($buffer, $assign, $append); + } else { + list($buffer, $assign, $append) = array_pop($this->_capture_stack); + $output = "_smarty_vars['capture'][$buffer] = ob_get_contents(); "; + if (isset($assign)) { + $output .= " \$this->assign($assign, ob_get_contents());"; + } + if (isset($append)) { + $output .= " \$this->append($append, ob_get_contents());"; + } + $output .= "ob_end_clean(); ?>"; + } + + return $output; + } + + /** + * Compile {if ...} tag + * + * @param string $tag_args + * @param boolean $elseif if true, uses elseif instead of if + * @return string + */ + function _compile_if_tag($tag_args, $elseif = false) + { + + /* Tokenize args for 'if' tag. */ + preg_match_all('~(?> + ' . $this->_obj_call_regexp . '(?:' . $this->_mod_regexp . '*)? | # valid object call + ' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)? | # var or quoted string + \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@ | # valid non-word token + \b\w+\b | # valid word token + \S+ # anything else + )~x', $tag_args, $match); + + $tokens = $match[0]; + + if(empty($tokens)) { + $_error_msg = $elseif ? "'elseif'" : "'if'"; + $_error_msg .= ' statement requires arguments'; + $this->_syntax_error($_error_msg, E_USER_ERROR, __FILE__, __LINE__); + } + + + // make sure we have balanced parenthesis + $token_count = array_count_values($tokens); + if(isset($token_count['(']) && $token_count['('] != $token_count[')']) { + $this->_syntax_error("unbalanced parenthesis in if statement", E_USER_ERROR, __FILE__, __LINE__); + } + + $is_arg_stack = array(); + + for ($i = 0; $i < count($tokens); $i++) { + + $token = &$tokens[$i]; + + switch (strtolower($token)) { + case '!': + case '%': + case '!==': + case '==': + case '===': + case '>': + case '<': + case '!=': + case '<>': + case '<<': + case '>>': + case '<=': + case '>=': + case '&&': + case '||': + case '|': + case '^': + case '&': + case '~': + case ')': + case ',': + case '+': + case '-': + case '*': + case '/': + case '@': + break; + + case 'eq': + $token = '=='; + break; + + case 'ne': + case 'neq': + $token = '!='; + break; + + case 'lt': + $token = '<'; + break; + + case 'le': + case 'lte': + $token = '<='; + break; + + case 'gt': + $token = '>'; + break; + + case 'ge': + case 'gte': + $token = '>='; + break; + + case 'and': + $token = '&&'; + break; + + case 'or': + $token = '||'; + break; + + case 'not': + $token = '!'; + break; + + case 'mod': + $token = '%'; + break; + + case '(': + array_push($is_arg_stack, $i); + break; + + case 'is': + /* If last token was a ')', we operate on the parenthesized + expression. The start of the expression is on the stack. + Otherwise, we operate on the last encountered token. */ + if ($tokens[$i-1] == ')') { + $is_arg_start = array_pop($is_arg_stack); + if ($is_arg_start != 0) { + if (preg_match('~^' . $this->_func_regexp . '$~', $tokens[$is_arg_start-1])) { + $is_arg_start--; + } + } + } else + $is_arg_start = $i-1; + /* Construct the argument for 'is' expression, so it knows + what to operate on. */ + $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start)); + + /* Pass all tokens from next one until the end to the + 'is' expression parsing function. The function will + return modified tokens, where the first one is the result + of the 'is' expression and the rest are the tokens it + didn't touch. */ + $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1)); + + /* Replace the old tokens with the new ones. */ + array_splice($tokens, $is_arg_start, count($tokens), $new_tokens); + + /* Adjust argument start so that it won't change from the + current position for the next iteration. */ + $i = $is_arg_start; + break; + + default: + if(preg_match('~^' . $this->_func_regexp . '$~', $token) ) { + // function call + if($this->security && + !in_array($token, $this->security_settings['IF_FUNCS'])) { + $this->_syntax_error("(secure mode) '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__); + } + } elseif(preg_match('~^' . $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', substr($token, -1)) === false) && isset($tokens[$i+1]) && $tokens[$i+1] == '(') { + // variable function call + $this->_syntax_error("variable function call '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__); + } elseif(preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)$~', $token)) { + // object or variable + $token = $this->_parse_var_props($token); + } elseif(is_numeric($token)) { + // number, skip it + } else { + $this->_syntax_error("unidentified token '$token'", E_USER_ERROR, __FILE__, __LINE__); + } + break; + } + } + + if ($elseif) + return ''; + else + return ''; + } + + + function _compile_arg_list($type, $name, $attrs, &$cache_code) { + $arg_list = array(); + + if (isset($type) && isset($name) + && isset($this->_plugins[$type]) + && isset($this->_plugins[$type][$name]) + && empty($this->_plugins[$type][$name][4]) + && is_array($this->_plugins[$type][$name][5]) + ) { + /* we have a list of parameters that should be cached */ + $_cache_attrs = $this->_plugins[$type][$name][5]; + $_count = $this->_cache_attrs_count++; + $cache_code = "\$_cache_attrs =& \$this->_smarty_cache_attrs('$this->_cache_serial','$_count');"; + + } else { + /* no parameters are cached */ + $_cache_attrs = null; + } + + foreach ($attrs as $arg_name => $arg_value) { + if (is_bool($arg_value)) + $arg_value = $arg_value ? 'true' : 'false'; + if (is_null($arg_value)) + $arg_value = 'null'; + if ($_cache_attrs && in_array($arg_name, $_cache_attrs)) { + $arg_list[] = "'$arg_name' => (\$this->_cache_including) ? \$_cache_attrs['$arg_name'] : (\$_cache_attrs['$arg_name']=$arg_value)"; + } else { + $arg_list[] = "'$arg_name' => $arg_value"; + } + } + return $arg_list; + } + + /** + * Parse is expression + * + * @param string $is_arg + * @param array $tokens + * @return array + */ + function _parse_is_expr($is_arg, $tokens) + { + $expr_end = 0; + $negate_expr = false; + + if (($first_token = array_shift($tokens)) == 'not') { + $negate_expr = true; + $expr_type = array_shift($tokens); + } else + $expr_type = $first_token; + + switch ($expr_type) { + case 'even': + if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') { + $expr_end++; + $expr_arg = $tokens[$expr_end++]; + $expr = "!(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))"; + } else + $expr = "!(1 & $is_arg)"; + break; + + case 'odd': + if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') { + $expr_end++; + $expr_arg = $tokens[$expr_end++]; + $expr = "(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))"; + } else + $expr = "(1 & $is_arg)"; + break; + + case 'div': + if (@$tokens[$expr_end] == 'by') { + $expr_end++; + $expr_arg = $tokens[$expr_end++]; + $expr = "!($is_arg % " . $this->_parse_var_props($expr_arg) . ")"; + } else { + $this->_syntax_error("expecting 'by' after 'div'", E_USER_ERROR, __FILE__, __LINE__); + } + break; + + default: + $this->_syntax_error("unknown 'is' expression - '$expr_type'", E_USER_ERROR, __FILE__, __LINE__); + break; + } + + if ($negate_expr) { + $expr = "!($expr)"; + } + + array_splice($tokens, 0, $expr_end, $expr); + + return $tokens; + } + + + /** + * Parse attribute string + * + * @param string $tag_args + * @return array + */ + function _parse_attrs($tag_args) + { + + /* Tokenize tag attributes. */ + preg_match_all('~(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+) + )+ | + [=] + ~x', $tag_args, $match); + $tokens = $match[0]; + + $attrs = array(); + /* Parse state: + 0 - expecting attribute name + 1 - expecting '=' + 2 - expecting attribute value (not '=') */ + $state = 0; + + foreach ($tokens as $token) { + switch ($state) { + case 0: + /* If the token is a valid identifier, we set attribute name + and go to state 1. */ + if (preg_match('~^\w+$~', $token)) { + $attr_name = $token; + $state = 1; + } else + $this->_syntax_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__); + break; + + case 1: + /* If the token is '=', then we go to state 2. */ + if ($token == '=') { + $state = 2; + } else + $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__); + break; + + case 2: + /* If token is not '=', we set the attribute value and go to + state 0. */ + if ($token != '=') { + /* We booleanize the token if it's a non-quoted possible + boolean value. */ + if (preg_match('~^(on|yes|true)$~', $token)) { + $token = 'true'; + } else if (preg_match('~^(off|no|false)$~', $token)) { + $token = 'false'; + } else if ($token == 'null') { + $token = 'null'; + } else if (preg_match('~^' . $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) { + /* treat integer literally */ + } else if (!preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . ')*$~', $token)) { + /* treat as a string, double-quote it escaping quotes */ + $token = '"'.addslashes($token).'"'; + } + + $attrs[$attr_name] = $token; + $state = 0; + } else + $this->_syntax_error("'=' cannot be an attribute value", E_USER_ERROR, __FILE__, __LINE__); + break; + } + $last_token = $token; + } + + if($state != 0) { + if($state == 1) { + $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__); + } else { + $this->_syntax_error("missing attribute value", E_USER_ERROR, __FILE__, __LINE__); + } + } + + $this->_parse_vars_props($attrs); + + return $attrs; + } + + /** + * compile multiple variables and section properties tokens into + * PHP code + * + * @param array $tokens + */ + function _parse_vars_props(&$tokens) + { + foreach($tokens as $key => $val) { + $tokens[$key] = $this->_parse_var_props($val); + } + } + + /** + * compile single variable and section properties token into + * PHP code + * + * @param string $val + * @param string $tag_attrs + * @return string + */ + function _parse_var_props($val) + { + $val = trim($val); + + if(preg_match('~^(' . $this->_obj_call_regexp . '|' . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', $val, $match)) { + // $ variable or object + $return = $this->_parse_var($match[1]); + $modifiers = $match[2]; + if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) { + $_default_mod_string = implode('|',(array)$this->default_modifiers); + $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers; + } + $this->_parse_modifiers($return, $modifiers); + return $return; + } elseif (preg_match('~^' . $this->_db_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { + // double quoted text + preg_match('~^(' . $this->_db_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match); + $return = $this->_expand_quoted_text($match[1]); + if($match[2] != '') { + $this->_parse_modifiers($return, $match[2]); + } + return $return; + } + elseif(preg_match('~^' . $this->_num_const_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { + // numerical constant + preg_match('~^(' . $this->_num_const_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match); + if($match[2] != '') { + $this->_parse_modifiers($match[1], $match[2]); + return $match[1]; + } + } + elseif(preg_match('~^' . $this->_si_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { + // single quoted text + preg_match('~^(' . $this->_si_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match); + if($match[2] != '') { + $this->_parse_modifiers($match[1], $match[2]); + return $match[1]; + } + } + elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { + // config var + return $this->_parse_conf_var($val); + } + elseif(preg_match('~^' . $this->_svar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) { + // section var + return $this->_parse_section_prop($val); + } + elseif(!in_array($val, $this->_permitted_tokens) && !is_numeric($val)) { + // literal string + return $this->_expand_quoted_text('"' . strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"'); + } + return $val; + } + + /** + * expand quoted text with embedded variables + * + * @param string $var_expr + * @return string + */ + function _expand_quoted_text($var_expr) + { + // if contains unescaped $, expand it + if(preg_match_all('~(?:\`(?_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . ')*\`)|(?:(?_parse_var(str_replace('`','',$_var)) . ')."'; + } + $var_expr = strtr($var_expr, $_replace); + $_return = preg_replace('~\.""|(?_dvar_math_regexp.'|'.$this->_qstr_regexp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE); + + if(count($_math_vars) > 1) { + $_first_var = ""; + $_complete_var = ""; + $_output = ""; + // simple check if there is any math, to stop recursion (due to modifiers with "xx % yy" as parameter) + foreach($_math_vars as $_k => $_math_var) { + $_math_var = $_math_vars[$_k]; + + if(!empty($_math_var) || is_numeric($_math_var)) { + // hit a math operator, so process the stuff which came before it + if(preg_match('~^' . $this->_dvar_math_regexp . '$~', $_math_var)) { + $_has_math = true; + if(!empty($_complete_var) || is_numeric($_complete_var)) { + $_output .= $this->_parse_var($_complete_var); + } + + // just output the math operator to php + $_output .= $_math_var; + + if(empty($_first_var)) + $_first_var = $_complete_var; + + $_complete_var = ""; + } else { + $_complete_var .= $_math_var; + } + } + } + if($_has_math) { + if(!empty($_complete_var) || is_numeric($_complete_var)) + $_output .= $this->_parse_var($_complete_var); + + // get the modifiers working (only the last var from math + modifier is left) + $var_expr = $_complete_var; + } + } + + // prevent cutting of first digit in the number (we _definitly_ got a number if the first char is a digit) + if(is_numeric(substr($var_expr, 0, 1))) + $_var_ref = $var_expr; + else + $_var_ref = substr($var_expr, 1); + + if(!$_has_math) { + + // get [foo] and .foo and ->foo and (...) pieces + preg_match_all('~(?:^\w+)|' . $this->_obj_params_regexp . '|(?:' . $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', $_var_ref, $match); + + $_indexes = $match[0]; + $_var_name = array_shift($_indexes); + + /* Handle $smarty.* variable references as a special case. */ + if ($_var_name == 'smarty') { + /* + * If the reference could be compiled, use the compiled output; + * otherwise, fall back on the $smarty variable generated at + * run-time. + */ + if (($smarty_ref = $this->_compile_smarty_ref($_indexes)) !== null) { + $_output = $smarty_ref; + } else { + $_var_name = substr(array_shift($_indexes), 1); + $_output = "\$this->_smarty_vars['$_var_name']"; + } + } elseif(is_numeric($_var_name) && is_numeric(substr($var_expr, 0, 1))) { + // because . is the operator for accessing arrays thru inidizes we need to put it together again for floating point numbers + if(count($_indexes) > 0) + { + $_var_name .= implode("", $_indexes); + $_indexes = array(); + } + $_output = $_var_name; + } else { + $_output = "\$this->_tpl_vars['$_var_name']"; + } + + foreach ($_indexes as $_index) { + if (substr($_index, 0, 1) == '[') { + $_index = substr($_index, 1, -1); + if (is_numeric($_index)) { + $_output .= "[$_index]"; + } elseif (substr($_index, 0, 1) == '$') { + if (strpos($_index, '.') !== false) { + $_output .= '[' . $this->_parse_var($_index) . ']'; + } else { + $_output .= "[\$this->_tpl_vars['" . substr($_index, 1) . "']]"; + } + } else { + $_var_parts = explode('.', $_index); + $_var_section = $_var_parts[0]; + $_var_section_prop = isset($_var_parts[1]) ? $_var_parts[1] : 'index'; + $_output .= "[\$this->_sections['$_var_section']['$_var_section_prop']]"; + } + } else if (substr($_index, 0, 1) == '.') { + if (substr($_index, 1, 1) == '$') + $_output .= "[\$this->_tpl_vars['" . substr($_index, 2) . "']]"; + else + $_output .= "['" . substr($_index, 1) . "']"; + } else if (substr($_index,0,2) == '->') { + if(substr($_index,2,2) == '__') { + $this->_syntax_error('call to internal object members is not allowed', E_USER_ERROR, __FILE__, __LINE__); + } elseif($this->security && substr($_index, 2, 1) == '_') { + $this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__); + } elseif (substr($_index, 2, 1) == '$') { + if ($this->security) { + $this->_syntax_error('(secure) call to dynamic object member is not allowed', E_USER_ERROR, __FILE__, __LINE__); + } else { + $_output .= '->{(($_var=$this->_tpl_vars[\''.substr($_index,3).'\']) && substr($_var,0,2)!=\'__\') ? $_var : $this->trigger_error("cannot access property \\"$_var\\"")}'; + } + } else { + $_output .= $_index; + } + } elseif (substr($_index, 0, 1) == '(') { + $_index = $this->_parse_parenth_args($_index); + $_output .= $_index; + } else { + $_output .= $_index; + } + } + } + + return $_output; + } + + /** + * parse arguments in function call parenthesis + * + * @param string $parenth_args + * @return string + */ + function _parse_parenth_args($parenth_args) + { + preg_match_all('~' . $this->_param_regexp . '~',$parenth_args, $match); + $orig_vals = $match = $match[0]; + $this->_parse_vars_props($match); + $replace = array(); + for ($i = 0, $count = count($match); $i < $count; $i++) { + $replace[$orig_vals[$i]] = $match[$i]; + } + return strtr($parenth_args, $replace); + } + + /** + * parse configuration variable expression into PHP code + * + * @param string $conf_var_expr + */ + function _parse_conf_var($conf_var_expr) + { + $parts = explode('|', $conf_var_expr, 2); + $var_ref = $parts[0]; + $modifiers = isset($parts[1]) ? $parts[1] : ''; + + $var_name = substr($var_ref, 1, -1); + + $output = "\$this->_config[0]['vars']['$var_name']"; + + $this->_parse_modifiers($output, $modifiers); + + return $output; + } + + /** + * parse section property expression into PHP code + * + * @param string $section_prop_expr + * @return string + */ + function _parse_section_prop($section_prop_expr) + { + $parts = explode('|', $section_prop_expr, 2); + $var_ref = $parts[0]; + $modifiers = isset($parts[1]) ? $parts[1] : ''; + + preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match); + $section_name = $match[1]; + $prop_name = $match[2]; + + $output = "\$this->_sections['$section_name']['$prop_name']"; + + $this->_parse_modifiers($output, $modifiers); + + return $output; + } + + + /** + * parse modifier chain into PHP code + * + * sets $output to parsed modified chain + * @param string $output + * @param string $modifier_string + */ + function _parse_modifiers(&$output, $modifier_string) + { + preg_match_all('~\|(@?\w+)((?>:(?:'. $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match); + list(, $_modifiers, $modifier_arg_strings) = $_match; + + for ($_i = 0, $_for_max = count($_modifiers); $_i < $_for_max; $_i++) { + $_modifier_name = $_modifiers[$_i]; + + if($_modifier_name == 'smarty') { + // skip smarty modifier + continue; + } + + preg_match_all('~:(' . $this->_qstr_regexp . '|[^:]+)~', $modifier_arg_strings[$_i], $_match); + $_modifier_args = $_match[1]; + + if (substr($_modifier_name, 0, 1) == '@') { + $_map_array = false; + $_modifier_name = substr($_modifier_name, 1); + } else { + $_map_array = true; + } + + if (empty($this->_plugins['modifier'][$_modifier_name]) + && !$this->_get_plugin_filepath('modifier', $_modifier_name) + && function_exists($_modifier_name)) { + if ($this->security && !in_array($_modifier_name, $this->security_settings['MODIFIER_FUNCS'])) { + $this->_trigger_fatal_error("[plugin] (secure mode) modifier '$_modifier_name' is not allowed" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__); + } else { + $this->_plugins['modifier'][$_modifier_name] = array($_modifier_name, null, null, false); + } + } + $this->_add_plugin('modifier', $_modifier_name); + + $this->_parse_vars_props($_modifier_args); + + if($_modifier_name == 'default') { + // supress notifications of default modifier vars and args + if(substr($output, 0, 1) == '$') { + $output = '@' . $output; + } + if(isset($_modifier_args[0]) && substr($_modifier_args[0], 0, 1) == '$') { + $_modifier_args[0] = '@' . $_modifier_args[0]; + } + } + if (count($_modifier_args) > 0) + $_modifier_args = ', '.implode(', ', $_modifier_args); + else + $_modifier_args = ''; + + if ($_map_array) { + $output = "((is_array(\$_tmp=$output)) ? \$this->_run_mod_handler('$_modifier_name', true, \$_tmp$_modifier_args) : " . $this->_compile_plugin_call('modifier', $_modifier_name) . "(\$_tmp$_modifier_args))"; + + } else { + + $output = $this->_compile_plugin_call('modifier', $_modifier_name)."($output$_modifier_args)"; + + } + } + } + + + /** + * add plugin + * + * @param string $type + * @param string $name + * @param boolean? $delayed_loading + */ + function _add_plugin($type, $name, $delayed_loading = null) + { + if (!isset($this->_plugin_info[$type])) { + $this->_plugin_info[$type] = array(); + } + if (!isset($this->_plugin_info[$type][$name])) { + $this->_plugin_info[$type][$name] = array($this->_current_file, + $this->_current_line_no, + $delayed_loading); + } + } + + + /** + * Compiles references of type $smarty.foo + * + * @param string $indexes + * @return string + */ + function _compile_smarty_ref(&$indexes) + { + /* Extract the reference name. */ + $_ref = substr($indexes[0], 1); + foreach($indexes as $_index_no=>$_index) { + if (substr($_index, 0, 1) != '.' && $_index_no<2 || !preg_match('~^(\.|\[|->)~', $_index)) { + $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__); + } + } + + switch ($_ref) { + case 'now': + $compiled_ref = 'time()'; + $_max_index = 1; + break; + + case 'foreach': + array_shift($indexes); + $_var = $this->_parse_var_props(substr($indexes[0], 1)); + $_propname = substr($indexes[1], 1); + $_max_index = 1; + switch ($_propname) { + case 'index': + array_shift($indexes); + $compiled_ref = "(\$this->_foreach[$_var]['iteration']-1)"; + break; + + case 'first': + array_shift($indexes); + $compiled_ref = "(\$this->_foreach[$_var]['iteration'] <= 1)"; + break; + + case 'last': + array_shift($indexes); + $compiled_ref = "(\$this->_foreach[$_var]['iteration'] == \$this->_foreach[$_var]['total'])"; + break; + + case 'show': + array_shift($indexes); + $compiled_ref = "(\$this->_foreach[$_var]['total'] > 0)"; + break; + + default: + unset($_max_index); + $compiled_ref = "\$this->_foreach[$_var]"; + } + break; + + case 'section': + array_shift($indexes); + $_var = $this->_parse_var_props(substr($indexes[0], 1)); + $compiled_ref = "\$this->_sections[$_var]"; + break; + + case 'get': + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { + $this->_syntax_error("(secure mode) super global access not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + $compiled_ref = "\$_GET"; + break; + + case 'post': + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { + $this->_syntax_error("(secure mode) super global access not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + $compiled_ref = "\$_POST"; + break; + + case 'cookies': + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { + $this->_syntax_error("(secure mode) super global access not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + $compiled_ref = "\$_COOKIE"; + break; + + case 'env': + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { + $this->_syntax_error("(secure mode) super global access not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + $compiled_ref = "\$_ENV"; + break; + + case 'server': + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { + $this->_syntax_error("(secure mode) super global access not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + $compiled_ref = "\$_SERVER"; + break; + + case 'session': + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { + $this->_syntax_error("(secure mode) super global access not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + $compiled_ref = "\$_SESSION"; + break; + + /* + * These cases are handled either at run-time or elsewhere in the + * compiler. + */ + case 'request': + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) { + $this->_syntax_error("(secure mode) super global access not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + if ($this->request_use_auto_globals) { + $compiled_ref = "\$_REQUEST"; + break; + } else { + $this->_init_smarty_vars = true; + } + return null; + + case 'capture': + return null; + + case 'template': + $compiled_ref = "'" . addslashes($this->_current_file) . "'"; + $_max_index = 1; + break; + + case 'version': + $compiled_ref = "'$this->_version'"; + $_max_index = 1; + break; + + case 'const': + if ($this->security && !$this->security_settings['ALLOW_CONSTANTS']) { + $this->_syntax_error("(secure mode) constants not permitted", + E_USER_WARNING, __FILE__, __LINE__); + return; + } + array_shift($indexes); + if (preg_match('!^\.\w+$!', $indexes[0])) { + $compiled_ref = '@' . substr($indexes[0], 1); + } else { + $_val = $this->_parse_var_props(substr($indexes[0], 1)); + $compiled_ref = '@constant(' . $_val . ')'; + } + $_max_index = 1; + break; + + case 'config': + $compiled_ref = "\$this->_config[0]['vars']"; + $_max_index = 3; + break; + + case 'ldelim': + $compiled_ref = "'$this->left_delimiter'"; + break; + + case 'rdelim': + $compiled_ref = "'$this->right_delimiter'"; + break; + + default: + $this->_syntax_error('$smarty.' . $_ref . ' is an unknown reference', E_USER_ERROR, __FILE__, __LINE__); + break; + } + + if (isset($_max_index) && count($indexes) > $_max_index) { + $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__); + } + + array_shift($indexes); + return $compiled_ref; + } + + /** + * compiles call to plugin of type $type with name $name + * returns a string containing the function-name or method call + * without the paramter-list that would have follow to make the + * call valid php-syntax + * + * @param string $type + * @param string $name + * @return string + */ + function _compile_plugin_call($type, $name) { + if (isset($this->_plugins[$type][$name])) { + /* plugin loaded */ + if (is_array($this->_plugins[$type][$name][0])) { + return ((is_object($this->_plugins[$type][$name][0][0])) ? + "\$this->_plugins['$type']['$name'][0][0]->" /* method callback */ + : (string)($this->_plugins[$type][$name][0][0]).'::' /* class callback */ + ). $this->_plugins[$type][$name][0][1]; + + } else { + /* function callback */ + return $this->_plugins[$type][$name][0]; + + } + } else { + /* plugin not loaded -> auto-loadable-plugin */ + return 'smarty_'.$type.'_'.$name; + + } + } + + /** + * load pre- and post-filters + */ + function _load_filters() + { + if (count($this->_plugins['prefilter']) > 0) { + foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) { + if ($prefilter === false) { + unset($this->_plugins['prefilter'][$filter_name]); + $_params = array('plugins' => array(array('prefilter', $filter_name, null, null, false))); + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); + smarty_core_load_plugins($_params, $this); + } + } + } + if (count($this->_plugins['postfilter']) > 0) { + foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) { + if ($postfilter === false) { + unset($this->_plugins['postfilter'][$filter_name]); + $_params = array('plugins' => array(array('postfilter', $filter_name, null, null, false))); + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php'); + smarty_core_load_plugins($_params, $this); + } + } + } + } + + + /** + * Quote subpattern references + * + * @param string $string + * @return string + */ + function _quote_replace($string) + { + return strtr($string, array('\\' => '\\\\', '$' => '\\$')); + } + + /** + * display Smarty syntax error + * + * @param string $error_msg + * @param integer $error_type + * @param string $file + * @param integer $line + */ + function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) + { + $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type); + } + + + /** + * check if the compilation changes from cacheable to + * non-cacheable state with the beginning of the current + * plugin. return php-code to reflect the transition. + * @return string + */ + function _push_cacheable_state($type, $name) { + $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4]; + if ($_cacheable + || 0<$this->_cacheable_state++) return ''; + if (!isset($this->_cache_serial)) $this->_cache_serial = md5(uniqid('Smarty')); + $_ret = 'if ($this->caching && !$this->_cache_including): echo \'{nocache:' + . $this->_cache_serial . '#' . $this->_nocache_count + . '}\'; endif;'; + return $_ret; + } + + + /** + * check if the compilation changes from non-cacheable to + * cacheable state with the end of the current plugin return + * php-code to reflect the transition. + * @return string + */ + function _pop_cacheable_state($type, $name) { + $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4]; + if ($_cacheable + || --$this->_cacheable_state>0) return ''; + return 'if ($this->caching && !$this->_cache_including): echo \'{/nocache:' + . $this->_cache_serial . '#' . ($this->_nocache_count++) + . '}\'; endif;'; + } + + + /** + * push opening tag-name, file-name and line-number on the tag-stack + * @param string the opening tag's name + */ + function _push_tag($open_tag) + { + array_push($this->_tag_stack, array($open_tag, $this->_current_line_no)); + } + + /** + * pop closing tag-name + * raise an error if this stack-top doesn't match with the closing tag + * @param string the closing tag's name + * @return string the opening tag's name + */ + function _pop_tag($close_tag) + { + $message = ''; + if (count($this->_tag_stack)>0) { + list($_open_tag, $_line_no) = array_pop($this->_tag_stack); + if ($close_tag == $_open_tag) { + return $_open_tag; + } + if ($close_tag == 'if' && ($_open_tag == 'else' || $_open_tag == 'elseif' )) { + return $this->_pop_tag($close_tag); + } + if ($close_tag == 'section' && $_open_tag == 'sectionelse') { + $this->_pop_tag($close_tag); + return $_open_tag; + } + if ($close_tag == 'foreach' && $_open_tag == 'foreachelse') { + $this->_pop_tag($close_tag); + return $_open_tag; + } + if ($_open_tag == 'else' || $_open_tag == 'elseif') { + $_open_tag = 'if'; + } elseif ($_open_tag == 'sectionelse') { + $_open_tag = 'section'; + } elseif ($_open_tag == 'foreachelse') { + $_open_tag = 'foreach'; + } + $message = " expected {/$_open_tag} (opened line $_line_no)."; + } + $this->_syntax_error("mismatched tag {/$close_tag}.$message", + E_USER_ERROR, __FILE__, __LINE__); + } + +} + +/** + * compare to values by their string length + * + * @access private + * @param string $a + * @param string $b + * @return 0|-1|1 + */ +function _smarty_sort_length($a, $b) +{ + if($a == $b) + return 0; + + if(strlen($a) == strlen($b)) + return ($a > $b) ? -1 : 1; + + return (strlen($a) > strlen($b)) ? -1 : 1; +} + + +/* vim: set et: */ + +?> diff --git a/lib/Smarty/debug.tpl b/lib/Smarty/debug.tpl new file mode 100755 index 0000000..c05ef5d --- /dev/null +++ b/lib/Smarty/debug.tpl @@ -0,0 +1,157 @@ +{* Smarty *} +{* debug.tpl, last updated version 2.1.0 *} +{assign_debug_info} +{capture assign=debug_output} + + + + Smarty Debug Console +{literal} + +{/literal} + + + +

      Smarty Debug Console

      + +

      included templates & config files (load time in seconds)

      + +
      +{section name=templates loop=$_debug_tpls} + {section name=indent loop=$_debug_tpls[templates].depth}   {/section} + + {$_debug_tpls[templates].filename|escape:html} + {if isset($_debug_tpls[templates].exec_time)} + + ({$_debug_tpls[templates].exec_time|string_format:"%.5f"}) + {if %templates.index% eq 0}(total){/if} + + {/if} +
      +{sectionelse} +

      no templates included

      +{/section} +
      + +

      assigned template variables

      + + + {section name=vars loop=$_debug_keys} + + + + {sectionelse} + + {/section} +
      {ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}{$_debug_vals[vars]|@debug_print_var}

      no template variables assigned

      + +

      assigned config file variables (outer template scope)

      + + + {section name=config_vars loop=$_debug_config_keys} + + + + {sectionelse} + + {/section} +
      {ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}{$_debug_config_vals[config_vars]|@debug_print_var}

      no config vars assigned

      + + +{/capture} +{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"} + {$debug_output} +{else} + +{/if} \ No newline at end of file diff --git a/lib/Smarty/internals/core.assemble_plugin_filepath.php b/lib/Smarty/internals/core.assemble_plugin_filepath.php new file mode 100755 index 0000000..22c0248 --- /dev/null +++ b/lib/Smarty/internals/core.assemble_plugin_filepath.php @@ -0,0 +1,65 @@ +_filepaths_cache[$_plugin_filename])) { + return $smarty->_filepaths_cache[$_plugin_filename]; + } + $_return = false; + + foreach ((array)$smarty->plugins_dir as $_plugin_dir) { + + $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; + + // see if path is relative + if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) { + $_relative_paths[] = $_plugin_dir; + // relative path, see if it is in the SMARTY_DIR + if (@is_readable(SMARTY_DIR . $_plugin_filepath)) { + $_return = SMARTY_DIR . $_plugin_filepath; + break; + } + } + // try relative to cwd (or absolute) + if (@is_readable($_plugin_filepath)) { + $_return = $_plugin_filepath; + break; + } + } + + if($_return === false) { + // still not found, try PHP include_path + if(isset($_relative_paths)) { + foreach ((array)$_relative_paths as $_plugin_dir) { + + $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename; + + $_params = array('file_path' => $_plugin_filepath); + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); + if(smarty_core_get_include_path($_params, $smarty)) { + $_return = $_params['new_file_path']; + break; + } + } + } + } + $smarty->_filepaths_cache[$_plugin_filename] = $_return; + return $_return; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.assign_smarty_interface.php b/lib/Smarty/internals/core.assign_smarty_interface.php new file mode 100755 index 0000000..7e65a73 --- /dev/null +++ b/lib/Smarty/internals/core.assign_smarty_interface.php @@ -0,0 +1,43 @@ + + * Name: assign_smarty_interface
      + * Purpose: assign the $smarty interface variable + * @param array Format: null + * @param Smarty + */ +function smarty_core_assign_smarty_interface($params, &$smarty) +{ + if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) { + return; + } + + $_globals_map = array('g' => 'HTTP_GET_VARS', + 'p' => 'HTTP_POST_VARS', + 'c' => 'HTTP_COOKIE_VARS', + 's' => 'HTTP_SERVER_VARS', + 'e' => 'HTTP_ENV_VARS'); + + $_smarty_vars_request = array(); + + foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) { + if (isset($_globals_map[$_c])) { + $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]); + } + } + $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']); + + $smarty->_smarty_vars['request'] = $_smarty_vars_request; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.create_dir_structure.php b/lib/Smarty/internals/core.create_dir_structure.php new file mode 100755 index 0000000..3eecc49 --- /dev/null +++ b/lib/Smarty/internals/core.create_dir_structure.php @@ -0,0 +1,79 @@ +_dir_perms) && !is_dir($_new_dir)) { + $smarty->trigger_error("problem creating directory '" . $_new_dir . "'"); + return false; + } + $_new_dir .= '/'; + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.display_debug_console.php b/lib/Smarty/internals/core.display_debug_console.php new file mode 100755 index 0000000..1a80f39 --- /dev/null +++ b/lib/Smarty/internals/core.display_debug_console.php @@ -0,0 +1,61 @@ + + * Name: display_debug_console
      + * Purpose: display the javascript debug console window + * @param array Format: null + * @param Smarty + */ +function smarty_core_display_debug_console($params, &$smarty) +{ + // we must force compile the debug template in case the environment + // changed between separate applications. + + if(empty($smarty->debug_tpl)) { + // set path to debug template from SMARTY_DIR + $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl'; + if($smarty->security && is_file($smarty->debug_tpl)) { + $smarty->secure_dir[] = realpath($smarty->debug_tpl); + } + $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl'; + } + + $_ldelim_orig = $smarty->left_delimiter; + $_rdelim_orig = $smarty->right_delimiter; + + $smarty->left_delimiter = '{'; + $smarty->right_delimiter = '}'; + + $_compile_id_orig = $smarty->_compile_id; + $smarty->_compile_id = null; + + $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl); + if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path)) + { + ob_start(); + $smarty->_include($_compile_path); + $_results = ob_get_contents(); + ob_end_clean(); + } else { + $_results = ''; + } + + $smarty->_compile_id = $_compile_id_orig; + + $smarty->left_delimiter = $_ldelim_orig; + $smarty->right_delimiter = $_rdelim_orig; + + return $_results; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.get_include_path.php b/lib/Smarty/internals/core.get_include_path.php new file mode 100755 index 0000000..4343241 --- /dev/null +++ b/lib/Smarty/internals/core.get_include_path.php @@ -0,0 +1,44 @@ + diff --git a/lib/Smarty/internals/core.get_microtime.php b/lib/Smarty/internals/core.get_microtime.php new file mode 100755 index 0000000..f1a28e0 --- /dev/null +++ b/lib/Smarty/internals/core.get_microtime.php @@ -0,0 +1,23 @@ + diff --git a/lib/Smarty/internals/core.get_php_resource.php b/lib/Smarty/internals/core.get_php_resource.php new file mode 100755 index 0000000..786d4e7 --- /dev/null +++ b/lib/Smarty/internals/core.get_php_resource.php @@ -0,0 +1,80 @@ +trusted_dir; + $smarty->_parse_resource_name($params, $smarty); + + /* + * Find out if the resource exists. + */ + + if ($params['resource_type'] == 'file') { + $_readable = false; + if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) { + $_readable = true; + } else { + // test for file in include_path + $_params = array('file_path' => $params['resource_name']); + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php'); + if(smarty_core_get_include_path($_params, $smarty)) { + $_include_path = $_params['new_file_path']; + $_readable = true; + } + } + } else if ($params['resource_type'] != 'file') { + $_template_source = null; + $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0]) + && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0], + array($params['resource_name'], &$_template_source, &$smarty)); + } + + /* + * Set the error function, depending on which class calls us. + */ + if (method_exists($smarty, '_syntax_error')) { + $_error_funcc = '_syntax_error'; + } else { + $_error_funcc = 'trigger_error'; + } + + if ($_readable) { + if ($smarty->security) { + require_once(SMARTY_CORE_DIR . 'core.is_trusted.php'); + if (!smarty_core_is_trusted($params, $smarty)) { + $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted'); + return false; + } + } + } else { + $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable'); + return false; + } + + if ($params['resource_type'] == 'file') { + $params['php_resource'] = $params['resource_name']; + } else { + $params['php_resource'] = $_template_source; + } + return true; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.is_secure.php b/lib/Smarty/internals/core.is_secure.php new file mode 100755 index 0000000..d54abd4 --- /dev/null +++ b/lib/Smarty/internals/core.is_secure.php @@ -0,0 +1,59 @@ +security || $smarty->security_settings['INCLUDE_ANY']) { + return true; + } + + if ($params['resource_type'] == 'file') { + $_rp = realpath($params['resource_name']); + if (isset($params['resource_base_path'])) { + foreach ((array)$params['resource_base_path'] as $curr_dir) { + if ( ($_cd = realpath($curr_dir)) !== false && + strncmp($_rp, $_cd, strlen($_cd)) == 0 && + substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) { + return true; + } + } + } + if (!empty($smarty->secure_dir)) { + foreach ((array)$smarty->secure_dir as $curr_dir) { + if ( ($_cd = realpath($curr_dir)) !== false) { + if($_cd == $_rp) { + return true; + } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 && + substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) { + return true; + } + } + } + } + } else { + // resource is not on local file system + return call_user_func_array( + $smarty->_plugins['resource'][$params['resource_type']][0][2], + array($params['resource_name'], &$smarty)); + } + + return false; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.is_trusted.php b/lib/Smarty/internals/core.is_trusted.php new file mode 100755 index 0000000..4299731 --- /dev/null +++ b/lib/Smarty/internals/core.is_trusted.php @@ -0,0 +1,47 @@ +trusted_dir)) { + $_rp = realpath($params['resource_name']); + foreach ((array)$smarty->trusted_dir as $curr_dir) { + if (!empty($curr_dir) && is_readable ($curr_dir)) { + $_cd = realpath($curr_dir); + if (strncmp($_rp, $_cd, strlen($_cd)) == 0 + && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) { + $_smarty_trusted = true; + break; + } + } + } + } + + } else { + // resource is not on local file system + $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3], + array($params['resource_name'], $smarty)); + } + + return $_smarty_trusted; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.load_plugins.php b/lib/Smarty/internals/core.load_plugins.php new file mode 100755 index 0000000..6db1dc5 --- /dev/null +++ b/lib/Smarty/internals/core.load_plugins.php @@ -0,0 +1,125 @@ +_plugins[$_type][$_name]; + + /* + * We do not load plugin more than once for each instance of Smarty. + * The following code checks for that. The plugin can also be + * registered dynamically at runtime, in which case template file + * and line number will be unknown, so we fill them in. + * + * The final element of the info array is a flag that indicates + * whether the dynamically registered plugin function has been + * checked for existence yet or not. + */ + if (isset($_plugin)) { + if (empty($_plugin[3])) { + if (!is_callable($_plugin[0])) { + $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__); + } else { + $_plugin[1] = $_tpl_file; + $_plugin[2] = $_tpl_line; + $_plugin[3] = true; + if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */ + } + } + continue; + } else if ($_type == 'insert') { + /* + * For backwards compatibility, we check for insert functions in + * the symbol table before trying to load them as a plugin. + */ + $_plugin_func = 'insert_' . $_name; + if (function_exists($_plugin_func)) { + $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false); + continue; + } + } + + $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name); + + if (! $_found = ($_plugin_file != false)) { + $_message = "could not load plugin file '$_type.$_name.php'\n"; + } + + /* + * If plugin file is found, it -must- provide the properly named + * plugin function. In case it doesn't, simply output the error and + * do not fall back on any other method. + */ + if ($_found) { + include_once $_plugin_file; + + $_plugin_func = 'smarty_' . $_type . '_' . $_name; + if (!function_exists($_plugin_func)) { + $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__); + continue; + } + } + /* + * In case of insert plugins, their code may be loaded later via + * 'script' attribute. + */ + else if ($_type == 'insert' && $_delayed_loading) { + $_plugin_func = 'smarty_' . $_type . '_' . $_name; + $_found = true; + } + + /* + * Plugin specific processing and error checking. + */ + if (!$_found) { + if ($_type == 'modifier') { + /* + * In case modifier falls back on using PHP functions + * directly, we only allow those specified in the security + * context. + */ + if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) { + $_message = "(secure mode) modifier '$_name' is not allowed"; + } else { + if (!function_exists($_name)) { + $_message = "modifier '$_name' is not implemented"; + } else { + $_plugin_func = $_name; + $_found = true; + } + } + } else if ($_type == 'function') { + /* + * This is a catch-all situation. + */ + $_message = "unknown tag - '$_name'"; + } + } + + if ($_found) { + $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true); + } else { + // output error + $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__); + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.load_resource_plugin.php b/lib/Smarty/internals/core.load_resource_plugin.php new file mode 100755 index 0000000..a7d37d1 --- /dev/null +++ b/lib/Smarty/internals/core.load_resource_plugin.php @@ -0,0 +1,74 @@ +_plugins['resource'][$params['type']]; + if (isset($_plugin)) { + if (!$_plugin[1] && count($_plugin[0])) { + $_plugin[1] = true; + foreach ($_plugin[0] as $_plugin_func) { + if (!is_callable($_plugin_func)) { + $_plugin[1] = false; + break; + } + } + } + + if (!$_plugin[1]) { + $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__); + } + + return; + } + + $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']); + $_found = ($_plugin_file != false); + + if ($_found) { /* + * If the plugin file is found, it -must- provide the properly named + * plugin functions. + */ + include_once($_plugin_file); + + /* + * Locate functions that we require the plugin to provide. + */ + $_resource_ops = array('source', 'timestamp', 'secure', 'trusted'); + $_resource_funcs = array(); + foreach ($_resource_ops as $_op) { + $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op; + if (!function_exists($_plugin_func)) { + $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__); + return; + } else { + $_resource_funcs[] = $_plugin_func; + } + } + + $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true); + } +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.process_cached_inserts.php b/lib/Smarty/internals/core.process_cached_inserts.php new file mode 100755 index 0000000..1d78edd --- /dev/null +++ b/lib/Smarty/internals/core.process_cached_inserts.php @@ -0,0 +1,71 @@ +_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis', + $params['results'], $match); + list($cached_inserts, $insert_args) = $match; + + for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) { + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $debug_start_time = smarty_core_get_microtime($_params, $smarty); + } + + $args = unserialize($insert_args[$i]); + $name = $args['name']; + + if (isset($args['script'])) { + $_params = array('resource_name' => $smarty->_dequote($args['script'])); + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); + if(!smarty_core_get_php_resource($_params, $smarty)) { + return false; + } + $resource_type = $_params['resource_type']; + $php_resource = $_params['php_resource']; + + + if ($resource_type == 'file') { + $smarty->_include($php_resource, true); + } else { + $smarty->_eval($php_resource); + } + } + + $function_name = $smarty->_plugins['insert'][$name][0]; + if (empty($args['assign'])) { + $replace = $function_name($args, $smarty); + } else { + $smarty->assign($args['assign'], $function_name($args, $smarty)); + $replace = ''; + } + + $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i])); + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $smarty->_smarty_debug_info[] = array('type' => 'insert', + 'filename' => 'insert_'.$name, + 'depth' => $smarty->_inclusion_depth, + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time); + } + } + + return $params['results']; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.process_compiled_include.php b/lib/Smarty/internals/core.process_compiled_include.php new file mode 100755 index 0000000..904d597 --- /dev/null +++ b/lib/Smarty/internals/core.process_compiled_include.php @@ -0,0 +1,37 @@ +_cache_including; + $smarty->_cache_including = true; + + $_return = $params['results']; + + foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) { + $smarty->_include($_include_file_path, true); + } + + foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) { + $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s', + array(&$smarty, '_process_compiled_include_callback'), + $_return); + } + $smarty->_cache_including = $_cache_including; + return $_return; +} + +?> diff --git a/lib/Smarty/internals/core.read_cache_file.php b/lib/Smarty/internals/core.read_cache_file.php new file mode 100755 index 0000000..c60e113 --- /dev/null +++ b/lib/Smarty/internals/core.read_cache_file.php @@ -0,0 +1,101 @@ +force_compile) { + // force compile enabled, always regenerate + return false; + } + + if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) { + list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']]; + return true; + } + + if (!empty($smarty->cache_handler_func)) { + // use cache_handler function + call_user_func_array($smarty->cache_handler_func, + array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null)); + } else { + // use local cache file + $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); + $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); + $params['results'] = $smarty->_read_file($_cache_file); + } + + if (empty($params['results'])) { + // nothing to parse (error?), regenerate cache + return false; + } + + $_contents = $params['results']; + $_info_start = strpos($_contents, "\n") + 1; + $_info_len = (int)substr($_contents, 0, $_info_start - 1); + $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len)); + $params['results'] = substr($_contents, $_info_start + $_info_len); + + if ($smarty->caching == 2 && isset ($_cache_info['expires'])){ + // caching by expiration time + if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) { + // cache expired, regenerate + return false; + } + } else { + // caching by lifetime + if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) { + // cache expired, regenerate + return false; + } + } + + if ($smarty->compile_check) { + $_params = array('get_source' => false, 'quiet'=>true); + foreach (array_keys($_cache_info['template']) as $_template_dep) { + $_params['resource_name'] = $_template_dep; + if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { + // template file has changed, regenerate cache + return false; + } + } + + if (isset($_cache_info['config'])) { + $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true); + foreach (array_keys($_cache_info['config']) as $_config_dep) { + $_params['resource_name'] = $_config_dep; + if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) { + // config file has changed, regenerate cache + return false; + } + } + } + } + + $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info); + + $smarty->_cache_info = $_cache_info; + return true; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.rm_auto.php b/lib/Smarty/internals/core.rm_auto.php new file mode 100755 index 0000000..b251f64 --- /dev/null +++ b/lib/Smarty/internals/core.rm_auto.php @@ -0,0 +1,71 @@ + $params['auto_base'], + 'level' => 0, + 'exp_time' => $params['exp_time'] + ); + require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); + $_res = smarty_core_rmdir($_params, $smarty); + } else { + $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']); + + if(isset($params['auto_source'])) { + if (isset($params['extensions'])) { + $_res = false; + foreach ((array)$params['extensions'] as $_extension) + $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']); + } else { + $_res = $smarty->_unlink($_tname, $params['exp_time']); + } + } elseif ($smarty->use_sub_dirs) { + $_params = array( + 'dirname' => $_tname, + 'level' => 1, + 'exp_time' => $params['exp_time'] + ); + require_once(SMARTY_CORE_DIR . 'core.rmdir.php'); + $_res = smarty_core_rmdir($_params, $smarty); + } else { + // remove matching file names + $_handle = opendir($params['auto_base']); + $_res = true; + while (false !== ($_filename = readdir($_handle))) { + if($_filename == '.' || $_filename == '..') { + continue; + } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) { + $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']); + } + } + } + } + + return $_res; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.rmdir.php b/lib/Smarty/internals/core.rmdir.php new file mode 100755 index 0000000..2166c44 --- /dev/null +++ b/lib/Smarty/internals/core.rmdir.php @@ -0,0 +1,54 @@ + keep root) + * WARNING: no tests, it will try to remove what you tell it! + * + * @param string $dirname + * @param integer $level + * @param integer $exp_time + * @return boolean + */ + +// $dirname, $level = 1, $exp_time = null + +function smarty_core_rmdir($params, &$smarty) +{ + if(!isset($params['level'])) { $params['level'] = 1; } + if(!isset($params['exp_time'])) { $params['exp_time'] = null; } + + if($_handle = @opendir($params['dirname'])) { + + while (false !== ($_entry = readdir($_handle))) { + if ($_entry != '.' && $_entry != '..') { + if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) { + $_params = array( + 'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry, + 'level' => $params['level'] + 1, + 'exp_time' => $params['exp_time'] + ); + smarty_core_rmdir($_params, $smarty); + } + else { + $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']); + } + } + } + closedir($_handle); + } + + if ($params['level']) { + return @rmdir($params['dirname']); + } + return (bool)$_handle; + +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.run_insert_handler.php b/lib/Smarty/internals/core.run_insert_handler.php new file mode 100755 index 0000000..71c3845 --- /dev/null +++ b/lib/Smarty/internals/core.run_insert_handler.php @@ -0,0 +1,71 @@ +debugging) { + $_params = array(); + $_debug_start_time = smarty_core_get_microtime($_params, $smarty); + } + + if ($smarty->caching) { + $_arg_string = serialize($params['args']); + $_name = $params['args']['name']; + if (!isset($smarty->_cache_info['insert_tags'][$_name])) { + $smarty->_cache_info['insert_tags'][$_name] = array('insert', + $_name, + $smarty->_plugins['insert'][$_name][1], + $smarty->_plugins['insert'][$_name][2], + !empty($params['args']['script']) ? true : false); + } + return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5; + } else { + if (isset($params['args']['script'])) { + $_params = array('resource_name' => $smarty->_dequote($params['args']['script'])); + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); + if(!smarty_core_get_php_resource($_params, $smarty)) { + return false; + } + + if ($_params['resource_type'] == 'file') { + $smarty->_include($_params['php_resource'], true); + } else { + $smarty->_eval($_params['php_resource']); + } + unset($params['args']['script']); + } + + $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0]; + $_content = $_funcname($params['args'], $smarty); + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $smarty->_smarty_debug_info[] = array('type' => 'insert', + 'filename' => 'insert_'.$params['args']['name'], + 'depth' => $smarty->_inclusion_depth, + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); + } + + if (!empty($params['args']["assign"])) { + $smarty->assign($params['args']["assign"], $_content); + } else { + return $_content; + } + } +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.smarty_include_php.php b/lib/Smarty/internals/core.smarty_include_php.php new file mode 100755 index 0000000..30c6e76 --- /dev/null +++ b/lib/Smarty/internals/core.smarty_include_php.php @@ -0,0 +1,50 @@ + $params['smarty_file']); + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php'); + smarty_core_get_php_resource($_params, $smarty); + $_smarty_resource_type = $_params['resource_type']; + $_smarty_php_resource = $_params['php_resource']; + + if (!empty($params['smarty_assign'])) { + ob_start(); + if ($_smarty_resource_type == 'file') { + $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); + } else { + $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); + } + $smarty->assign($params['smarty_assign'], ob_get_contents()); + ob_end_clean(); + } else { + if ($_smarty_resource_type == 'file') { + $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']); + } else { + $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']); + } + } +} + + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.write_cache_file.php b/lib/Smarty/internals/core.write_cache_file.php new file mode 100755 index 0000000..fa3cdd7 --- /dev/null +++ b/lib/Smarty/internals/core.write_cache_file.php @@ -0,0 +1,96 @@ +_cache_info['timestamp'] = time(); + if ($smarty->cache_lifetime > -1){ + // expiration set + $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime; + } else { + // cache will never expire + $smarty->_cache_info['expires'] = -1; + } + + // collapse nocache.../nocache-tags + if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) { + // remove everything between every pair of outermost noache.../nocache-tags + // and replace it by a single nocache-tag + // this new nocache-tag will be replaced by dynamic contents in + // smarty_core_process_compiled_includes() on a cache-read + + $match_count = count($match[0]); + $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE); + + $level = 0; + $j = 0; + for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) { + if ($results[$i] == $match[0][$j]) { + // nocache tag + if ($match[1][$j]) { // closing tag + $level--; + unset($results[$i]); + } else { // opening tag + if ($level++ > 0) unset($results[$i]); + } + $j++; + } elseif ($level > 0) { + unset($results[$i]); + } + } + $params['results'] = implode('', $results); + } + $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials; + + // prepend the cache header info into cache file + $_cache_info = serialize($smarty->_cache_info); + $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results']; + + if (!empty($smarty->cache_handler_func)) { + // use cache_handler function + call_user_func_array($smarty->cache_handler_func, + array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires'])); + } else { + // use local cache file + + if(!@is_writable($smarty->cache_dir)) { + // cache_dir not writable, see if it exists + if(!@is_dir($smarty->cache_dir)) { + $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); + return false; + } + $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR); + return false; + } + + $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']); + $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id); + $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true); + require_once(SMARTY_CORE_DIR . 'core.write_file.php'); + smarty_core_write_file($_params, $smarty); + return true; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.write_compiled_include.php b/lib/Smarty/internals/core.write_compiled_include.php new file mode 100755 index 0000000..c14adb5 --- /dev/null +++ b/lib/Smarty/internals/core.write_compiled_include.php @@ -0,0 +1,91 @@ +caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;'; + $_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;'; + + preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us', + $params['compiled_content'], $_match_source, PREG_SET_ORDER); + + // no nocache-parts found: done + if (count($_match_source)==0) return; + + // convert the matched php-code to functions + $_include_compiled = "_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n"; + $_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n"; + + $_compile_path = $params['include_file_path']; + + $smarty->_cache_serials[$_compile_path] = $params['cache_serial']; + $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>"; + + $_include_compiled .= $params['plugins_code']; + $_include_compiled .= "= 5.0) ? '_smarty' : 'this'; + for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) { + $_match =& $_match_source[$_i]; + $source = $_match[4]; + if ($this_varname == '_smarty') { + /* rename $this to $_smarty in the sourcecode */ + $tokens = token_get_all('\n"; + + $_params = array('filename' => $_compile_path, + 'contents' => $_include_compiled, 'create_dirs' => true); + + require_once(SMARTY_CORE_DIR . 'core.write_file.php'); + smarty_core_write_file($_params, $smarty); + return true; +} + + +?> diff --git a/lib/Smarty/internals/core.write_compiled_resource.php b/lib/Smarty/internals/core.write_compiled_resource.php new file mode 100755 index 0000000..b902eff --- /dev/null +++ b/lib/Smarty/internals/core.write_compiled_resource.php @@ -0,0 +1,35 @@ +compile_dir)) { + // compile_dir not writable, see if it exists + if(!@is_dir($smarty->compile_dir)) { + $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR); + return false; + } + $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR); + return false; + } + + $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true); + require_once(SMARTY_CORE_DIR . 'core.write_file.php'); + smarty_core_write_file($_params, $smarty); + return true; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/internals/core.write_file.php b/lib/Smarty/internals/core.write_file.php new file mode 100755 index 0000000..8a3a3b3 --- /dev/null +++ b/lib/Smarty/internals/core.write_file.php @@ -0,0 +1,54 @@ + $_dirname); + require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php'); + smarty_core_create_dir_structure($_params, $smarty); + } + + // write to tmp file, then rename it to avoid file locking race condition + $_tmp_file = tempnam($_dirname, 'wrt'); + + if (!($fd = @fopen($_tmp_file, 'wb'))) { + $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt'); + if (!($fd = @fopen($_tmp_file, 'wb'))) { + $smarty->trigger_error("problem writing temporary file '$_tmp_file'"); + return false; + } + } + + fwrite($fd, $params['contents']); + fclose($fd); + + if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) { + // On platforms and filesystems that cannot overwrite with rename() + // delete the file before renaming it -- because windows always suffers + // this, it is short-circuited to avoid the initial rename() attempt + @unlink($params['filename']); + @rename($_tmp_file, $params['filename']); + } + @chmod($params['filename'], $smarty->_file_perms); + + return true; +} + +/* vim: set expandtab: */ + +?> \ No newline at end of file diff --git a/lib/Smarty/plugins/block.textformat.php b/lib/Smarty/plugins/block.textformat.php new file mode 100755 index 0000000..8cd010a --- /dev/null +++ b/lib/Smarty/plugins/block.textformat.php @@ -0,0 +1,103 @@ + + * Name: textformat
      + * Purpose: format text a certain way with preset styles + * or custom wrap/indent settings
      + * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * @param array + *
      + * Params:   style: string (email)
      + *           indent: integer (0)
      + *           wrap: integer (80)
      + *           wrap_char string ("\n")
      + *           indent_char: string (" ")
      + *           wrap_boundary: boolean (true)
      + * 
      + * @author Monte Ohrt + * @param string contents of the block + * @param Smarty clever simulation of a method + * @return string string $content re-formatted + */ +function smarty_block_textformat($params, $content, &$smarty) +{ + if (is_null($content)) { + return; + } + + $style = null; + $indent = 0; + $indent_first = 0; + $indent_char = ' '; + $wrap = 80; + $wrap_char = "\n"; + $wrap_cut = false; + $assign = null; + + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'style': + case 'indent_char': + case 'wrap_char': + case 'assign': + $$_key = (string)$_val; + break; + + case 'indent': + case 'indent_first': + case 'wrap': + $$_key = (int)$_val; + break; + + case 'wrap_cut': + $$_key = (bool)$_val; + break; + + default: + $smarty->trigger_error("textformat: unknown attribute '$_key'"); + } + } + + if ($style == 'email') { + $wrap = 72; + } + + // split into paragraphs + $_paragraphs = preg_split('![\r\n][\r\n]!',$content); + $_output = ''; + + for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) { + if ($_paragraphs[$_x] == '') { + continue; + } + // convert mult. spaces & special chars to single space + $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]); + // indent first line + if($indent_first > 0) { + $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x]; + } + // wordwrap sentences + $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut); + // indent lines + if($indent > 0) { + $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]); + } + } + $_output = implode($wrap_char . $wrap_char, $_paragraphs); + + return $assign ? $smarty->assign($assign, $_output) : $_output; + +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/compiler.assign.php b/lib/Smarty/plugins/compiler.assign.php new file mode 100755 index 0000000..abef377 --- /dev/null +++ b/lib/Smarty/plugins/compiler.assign.php @@ -0,0 +1,40 @@ + + * Name: assign
      + * Purpose: assign a value to a template variable + * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign} + * (Smarty online manual) + * @author Monte Ohrt (initial author) + * @author messju mohr (conversion to compiler function) + * @param string containing var-attribute and value-attribute + * @param Smarty_Compiler + */ +function smarty_compiler_assign($tag_attrs, &$compiler) +{ + $_params = $compiler->_parse_attrs($tag_attrs); + + if (!isset($_params['var'])) { + $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING); + return; + } + + if (!isset($_params['value'])) { + $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING); + return; + } + + return "\$this->assign({$_params['var']}, {$_params['value']});"; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.assign_debug_info.php b/lib/Smarty/plugins/function.assign_debug_info.php new file mode 100755 index 0000000..6540498 --- /dev/null +++ b/lib/Smarty/plugins/function.assign_debug_info.php @@ -0,0 +1,40 @@ + + * Name: assign_debug_info
      + * Purpose: assign debug info to the template
      + * @author Monte Ohrt + * @param array unused in this plugin, this plugin uses {@link Smarty::$_config}, + * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info} + * @param Smarty + */ +function smarty_function_assign_debug_info($params, &$smarty) +{ + $assigned_vars = $smarty->_tpl_vars; + ksort($assigned_vars); + if (@is_array($smarty->_config[0])) { + $config_vars = $smarty->_config[0]; + ksort($config_vars); + $smarty->assign("_debug_config_keys", array_keys($config_vars)); + $smarty->assign("_debug_config_vals", array_values($config_vars)); + } + + $included_templates = $smarty->_smarty_debug_info; + + $smarty->assign("_debug_keys", array_keys($assigned_vars)); + $smarty->assign("_debug_vals", array_values($assigned_vars)); + + $smarty->assign("_debug_tpls", $included_templates); +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.config_load.php b/lib/Smarty/plugins/function.config_load.php new file mode 100755 index 0000000..db89f63 --- /dev/null +++ b/lib/Smarty/plugins/function.config_load.php @@ -0,0 +1,142 @@ + + * Name: config_load
      + * Purpose: load config file vars + * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load} + * (Smarty online manual) + * @author Monte Ohrt + * @author messju mohr (added use of resources) + * @param array Format: + *
      + * array('file' => required config file name,
      + *       'section' => optional config file section to load
      + *       'scope' => local/parent/global
      + *       'global' => overrides scope, setting to parent if true)
      + * 
      + * @param Smarty + */ +function smarty_function_config_load($params, &$smarty) +{ + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $_debug_start_time = smarty_core_get_microtime($_params, $smarty); + } + + $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null; + $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null; + $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global'; + $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false; + + if (!isset($_file) || strlen($_file) == 0) { + $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__); + } + + if (isset($_scope)) { + if ($_scope != 'local' && + $_scope != 'parent' && + $_scope != 'global') { + $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__); + } + } else { + if ($_global) { + $_scope = 'parent'; + } else { + $_scope = 'local'; + } + } + + $_params = array('resource_name' => $_file, + 'resource_base_path' => $smarty->config_dir, + 'get_source' => false); + $smarty->_parse_resource_name($_params); + $_file_path = $_params['resource_type'] . ':' . $_params['resource_name']; + if (isset($_section)) + $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section); + else + $_compile_file = $smarty->_get_compile_path($_file_path); + + if($smarty->force_compile || !file_exists($_compile_file)) { + $_compile = true; + } elseif ($smarty->compile_check) { + $_params = array('resource_name' => $_file, + 'resource_base_path' => $smarty->config_dir, + 'get_source' => false); + $_compile = $smarty->_fetch_resource_info($_params) && + $_params['resource_timestamp'] > filemtime($_compile_file); + } else { + $_compile = false; + } + + if($_compile) { + // compile config file + if(!is_object($smarty->_conf_obj)) { + require_once SMARTY_DIR . $smarty->config_class . '.class.php'; + $smarty->_conf_obj = new $smarty->config_class(); + $smarty->_conf_obj->overwrite = $smarty->config_overwrite; + $smarty->_conf_obj->booleanize = $smarty->config_booleanize; + $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden; + $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines; + } + + $_params = array('resource_name' => $_file, + 'resource_base_path' => $smarty->config_dir, + $_params['get_source'] = true); + if (!$smarty->_fetch_resource_info($_params)) { + return; + } + $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']); + $_config_vars = array_merge($smarty->_conf_obj->get($_file), + $smarty->_conf_obj->get($_file, $_section)); + if(function_exists('var_export')) { + $_output = ''; + } else { + $_output = ''\\\'', '\\'=>'\\\\')) . '\'); ?>'; + } + $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp'])); + require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php'); + smarty_core_write_compiled_resource($_params, $smarty); + } else { + include($_compile_file); + } + + if ($smarty->caching) { + $smarty->_cache_info['config'][$_file] = true; + } + + $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars); + $smarty->_config[0]['files'][$_file] = true; + + if ($_scope == 'parent') { + $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars); + $smarty->_config[1]['files'][$_file] = true; + } else if ($_scope == 'global') { + for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) { + $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars); + $smarty->_config[$i]['files'][$_file] = true; + } + } + + if ($smarty->debugging) { + $_params = array(); + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php'); + $smarty->_smarty_debug_info[] = array('type' => 'config', + 'filename' => $_file.' ['.$_section.'] '.$_scope, + 'depth' => $smarty->_inclusion_depth, + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time); + } + +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.counter.php b/lib/Smarty/plugins/function.counter.php new file mode 100755 index 0000000..1f26db5 --- /dev/null +++ b/lib/Smarty/plugins/function.counter.php @@ -0,0 +1,80 @@ + + * Name: counter
      + * Purpose: print out a counter value + * @author Monte Ohrt + * @link http://smarty.php.net/manual/en/language.function.counter.php {counter} + * (Smarty online manual) + * @param array parameters + * @param Smarty + * @return string|null + */ +function smarty_function_counter($params, &$smarty) +{ + static $counters = array(); + + $name = (isset($params['name'])) ? $params['name'] : 'default'; + if (!isset($counters[$name])) { + $counters[$name] = array( + 'start'=>1, + 'skip'=>1, + 'direction'=>'up', + 'count'=>1 + ); + } + $counter =& $counters[$name]; + + if (isset($params['start'])) { + $counter['start'] = $counter['count'] = (int)$params['start']; + } + + if (!empty($params['assign'])) { + $counter['assign'] = $params['assign']; + } + + if (isset($counter['assign'])) { + $smarty->assign($counter['assign'], $counter['count']); + } + + if (isset($params['print'])) { + $print = (bool)$params['print']; + } else { + $print = empty($counter['assign']); + } + + if ($print) { + $retval = $counter['count']; + } else { + $retval = null; + } + + if (isset($params['skip'])) { + $counter['skip'] = $params['skip']; + } + + if (isset($params['direction'])) { + $counter['direction'] = $params['direction']; + } + + if ($counter['direction'] == "down") + $counter['count'] -= $counter['skip']; + else + $counter['count'] += $counter['skip']; + + return $retval; + +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.cycle.php b/lib/Smarty/plugins/function.cycle.php new file mode 100755 index 0000000..80378b7 --- /dev/null +++ b/lib/Smarty/plugins/function.cycle.php @@ -0,0 +1,106 @@ + + * Name: cycle
      + * Date: May 3, 2002
      + * Purpose: cycle through given values
      + * Input: + * - name = name of cycle (optional) + * - values = comma separated list of values to cycle, + * or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset = boolean - resets given var to true + * - print = boolean - print var or not. default is true + * - advance = boolean - whether or not to advance the cycle + * - delimiter = the value delimiter, default is "," + * - assign = boolean, assigns to template var instead of + * printed. + * + * Examples:
      + *
      + * {cycle values="#eeeeee,#d0d0d0d"}
      + * {cycle name=row values="one,two,three" reset=true}
      + * {cycle name=row}
      + * 
      + * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle} + * (Smarty online manual) + * @author Monte Ohrt + * @author credit to Mark Priatel + * @author credit to Gerard + * @author credit to Jason Sweat + * @version 1.3 + * @param array + * @param Smarty + * @return string|null + */ +function smarty_function_cycle($params, &$smarty) +{ + static $cycle_vars; + + $name = (empty($params['name'])) ? 'default' : $params['name']; + $print = (isset($params['print'])) ? (bool)$params['print'] : true; + $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; + $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; + + if (!in_array('values', array_keys($params))) { + if(!isset($cycle_vars[$name]['values'])) { + $smarty->trigger_error("cycle: missing 'values' parameter"); + return; + } + } else { + if(isset($cycle_vars[$name]['values']) + && $cycle_vars[$name]['values'] != $params['values'] ) { + $cycle_vars[$name]['index'] = 0; + } + $cycle_vars[$name]['values'] = $params['values']; + } + + if (isset($params['delimiter'])) { + $cycle_vars[$name]['delimiter'] = $params['delimiter']; + } elseif (!isset($cycle_vars[$name]['delimiter'])) { + $cycle_vars[$name]['delimiter'] = ','; + } + + if(is_array($cycle_vars[$name]['values'])) { + $cycle_array = $cycle_vars[$name]['values']; + } else { + $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); + } + + if(!isset($cycle_vars[$name]['index']) || $reset ) { + $cycle_vars[$name]['index'] = 0; + } + + if (isset($params['assign'])) { + $print = false; + $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); + } + + if($print) { + $retval = $cycle_array[$cycle_vars[$name]['index']]; + } else { + $retval = null; + } + + if($advance) { + if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { + $cycle_vars[$name]['index'] = 0; + } else { + $cycle_vars[$name]['index']++; + } + } + + return $retval; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.debug.php b/lib/Smarty/plugins/function.debug.php new file mode 100755 index 0000000..4345230 --- /dev/null +++ b/lib/Smarty/plugins/function.debug.php @@ -0,0 +1,35 @@ + + * Name: debug
      + * Date: July 1, 2002
      + * Purpose: popup debug window + * @link http://smarty.php.net/manual/en/language.function.debug.php {debug} + * (Smarty online manual) + * @author Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string output from {@link Smarty::_generate_debug_output()} + */ +function smarty_function_debug($params, &$smarty) +{ + if (isset($params['output'])) { + $smarty->assign('_smarty_debug_output', $params['output']); + } + require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php'); + return smarty_core_display_debug_console(null, $smarty); +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.eval.php b/lib/Smarty/plugins/function.eval.php new file mode 100755 index 0000000..ff0472d --- /dev/null +++ b/lib/Smarty/plugins/function.eval.php @@ -0,0 +1,49 @@ + + * Name: eval
      + * Purpose: evaluate a template variable as a template
      + * @link http://smarty.php.net/manual/en/language.function.eval.php {eval} + * (Smarty online manual) + * @author Monte Ohrt + * @param array + * @param Smarty + */ +function smarty_function_eval($params, &$smarty) +{ + + if (!isset($params['var'])) { + $smarty->trigger_error("eval: missing 'var' parameter"); + return; + } + + if($params['var'] == '') { + return; + } + + $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled); + + ob_start(); + $smarty->_eval('?>' . $_var_compiled); + $_contents = ob_get_contents(); + ob_end_clean(); + + if (!empty($params['assign'])) { + $smarty->assign($params['assign'], $_contents); + } else { + return $_contents; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.fetch.php b/lib/Smarty/plugins/function.fetch.php new file mode 100755 index 0000000..d72c7b1 --- /dev/null +++ b/lib/Smarty/plugins/function.fetch.php @@ -0,0 +1,221 @@ + + * Name: fetch
      + * Purpose: fetch file, web or ftp data and display results + * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch} + * (Smarty online manual) + * @author Monte Ohrt + * @param array + * @param Smarty + * @return string|null if the assign parameter is passed, Smarty assigns the + * result to a template variable + */ +function smarty_function_fetch($params, &$smarty) +{ + if (empty($params['file'])) { + $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty"); + return; + } + + $content = ''; + if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) { + $_params = array('resource_type' => 'file', 'resource_name' => $params['file']); + require_once(SMARTY_CORE_DIR . 'core.is_secure.php'); + if(!smarty_core_is_secure($_params, $smarty)) { + $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed'); + return; + } + + // fetch the file + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\''); + return; + } + } else { + // not a local file + if(preg_match('!^http://!i',$params['file'])) { + // http fetch + if($uri_parts = parse_url($params['file'])) { + // set defaults + $host = $server_name = $uri_parts['host']; + $timeout = 30; + $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; + $agent = "Smarty Template Engine ".$smarty->_version; + $referer = ""; + $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; + $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; + $_is_proxy = false; + if(empty($uri_parts['port'])) { + $port = 80; + } else { + $port = $uri_parts['port']; + } + if(!empty($uri_parts['user'])) { + $user = $uri_parts['user']; + } + if(!empty($uri_parts['pass'])) { + $pass = $uri_parts['pass']; + } + // loop through parameters, setup headers + foreach($params as $param_key => $param_value) { + switch($param_key) { + case "file": + case "assign": + case "assign_headers": + break; + case "user": + if(!empty($param_value)) { + $user = $param_value; + } + break; + case "pass": + if(!empty($param_value)) { + $pass = $param_value; + } + break; + case "accept": + if(!empty($param_value)) { + $accept = $param_value; + } + break; + case "header": + if(!empty($param_value)) { + if(!preg_match('![\w\d-]+: .+!',$param_value)) { + $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'"); + return; + } else { + $extra_headers[] = $param_value; + } + } + break; + case "proxy_host": + if(!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case "proxy_port": + if(!preg_match('!\D!', $param_value)) { + $proxy_port = (int) $param_value; + } else { + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); + return; + } + break; + case "agent": + if(!empty($param_value)) { + $agent = $param_value; + } + break; + case "referer": + if(!empty($param_value)) { + $referer = $param_value; + } + break; + case "timeout": + if(!preg_match('!\D!', $param_value)) { + $timeout = (int) $param_value; + } else { + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'"); + return; + } + break; + default: + $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'"); + return; + } + } + if(!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); + } else { + $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); + } + + if(!$fp) { + $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)"); + return; + } else { + if($_is_proxy) { + fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if(!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if(!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if(!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if(!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if(isset($extra_headers) && is_array($extra_headers)) { + foreach($extra_headers as $curr_header) { + fputs($fp, $curr_header."\r\n"); + } + } + if(!empty($user) && !empty($pass)) { + fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); + } + + fputs($fp, "\r\n"); + while(!feof($fp)) { + $content .= fgets($fp,4096); + } + fclose($fp); + $csplit = preg_split("!\r\n\r\n!",$content,2); + + $content = $csplit[1]; + + if(!empty($params['assign_headers'])) { + $smarty->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); + } + } + } else { + $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax"); + return; + } + } else { + // ftp fetch + if($fp = @fopen($params['file'],'r')) { + while(!feof($fp)) { + $content .= fgets ($fp,4096); + } + fclose($fp); + } else { + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\''); + return; + } + } + + } + + + if (!empty($params['assign'])) { + $smarty->assign($params['assign'],$content); + } else { + return $content; + } +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.html_checkboxes.php b/lib/Smarty/plugins/function.html_checkboxes.php new file mode 100755 index 0000000..ed8ad7f --- /dev/null +++ b/lib/Smarty/plugins/function.html_checkboxes.php @@ -0,0 +1,143 @@ + + * Type: function
      + * Name: html_checkboxes
      + * Date: 24.Feb.2003
      + * Purpose: Prints out a list of checkbox input types
      + * Input:
      + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie
      or   + * - output (optional) - the output next to each checkbox + * - assign (optional) - assign the output as an array to this variable + * Examples: + *
      + * {html_checkboxes values=$ids output=$names}
      + * {html_checkboxes values=$ids name='box' separator='
      ' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='
      ' output=$names} + *
      + * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme + * @author credits to Monte Ohrt + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_checkboxes($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $name = 'checkbox'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $labels = true; + $output = null; + + $extra = ''; + + foreach($params as $_key => $_val) { + switch($_key) { + case 'name': + case 'separator': + $$_key = $_val; + break; + + case 'labels': + $$_key = (bool)$_val; + break; + + case 'options': + $$_key = (array)$_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array)$_val); + break; + + case 'checked': + case 'selected': + $selected = array_map('strval', array_values((array)$_val)); + break; + + case 'checkboxes': + $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array)$_val; + break; + + case 'assign': + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) + return ''; /* raise error here? */ + + settype($selected, 'array'); + $_html_result = array(); + + if (isset($options)) { + + foreach ($options as $_key=>$_val) + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + + + } else { + foreach ($values as $_i=>$_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels); + } + + } + + if(!empty($params['assign'])) { + $smarty->assign($params['assign'], $_html_result); + } else { + return implode("\n",$_html_result); + } + +} + +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) { + $_output = ''; + if ($labels) $_output .= ''; + $_output .= $separator; + + return $_output; +} + +?> diff --git a/lib/Smarty/plugins/function.html_image.php b/lib/Smarty/plugins/function.html_image.php new file mode 100755 index 0000000..9abae72 --- /dev/null +++ b/lib/Smarty/plugins/function.html_image.php @@ -0,0 +1,142 @@ + + * Name: html_image
      + * Date: Feb 24, 2003
      + * Purpose: format HTML tags for the image
      + * Input:
      + * - file = file (and path) of image (required) + * - height = image height (optional, default actual height) + * - width = image width (optional, default actual width) + * - basedir = base directory for absolute paths, default + * is environment variable DOCUMENT_ROOT + * - path_prefix = prefix for path output (optional, default empty) + * + * Examples: {html_image file="/images/masthead.gif"} + * Output: + * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt + * @author credits to Duda - wrote first image function + * in repository, helped with lots of functionality + * @version 1.0 + * @param array + * @param Smarty + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_image($params, &$smarty) +{ + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars'); + + $alt = ''; + $file = ''; + $height = ''; + $width = ''; + $extra = ''; + $prefix = ''; + $suffix = ''; + $path_prefix = ''; + $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; + $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : ''; + foreach($params as $_key => $_val) { + switch($_key) { + case 'file': + case 'height': + case 'width': + case 'dpi': + case 'path_prefix': + case 'basedir': + $$_key = $_val; + break; + + case 'alt': + if(!is_array($_val)) { + $$_key = smarty_function_escape_special_chars($_val); + } else { + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + + case 'link': + case 'href': + $prefix = ''; + $suffix = ''; + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (empty($file)) { + $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); + return; + } + + if (substr($file,0,1) == '/') { + $_image_path = $basedir . $file; + } else { + $_image_path = $file; + } + + if(!isset($params['width']) || !isset($params['height'])) { + if(!$_image_data = @getimagesize($_image_path)) { + if(!file_exists($_image_path)) { + $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); + return; + } else if(!is_readable($_image_path)) { + $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); + return; + } else { + $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); + return; + } + } + if ($smarty->security && + ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) && + (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) && + (!smarty_core_is_secure($_params, $smarty)) ) { + $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE); + } + + if(!isset($params['width'])) { + $width = $_image_data[0]; + } + if(!isset($params['height'])) { + $height = $_image_data[1]; + } + + } + + if(isset($params['dpi'])) { + if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) { + $dpi_default = 72; + } else { + $dpi_default = 96; + } + $_resize = $dpi_default/$params['dpi']; + $width = round($width * $_resize); + $height = round($height * $_resize); + } + + return $prefix . ''.$alt.'' . $suffix; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/function.html_options.php b/lib/Smarty/plugins/function.html_options.php new file mode 100755 index 0000000..cebadde --- /dev/null +++ b/lib/Smarty/plugins/function.html_options.php @@ -0,0 +1,122 @@ + + * Name: html_options
      + * Input:
      + * - name (optional) - string default "select" + * - values (required if no options supplied) - array + * - options (required if no values supplied) - associative array + * - selected (optional) - string default not set + * - output (required if not options supplied) - array + * Purpose: Prints the list of
      !is", $source, $match); + $_pre_blocks = $match[0]; + $source = preg_replace("!]*?>.*?
      !is", + '@@@SMARTY:TRIM:PRE@@@', $source); + + // Pull out the textarea blocks + preg_match_all("!]*?>.*?!is", $source, $match); + $_textarea_blocks = $match[0]; + $source = preg_replace("!]*?>.*?!is", + '@@@SMARTY:TRIM:TEXTAREA@@@', $source); + + // remove all leading spaces, tabs and carriage returns NOT + // preceeded by a php close tag. + $source = trim(preg_replace('/((?)\n)[\s]+/m', '\1', $source)); + + // replace textarea blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source); + + // replace pre blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source); + + // replace script blocks + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $source); + + return $source; +} + +function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) { + $_len = strlen($search_str); + $_pos = 0; + for ($_i=0, $_count=count($replace); $_i<$_count; $_i++) + if (($_pos=strpos($subject, $search_str, $_pos))!==false) + $subject = substr_replace($subject, $replace[$_i], $_pos, $_len); + else + break; + +} + +?> diff --git a/lib/Smarty/plugins/shared.escape_special_chars.php b/lib/Smarty/plugins/shared.escape_special_chars.php new file mode 100755 index 0000000..c07ce31 --- /dev/null +++ b/lib/Smarty/plugins/shared.escape_special_chars.php @@ -0,0 +1,31 @@ + + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * @author Monte Ohrt + * @param string + * @return string + */ +function smarty_function_escape_special_chars($string) +{ + if(!is_array($string)) { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string); + $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string); + } + return $string; +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/Smarty/plugins/shared.make_timestamp.php b/lib/Smarty/plugins/shared.make_timestamp.php new file mode 100755 index 0000000..b42eb11 --- /dev/null +++ b/lib/Smarty/plugins/shared.make_timestamp.php @@ -0,0 +1,46 @@ + + * Purpose: used by other smarty functions to make a timestamp + * from a string. + * @author Monte Ohrt + * @param string + * @return string + */ +function smarty_make_timestamp($string) +{ + if(empty($string)) { + // use "now": + $time = time(); + + } elseif (preg_match('/^\d{14}$/', $string)) { + // it is mysql timestamp format of YYYYMMDDHHMMSS? + $time = mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2), + substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4)); + + } elseif (is_numeric($string)) { + // it is a numeric string, we handle it as timestamp + $time = (int)$string; + + } else { + // strtotime should handle it + $time = strtotime($string); + if ($time == -1 || $time === false) { + // strtotime() was not able to parse $string, use "now": + $time = time(); + } + } + return $time; + +} + +/* vim: set expandtab: */ + +?> diff --git a/lib/StripTagsSmart/strip_tags_smart.php b/lib/StripTagsSmart/strip_tags_smart.php new file mode 100644 index 0000000..88ab101 --- /dev/null +++ b/lib/StripTagsSmart/strip_tags_smart.php @@ -0,0 +1,208 @@ + c" + * - корректно обрабатывается "грязный" html, когда в значениях атрибутов тагов могут встречаться символы < > + * - корректно обрабатывается разбитый html + * - вырезаются комментарии, скрипты, стили, PHP, Perl, ASP код, MS Word таги, CDATA + * - автоматически форматируется текст, если он содержит html код + * - защита от подделок типа: "<script>alert('hi')script>" + * + * @param string $s + * @param array $allowable_tags Массив тагов, которые не будут вырезаны + * Пример: 'b' -- таг останется с атрибутами, '' -- таг останется без атрибутов + * @param bool $is_format_spaces Форматировать пробелы и переносы строк? + * Вид текста на выходе (plain) максимально приближеется виду текста в браузере на входе. + * Другими словами, грамотно преобразует text/html в text/plain. + * Текст форматируется только в том случае, если были вырезаны какие-либо таги. + * @param array $pair_tags массив имён парных тагов, которые будут удалены вместе с содержимым + * см. значения по умолчанию + * @param array $para_tags массив имён парных тагов, которые будут восприниматься как параграфы (если $is_format_spaces = true) + * см. значения по умолчанию + * @return string + * + * @license http://creativecommons.org/licenses/by-sa/3.0/ + * @author Nasibullin Rinat, http://orangetie.ru/ + * @charset ANSI + * @version 4.0.14 + */ +function strip_tags_smart( + /*string*/ $s, + array $allowable_tags = null, + /*boolean*/ $is_format_spaces = true, + array $pair_tags = array('script', 'style', 'map', 'iframe', 'frameset', 'object', 'applet', 'comment', 'button', 'textarea', 'select'), + array $para_tags = array('p', 'td', 'th', 'li', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'div', 'form', 'title', 'pre') +) +{ + //return strip_tags($s); + static $_callback_type = false; + static $_allowable_tags = array(); + static $_para_tags = array(); + #regular expression for tag attributes + #correct processes dirty and broken HTML in a singlebyte or multibyte UTF-8 charset! + static $re_attrs_fast_safe = '(?![a-zA-Z\d]) #statement, which follows after a tag + #correct attributes + (?> + [^>"\']+ + | (?<=[\=\x20\r\n\t]|\xc2\xa0) "[^"]*" + | (?<=[\=\x20\r\n\t]|\xc2\xa0) \'[^\']*\' + )* + #incorrect attributes + [^>]*+'; + + if (is_array($s)) + { + if ($_callback_type === 'strip_tags') + { + $tag = strtolower($s[1]); + if ($_allowable_tags) + { + #tag with attributes + if (array_key_exists($tag, $_allowable_tags)) return $s[0]; + + #tag without attributes + if (array_key_exists('<' . $tag . '>', $_allowable_tags)) + { + if (substr($s[0], 0, 2) === ''; + if (substr($s[0], -2) === '/>') return '<' . $tag . ' />'; + return '<' . $tag . '>'; + } + } + if ($tag === 'br') return "\r\n"; + if ($_para_tags && array_key_exists($tag, $_para_tags)) return "\r\n\r\n"; + return ''; + } + trigger_error('Unknown callback type "' . $_callback_type . '"!', E_USER_ERROR); + } + + if (($pos = strpos($s, '<')) === false || strpos($s, '>', $pos) === false) #speed improve + { + #tags are not found + return $s; + } + + $length = strlen($s); + + #unpaired tags (opening, closing, !DOCTYPE, MS Word namespace) + $re_tags = '~ <[/!]?+ + ( + [a-zA-Z][a-zA-Z\d]*+ + (?>:[a-zA-Z][a-zA-Z\d]*+)? + ) #1 + ' . $re_attrs_fast_safe . ' + > + ~sxSX'; + + $patterns = array( + '/<([\?\%]) .*? \\1>/sxSX', #встроенный PHP, Perl, ASP код + '/<\!\[CDATA\[ .*? \]\]>/sxSX', #блоки CDATA + #'/<\!\[ [\x20\r\n\t]* [a-zA-Z] .*? \]>/sxSX', #:DEPRECATED: MS Word таги типа ... + + '/<\!--.*?-->/sSX', #комментарии + + #MS Word таги типа "...", + #условное выполнение кода для IE типа "" + #условное выполнение кода для IE типа " HTML " + #см. http://www.tigir.com/comments.htm + '/ <\! (?:--)?+ + \[ + (?> [^\]"\']+ | "[^"]*" | \'[^\']*\' )* + \] + (?:--)?+ + > + /sxSX', + ); + if ($pair_tags) + { + #парные таги вместе с содержимым: + foreach ($pair_tags as $k => $v) $pair_tags[$k] = preg_quote($v, '/'); + $patterns[] = '/ <((?i:' . implode('|', $pair_tags) . '))' . $re_attrs_fast_safe . '(? + .*? + <\/(?i:\\1)' . $re_attrs_fast_safe . '> + /sxSX'; + } + #d($patterns); + + $i = 0; #защита от зацикливания + $max = 99; + while ($i < $max) + { + $s2 = preg_replace($patterns, '', $s); + if (preg_last_error() !== PREG_NO_ERROR) + { + $i = 999; + break; + } + + if ($i == 0) + { + $is_html = ($s2 != $s || preg_match($re_tags, $s2)); + if (preg_last_error() !== PREG_NO_ERROR) + { + $i = 999; + break; + } + if ($is_html) + { + if ($is_format_spaces) + { + /* + В библиотеке PCRE для PHP \s - это любой пробельный символ, а именно класс символов [\x09\x0a\x0c\x0d\x20\xa0] или, по другому, [\t\n\f\r \xa0] + Если \s используется с модификатором /u, то \s трактуется как [\x09\x0a\x0c\x0d\x20] + Браузер не делает различия между пробельными символами, друг за другом подряд идущие символы воспринимаются как один + */ + #$s2 = str_replace(array("\r", "\n", "\t"), ' ', $s2); + #$s2 = strtr($s2, "\x09\x0a\x0c\x0d", ' '); + $s2 = preg_replace('/ [\x09\x0a\x0c\x0d]++ + | <((?i:pre|textarea))' . $re_attrs_fast_safe . '(? + .+? + <\/(?i:\\1)' . $re_attrs_fast_safe . '> + \K + /sxSX', ' ', $s2); + if (preg_last_error() !== PREG_NO_ERROR) + { + $i = 999; + break; + } + } + + #массив тагов, которые не будут вырезаны + if ($allowable_tags) $_allowable_tags = array_flip($allowable_tags); + + #парные таги, которые будут восприниматься как параграфы + if ($para_tags) $_para_tags = array_flip($para_tags); + } + }#if + + #tags processing + if ($is_html) + { + $_callback_type = 'strip_tags'; + $s2 = preg_replace_callback($re_tags, __FUNCTION__, $s2); + $_callback_type = false; + if (preg_last_error() !== PREG_NO_ERROR) + { + $i = 999; + break; + } + } + + if ($s === $s2) break; + $s = $s2; $i++; + }#while + if ($i >= $max) $s = strip_tags($s); #too many cycles for replace... + + if ($is_format_spaces && strlen($s) !== $length) + { + #remove a duplicate spaces + $s = preg_replace('/\x20\x20++/sSX', ' ', trim($s)); + #remove a spaces before and after new lines + $s = str_replace(array("\r\n\x20", "\x20\r\n"), "\r\n", $s); + #replace 3 and more new lines to 2 new lines + $s = preg_replace('/[\r\n]{3,}+/sSX', "\r\n\r\n", $s); + } + return $s; +} +?> \ No newline at end of file diff --git a/lib/SwiftMailer/classes/Swift.php b/lib/SwiftMailer/classes/Swift.php new file mode 100644 index 0000000..82c381b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift.php @@ -0,0 +1,80 @@ +createDependenciesFor('mime.attachment') + ); + + $this->setBody($data); + $this->setFilename($filename); + if ($contentType) { + $this->setContentType($contentType); + } + } + + /** + * Create a new Attachment. + * + * @param string|Swift_OutputByteStream $data + * @param string $filename + * @param string $contentType + * + * @return Swift_Mime_Attachment + */ + public static function newInstance($data = null, $filename = null, $contentType = null) + { + return new self($data, $filename, $contentType); + } + + /** + * Create a new Attachment from a filesystem path. + * + * @param string $path + * @param string $contentType optional + * + * @return Swift_Mime_Attachment + */ + public static function fromPath($path, $contentType = null) + { + return self::newInstance()->setFile( + new Swift_ByteStream_FileByteStream($path), + $contentType + ); + } +} diff --git a/lib/SwiftMailer/classes/Swift/ByteStream/AbstractFilterableInputStream.php b/lib/SwiftMailer/classes/Swift/ByteStream/AbstractFilterableInputStream.php new file mode 100644 index 0000000..a7b0e3a --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/ByteStream/AbstractFilterableInputStream.php @@ -0,0 +1,181 @@ +_filters[$key] = $filter; + } + + /** + * Remove an already present StreamFilter based on its $key. + * + * @param string $key + */ + public function removeFilter($key) + { + unset($this->_filters[$key]); + } + + /** + * Writes $bytes to the end of the stream. + * + * @param string $bytes + * + * @throws Swift_IoException + * + * @return int + */ + public function write($bytes) + { + $this->_writeBuffer .= $bytes; + foreach ($this->_filters as $filter) { + if ($filter->shouldBuffer($this->_writeBuffer)) { + return; + } + } + $this->_doWrite($this->_writeBuffer); + + return ++$this->_sequence; + } + + /** + * For any bytes that are currently buffered inside the stream, force them + * off the buffer. + * + * @throws Swift_IoException + */ + public function commit() + { + $this->_doWrite($this->_writeBuffer); + } + + /** + * Attach $is to this stream. + * + * The stream acts as an observer, receiving all data that is written. + * All {@link write()} and {@link flushBuffers()} operations will be mirrored. + * + * @param Swift_InputByteStream $is + */ + public function bind(Swift_InputByteStream $is) + { + $this->_mirrors[] = $is; + } + + /** + * Remove an already bound stream. + * + * If $is is not bound, no errors will be raised. + * If the stream currently has any buffered data it will be written to $is + * before unbinding occurs. + * + * @param Swift_InputByteStream $is + */ + public function unbind(Swift_InputByteStream $is) + { + foreach ($this->_mirrors as $k => $stream) { + if ($is === $stream) { + if ($this->_writeBuffer !== '') { + $stream->write($this->_writeBuffer); + } + unset($this->_mirrors[$k]); + } + } + } + + /** + * Flush the contents of the stream (empty it) and set the internal pointer + * to the beginning. + * + * @throws Swift_IoException + */ + public function flushBuffers() + { + if ($this->_writeBuffer !== '') { + $this->_doWrite($this->_writeBuffer); + } + $this->_flush(); + + foreach ($this->_mirrors as $stream) { + $stream->flushBuffers(); + } + } + + /** Run $bytes through all filters */ + private function _filter($bytes) + { + foreach ($this->_filters as $filter) { + $bytes = $filter->filter($bytes); + } + + return $bytes; + } + + /** Just write the bytes to the stream */ + private function _doWrite($bytes) + { + $this->_commit($this->_filter($bytes)); + + foreach ($this->_mirrors as $stream) { + $stream->write($bytes); + } + + $this->_writeBuffer = ''; + } +} diff --git a/lib/SwiftMailer/classes/Swift/ByteStream/ArrayByteStream.php b/lib/SwiftMailer/classes/Swift/ByteStream/ArrayByteStream.php new file mode 100644 index 0000000..ef05a6d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/ByteStream/ArrayByteStream.php @@ -0,0 +1,182 @@ +_array = $stack; + $this->_arraySize = count($stack); + } elseif (is_string($stack)) { + $this->write($stack); + } else { + $this->_array = array(); + } + } + + /** + * Reads $length bytes from the stream into a string and moves the pointer + * through the stream by $length. + * + * If less bytes exist than are requested the + * remaining bytes are given instead. If no bytes are remaining at all, boolean + * false is returned. + * + * @param int $length + * + * @return string + */ + public function read($length) + { + if ($this->_offset == $this->_arraySize) { + return false; + } + + // Don't use array slice + $end = $length + $this->_offset; + $end = $this->_arraySize < $end ? $this->_arraySize : $end; + $ret = ''; + for (; $this->_offset < $end; ++$this->_offset) { + $ret .= $this->_array[$this->_offset]; + } + + return $ret; + } + + /** + * Writes $bytes to the end of the stream. + * + * @param string $bytes + */ + public function write($bytes) + { + $to_add = str_split($bytes); + foreach ($to_add as $value) { + $this->_array[] = $value; + } + $this->_arraySize = count($this->_array); + + foreach ($this->_mirrors as $stream) { + $stream->write($bytes); + } + } + + /** + * Not used. + */ + public function commit() + { + } + + /** + * Attach $is to this stream. + * + * The stream acts as an observer, receiving all data that is written. + * All {@link write()} and {@link flushBuffers()} operations will be mirrored. + * + * @param Swift_InputByteStream $is + */ + public function bind(Swift_InputByteStream $is) + { + $this->_mirrors[] = $is; + } + + /** + * Remove an already bound stream. + * + * If $is is not bound, no errors will be raised. + * If the stream currently has any buffered data it will be written to $is + * before unbinding occurs. + * + * @param Swift_InputByteStream $is + */ + public function unbind(Swift_InputByteStream $is) + { + foreach ($this->_mirrors as $k => $stream) { + if ($is === $stream) { + unset($this->_mirrors[$k]); + } + } + } + + /** + * Move the internal read pointer to $byteOffset in the stream. + * + * @param int $byteOffset + * + * @return bool + */ + public function setReadPointer($byteOffset) + { + if ($byteOffset > $this->_arraySize) { + $byteOffset = $this->_arraySize; + } elseif ($byteOffset < 0) { + $byteOffset = 0; + } + + $this->_offset = $byteOffset; + } + + /** + * Flush the contents of the stream (empty it) and set the internal pointer + * to the beginning. + */ + public function flushBuffers() + { + $this->_offset = 0; + $this->_array = array(); + $this->_arraySize = 0; + + foreach ($this->_mirrors as $stream) { + $stream->flushBuffers(); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/ByteStream/FileByteStream.php b/lib/SwiftMailer/classes/Swift/ByteStream/FileByteStream.php new file mode 100644 index 0000000..9ed8523 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/ByteStream/FileByteStream.php @@ -0,0 +1,231 @@ +_path = $path; + $this->_mode = $writable ? 'w+b' : 'rb'; + + if (function_exists('get_magic_quotes_runtime') && @get_magic_quotes_runtime() == 1) { + $this->_quotes = true; + } + } + + /** + * Get the complete path to the file. + * + * @return string + */ + public function getPath() + { + return $this->_path; + } + + /** + * Reads $length bytes from the stream into a string and moves the pointer + * through the stream by $length. + * + * If less bytes exist than are requested the + * remaining bytes are given instead. If no bytes are remaining at all, boolean + * false is returned. + * + * @param int $length + * + * @throws Swift_IoException + * + * @return string|bool + */ + public function read($length) + { + $fp = $this->_getReadHandle(); + if (!feof($fp)) { + if ($this->_quotes) { + ini_set('magic_quotes_runtime', 0); + } + $bytes = fread($fp, $length); + if ($this->_quotes) { + ini_set('magic_quotes_runtime', 1); + } + $this->_offset = ftell($fp); + + // If we read one byte after reaching the end of the file + // feof() will return false and an empty string is returned + if ($bytes === '' && feof($fp)) { + $this->_resetReadHandle(); + + return false; + } + + return $bytes; + } + + $this->_resetReadHandle(); + + return false; + } + + /** + * Move the internal read pointer to $byteOffset in the stream. + * + * @param int $byteOffset + * + * @return bool + */ + public function setReadPointer($byteOffset) + { + if (isset($this->_reader)) { + $this->_seekReadStreamToPosition($byteOffset); + } + $this->_offset = $byteOffset; + } + + /** Just write the bytes to the file */ + protected function _commit($bytes) + { + fwrite($this->_getWriteHandle(), $bytes); + $this->_resetReadHandle(); + } + + /** Not used */ + protected function _flush() + { + } + + /** Get the resource for reading */ + private function _getReadHandle() + { + if (!isset($this->_reader)) { + $pointer = @fopen($this->_path, 'rb'); + if (!$pointer) { + throw new Swift_IoException( + 'Unable to open file for reading ['.$this->_path.']' + ); + } + $this->_reader = $pointer; + if ($this->_offset != 0) { + $this->_getReadStreamSeekableStatus(); + $this->_seekReadStreamToPosition($this->_offset); + } + } + + return $this->_reader; + } + + /** Get the resource for writing */ + private function _getWriteHandle() + { + if (!isset($this->_writer)) { + if (!$this->_writer = fopen($this->_path, $this->_mode)) { + throw new Swift_IoException( + 'Unable to open file for writing ['.$this->_path.']' + ); + } + } + + return $this->_writer; + } + + /** Force a reload of the resource for reading */ + private function _resetReadHandle() + { + if (isset($this->_reader)) { + fclose($this->_reader); + $this->_reader = null; + } + } + + /** Check if ReadOnly Stream is seekable */ + private function _getReadStreamSeekableStatus() + { + $metas = stream_get_meta_data($this->_reader); + $this->_seekable = $metas['seekable']; + } + + /** Streams in a readOnly stream ensuring copy if needed */ + private function _seekReadStreamToPosition($offset) + { + if ($this->_seekable === null) { + $this->_getReadStreamSeekableStatus(); + } + if ($this->_seekable === false) { + $currentPos = ftell($this->_reader); + if ($currentPos < $offset) { + $toDiscard = $offset - $currentPos; + fread($this->_reader, $toDiscard); + + return; + } + $this->_copyReadStream(); + } + fseek($this->_reader, $offset, SEEK_SET); + } + + /** Copy a readOnly Stream to ensure seekability */ + private function _copyReadStream() + { + if ($tmpFile = fopen('php://temp/maxmemory:4096', 'w+b')) { + /* We have opened a php:// Stream Should work without problem */ + } elseif (function_exists('sys_get_temp_dir') && is_writable(sys_get_temp_dir()) && ($tmpFile = tmpfile())) { + /* We have opened a tmpfile */ + } else { + throw new Swift_IoException('Unable to copy the file to make it seekable, sys_temp_dir is not writable, php://memory not available'); + } + $currentPos = ftell($this->_reader); + fclose($this->_reader); + $source = fopen($this->_path, 'rb'); + if (!$source) { + throw new Swift_IoException('Unable to open file for copying ['.$this->_path.']'); + } + fseek($tmpFile, 0, SEEK_SET); + while (!feof($source)) { + fwrite($tmpFile, fread($source, 4096)); + } + fseek($tmpFile, $currentPos, SEEK_SET); + fclose($source); + $this->_reader = $tmpFile; + } +} diff --git a/lib/SwiftMailer/classes/Swift/ByteStream/TemporaryFileByteStream.php b/lib/SwiftMailer/classes/Swift/ByteStream/TemporaryFileByteStream.php new file mode 100644 index 0000000..1c9a80c --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/ByteStream/TemporaryFileByteStream.php @@ -0,0 +1,42 @@ +getPath())) === false) { + throw new Swift_IoException('Failed to get temporary file content.'); + } + + return $content; + } + + public function __destruct() + { + if (file_exists($this->getPath())) { + @unlink($this->getPath()); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/CharacterReader.php b/lib/SwiftMailer/classes/Swift/CharacterReader.php new file mode 100644 index 0000000..3d5e854 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/CharacterReader.php @@ -0,0 +1,67 @@ + + */ +interface Swift_CharacterReader +{ + const MAP_TYPE_INVALID = 0x01; + const MAP_TYPE_FIXED_LEN = 0x02; + const MAP_TYPE_POSITIONS = 0x03; + + /** + * Returns the complete character map. + * + * @param string $string + * @param int $startOffset + * @param array $currentMap + * @param mixed $ignoredChars + * + * @return int + */ + public function getCharPositions($string, $startOffset, &$currentMap, &$ignoredChars); + + /** + * Returns the mapType, see constants. + * + * @return int + */ + public function getMapType(); + + /** + * Returns an integer which specifies how many more bytes to read. + * + * A positive integer indicates the number of more bytes to fetch before invoking + * this method again. + * + * A value of zero means this is already a valid character. + * A value of -1 means this cannot possibly be a valid character. + * + * @param integer[] $bytes + * @param int $size + * + * @return int + */ + public function validateByteSequence($bytes, $size); + + /** + * Returns the number of bytes which should be read to start each character. + * + * For fixed width character sets this should be the number of octets-per-character. + * For multibyte character sets this will probably be 1. + * + * @return int + */ + public function getInitialByteSize(); +} diff --git a/lib/SwiftMailer/classes/Swift/CharacterReader/GenericFixedWidthReader.php b/lib/SwiftMailer/classes/Swift/CharacterReader/GenericFixedWidthReader.php new file mode 100644 index 0000000..6a18e1d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/CharacterReader/GenericFixedWidthReader.php @@ -0,0 +1,97 @@ + + */ +class Swift_CharacterReader_GenericFixedWidthReader implements Swift_CharacterReader +{ + /** + * The number of bytes in a single character. + * + * @var int + */ + private $_width; + + /** + * Creates a new GenericFixedWidthReader using $width bytes per character. + * + * @param int $width + */ + public function __construct($width) + { + $this->_width = $width; + } + + /** + * Returns the complete character map. + * + * @param string $string + * @param int $startOffset + * @param array $currentMap + * @param mixed $ignoredChars + * + * @return int + */ + public function getCharPositions($string, $startOffset, &$currentMap, &$ignoredChars) + { + $strlen = strlen($string); + // % and / are CPU intensive, so, maybe find a better way + $ignored = $strlen % $this->_width; + $ignoredChars = $ignored ? substr($string, -$ignored) : ''; + $currentMap = $this->_width; + + return ($strlen - $ignored) / $this->_width; + } + + /** + * Returns the mapType. + * + * @return int + */ + public function getMapType() + { + return self::MAP_TYPE_FIXED_LEN; + } + + /** + * Returns an integer which specifies how many more bytes to read. + * + * A positive integer indicates the number of more bytes to fetch before invoking + * this method again. + * + * A value of zero means this is already a valid character. + * A value of -1 means this cannot possibly be a valid character. + * + * @param string $bytes + * @param int $size + * + * @return int + */ + public function validateByteSequence($bytes, $size) + { + $needed = $this->_width - $size; + + return $needed > -1 ? $needed : -1; + } + + /** + * Returns the number of bytes which should be read to start each character. + * + * @return int + */ + public function getInitialByteSize() + { + return $this->_width; + } +} diff --git a/lib/SwiftMailer/classes/Swift/CharacterReader/UsAsciiReader.php b/lib/SwiftMailer/classes/Swift/CharacterReader/UsAsciiReader.php new file mode 100644 index 0000000..67da48f --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/CharacterReader/UsAsciiReader.php @@ -0,0 +1,84 @@ + "\x07F") { + // Invalid char + $currentMap[$i + $startOffset] = $string[$i]; + } + } + + return $strlen; + } + + /** + * Returns mapType. + * + * @return int mapType + */ + public function getMapType() + { + return self::MAP_TYPE_INVALID; + } + + /** + * Returns an integer which specifies how many more bytes to read. + * + * A positive integer indicates the number of more bytes to fetch before invoking + * this method again. + * A value of zero means this is already a valid character. + * A value of -1 means this cannot possibly be a valid character. + * + * @param string $bytes + * @param int $size + * + * @return int + */ + public function validateByteSequence($bytes, $size) + { + $byte = reset($bytes); + if (1 == count($bytes) && $byte >= 0x00 && $byte <= 0x7F) { + return 0; + } + + return -1; + } + + /** + * Returns the number of bytes which should be read to start each character. + * + * @return int + */ + public function getInitialByteSize() + { + return 1; + } +} diff --git a/lib/SwiftMailer/classes/Swift/CharacterReader/Utf8Reader.php b/lib/SwiftMailer/classes/Swift/CharacterReader/Utf8Reader.php new file mode 100644 index 0000000..7379bda --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/CharacterReader/Utf8Reader.php @@ -0,0 +1,176 @@ + + */ +class Swift_CharacterReader_Utf8Reader implements Swift_CharacterReader +{ + /** Pre-computed for optimization */ + private static $length_map = array( + // N=0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x0N + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x1N + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x2N + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x3N + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x4N + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x5N + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x6N + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // 0x7N + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x8N + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0x9N + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xAN + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 0xBN + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // 0xCN + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // 0xDN + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, // 0xEN + 4,4,4,4,4,4,4,4,5,5,5,5,6,6,0,0, // 0xFN + ); + + private static $s_length_map = array( + "\x00" => 1, "\x01" => 1, "\x02" => 1, "\x03" => 1, "\x04" => 1, "\x05" => 1, "\x06" => 1, "\x07" => 1, + "\x08" => 1, "\x09" => 1, "\x0a" => 1, "\x0b" => 1, "\x0c" => 1, "\x0d" => 1, "\x0e" => 1, "\x0f" => 1, + "\x10" => 1, "\x11" => 1, "\x12" => 1, "\x13" => 1, "\x14" => 1, "\x15" => 1, "\x16" => 1, "\x17" => 1, + "\x18" => 1, "\x19" => 1, "\x1a" => 1, "\x1b" => 1, "\x1c" => 1, "\x1d" => 1, "\x1e" => 1, "\x1f" => 1, + "\x20" => 1, "\x21" => 1, "\x22" => 1, "\x23" => 1, "\x24" => 1, "\x25" => 1, "\x26" => 1, "\x27" => 1, + "\x28" => 1, "\x29" => 1, "\x2a" => 1, "\x2b" => 1, "\x2c" => 1, "\x2d" => 1, "\x2e" => 1, "\x2f" => 1, + "\x30" => 1, "\x31" => 1, "\x32" => 1, "\x33" => 1, "\x34" => 1, "\x35" => 1, "\x36" => 1, "\x37" => 1, + "\x38" => 1, "\x39" => 1, "\x3a" => 1, "\x3b" => 1, "\x3c" => 1, "\x3d" => 1, "\x3e" => 1, "\x3f" => 1, + "\x40" => 1, "\x41" => 1, "\x42" => 1, "\x43" => 1, "\x44" => 1, "\x45" => 1, "\x46" => 1, "\x47" => 1, + "\x48" => 1, "\x49" => 1, "\x4a" => 1, "\x4b" => 1, "\x4c" => 1, "\x4d" => 1, "\x4e" => 1, "\x4f" => 1, + "\x50" => 1, "\x51" => 1, "\x52" => 1, "\x53" => 1, "\x54" => 1, "\x55" => 1, "\x56" => 1, "\x57" => 1, + "\x58" => 1, "\x59" => 1, "\x5a" => 1, "\x5b" => 1, "\x5c" => 1, "\x5d" => 1, "\x5e" => 1, "\x5f" => 1, + "\x60" => 1, "\x61" => 1, "\x62" => 1, "\x63" => 1, "\x64" => 1, "\x65" => 1, "\x66" => 1, "\x67" => 1, + "\x68" => 1, "\x69" => 1, "\x6a" => 1, "\x6b" => 1, "\x6c" => 1, "\x6d" => 1, "\x6e" => 1, "\x6f" => 1, + "\x70" => 1, "\x71" => 1, "\x72" => 1, "\x73" => 1, "\x74" => 1, "\x75" => 1, "\x76" => 1, "\x77" => 1, + "\x78" => 1, "\x79" => 1, "\x7a" => 1, "\x7b" => 1, "\x7c" => 1, "\x7d" => 1, "\x7e" => 1, "\x7f" => 1, + "\x80" => 0, "\x81" => 0, "\x82" => 0, "\x83" => 0, "\x84" => 0, "\x85" => 0, "\x86" => 0, "\x87" => 0, + "\x88" => 0, "\x89" => 0, "\x8a" => 0, "\x8b" => 0, "\x8c" => 0, "\x8d" => 0, "\x8e" => 0, "\x8f" => 0, + "\x90" => 0, "\x91" => 0, "\x92" => 0, "\x93" => 0, "\x94" => 0, "\x95" => 0, "\x96" => 0, "\x97" => 0, + "\x98" => 0, "\x99" => 0, "\x9a" => 0, "\x9b" => 0, "\x9c" => 0, "\x9d" => 0, "\x9e" => 0, "\x9f" => 0, + "\xa0" => 0, "\xa1" => 0, "\xa2" => 0, "\xa3" => 0, "\xa4" => 0, "\xa5" => 0, "\xa6" => 0, "\xa7" => 0, + "\xa8" => 0, "\xa9" => 0, "\xaa" => 0, "\xab" => 0, "\xac" => 0, "\xad" => 0, "\xae" => 0, "\xaf" => 0, + "\xb0" => 0, "\xb1" => 0, "\xb2" => 0, "\xb3" => 0, "\xb4" => 0, "\xb5" => 0, "\xb6" => 0, "\xb7" => 0, + "\xb8" => 0, "\xb9" => 0, "\xba" => 0, "\xbb" => 0, "\xbc" => 0, "\xbd" => 0, "\xbe" => 0, "\xbf" => 0, + "\xc0" => 2, "\xc1" => 2, "\xc2" => 2, "\xc3" => 2, "\xc4" => 2, "\xc5" => 2, "\xc6" => 2, "\xc7" => 2, + "\xc8" => 2, "\xc9" => 2, "\xca" => 2, "\xcb" => 2, "\xcc" => 2, "\xcd" => 2, "\xce" => 2, "\xcf" => 2, + "\xd0" => 2, "\xd1" => 2, "\xd2" => 2, "\xd3" => 2, "\xd4" => 2, "\xd5" => 2, "\xd6" => 2, "\xd7" => 2, + "\xd8" => 2, "\xd9" => 2, "\xda" => 2, "\xdb" => 2, "\xdc" => 2, "\xdd" => 2, "\xde" => 2, "\xdf" => 2, + "\xe0" => 3, "\xe1" => 3, "\xe2" => 3, "\xe3" => 3, "\xe4" => 3, "\xe5" => 3, "\xe6" => 3, "\xe7" => 3, + "\xe8" => 3, "\xe9" => 3, "\xea" => 3, "\xeb" => 3, "\xec" => 3, "\xed" => 3, "\xee" => 3, "\xef" => 3, + "\xf0" => 4, "\xf1" => 4, "\xf2" => 4, "\xf3" => 4, "\xf4" => 4, "\xf5" => 4, "\xf6" => 4, "\xf7" => 4, + "\xf8" => 5, "\xf9" => 5, "\xfa" => 5, "\xfb" => 5, "\xfc" => 6, "\xfd" => 6, "\xfe" => 0, "\xff" => 0, + ); + + /** + * Returns the complete character map. + * + * @param string $string + * @param int $startOffset + * @param array $currentMap + * @param mixed $ignoredChars + * + * @return int + */ + public function getCharPositions($string, $startOffset, &$currentMap, &$ignoredChars) + { + if (!isset($currentMap['i']) || !isset($currentMap['p'])) { + $currentMap['p'] = $currentMap['i'] = array(); + } + + $strlen = strlen($string); + $charPos = count($currentMap['p']); + $foundChars = 0; + $invalid = false; + for ($i = 0; $i < $strlen; ++$i) { + $char = $string[$i]; + $size = self::$s_length_map[$char]; + if ($size == 0) { + /* char is invalid, we must wait for a resync */ + $invalid = true; + continue; + } else { + if ($invalid == true) { + /* We mark the chars as invalid and start a new char */ + $currentMap['p'][$charPos + $foundChars] = $startOffset + $i; + $currentMap['i'][$charPos + $foundChars] = true; + ++$foundChars; + $invalid = false; + } + if (($i + $size) > $strlen) { + $ignoredChars = substr($string, $i); + break; + } + for ($j = 1; $j < $size; ++$j) { + $char = $string[$i + $j]; + if ($char > "\x7F" && $char < "\xC0") { + // Valid - continue parsing + } else { + /* char is invalid, we must wait for a resync */ + $invalid = true; + continue 2; + } + } + /* Ok we got a complete char here */ + $currentMap['p'][$charPos + $foundChars] = $startOffset + $i + $size; + $i += $j - 1; + ++$foundChars; + } + } + + return $foundChars; + } + + /** + * Returns mapType. + * + * @return int mapType + */ + public function getMapType() + { + return self::MAP_TYPE_POSITIONS; + } + + /** + * Returns an integer which specifies how many more bytes to read. + * + * A positive integer indicates the number of more bytes to fetch before invoking + * this method again. + * A value of zero means this is already a valid character. + * A value of -1 means this cannot possibly be a valid character. + * + * @param string $bytes + * @param int $size + * + * @return int + */ + public function validateByteSequence($bytes, $size) + { + if ($size < 1) { + return -1; + } + $needed = self::$length_map[$bytes[0]] - $size; + + return $needed > -1 ? $needed : -1; + } + + /** + * Returns the number of bytes which should be read to start each character. + * + * @return int + */ + public function getInitialByteSize() + { + return 1; + } +} diff --git a/lib/SwiftMailer/classes/Swift/CharacterReaderFactory.php b/lib/SwiftMailer/classes/Swift/CharacterReaderFactory.php new file mode 100644 index 0000000..15b6c69 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/CharacterReaderFactory.php @@ -0,0 +1,26 @@ +init(); + } + + public function __wakeup() + { + $this->init(); + } + + public function init() + { + if (count(self::$_map) > 0) { + return; + } + + $prefix = 'Swift_CharacterReader_'; + + $singleByte = array( + 'class' => $prefix.'GenericFixedWidthReader', + 'constructor' => array(1), + ); + + $doubleByte = array( + 'class' => $prefix.'GenericFixedWidthReader', + 'constructor' => array(2), + ); + + $fourBytes = array( + 'class' => $prefix.'GenericFixedWidthReader', + 'constructor' => array(4), + ); + + // Utf-8 + self::$_map['utf-?8'] = array( + 'class' => $prefix.'Utf8Reader', + 'constructor' => array(), + ); + + //7-8 bit charsets + self::$_map['(us-)?ascii'] = $singleByte; + self::$_map['(iso|iec)-?8859-?[0-9]+'] = $singleByte; + self::$_map['windows-?125[0-9]'] = $singleByte; + self::$_map['cp-?[0-9]+'] = $singleByte; + self::$_map['ansi'] = $singleByte; + self::$_map['macintosh'] = $singleByte; + self::$_map['koi-?7'] = $singleByte; + self::$_map['koi-?8-?.+'] = $singleByte; + self::$_map['mik'] = $singleByte; + self::$_map['(cork|t1)'] = $singleByte; + self::$_map['v?iscii'] = $singleByte; + + //16 bits + self::$_map['(ucs-?2|utf-?16)'] = $doubleByte; + + //32 bits + self::$_map['(ucs-?4|utf-?32)'] = $fourBytes; + + // Fallback + self::$_map['.*'] = $singleByte; + } + + /** + * Returns a CharacterReader suitable for the charset applied. + * + * @param string $charset + * + * @return Swift_CharacterReader + */ + public function getReaderFor($charset) + { + $charset = trim(strtolower($charset)); + foreach (self::$_map as $pattern => $spec) { + $re = '/^'.$pattern.'$/D'; + if (preg_match($re, $charset)) { + if (!array_key_exists($pattern, self::$_loaded)) { + $reflector = new ReflectionClass($spec['class']); + if ($reflector->getConstructor()) { + $reader = $reflector->newInstanceArgs($spec['constructor']); + } else { + $reader = $reflector->newInstance(); + } + self::$_loaded[$pattern] = $reader; + } + + return self::$_loaded[$pattern]; + } + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/CharacterStream.php b/lib/SwiftMailer/classes/Swift/CharacterStream.php new file mode 100644 index 0000000..717924f --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/CharacterStream.php @@ -0,0 +1,89 @@ +setCharacterReaderFactory($factory); + $this->setCharacterSet($charset); + } + + /** + * Set the character set used in this CharacterStream. + * + * @param string $charset + */ + public function setCharacterSet($charset) + { + $this->_charset = $charset; + $this->_charReader = null; + } + + /** + * Set the CharacterReaderFactory for multi charset support. + * + * @param Swift_CharacterReaderFactory $factory + */ + public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory) + { + $this->_charReaderFactory = $factory; + } + + /** + * Overwrite this character stream using the byte sequence in the byte stream. + * + * @param Swift_OutputByteStream $os output stream to read from + */ + public function importByteStream(Swift_OutputByteStream $os) + { + if (!isset($this->_charReader)) { + $this->_charReader = $this->_charReaderFactory + ->getReaderFor($this->_charset); + } + + $startLength = $this->_charReader->getInitialByteSize(); + while (false !== $bytes = $os->read($startLength)) { + $c = array(); + for ($i = 0, $len = strlen($bytes); $i < $len; ++$i) { + $c[] = self::$_byteMap[$bytes[$i]]; + } + $size = count($c); + $need = $this->_charReader + ->validateByteSequence($c, $size); + if ($need > 0 && + false !== $bytes = $os->read($need)) { + for ($i = 0, $len = strlen($bytes); $i < $len; ++$i) { + $c[] = self::$_byteMap[$bytes[$i]]; + } + } + $this->_array[] = $c; + ++$this->_array_size; + } + } + + /** + * Import a string a bytes into this CharacterStream, overwriting any existing + * data in the stream. + * + * @param string $string + */ + public function importString($string) + { + $this->flushContents(); + $this->write($string); + } + + /** + * Read $length characters from the stream and move the internal pointer + * $length further into the stream. + * + * @param int $length + * + * @return string + */ + public function read($length) + { + if ($this->_offset == $this->_array_size) { + return false; + } + + // Don't use array slice + $arrays = array(); + $end = $length + $this->_offset; + for ($i = $this->_offset; $i < $end; ++$i) { + if (!isset($this->_array[$i])) { + break; + } + $arrays[] = $this->_array[$i]; + } + $this->_offset += $i - $this->_offset; // Limit function calls + $chars = false; + foreach ($arrays as $array) { + $chars .= implode('', array_map('chr', $array)); + } + + return $chars; + } + + /** + * Read $length characters from the stream and return a 1-dimensional array + * containing there octet values. + * + * @param int $length + * + * @return integer[] + */ + public function readBytes($length) + { + if ($this->_offset == $this->_array_size) { + return false; + } + $arrays = array(); + $end = $length + $this->_offset; + for ($i = $this->_offset; $i < $end; ++$i) { + if (!isset($this->_array[$i])) { + break; + } + $arrays[] = $this->_array[$i]; + } + $this->_offset += ($i - $this->_offset); // Limit function calls + + return call_user_func_array('array_merge', $arrays); + } + + /** + * Write $chars to the end of the stream. + * + * @param string $chars + */ + public function write($chars) + { + if (!isset($this->_charReader)) { + $this->_charReader = $this->_charReaderFactory->getReaderFor( + $this->_charset); + } + + $startLength = $this->_charReader->getInitialByteSize(); + + $fp = fopen('php://memory', 'w+b'); + fwrite($fp, $chars); + unset($chars); + fseek($fp, 0, SEEK_SET); + + $buffer = array(0); + $buf_pos = 1; + $buf_len = 1; + $has_datas = true; + do { + $bytes = array(); + // Buffer Filing + if ($buf_len - $buf_pos < $startLength) { + $buf = array_splice($buffer, $buf_pos); + $new = $this->_reloadBuffer($fp, 100); + if ($new) { + $buffer = array_merge($buf, $new); + $buf_len = count($buffer); + $buf_pos = 0; + } else { + $has_datas = false; + } + } + if ($buf_len - $buf_pos > 0) { + $size = 0; + for ($i = 0; $i < $startLength && isset($buffer[$buf_pos]); ++$i) { + ++$size; + $bytes[] = $buffer[$buf_pos++]; + } + $need = $this->_charReader->validateByteSequence( + $bytes, $size); + if ($need > 0) { + if ($buf_len - $buf_pos < $need) { + $new = $this->_reloadBuffer($fp, $need); + + if ($new) { + $buffer = array_merge($buffer, $new); + $buf_len = count($buffer); + } + } + for ($i = 0; $i < $need && isset($buffer[$buf_pos]); ++$i) { + $bytes[] = $buffer[$buf_pos++]; + } + } + $this->_array[] = $bytes; + ++$this->_array_size; + } + } while ($has_datas); + + fclose($fp); + } + + /** + * Move the internal pointer to $charOffset in the stream. + * + * @param int $charOffset + */ + public function setPointer($charOffset) + { + if ($charOffset > $this->_array_size) { + $charOffset = $this->_array_size; + } elseif ($charOffset < 0) { + $charOffset = 0; + } + $this->_offset = $charOffset; + } + + /** + * Empty the stream and reset the internal pointer. + */ + public function flushContents() + { + $this->_offset = 0; + $this->_array = array(); + $this->_array_size = 0; + } + + private function _reloadBuffer($fp, $len) + { + if (!feof($fp) && ($bytes = fread($fp, $len)) !== false) { + $buf = array(); + for ($i = 0, $len = strlen($bytes); $i < $len; ++$i) { + $buf[] = self::$_byteMap[$bytes[$i]]; + } + + return $buf; + } + + return false; + } + + private static function _initializeMaps() + { + if (!isset(self::$_charMap)) { + self::$_charMap = array(); + for ($byte = 0; $byte < 256; ++$byte) { + self::$_charMap[$byte] = chr($byte); + } + self::$_byteMap = array_flip(self::$_charMap); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/CharacterStream/NgCharacterStream.php b/lib/SwiftMailer/classes/Swift/CharacterStream/NgCharacterStream.php new file mode 100644 index 0000000..58bd140 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/CharacterStream/NgCharacterStream.php @@ -0,0 +1,267 @@ + + */ +class Swift_CharacterStream_NgCharacterStream implements Swift_CharacterStream +{ + /** + * The char reader (lazy-loaded) for the current charset. + * + * @var Swift_CharacterReader + */ + private $_charReader; + + /** + * A factory for creating CharacterReader instances. + * + * @var Swift_CharacterReaderFactory + */ + private $_charReaderFactory; + + /** + * The character set this stream is using. + * + * @var string + */ + private $_charset; + + /** + * The data's stored as-is. + * + * @var string + */ + private $_datas = ''; + + /** + * Number of bytes in the stream. + * + * @var int + */ + private $_datasSize = 0; + + /** + * Map. + * + * @var mixed + */ + private $_map; + + /** + * Map Type. + * + * @var int + */ + private $_mapType = 0; + + /** + * Number of characters in the stream. + * + * @var int + */ + private $_charCount = 0; + + /** + * Position in the stream. + * + * @var int + */ + private $_currentPos = 0; + + /** + * Constructor. + * + * @param Swift_CharacterReaderFactory $factory + * @param string $charset + */ + public function __construct(Swift_CharacterReaderFactory $factory, $charset) + { + $this->setCharacterReaderFactory($factory); + $this->setCharacterSet($charset); + } + + /* -- Changing parameters of the stream -- */ + + /** + * Set the character set used in this CharacterStream. + * + * @param string $charset + */ + public function setCharacterSet($charset) + { + $this->_charset = $charset; + $this->_charReader = null; + $this->_mapType = 0; + } + + /** + * Set the CharacterReaderFactory for multi charset support. + * + * @param Swift_CharacterReaderFactory $factory + */ + public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory) + { + $this->_charReaderFactory = $factory; + } + + /** + * @see Swift_CharacterStream::flushContents() + */ + public function flushContents() + { + $this->_datas = null; + $this->_map = null; + $this->_charCount = 0; + $this->_currentPos = 0; + $this->_datasSize = 0; + } + + /** + * @see Swift_CharacterStream::importByteStream() + * + * @param Swift_OutputByteStream $os + */ + public function importByteStream(Swift_OutputByteStream $os) + { + $this->flushContents(); + $blocks = 512; + $os->setReadPointer(0); + while (false !== ($read = $os->read($blocks))) { + $this->write($read); + } + } + + /** + * @see Swift_CharacterStream::importString() + * + * @param string $string + */ + public function importString($string) + { + $this->flushContents(); + $this->write($string); + } + + /** + * @see Swift_CharacterStream::read() + * + * @param int $length + * + * @return string + */ + public function read($length) + { + if ($this->_currentPos >= $this->_charCount) { + return false; + } + $ret = false; + $length = $this->_currentPos + $length > $this->_charCount ? $this->_charCount - $this->_currentPos : $length; + switch ($this->_mapType) { + case Swift_CharacterReader::MAP_TYPE_FIXED_LEN: + $len = $length * $this->_map; + $ret = substr($this->_datas, + $this->_currentPos * $this->_map, + $len); + $this->_currentPos += $length; + break; + + case Swift_CharacterReader::MAP_TYPE_INVALID: + $ret = ''; + for (; $this->_currentPos < $length; ++$this->_currentPos) { + if (isset($this->_map[$this->_currentPos])) { + $ret .= '?'; + } else { + $ret .= $this->_datas[$this->_currentPos]; + } + } + break; + + case Swift_CharacterReader::MAP_TYPE_POSITIONS: + $end = $this->_currentPos + $length; + $end = $end > $this->_charCount ? $this->_charCount : $end; + $ret = ''; + $start = 0; + if ($this->_currentPos > 0) { + $start = $this->_map['p'][$this->_currentPos - 1]; + } + $to = $start; + for (; $this->_currentPos < $end; ++$this->_currentPos) { + if (isset($this->_map['i'][$this->_currentPos])) { + $ret .= substr($this->_datas, $start, $to - $start).'?'; + $start = $this->_map['p'][$this->_currentPos]; + } else { + $to = $this->_map['p'][$this->_currentPos]; + } + } + $ret .= substr($this->_datas, $start, $to - $start); + break; + } + + return $ret; + } + + /** + * @see Swift_CharacterStream::readBytes() + * + * @param int $length + * + * @return int[] + */ + public function readBytes($length) + { + $read = $this->read($length); + if ($read !== false) { + $ret = array_map('ord', str_split($read, 1)); + + return $ret; + } + + return false; + } + + /** + * @see Swift_CharacterStream::setPointer() + * + * @param int $charOffset + */ + public function setPointer($charOffset) + { + if ($this->_charCount < $charOffset) { + $charOffset = $this->_charCount; + } + $this->_currentPos = $charOffset; + } + + /** + * @see Swift_CharacterStream::write() + * + * @param string $chars + */ + public function write($chars) + { + if (!isset($this->_charReader)) { + $this->_charReader = $this->_charReaderFactory->getReaderFor( + $this->_charset); + $this->_map = array(); + $this->_mapType = $this->_charReader->getMapType(); + } + $ignored = ''; + $this->_datas .= $chars; + $this->_charCount += $this->_charReader->getCharPositions(substr($this->_datas, $this->_datasSize), $this->_datasSize, $this->_map, $ignored); + if ($ignored !== false) { + $this->_datasSize = strlen($this->_datas) - strlen($ignored); + } else { + $this->_datasSize = strlen($this->_datas); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/ConfigurableSpool.php b/lib/SwiftMailer/classes/Swift/ConfigurableSpool.php new file mode 100644 index 0000000..4ae5bac --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/ConfigurableSpool.php @@ -0,0 +1,63 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Base class for Spools (implements time and message limits). + * + * @author Fabien Potencier + */ +abstract class Swift_ConfigurableSpool implements Swift_Spool +{ + /** The maximum number of messages to send per flush */ + private $_message_limit; + + /** The time limit per flush */ + private $_time_limit; + + /** + * Sets the maximum number of messages to send per flush. + * + * @param int $limit + */ + public function setMessageLimit($limit) + { + $this->_message_limit = (int) $limit; + } + + /** + * Gets the maximum number of messages to send per flush. + * + * @return int The limit + */ + public function getMessageLimit() + { + return $this->_message_limit; + } + + /** + * Sets the time limit (in seconds) per flush. + * + * @param int $limit The limit + */ + public function setTimeLimit($limit) + { + $this->_time_limit = (int) $limit; + } + + /** + * Gets the time limit (in seconds) per flush. + * + * @return int The limit + */ + public function getTimeLimit() + { + return $this->_time_limit; + } +} diff --git a/lib/SwiftMailer/classes/Swift/DependencyContainer.php b/lib/SwiftMailer/classes/Swift/DependencyContainer.php new file mode 100644 index 0000000..8c1074a --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/DependencyContainer.php @@ -0,0 +1,373 @@ +_store); + } + + /** + * Test if an item is registered in this container with the given name. + * + * @see register() + * + * @param string $itemName + * + * @return bool + */ + public function has($itemName) + { + return array_key_exists($itemName, $this->_store) + && isset($this->_store[$itemName]['lookupType']); + } + + /** + * Lookup the item with the given $itemName. + * + * @see register() + * + * @param string $itemName + * + * @throws Swift_DependencyException If the dependency is not found + * + * @return mixed + */ + public function lookup($itemName) + { + if (!$this->has($itemName)) { + throw new Swift_DependencyException( + 'Cannot lookup dependency "'.$itemName.'" since it is not registered.' + ); + } + + switch ($this->_store[$itemName]['lookupType']) { + case self::TYPE_ALIAS: + return $this->_createAlias($itemName); + case self::TYPE_VALUE: + return $this->_getValue($itemName); + case self::TYPE_INSTANCE: + return $this->_createNewInstance($itemName); + case self::TYPE_SHARED: + return $this->_createSharedInstance($itemName); + } + } + + /** + * Create an array of arguments passed to the constructor of $itemName. + * + * @param string $itemName + * + * @return array + */ + public function createDependenciesFor($itemName) + { + $args = array(); + if (isset($this->_store[$itemName]['args'])) { + $args = $this->_resolveArgs($this->_store[$itemName]['args']); + } + + return $args; + } + + /** + * Register a new dependency with $itemName. + * + * This method returns the current DependencyContainer instance because it + * requires the use of the fluid interface to set the specific details for the + * dependency. + * + * @see asNewInstanceOf(), asSharedInstanceOf(), asValue() + * + * @param string $itemName + * + * @return Swift_DependencyContainer + */ + public function register($itemName) + { + $this->_store[$itemName] = array(); + $this->_endPoint = &$this->_store[$itemName]; + + return $this; + } + + /** + * Specify the previously registered item as a literal value. + * + * {@link register()} must be called before this will work. + * + * @param mixed $value + * + * @return Swift_DependencyContainer + */ + public function asValue($value) + { + $endPoint = &$this->_getEndPoint(); + $endPoint['lookupType'] = self::TYPE_VALUE; + $endPoint['value'] = $value; + + return $this; + } + + /** + * Specify the previously registered item as an alias of another item. + * + * @param string $lookup + * + * @return Swift_DependencyContainer + */ + public function asAliasOf($lookup) + { + $endPoint = &$this->_getEndPoint(); + $endPoint['lookupType'] = self::TYPE_ALIAS; + $endPoint['ref'] = $lookup; + + return $this; + } + + /** + * Specify the previously registered item as a new instance of $className. + * + * {@link register()} must be called before this will work. + * Any arguments can be set with {@link withDependencies()}, + * {@link addConstructorValue()} or {@link addConstructorLookup()}. + * + * @see withDependencies(), addConstructorValue(), addConstructorLookup() + * + * @param string $className + * + * @return Swift_DependencyContainer + */ + public function asNewInstanceOf($className) + { + $endPoint = &$this->_getEndPoint(); + $endPoint['lookupType'] = self::TYPE_INSTANCE; + $endPoint['className'] = $className; + + return $this; + } + + /** + * Specify the previously registered item as a shared instance of $className. + * + * {@link register()} must be called before this will work. + * + * @param string $className + * + * @return Swift_DependencyContainer + */ + public function asSharedInstanceOf($className) + { + $endPoint = &$this->_getEndPoint(); + $endPoint['lookupType'] = self::TYPE_SHARED; + $endPoint['className'] = $className; + + return $this; + } + + /** + * Specify a list of injected dependencies for the previously registered item. + * + * This method takes an array of lookup names. + * + * @see addConstructorValue(), addConstructorLookup() + * + * @param array $lookups + * + * @return Swift_DependencyContainer + */ + public function withDependencies(array $lookups) + { + $endPoint = &$this->_getEndPoint(); + $endPoint['args'] = array(); + foreach ($lookups as $lookup) { + $this->addConstructorLookup($lookup); + } + + return $this; + } + + /** + * Specify a literal (non looked up) value for the constructor of the + * previously registered item. + * + * @see withDependencies(), addConstructorLookup() + * + * @param mixed $value + * + * @return Swift_DependencyContainer + */ + public function addConstructorValue($value) + { + $endPoint = &$this->_getEndPoint(); + if (!isset($endPoint['args'])) { + $endPoint['args'] = array(); + } + $endPoint['args'][] = array('type' => 'value', 'item' => $value); + + return $this; + } + + /** + * Specify a dependency lookup for the constructor of the previously + * registered item. + * + * @see withDependencies(), addConstructorValue() + * + * @param string $lookup + * + * @return Swift_DependencyContainer + */ + public function addConstructorLookup($lookup) + { + $endPoint = &$this->_getEndPoint(); + if (!isset($this->_endPoint['args'])) { + $endPoint['args'] = array(); + } + $endPoint['args'][] = array('type' => 'lookup', 'item' => $lookup); + + return $this; + } + + /** Get the literal value with $itemName */ + private function _getValue($itemName) + { + return $this->_store[$itemName]['value']; + } + + /** Resolve an alias to another item */ + private function _createAlias($itemName) + { + return $this->lookup($this->_store[$itemName]['ref']); + } + + /** Create a fresh instance of $itemName */ + private function _createNewInstance($itemName) + { + $reflector = new ReflectionClass($this->_store[$itemName]['className']); + if ($reflector->getConstructor()) { + return $reflector->newInstanceArgs( + $this->createDependenciesFor($itemName) + ); + } + + return $reflector->newInstance(); + } + + /** Create and register a shared instance of $itemName */ + private function _createSharedInstance($itemName) + { + if (!isset($this->_store[$itemName]['instance'])) { + $this->_store[$itemName]['instance'] = $this->_createNewInstance($itemName); + } + + return $this->_store[$itemName]['instance']; + } + + /** Get the current endpoint in the store */ + private function &_getEndPoint() + { + if (!isset($this->_endPoint)) { + throw new BadMethodCallException( + 'Component must first be registered by calling register()' + ); + } + + return $this->_endPoint; + } + + /** Get an argument list with dependencies resolved */ + private function _resolveArgs(array $args) + { + $resolved = array(); + foreach ($args as $argDefinition) { + switch ($argDefinition['type']) { + case 'lookup': + $resolved[] = $this->_lookupRecursive($argDefinition['item']); + break; + case 'value': + $resolved[] = $argDefinition['item']; + break; + } + } + + return $resolved; + } + + /** Resolve a single dependency with an collections */ + private function _lookupRecursive($item) + { + if (is_array($item)) { + $collection = array(); + foreach ($item as $k => $v) { + $collection[$k] = $this->_lookupRecursive($v); + } + + return $collection; + } + + return $this->lookup($item); + } +} diff --git a/lib/SwiftMailer/classes/Swift/DependencyException.php b/lib/SwiftMailer/classes/Swift/DependencyException.php new file mode 100644 index 0000000..799d38d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/DependencyException.php @@ -0,0 +1,27 @@ +createDependenciesFor('mime.embeddedfile') + ); + + $this->setBody($data); + $this->setFilename($filename); + if ($contentType) { + $this->setContentType($contentType); + } + } + + /** + * Create a new EmbeddedFile. + * + * @param string|Swift_OutputByteStream $data + * @param string $filename + * @param string $contentType + * + * @return Swift_Mime_EmbeddedFile + */ + public static function newInstance($data = null, $filename = null, $contentType = null) + { + return new self($data, $filename, $contentType); + } + + /** + * Create a new EmbeddedFile from a filesystem path. + * + * @param string $path + * + * @return Swift_Mime_EmbeddedFile + */ + public static function fromPath($path) + { + return self::newInstance()->setFile( + new Swift_ByteStream_FileByteStream($path) + ); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Encoder.php b/lib/SwiftMailer/classes/Swift/Encoder.php new file mode 100644 index 0000000..2073abc --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Encoder.php @@ -0,0 +1,28 @@ += $maxLineLength || 76 < $maxLineLength) { + $maxLineLength = 76; + } + + $encodedString = base64_encode($string); + $firstLine = ''; + + if (0 != $firstLineOffset) { + $firstLine = substr( + $encodedString, 0, $maxLineLength - $firstLineOffset + )."\r\n"; + $encodedString = substr( + $encodedString, $maxLineLength - $firstLineOffset + ); + } + + return $firstLine.trim(chunk_split($encodedString, $maxLineLength, "\r\n")); + } + + /** + * Does nothing. + */ + public function charsetChanged($charset) + { + } +} diff --git a/lib/SwiftMailer/classes/Swift/Encoder/QpEncoder.php b/lib/SwiftMailer/classes/Swift/Encoder/QpEncoder.php new file mode 100644 index 0000000..8a81fe3 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Encoder/QpEncoder.php @@ -0,0 +1,300 @@ + '=00', 1 => '=01', 2 => '=02', 3 => '=03', 4 => '=04', + 5 => '=05', 6 => '=06', 7 => '=07', 8 => '=08', 9 => '=09', + 10 => '=0A', 11 => '=0B', 12 => '=0C', 13 => '=0D', 14 => '=0E', + 15 => '=0F', 16 => '=10', 17 => '=11', 18 => '=12', 19 => '=13', + 20 => '=14', 21 => '=15', 22 => '=16', 23 => '=17', 24 => '=18', + 25 => '=19', 26 => '=1A', 27 => '=1B', 28 => '=1C', 29 => '=1D', + 30 => '=1E', 31 => '=1F', 32 => '=20', 33 => '=21', 34 => '=22', + 35 => '=23', 36 => '=24', 37 => '=25', 38 => '=26', 39 => '=27', + 40 => '=28', 41 => '=29', 42 => '=2A', 43 => '=2B', 44 => '=2C', + 45 => '=2D', 46 => '=2E', 47 => '=2F', 48 => '=30', 49 => '=31', + 50 => '=32', 51 => '=33', 52 => '=34', 53 => '=35', 54 => '=36', + 55 => '=37', 56 => '=38', 57 => '=39', 58 => '=3A', 59 => '=3B', + 60 => '=3C', 61 => '=3D', 62 => '=3E', 63 => '=3F', 64 => '=40', + 65 => '=41', 66 => '=42', 67 => '=43', 68 => '=44', 69 => '=45', + 70 => '=46', 71 => '=47', 72 => '=48', 73 => '=49', 74 => '=4A', + 75 => '=4B', 76 => '=4C', 77 => '=4D', 78 => '=4E', 79 => '=4F', + 80 => '=50', 81 => '=51', 82 => '=52', 83 => '=53', 84 => '=54', + 85 => '=55', 86 => '=56', 87 => '=57', 88 => '=58', 89 => '=59', + 90 => '=5A', 91 => '=5B', 92 => '=5C', 93 => '=5D', 94 => '=5E', + 95 => '=5F', 96 => '=60', 97 => '=61', 98 => '=62', 99 => '=63', + 100 => '=64', 101 => '=65', 102 => '=66', 103 => '=67', 104 => '=68', + 105 => '=69', 106 => '=6A', 107 => '=6B', 108 => '=6C', 109 => '=6D', + 110 => '=6E', 111 => '=6F', 112 => '=70', 113 => '=71', 114 => '=72', + 115 => '=73', 116 => '=74', 117 => '=75', 118 => '=76', 119 => '=77', + 120 => '=78', 121 => '=79', 122 => '=7A', 123 => '=7B', 124 => '=7C', + 125 => '=7D', 126 => '=7E', 127 => '=7F', 128 => '=80', 129 => '=81', + 130 => '=82', 131 => '=83', 132 => '=84', 133 => '=85', 134 => '=86', + 135 => '=87', 136 => '=88', 137 => '=89', 138 => '=8A', 139 => '=8B', + 140 => '=8C', 141 => '=8D', 142 => '=8E', 143 => '=8F', 144 => '=90', + 145 => '=91', 146 => '=92', 147 => '=93', 148 => '=94', 149 => '=95', + 150 => '=96', 151 => '=97', 152 => '=98', 153 => '=99', 154 => '=9A', + 155 => '=9B', 156 => '=9C', 157 => '=9D', 158 => '=9E', 159 => '=9F', + 160 => '=A0', 161 => '=A1', 162 => '=A2', 163 => '=A3', 164 => '=A4', + 165 => '=A5', 166 => '=A6', 167 => '=A7', 168 => '=A8', 169 => '=A9', + 170 => '=AA', 171 => '=AB', 172 => '=AC', 173 => '=AD', 174 => '=AE', + 175 => '=AF', 176 => '=B0', 177 => '=B1', 178 => '=B2', 179 => '=B3', + 180 => '=B4', 181 => '=B5', 182 => '=B6', 183 => '=B7', 184 => '=B8', + 185 => '=B9', 186 => '=BA', 187 => '=BB', 188 => '=BC', 189 => '=BD', + 190 => '=BE', 191 => '=BF', 192 => '=C0', 193 => '=C1', 194 => '=C2', + 195 => '=C3', 196 => '=C4', 197 => '=C5', 198 => '=C6', 199 => '=C7', + 200 => '=C8', 201 => '=C9', 202 => '=CA', 203 => '=CB', 204 => '=CC', + 205 => '=CD', 206 => '=CE', 207 => '=CF', 208 => '=D0', 209 => '=D1', + 210 => '=D2', 211 => '=D3', 212 => '=D4', 213 => '=D5', 214 => '=D6', + 215 => '=D7', 216 => '=D8', 217 => '=D9', 218 => '=DA', 219 => '=DB', + 220 => '=DC', 221 => '=DD', 222 => '=DE', 223 => '=DF', 224 => '=E0', + 225 => '=E1', 226 => '=E2', 227 => '=E3', 228 => '=E4', 229 => '=E5', + 230 => '=E6', 231 => '=E7', 232 => '=E8', 233 => '=E9', 234 => '=EA', + 235 => '=EB', 236 => '=EC', 237 => '=ED', 238 => '=EE', 239 => '=EF', + 240 => '=F0', 241 => '=F1', 242 => '=F2', 243 => '=F3', 244 => '=F4', + 245 => '=F5', 246 => '=F6', 247 => '=F7', 248 => '=F8', 249 => '=F9', + 250 => '=FA', 251 => '=FB', 252 => '=FC', 253 => '=FD', 254 => '=FE', + 255 => '=FF', + ); + + protected static $_safeMapShare = array(); + + /** + * A map of non-encoded ascii characters. + * + * @var string[] + */ + protected $_safeMap = array(); + + /** + * Creates a new QpEncoder for the given CharacterStream. + * + * @param Swift_CharacterStream $charStream to use for reading characters + * @param Swift_StreamFilter $filter if input should be canonicalized + */ + public function __construct(Swift_CharacterStream $charStream, Swift_StreamFilter $filter = null) + { + $this->_charStream = $charStream; + if (!isset(self::$_safeMapShare[$this->getSafeMapShareId()])) { + $this->initSafeMap(); + self::$_safeMapShare[$this->getSafeMapShareId()] = $this->_safeMap; + } else { + $this->_safeMap = self::$_safeMapShare[$this->getSafeMapShareId()]; + } + $this->_filter = $filter; + } + + public function __sleep() + { + return array('_charStream', '_filter'); + } + + public function __wakeup() + { + if (!isset(self::$_safeMapShare[$this->getSafeMapShareId()])) { + $this->initSafeMap(); + self::$_safeMapShare[$this->getSafeMapShareId()] = $this->_safeMap; + } else { + $this->_safeMap = self::$_safeMapShare[$this->getSafeMapShareId()]; + } + } + + protected function getSafeMapShareId() + { + return get_class($this); + } + + protected function initSafeMap() + { + foreach (array_merge( + array(0x09, 0x20), range(0x21, 0x3C), range(0x3E, 0x7E)) as $byte) { + $this->_safeMap[$byte] = chr($byte); + } + } + + /** + * Takes an unencoded string and produces a QP encoded string from it. + * + * QP encoded strings have a maximum line length of 76 characters. + * If the first line needs to be shorter, indicate the difference with + * $firstLineOffset. + * + * @param string $string to encode + * @param int $firstLineOffset, optional + * @param int $maxLineLength, optional 0 indicates the default of 76 chars + * + * @return string + */ + public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0) + { + if ($maxLineLength > 76 || $maxLineLength <= 0) { + $maxLineLength = 76; + } + + $thisLineLength = $maxLineLength - $firstLineOffset; + + $lines = array(); + $lNo = 0; + $lines[$lNo] = ''; + $currentLine = &$lines[$lNo++]; + $size = $lineLen = 0; + + $this->_charStream->flushContents(); + $this->_charStream->importString($string); + + // Fetching more than 4 chars at one is slower, as is fetching fewer bytes + // Conveniently 4 chars is the UTF-8 safe number since UTF-8 has up to 6 + // bytes per char and (6 * 4 * 3 = 72 chars per line) * =NN is 3 bytes + while (false !== $bytes = $this->_nextSequence()) { + // If we're filtering the input + if (isset($this->_filter)) { + // If we can't filter because we need more bytes + while ($this->_filter->shouldBuffer($bytes)) { + // Then collect bytes into the buffer + if (false === $moreBytes = $this->_nextSequence(1)) { + break; + } + + foreach ($moreBytes as $b) { + $bytes[] = $b; + } + } + // And filter them + $bytes = $this->_filter->filter($bytes); + } + + $enc = $this->_encodeByteSequence($bytes, $size); + + $i = strpos($enc, '=0D=0A'); + $newLineLength = $lineLen + ($i === false ? $size : $i); + + if ($currentLine && $newLineLength >= $thisLineLength) { + $lines[$lNo] = ''; + $currentLine = &$lines[$lNo++]; + $thisLineLength = $maxLineLength; + $lineLen = 0; + } + + $currentLine .= $enc; + + if ($i === false) { + $lineLen += $size; + } else { + // 6 is the length of '=0D=0A'. + $lineLen = $size - strrpos($enc, '=0D=0A') - 6; + } + } + + return $this->_standardize(implode("=\r\n", $lines)); + } + + /** + * Updates the charset used. + * + * @param string $charset + */ + public function charsetChanged($charset) + { + $this->_charStream->setCharacterSet($charset); + } + + /** + * Encode the given byte array into a verbatim QP form. + * + * @param integer[] $bytes + * @param int $size + * + * @return string + */ + protected function _encodeByteSequence(array $bytes, &$size) + { + $ret = ''; + $size = 0; + foreach ($bytes as $b) { + if (isset($this->_safeMap[$b])) { + $ret .= $this->_safeMap[$b]; + ++$size; + } else { + $ret .= self::$_qpMap[$b]; + $size += 3; + } + } + + return $ret; + } + + /** + * Get the next sequence of bytes to read from the char stream. + * + * @param int $size number of bytes to read + * + * @return integer[] + */ + protected function _nextSequence($size = 4) + { + return $this->_charStream->readBytes($size); + } + + /** + * Make sure CRLF is correct and HT/SPACE are in valid places. + * + * @param string $string + * + * @return string + */ + protected function _standardize($string) + { + $string = str_replace(array("\t=0D=0A", ' =0D=0A', '=0D=0A'), + array("=09\r\n", "=20\r\n", "\r\n"), $string + ); + switch ($end = ord(substr($string, -1))) { + case 0x09: + case 0x20: + $string = substr_replace($string, self::$_qpMap[$end], -1); + } + + return $string; + } + + /** + * Make a deep copy of object. + */ + public function __clone() + { + $this->_charStream = clone $this->_charStream; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Encoder/Rfc2231Encoder.php b/lib/SwiftMailer/classes/Swift/Encoder/Rfc2231Encoder.php new file mode 100644 index 0000000..b0215e8 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Encoder/Rfc2231Encoder.php @@ -0,0 +1,92 @@ +_charStream = $charStream; + } + + /** + * Takes an unencoded string and produces a string encoded according to + * RFC 2231 from it. + * + * @param string $string + * @param int $firstLineOffset + * @param int $maxLineLength optional, 0 indicates the default of 75 bytes + * + * @return string + */ + public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0) + { + $lines = array(); + $lineCount = 0; + $lines[] = ''; + $currentLine = &$lines[$lineCount++]; + + if (0 >= $maxLineLength) { + $maxLineLength = 75; + } + + $this->_charStream->flushContents(); + $this->_charStream->importString($string); + + $thisLineLength = $maxLineLength - $firstLineOffset; + + while (false !== $char = $this->_charStream->read(4)) { + $encodedChar = rawurlencode($char); + if (0 != strlen($currentLine) + && strlen($currentLine.$encodedChar) > $thisLineLength) { + $lines[] = ''; + $currentLine = &$lines[$lineCount++]; + $thisLineLength = $maxLineLength; + } + $currentLine .= $encodedChar; + } + + return implode("\r\n", $lines); + } + + /** + * Updates the charset used. + * + * @param string $charset + */ + public function charsetChanged($charset) + { + $this->_charStream->setCharacterSet($charset); + } + + /** + * Make a deep copy of object. + */ + public function __clone() + { + $this->_charStream = clone $this->_charStream; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Encoding.php b/lib/SwiftMailer/classes/Swift/Encoding.php new file mode 100644 index 0000000..253977b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Encoding.php @@ -0,0 +1,64 @@ +lookup($key); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/CommandEvent.php b/lib/SwiftMailer/classes/Swift/Events/CommandEvent.php new file mode 100644 index 0000000..7dc381d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/CommandEvent.php @@ -0,0 +1,65 @@ +_command = $command; + $this->_successCodes = $successCodes; + } + + /** + * Get the command which was sent to the server. + * + * @return string + */ + public function getCommand() + { + return $this->_command; + } + + /** + * Get the numeric response codes which indicate success for this command. + * + * @return integer[] + */ + public function getSuccessCodes() + { + return $this->_successCodes; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/CommandListener.php b/lib/SwiftMailer/classes/Swift/Events/CommandListener.php new file mode 100644 index 0000000..7545404 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/CommandListener.php @@ -0,0 +1,24 @@ +_source = $source; + } + + /** + * Get the source object of this event. + * + * @return object + */ + public function getSource() + { + return $this->_source; + } + + /** + * Prevent this Event from bubbling any further up the stack. + * + * @param bool $cancel, optional + */ + public function cancelBubble($cancel = true) + { + $this->_bubbleCancelled = $cancel; + } + + /** + * Returns true if this Event will not bubble any further up the stack. + * + * @return bool + */ + public function bubbleCancelled() + { + return $this->_bubbleCancelled; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/ResponseEvent.php b/lib/SwiftMailer/classes/Swift/Events/ResponseEvent.php new file mode 100644 index 0000000..2e92ba9 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/ResponseEvent.php @@ -0,0 +1,65 @@ +_response = $response; + $this->_valid = $valid; + } + + /** + * Get the response which was received from the server. + * + * @return string + */ + public function getResponse() + { + return $this->_response; + } + + /** + * Get the success status of this Event. + * + * @return bool + */ + public function isValid() + { + return $this->_valid; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/ResponseListener.php b/lib/SwiftMailer/classes/Swift/Events/ResponseListener.php new file mode 100644 index 0000000..c40919d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/ResponseListener.php @@ -0,0 +1,24 @@ +_message = $message; + $this->_result = self::RESULT_PENDING; + } + + /** + * Get the Transport used to send the Message. + * + * @return Swift_Transport + */ + public function getTransport() + { + return $this->getSource(); + } + + /** + * Get the Message being sent. + * + * @return Swift_Mime_Message + */ + public function getMessage() + { + return $this->_message; + } + + /** + * Set the array of addresses that failed in sending. + * + * @param array $recipients + */ + public function setFailedRecipients($recipients) + { + $this->_failedRecipients = $recipients; + } + + /** + * Get an recipient addresses which were not accepted for delivery. + * + * @return string[] + */ + public function getFailedRecipients() + { + return $this->_failedRecipients; + } + + /** + * Set the result of sending. + * + * @param int $result + */ + public function setResult($result) + { + $this->_result = $result; + } + + /** + * Get the result of this Event. + * + * The return value is a bitmask from + * {@see RESULT_PENDING, RESULT_SUCCESS, RESULT_TENTATIVE, RESULT_FAILED} + * + * @return int + */ + public function getResult() + { + return $this->_result; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/SendListener.php b/lib/SwiftMailer/classes/Swift/Events/SendListener.php new file mode 100644 index 0000000..d922e1b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/SendListener.php @@ -0,0 +1,31 @@ +_eventMap = array( + 'Swift_Events_CommandEvent' => 'Swift_Events_CommandListener', + 'Swift_Events_ResponseEvent' => 'Swift_Events_ResponseListener', + 'Swift_Events_SendEvent' => 'Swift_Events_SendListener', + 'Swift_Events_TransportChangeEvent' => 'Swift_Events_TransportChangeListener', + 'Swift_Events_TransportExceptionEvent' => 'Swift_Events_TransportExceptionListener', + ); + } + + /** + * Create a new SendEvent for $source and $message. + * + * @param Swift_Transport $source + * @param Swift_Mime_Message + * + * @return Swift_Events_SendEvent + */ + public function createSendEvent(Swift_Transport $source, Swift_Mime_Message $message) + { + return new Swift_Events_SendEvent($source, $message); + } + + /** + * Create a new CommandEvent for $source and $command. + * + * @param Swift_Transport $source + * @param string $command That will be executed + * @param array $successCodes That are needed + * + * @return Swift_Events_CommandEvent + */ + public function createCommandEvent(Swift_Transport $source, $command, $successCodes = array()) + { + return new Swift_Events_CommandEvent($source, $command, $successCodes); + } + + /** + * Create a new ResponseEvent for $source and $response. + * + * @param Swift_Transport $source + * @param string $response + * @param bool $valid If the response is valid + * + * @return Swift_Events_ResponseEvent + */ + public function createResponseEvent(Swift_Transport $source, $response, $valid) + { + return new Swift_Events_ResponseEvent($source, $response, $valid); + } + + /** + * Create a new TransportChangeEvent for $source. + * + * @param Swift_Transport $source + * + * @return Swift_Events_TransportChangeEvent + */ + public function createTransportChangeEvent(Swift_Transport $source) + { + return new Swift_Events_TransportChangeEvent($source); + } + + /** + * Create a new TransportExceptionEvent for $source. + * + * @param Swift_Transport $source + * @param Swift_TransportException $ex + * + * @return Swift_Events_TransportExceptionEvent + */ + public function createTransportExceptionEvent(Swift_Transport $source, Swift_TransportException $ex) + { + return new Swift_Events_TransportExceptionEvent($source, $ex); + } + + /** + * Bind an event listener to this dispatcher. + * + * @param Swift_Events_EventListener $listener + */ + public function bindEventListener(Swift_Events_EventListener $listener) + { + foreach ($this->_listeners as $l) { + // Already loaded + if ($l === $listener) { + return; + } + } + $this->_listeners[] = $listener; + } + + /** + * Dispatch the given Event to all suitable listeners. + * + * @param Swift_Events_EventObject $evt + * @param string $target method + */ + public function dispatchEvent(Swift_Events_EventObject $evt, $target) + { + $this->_prepareBubbleQueue($evt); + $this->_bubble($evt, $target); + } + + /** Queue listeners on a stack ready for $evt to be bubbled up it */ + private function _prepareBubbleQueue(Swift_Events_EventObject $evt) + { + $this->_bubbleQueue = array(); + $evtClass = get_class($evt); + foreach ($this->_listeners as $listener) { + if (array_key_exists($evtClass, $this->_eventMap) + && ($listener instanceof $this->_eventMap[$evtClass])) { + $this->_bubbleQueue[] = $listener; + } + } + } + + /** Bubble $evt up the stack calling $target() on each listener */ + private function _bubble(Swift_Events_EventObject $evt, $target) + { + if (!$evt->bubbleCancelled() && $listener = array_shift($this->_bubbleQueue)) { + $listener->$target($evt); + $this->_bubble($evt, $target); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/TransportChangeEvent.php b/lib/SwiftMailer/classes/Swift/Events/TransportChangeEvent.php new file mode 100644 index 0000000..a8972fd --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/TransportChangeEvent.php @@ -0,0 +1,27 @@ +getSource(); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/TransportChangeListener.php b/lib/SwiftMailer/classes/Swift/Events/TransportChangeListener.php new file mode 100644 index 0000000..253165d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/TransportChangeListener.php @@ -0,0 +1,45 @@ +_exception = $ex; + } + + /** + * Get the TransportException thrown. + * + * @return Swift_TransportException + */ + public function getException() + { + return $this->_exception; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Events/TransportExceptionListener.php b/lib/SwiftMailer/classes/Swift/Events/TransportExceptionListener.php new file mode 100644 index 0000000..cc3c099 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Events/TransportExceptionListener.php @@ -0,0 +1,24 @@ +createDependenciesFor('transport.failover') + ); + + $this->setTransports($transports); + } + + /** + * Create a new FailoverTransport instance. + * + * @param Swift_Transport[] $transports + * + * @return Swift_FailoverTransport + */ + public static function newInstance($transports = array()) + { + return new self($transports); + } +} diff --git a/lib/SwiftMailer/classes/Swift/FileSpool.php b/lib/SwiftMailer/classes/Swift/FileSpool.php new file mode 100644 index 0000000..c82c5db --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/FileSpool.php @@ -0,0 +1,208 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Stores Messages on the filesystem. + * + * @author Fabien Potencier + * @author Xavier De Cock + */ +class Swift_FileSpool extends Swift_ConfigurableSpool +{ + /** The spool directory */ + private $_path; + + /** + * File WriteRetry Limit. + * + * @var int + */ + private $_retryLimit = 10; + + /** + * Create a new FileSpool. + * + * @param string $path + * + * @throws Swift_IoException + */ + public function __construct($path) + { + $this->_path = $path; + + if (!file_exists($this->_path)) { + if (!mkdir($this->_path, 0777, true)) { + throw new Swift_IoException(sprintf('Unable to create path "%s".', $this->_path)); + } + } + } + + /** + * Tests if this Spool mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return true; + } + + /** + * Starts this Spool mechanism. + */ + public function start() + { + } + + /** + * Stops this Spool mechanism. + */ + public function stop() + { + } + + /** + * Allow to manage the enqueuing retry limit. + * + * Default, is ten and allows over 64^20 different fileNames + * + * @param int $limit + */ + public function setRetryLimit($limit) + { + $this->_retryLimit = $limit; + } + + /** + * Queues a message. + * + * @param Swift_Mime_Message $message The message to store + * + * @throws Swift_IoException + * + * @return bool + */ + public function queueMessage(Swift_Mime_Message $message) + { + $ser = serialize($message); + $fileName = $this->_path.'/'.$this->getRandomString(10); + for ($i = 0; $i < $this->_retryLimit; ++$i) { + /* We try an exclusive creation of the file. This is an atomic operation, it avoid locking mechanism */ + $fp = @fopen($fileName.'.message', 'x'); + if (false !== $fp) { + if (false === fwrite($fp, $ser)) { + return false; + } + + return fclose($fp); + } else { + /* The file already exists, we try a longer fileName */ + $fileName .= $this->getRandomString(1); + } + } + + throw new Swift_IoException(sprintf('Unable to create a file for enqueuing Message in "%s".', $this->_path)); + } + + /** + * Execute a recovery if for any reason a process is sending for too long. + * + * @param int $timeout in second Defaults is for very slow smtp responses + */ + public function recover($timeout = 900) + { + foreach (new DirectoryIterator($this->_path) as $file) { + $file = $file->getRealPath(); + + if (substr($file, -16) == '.message.sending') { + $lockedtime = filectime($file); + if ((time() - $lockedtime) > $timeout) { + rename($file, substr($file, 0, -8)); + } + } + } + } + + /** + * Sends messages using the given transport instance. + * + * @param Swift_Transport $transport A transport instance + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent e-mail's + */ + public function flushQueue(Swift_Transport $transport, &$failedRecipients = null) + { + $directoryIterator = new DirectoryIterator($this->_path); + + /* Start the transport only if there are queued files to send */ + if (!$transport->isStarted()) { + foreach ($directoryIterator as $file) { + if (substr($file->getRealPath(), -8) == '.message') { + $transport->start(); + break; + } + } + } + + $failedRecipients = (array) $failedRecipients; + $count = 0; + $time = time(); + foreach ($directoryIterator as $file) { + $file = $file->getRealPath(); + + if (substr($file, -8) != '.message') { + continue; + } + + /* We try a rename, it's an atomic operation, and avoid locking the file */ + if (rename($file, $file.'.sending')) { + $message = unserialize(file_get_contents($file.'.sending')); + + $count += $transport->send($message, $failedRecipients); + + unlink($file.'.sending'); + } else { + /* This message has just been catched by another process */ + continue; + } + + if ($this->getMessageLimit() && $count >= $this->getMessageLimit()) { + break; + } + + if ($this->getTimeLimit() && (time() - $time) >= $this->getTimeLimit()) { + break; + } + } + + return $count; + } + + /** + * Returns a random string needed to generate a fileName for the queue. + * + * @param int $count + * + * @return string + */ + protected function getRandomString($count) + { + // This string MUST stay FS safe, avoid special chars + $base = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-'; + $ret = ''; + $strlen = strlen($base); + for ($i = 0; $i < $count; ++$i) { + $ret .= $base[((int) rand(0, $strlen - 1))]; + } + + return $ret; + } +} diff --git a/lib/SwiftMailer/classes/Swift/FileStream.php b/lib/SwiftMailer/classes/Swift/FileStream.php new file mode 100644 index 0000000..0b24db1 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/FileStream.php @@ -0,0 +1,24 @@ +setFile( + new Swift_ByteStream_FileByteStream($path) + ); + + return $image; + } +} diff --git a/lib/SwiftMailer/classes/Swift/InputByteStream.php b/lib/SwiftMailer/classes/Swift/InputByteStream.php new file mode 100644 index 0000000..56efc75 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/InputByteStream.php @@ -0,0 +1,75 @@ +_stream = $stream; + } + + /** + * Set a string into the cache under $itemKey for the namespace $nsKey. + * + * @see MODE_WRITE, MODE_APPEND + * + * @param string $nsKey + * @param string $itemKey + * @param string $string + * @param int $mode + */ + public function setString($nsKey, $itemKey, $string, $mode) + { + $this->_prepareCache($nsKey); + switch ($mode) { + case self::MODE_WRITE: + $this->_contents[$nsKey][$itemKey] = $string; + break; + case self::MODE_APPEND: + if (!$this->hasKey($nsKey, $itemKey)) { + $this->_contents[$nsKey][$itemKey] = ''; + } + $this->_contents[$nsKey][$itemKey] .= $string; + break; + default: + throw new Swift_SwiftException( + 'Invalid mode ['.$mode.'] used to set nsKey='. + $nsKey.', itemKey='.$itemKey + ); + } + } + + /** + * Set a ByteStream into the cache under $itemKey for the namespace $nsKey. + * + * @see MODE_WRITE, MODE_APPEND + * + * @param string $nsKey + * @param string $itemKey + * @param Swift_OutputByteStream $os + * @param int $mode + */ + public function importFromByteStream($nsKey, $itemKey, Swift_OutputByteStream $os, $mode) + { + $this->_prepareCache($nsKey); + switch ($mode) { + case self::MODE_WRITE: + $this->clearKey($nsKey, $itemKey); + case self::MODE_APPEND: + if (!$this->hasKey($nsKey, $itemKey)) { + $this->_contents[$nsKey][$itemKey] = ''; + } + while (false !== $bytes = $os->read(8192)) { + $this->_contents[$nsKey][$itemKey] .= $bytes; + } + break; + default: + throw new Swift_SwiftException( + 'Invalid mode ['.$mode.'] used to set nsKey='. + $nsKey.', itemKey='.$itemKey + ); + } + } + + /** + * Provides a ByteStream which when written to, writes data to $itemKey. + * + * NOTE: The stream will always write in append mode. + * + * @param string $nsKey + * @param string $itemKey + * @param Swift_InputByteStream $writeThrough + * + * @return Swift_InputByteStream + */ + public function getInputByteStream($nsKey, $itemKey, Swift_InputByteStream $writeThrough = null) + { + $is = clone $this->_stream; + $is->setKeyCache($this); + $is->setNsKey($nsKey); + $is->setItemKey($itemKey); + if (isset($writeThrough)) { + $is->setWriteThroughStream($writeThrough); + } + + return $is; + } + + /** + * Get data back out of the cache as a string. + * + * @param string $nsKey + * @param string $itemKey + * + * @return string + */ + public function getString($nsKey, $itemKey) + { + $this->_prepareCache($nsKey); + if ($this->hasKey($nsKey, $itemKey)) { + return $this->_contents[$nsKey][$itemKey]; + } + } + + /** + * Get data back out of the cache as a ByteStream. + * + * @param string $nsKey + * @param string $itemKey + * @param Swift_InputByteStream $is to write the data to + */ + public function exportToByteStream($nsKey, $itemKey, Swift_InputByteStream $is) + { + $this->_prepareCache($nsKey); + $is->write($this->getString($nsKey, $itemKey)); + } + + /** + * Check if the given $itemKey exists in the namespace $nsKey. + * + * @param string $nsKey + * @param string $itemKey + * + * @return bool + */ + public function hasKey($nsKey, $itemKey) + { + $this->_prepareCache($nsKey); + + return array_key_exists($itemKey, $this->_contents[$nsKey]); + } + + /** + * Clear data for $itemKey in the namespace $nsKey if it exists. + * + * @param string $nsKey + * @param string $itemKey + */ + public function clearKey($nsKey, $itemKey) + { + unset($this->_contents[$nsKey][$itemKey]); + } + + /** + * Clear all data in the namespace $nsKey if it exists. + * + * @param string $nsKey + */ + public function clearAll($nsKey) + { + unset($this->_contents[$nsKey]); + } + + /** + * Initialize the namespace of $nsKey if needed. + * + * @param string $nsKey + */ + private function _prepareCache($nsKey) + { + if (!array_key_exists($nsKey, $this->_contents)) { + $this->_contents[$nsKey] = array(); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/KeyCache/DiskKeyCache.php b/lib/SwiftMailer/classes/Swift/KeyCache/DiskKeyCache.php new file mode 100644 index 0000000..453f50a --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/KeyCache/DiskKeyCache.php @@ -0,0 +1,321 @@ +_stream = $stream; + $this->_path = $path; + + if (function_exists('get_magic_quotes_runtime') && @get_magic_quotes_runtime() == 1) { + $this->_quotes = true; + } + } + + /** + * Set a string into the cache under $itemKey for the namespace $nsKey. + * + * @see MODE_WRITE, MODE_APPEND + * + * @param string $nsKey + * @param string $itemKey + * @param string $string + * @param int $mode + * + * @throws Swift_IoException + */ + public function setString($nsKey, $itemKey, $string, $mode) + { + $this->_prepareCache($nsKey); + switch ($mode) { + case self::MODE_WRITE: + $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START); + break; + case self::MODE_APPEND: + $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_END); + break; + default: + throw new Swift_SwiftException( + 'Invalid mode ['.$mode.'] used to set nsKey='. + $nsKey.', itemKey='.$itemKey + ); + break; + } + fwrite($fp, $string); + $this->_freeHandle($nsKey, $itemKey); + } + + /** + * Set a ByteStream into the cache under $itemKey for the namespace $nsKey. + * + * @see MODE_WRITE, MODE_APPEND + * + * @param string $nsKey + * @param string $itemKey + * @param Swift_OutputByteStream $os + * @param int $mode + * + * @throws Swift_IoException + */ + public function importFromByteStream($nsKey, $itemKey, Swift_OutputByteStream $os, $mode) + { + $this->_prepareCache($nsKey); + switch ($mode) { + case self::MODE_WRITE: + $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START); + break; + case self::MODE_APPEND: + $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_END); + break; + default: + throw new Swift_SwiftException( + 'Invalid mode ['.$mode.'] used to set nsKey='. + $nsKey.', itemKey='.$itemKey + ); + break; + } + while (false !== $bytes = $os->read(8192)) { + fwrite($fp, $bytes); + } + $this->_freeHandle($nsKey, $itemKey); + } + + /** + * Provides a ByteStream which when written to, writes data to $itemKey. + * + * NOTE: The stream will always write in append mode. + * + * @param string $nsKey + * @param string $itemKey + * @param Swift_InputByteStream $writeThrough + * + * @return Swift_InputByteStream + */ + public function getInputByteStream($nsKey, $itemKey, Swift_InputByteStream $writeThrough = null) + { + $is = clone $this->_stream; + $is->setKeyCache($this); + $is->setNsKey($nsKey); + $is->setItemKey($itemKey); + if (isset($writeThrough)) { + $is->setWriteThroughStream($writeThrough); + } + + return $is; + } + + /** + * Get data back out of the cache as a string. + * + * @param string $nsKey + * @param string $itemKey + * + * @throws Swift_IoException + * + * @return string + */ + public function getString($nsKey, $itemKey) + { + $this->_prepareCache($nsKey); + if ($this->hasKey($nsKey, $itemKey)) { + $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START); + if ($this->_quotes) { + ini_set('magic_quotes_runtime', 0); + } + $str = ''; + while (!feof($fp) && false !== $bytes = fread($fp, 8192)) { + $str .= $bytes; + } + if ($this->_quotes) { + ini_set('magic_quotes_runtime', 1); + } + $this->_freeHandle($nsKey, $itemKey); + + return $str; + } + } + + /** + * Get data back out of the cache as a ByteStream. + * + * @param string $nsKey + * @param string $itemKey + * @param Swift_InputByteStream $is to write the data to + */ + public function exportToByteStream($nsKey, $itemKey, Swift_InputByteStream $is) + { + if ($this->hasKey($nsKey, $itemKey)) { + $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_START); + if ($this->_quotes) { + ini_set('magic_quotes_runtime', 0); + } + while (!feof($fp) && false !== $bytes = fread($fp, 8192)) { + $is->write($bytes); + } + if ($this->_quotes) { + ini_set('magic_quotes_runtime', 1); + } + $this->_freeHandle($nsKey, $itemKey); + } + } + + /** + * Check if the given $itemKey exists in the namespace $nsKey. + * + * @param string $nsKey + * @param string $itemKey + * + * @return bool + */ + public function hasKey($nsKey, $itemKey) + { + return is_file($this->_path.'/'.$nsKey.'/'.$itemKey); + } + + /** + * Clear data for $itemKey in the namespace $nsKey if it exists. + * + * @param string $nsKey + * @param string $itemKey + */ + public function clearKey($nsKey, $itemKey) + { + if ($this->hasKey($nsKey, $itemKey)) { + $this->_freeHandle($nsKey, $itemKey); + unlink($this->_path.'/'.$nsKey.'/'.$itemKey); + } + } + + /** + * Clear all data in the namespace $nsKey if it exists. + * + * @param string $nsKey + */ + public function clearAll($nsKey) + { + if (array_key_exists($nsKey, $this->_keys)) { + foreach ($this->_keys[$nsKey] as $itemKey => $null) { + $this->clearKey($nsKey, $itemKey); + } + if (is_dir($this->_path.'/'.$nsKey)) { + rmdir($this->_path.'/'.$nsKey); + } + unset($this->_keys[$nsKey]); + } + } + + /** + * Initialize the namespace of $nsKey if needed. + * + * @param string $nsKey + */ + private function _prepareCache($nsKey) + { + $cacheDir = $this->_path.'/'.$nsKey; + if (!is_dir($cacheDir)) { + if (!mkdir($cacheDir)) { + throw new Swift_IoException('Failed to create cache directory '.$cacheDir); + } + $this->_keys[$nsKey] = array(); + } + } + + /** + * Get a file handle on the cache item. + * + * @param string $nsKey + * @param string $itemKey + * @param int $position + * + * @return resource + */ + private function _getHandle($nsKey, $itemKey, $position) + { + if (!isset($this->_keys[$nsKey][$itemKey])) { + $openMode = $this->hasKey($nsKey, $itemKey) ? 'r+b' : 'w+b'; + $fp = fopen($this->_path.'/'.$nsKey.'/'.$itemKey, $openMode); + $this->_keys[$nsKey][$itemKey] = $fp; + } + if (self::POSITION_START == $position) { + fseek($this->_keys[$nsKey][$itemKey], 0, SEEK_SET); + } elseif (self::POSITION_END == $position) { + fseek($this->_keys[$nsKey][$itemKey], 0, SEEK_END); + } + + return $this->_keys[$nsKey][$itemKey]; + } + + private function _freeHandle($nsKey, $itemKey) + { + $fp = $this->_getHandle($nsKey, $itemKey, self::POSITION_CURRENT); + fclose($fp); + $this->_keys[$nsKey][$itemKey] = null; + } + + /** + * Destructor. + */ + public function __destruct() + { + foreach ($this->_keys as $nsKey => $null) { + $this->clearAll($nsKey); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/KeyCache/KeyCacheInputStream.php b/lib/SwiftMailer/classes/Swift/KeyCache/KeyCacheInputStream.php new file mode 100644 index 0000000..af80bdc --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/KeyCache/KeyCacheInputStream.php @@ -0,0 +1,51 @@ +_keyCache = $keyCache; + } + + /** + * Specify a stream to write through for each write(). + * + * @param Swift_InputByteStream $is + */ + public function setWriteThroughStream(Swift_InputByteStream $is) + { + $this->_writeThrough = $is; + } + + /** + * Writes $bytes to the end of the stream. + * + * @param string $bytes + * @param Swift_InputByteStream $is optional + */ + public function write($bytes, Swift_InputByteStream $is = null) + { + $this->_keyCache->setString( + $this->_nsKey, $this->_itemKey, $bytes, Swift_KeyCache::MODE_APPEND + ); + if (isset($is)) { + $is->write($bytes); + } + if (isset($this->_writeThrough)) { + $this->_writeThrough->write($bytes); + } + } + + /** + * Not used. + */ + public function commit() + { + } + + /** + * Not used. + */ + public function bind(Swift_InputByteStream $is) + { + } + + /** + * Not used. + */ + public function unbind(Swift_InputByteStream $is) + { + } + + /** + * Flush the contents of the stream (empty it) and set the internal pointer + * to the beginning. + */ + public function flushBuffers() + { + $this->_keyCache->clearKey($this->_nsKey, $this->_itemKey); + } + + /** + * Set the nsKey which will be written to. + * + * @param string $nsKey + */ + public function setNsKey($nsKey) + { + $this->_nsKey = $nsKey; + } + + /** + * Set the itemKey which will be written to. + * + * @param string $itemKey + */ + public function setItemKey($itemKey) + { + $this->_itemKey = $itemKey; + } + + /** + * Any implementation should be cloneable, allowing the clone to access a + * separate $nsKey and $itemKey. + */ + public function __clone() + { + $this->_writeThrough = null; + } +} diff --git a/lib/SwiftMailer/classes/Swift/LoadBalancedTransport.php b/lib/SwiftMailer/classes/Swift/LoadBalancedTransport.php new file mode 100644 index 0000000..fdba9df --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/LoadBalancedTransport.php @@ -0,0 +1,45 @@ +createDependenciesFor('transport.loadbalanced') + ); + + $this->setTransports($transports); + } + + /** + * Create a new LoadBalancedTransport instance. + * + * @param array $transports + * + * @return Swift_LoadBalancedTransport + */ + public static function newInstance($transports = array()) + { + return new self($transports); + } +} diff --git a/lib/SwiftMailer/classes/Swift/MailTransport.php b/lib/SwiftMailer/classes/Swift/MailTransport.php new file mode 100644 index 0000000..858ca81 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/MailTransport.php @@ -0,0 +1,45 @@ +createDependenciesFor('transport.mail') + ); + + $this->setExtraParams($extraParams); + } + + /** + * Create a new MailTransport instance. + * + * @param string $extraParams To be passed to mail() + * + * @return Swift_MailTransport + */ + public static function newInstance($extraParams = '-f%s') + { + return new self($extraParams); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mailer.php b/lib/SwiftMailer/classes/Swift/Mailer.php new file mode 100644 index 0000000..6411546 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mailer.php @@ -0,0 +1,114 @@ +_transport = $transport; + } + + /** + * Create a new Mailer instance. + * + * @param Swift_Transport $transport + * + * @return Swift_Mailer + */ + public static function newInstance(Swift_Transport $transport) + { + return new self($transport); + } + + /** + * Create a new class instance of one of the message services. + * + * For example 'mimepart' would create a 'message.mimepart' instance + * + * @param string $service + * + * @return object + */ + public function createMessage($service = 'message') + { + return Swift_DependencyContainer::getInstance() + ->lookup('message.'.$service); + } + + /** + * Send the given Message like it would be sent in a mail client. + * + * All recipients (with the exception of Bcc) will be able to see the other + * recipients this message was sent to. + * + * Recipient/sender data will be retrieved from the Message object. + * + * The return value is the number of recipients who were accepted for + * delivery. + * + * @param Swift_Mime_Message $message + * @param array $failedRecipients An array of failures by-reference + * + * @return int The number of successful recipients. Can be 0 which indicates failure + */ + public function send(Swift_Mime_Message $message, &$failedRecipients = null) + { + $failedRecipients = (array) $failedRecipients; + + if (!$this->_transport->isStarted()) { + $this->_transport->start(); + } + + $sent = 0; + + try { + $sent = $this->_transport->send($message, $failedRecipients); + } catch (Swift_RfcComplianceException $e) { + foreach ($message->getTo() as $address => $name) { + $failedRecipients[] = $address; + } + } + + return $sent; + } + + /** + * Register a plugin using a known unique key (e.g. myPlugin). + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->_transport->registerPlugin($plugin); + } + + /** + * The Transport used to send messages. + * + * @return Swift_Transport + */ + public function getTransport() + { + return $this->_transport; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mailer/ArrayRecipientIterator.php b/lib/SwiftMailer/classes/Swift/Mailer/ArrayRecipientIterator.php new file mode 100644 index 0000000..e3e6cad --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mailer/ArrayRecipientIterator.php @@ -0,0 +1,55 @@ +_recipients = $recipients; + } + + /** + * Returns true only if there are more recipients to send to. + * + * @return bool + */ + public function hasNext() + { + return !empty($this->_recipients); + } + + /** + * Returns an array where the keys are the addresses of recipients and the + * values are the names. e.g. ('foo@bar' => 'Foo') or ('foo@bar' => NULL). + * + * @return array + */ + public function nextRecipient() + { + return array_splice($this->_recipients, 0, 1); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mailer/RecipientIterator.php b/lib/SwiftMailer/classes/Swift/Mailer/RecipientIterator.php new file mode 100644 index 0000000..650f3ec --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mailer/RecipientIterator.php @@ -0,0 +1,32 @@ + 'Foo') or ('foo@bar' => NULL). + * + * @return array + */ + public function nextRecipient(); +} diff --git a/lib/SwiftMailer/classes/Swift/MemorySpool.php b/lib/SwiftMailer/classes/Swift/MemorySpool.php new file mode 100644 index 0000000..2cafb67 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/MemorySpool.php @@ -0,0 +1,110 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Stores Messages in memory. + * + * @author Fabien Potencier + */ +class Swift_MemorySpool implements Swift_Spool +{ + protected $messages = array(); + private $flushRetries = 3; + + /** + * Tests if this Transport mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return true; + } + + /** + * Starts this Transport mechanism. + */ + public function start() + { + } + + /** + * Stops this Transport mechanism. + */ + public function stop() + { + } + + /** + * @param int $retries + */ + public function setFlushRetries($retries) + { + $this->flushRetries = $retries; + } + + /** + * Stores a message in the queue. + * + * @param Swift_Mime_Message $message The message to store + * + * @return bool Whether the operation has succeeded + */ + public function queueMessage(Swift_Mime_Message $message) + { + //clone the message to make sure it is not changed while in the queue + $this->messages[] = clone $message; + + return true; + } + + /** + * Sends messages using the given transport instance. + * + * @param Swift_Transport $transport A transport instance + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent emails + */ + public function flushQueue(Swift_Transport $transport, &$failedRecipients = null) + { + if (!$this->messages) { + return 0; + } + + if (!$transport->isStarted()) { + $transport->start(); + } + + $count = 0; + $retries = $this->flushRetries; + while ($retries--) { + try { + while ($message = array_pop($this->messages)) { + $count += $transport->send($message, $failedRecipients); + } + } catch (Swift_TransportException $exception) { + if ($retries) { + // re-queue the message at the end of the queue to give a chance + // to the other messages to be sent, in case the failure was due to + // this message and not just the transport failing + array_unshift($this->messages, $message); + + // wait half a second before we try again + usleep(500000); + } else { + throw $exception; + } + } + } + + return $count; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Message.php b/lib/SwiftMailer/classes/Swift/Message.php new file mode 100644 index 0000000..5f75b93 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Message.php @@ -0,0 +1,291 @@ +createDependenciesFor('mime.message') + ); + + if (!isset($charset)) { + $charset = Swift_DependencyContainer::getInstance() + ->lookup('properties.charset'); + } + $this->setSubject($subject); + $this->setBody($body); + $this->setCharset($charset); + if ($contentType) { + $this->setContentType($contentType); + } + } + + /** + * Create a new Message. + * + * @param string $subject + * @param string $body + * @param string $contentType + * @param string $charset + * + * @return Swift_Message + */ + public static function newInstance($subject = null, $body = null, $contentType = null, $charset = null) + { + return new self($subject, $body, $contentType, $charset); + } + + /** + * Add a MimePart to this Message. + * + * @param string|Swift_OutputByteStream $body + * @param string $contentType + * @param string $charset + * + * @return Swift_Mime_SimpleMessage + */ + public function addPart($body, $contentType = null, $charset = null) + { + return $this->attach(Swift_MimePart::newInstance( + $body, $contentType, $charset + )); + } + + /** + * Detach a signature handler from a message. + * + * @param Swift_Signer $signer + * + * @return Swift_Message + */ + public function attachSigner(Swift_Signer $signer) + { + if ($signer instanceof Swift_Signers_HeaderSigner) { + $this->headerSigners[] = $signer; + } elseif ($signer instanceof Swift_Signers_BodySigner) { + $this->bodySigners[] = $signer; + } + + return $this; + } + + /** + * Attach a new signature handler to the message. + * + * @param Swift_Signer $signer + * + * @return Swift_Message + */ + public function detachSigner(Swift_Signer $signer) + { + if ($signer instanceof Swift_Signers_HeaderSigner) { + foreach ($this->headerSigners as $k => $headerSigner) { + if ($headerSigner === $signer) { + unset($this->headerSigners[$k]); + + return $this; + } + } + } elseif ($signer instanceof Swift_Signers_BodySigner) { + foreach ($this->bodySigners as $k => $bodySigner) { + if ($bodySigner === $signer) { + unset($this->bodySigners[$k]); + + return $this; + } + } + } + + return $this; + } + + /** + * Get this message as a complete string. + * + * @return string + */ + public function toString() + { + if (empty($this->headerSigners) && empty($this->bodySigners)) { + return parent::toString(); + } + + $this->saveMessage(); + + $this->doSign(); + + $string = parent::toString(); + + $this->restoreMessage(); + + return $string; + } + + /** + * Write this message to a {@link Swift_InputByteStream}. + * + * @param Swift_InputByteStream $is + */ + public function toByteStream(Swift_InputByteStream $is) + { + if (empty($this->headerSigners) && empty($this->bodySigners)) { + parent::toByteStream($is); + + return; + } + + $this->saveMessage(); + + $this->doSign(); + + parent::toByteStream($is); + + $this->restoreMessage(); + } + + public function __wakeup() + { + Swift_DependencyContainer::getInstance()->createDependenciesFor('mime.message'); + } + + /** + * loops through signers and apply the signatures. + */ + protected function doSign() + { + foreach ($this->bodySigners as $signer) { + $altered = $signer->getAlteredHeaders(); + $this->saveHeaders($altered); + $signer->signMessage($this); + } + + foreach ($this->headerSigners as $signer) { + $altered = $signer->getAlteredHeaders(); + $this->saveHeaders($altered); + $signer->reset(); + + $signer->setHeaders($this->getHeaders()); + + $signer->startBody(); + $this->_bodyToByteStream($signer); + $signer->endBody(); + + $signer->addSignature($this->getHeaders()); + } + } + + /** + * save the message before any signature is applied. + */ + protected function saveMessage() + { + $this->savedMessage = array('headers' => array()); + $this->savedMessage['body'] = $this->getBody(); + $this->savedMessage['children'] = $this->getChildren(); + if (count($this->savedMessage['children']) > 0 && $this->getBody() != '') { + $this->setChildren(array_merge(array($this->_becomeMimePart()), $this->savedMessage['children'])); + $this->setBody(''); + } + } + + /** + * save the original headers. + * + * @param array $altered + */ + protected function saveHeaders(array $altered) + { + foreach ($altered as $head) { + $lc = strtolower($head); + + if (!isset($this->savedMessage['headers'][$lc])) { + $this->savedMessage['headers'][$lc] = $this->getHeaders()->getAll($head); + } + } + } + + /** + * Remove or restore altered headers. + */ + protected function restoreHeaders() + { + foreach ($this->savedMessage['headers'] as $name => $savedValue) { + $headers = $this->getHeaders()->getAll($name); + + foreach ($headers as $key => $value) { + if (!isset($savedValue[$key])) { + $this->getHeaders()->remove($name, $key); + } + } + } + } + + /** + * Restore message body. + */ + protected function restoreMessage() + { + $this->setBody($this->savedMessage['body']); + $this->setChildren($this->savedMessage['children']); + + $this->restoreHeaders(); + $this->savedMessage = array(); + } + + /** + * Clone Message Signers. + * + * @see Swift_Mime_SimpleMimeEntity::__clone() + */ + public function __clone() + { + parent::__clone(); + foreach ($this->bodySigners as $key => $bodySigner) { + $this->bodySigners[$key] = clone($bodySigner); + } + + foreach ($this->headerSigners as $key => $headerSigner) { + $this->headerSigners[$key] = clone($headerSigner); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Attachment.php b/lib/SwiftMailer/classes/Swift/Mime/Attachment.php new file mode 100644 index 0000000..46a5e8d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Attachment.php @@ -0,0 +1,149 @@ +setDisposition('attachment'); + $this->setContentType('application/octet-stream'); + $this->_mimeTypes = $mimeTypes; + } + + /** + * Get the nesting level used for this attachment. + * + * Always returns {@link LEVEL_MIXED}. + * + * @return int + */ + public function getNestingLevel() + { + return self::LEVEL_MIXED; + } + + /** + * Get the Content-Disposition of this attachment. + * + * By default attachments have a disposition of "attachment". + * + * @return string + */ + public function getDisposition() + { + return $this->_getHeaderFieldModel('Content-Disposition'); + } + + /** + * Set the Content-Disposition of this attachment. + * + * @param string $disposition + * + * @return Swift_Mime_Attachment + */ + public function setDisposition($disposition) + { + if (!$this->_setHeaderFieldModel('Content-Disposition', $disposition)) { + $this->getHeaders()->addParameterizedHeader('Content-Disposition', $disposition); + } + + return $this; + } + + /** + * Get the filename of this attachment when downloaded. + * + * @return string + */ + public function getFilename() + { + return $this->_getHeaderParameter('Content-Disposition', 'filename'); + } + + /** + * Set the filename of this attachment. + * + * @param string $filename + * + * @return Swift_Mime_Attachment + */ + public function setFilename($filename) + { + $this->_setHeaderParameter('Content-Disposition', 'filename', $filename); + $this->_setHeaderParameter('Content-Type', 'name', $filename); + + return $this; + } + + /** + * Get the file size of this attachment. + * + * @return int + */ + public function getSize() + { + return $this->_getHeaderParameter('Content-Disposition', 'size'); + } + + /** + * Set the file size of this attachment. + * + * @param int $size + * + * @return Swift_Mime_Attachment + */ + public function setSize($size) + { + $this->_setHeaderParameter('Content-Disposition', 'size', $size); + + return $this; + } + + /** + * Set the file that this attachment is for. + * + * @param Swift_FileStream $file + * @param string $contentType optional + * + * @return Swift_Mime_Attachment + */ + public function setFile(Swift_FileStream $file, $contentType = null) + { + $this->setFilename(basename($file->getPath())); + $this->setBody($file, $contentType); + if (!isset($contentType)) { + $extension = strtolower(substr($file->getPath(), strrpos($file->getPath(), '.') + 1)); + + if (array_key_exists($extension, $this->_mimeTypes)) { + $this->setContentType($this->_mimeTypes[$extension]); + } + } + + return $this; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/CharsetObserver.php b/lib/SwiftMailer/classes/Swift/Mime/CharsetObserver.php new file mode 100644 index 0000000..b49c3a8 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/CharsetObserver.php @@ -0,0 +1,24 @@ += $maxLineLength || 76 < $maxLineLength) { + $maxLineLength = 76; + } + + $remainder = 0; + $base64ReadBufferRemainderBytes = null; + + // To reduce memory usage, the output buffer is streamed to the input buffer like so: + // Output Stream => base64encode => wrap line length => Input Stream + // HOWEVER it's important to note that base64_encode() should only be passed whole triplets of data (except for the final chunk of data) + // otherwise it will assume the input data has *ended* and it will incorrectly pad/terminate the base64 data mid-stream. + // We use $base64ReadBufferRemainderBytes to carry over 1-2 "remainder" bytes from the each chunk from OutputStream and pre-pend those onto the + // chunk of bytes read in the next iteration. + // When the OutputStream is empty, we must flush any remainder bytes. + while (true) { + $readBytes = $os->read(8192); + $atEOF = ($readBytes === false); + + if ($atEOF) { + $streamTheseBytes = $base64ReadBufferRemainderBytes; + } else { + $streamTheseBytes = $base64ReadBufferRemainderBytes.$readBytes; + } + $base64ReadBufferRemainderBytes = null; + $bytesLength = strlen($streamTheseBytes); + + if ($bytesLength === 0) { // no data left to encode + break; + } + + // if we're not on the last block of the ouput stream, make sure $streamTheseBytes ends with a complete triplet of data + // and carry over remainder 1-2 bytes to the next loop iteration + if (!$atEOF) { + $excessBytes = $bytesLength % 3; + if ($excessBytes !== 0) { + $base64ReadBufferRemainderBytes = substr($streamTheseBytes, -$excessBytes); + $streamTheseBytes = substr($streamTheseBytes, 0, $bytesLength - $excessBytes); + } + } + + $encoded = base64_encode($streamTheseBytes); + $encodedTransformed = ''; + $thisMaxLineLength = $maxLineLength - $remainder - $firstLineOffset; + + while ($thisMaxLineLength < strlen($encoded)) { + $encodedTransformed .= substr($encoded, 0, $thisMaxLineLength)."\r\n"; + $firstLineOffset = 0; + $encoded = substr($encoded, $thisMaxLineLength); + $thisMaxLineLength = $maxLineLength; + $remainder = 0; + } + + if (0 < $remainingLength = strlen($encoded)) { + $remainder += $remainingLength; + $encodedTransformed .= $encoded; + $encoded = null; + } + + $is->write($encodedTransformed); + + if ($atEOF) { + break; + } + } + } + + /** + * Get the name of this encoding scheme. + * Returns the string 'base64'. + * + * @return string + */ + public function getName() + { + return 'base64'; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php new file mode 100644 index 0000000..710b5ac --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/NativeQpContentEncoder.php @@ -0,0 +1,123 @@ +charset = $charset ? $charset : 'utf-8'; + } + + /** + * Notify this observer that the entity's charset has changed. + * + * @param string $charset + */ + public function charsetChanged($charset) + { + $this->charset = $charset; + } + + /** + * Encode $in to $out. + * + * @param Swift_OutputByteStream $os to read from + * @param Swift_InputByteStream $is to write to + * @param int $firstLineOffset + * @param int $maxLineLength 0 indicates the default length for this encoding + * + * @throws RuntimeException + */ + public function encodeByteStream(Swift_OutputByteStream $os, Swift_InputByteStream $is, $firstLineOffset = 0, $maxLineLength = 0) + { + if ($this->charset !== 'utf-8') { + throw new RuntimeException( + sprintf('Charset "%s" not supported. NativeQpContentEncoder only supports "utf-8"', $this->charset)); + } + + $string = ''; + + while (false !== $bytes = $os->read(8192)) { + $string .= $bytes; + } + + $is->write($this->encodeString($string)); + } + + /** + * Get the MIME name of this content encoding scheme. + * + * @return string + */ + public function getName() + { + return 'quoted-printable'; + } + + /** + * Encode a given string to produce an encoded string. + * + * @param string $string + * @param int $firstLineOffset if first line needs to be shorter + * @param int $maxLineLength 0 indicates the default length for this encoding + * + * @throws RuntimeException + * + * @return string + */ + public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0) + { + if ($this->charset !== 'utf-8') { + throw new RuntimeException( + sprintf('Charset "%s" not supported. NativeQpContentEncoder only supports "utf-8"', $this->charset)); + } + + return $this->_standardize(quoted_printable_encode($string)); + } + + /** + * Make sure CRLF is correct and HT/SPACE are in valid places. + * + * @param string $string + * + * @return string + */ + protected function _standardize($string) + { + // transform CR or LF to CRLF + $string = preg_replace('~=0D(?!=0A)|(?_name = $name; + $this->_canonical = $canonical; + } + + /** + * Encode a given string to produce an encoded string. + * + * @param string $string + * @param int $firstLineOffset ignored + * @param int $maxLineLength - 0 means no wrapping will occur + * + * @return string + */ + public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0) + { + if ($this->_canonical) { + $string = $this->_canonicalize($string); + } + + return $this->_safeWordWrap($string, $maxLineLength, "\r\n"); + } + + /** + * Encode stream $in to stream $out. + * + * @param Swift_OutputByteStream $os + * @param Swift_InputByteStream $is + * @param int $firstLineOffset ignored + * @param int $maxLineLength optional, 0 means no wrapping will occur + */ + public function encodeByteStream(Swift_OutputByteStream $os, Swift_InputByteStream $is, $firstLineOffset = 0, $maxLineLength = 0) + { + $leftOver = ''; + while (false !== $bytes = $os->read(8192)) { + $toencode = $leftOver.$bytes; + if ($this->_canonical) { + $toencode = $this->_canonicalize($toencode); + } + $wrapped = $this->_safeWordWrap($toencode, $maxLineLength, "\r\n"); + $lastLinePos = strrpos($wrapped, "\r\n"); + $leftOver = substr($wrapped, $lastLinePos); + $wrapped = substr($wrapped, 0, $lastLinePos); + + $is->write($wrapped); + } + if (strlen($leftOver)) { + $is->write($leftOver); + } + } + + /** + * Get the name of this encoding scheme. + * + * @return string + */ + public function getName() + { + return $this->_name; + } + + /** + * Not used. + */ + public function charsetChanged($charset) + { + } + + /** + * A safer (but weaker) wordwrap for unicode. + * + * @param string $string + * @param int $length + * @param string $le + * + * @return string + */ + private function _safeWordwrap($string, $length = 75, $le = "\r\n") + { + if (0 >= $length) { + return $string; + } + + $originalLines = explode($le, $string); + + $lines = array(); + $lineCount = 0; + + foreach ($originalLines as $originalLine) { + $lines[] = ''; + $currentLine = &$lines[$lineCount++]; + + //$chunks = preg_split('/(?<=[\ \t,\.!\?\-&\+\/])/', $originalLine); + $chunks = preg_split('/(?<=\s)/', $originalLine); + + foreach ($chunks as $chunk) { + if (0 != strlen($currentLine) + && strlen($currentLine.$chunk) > $length) { + $lines[] = ''; + $currentLine = &$lines[$lineCount++]; + } + $currentLine .= $chunk; + } + } + + return implode("\r\n", $lines); + } + + /** + * Canonicalize string input (fix CRLF). + * + * @param string $string + * + * @return string + */ + private function _canonicalize($string) + { + return str_replace( + array("\r\n", "\r", "\n"), + array("\n", "\n", "\r\n"), + $string + ); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoder.php b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoder.php new file mode 100644 index 0000000..5cc907b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoder.php @@ -0,0 +1,134 @@ +_dotEscape = $dotEscape; + parent::__construct($charStream, $filter); + } + + public function __sleep() + { + return array('_charStream', '_filter', '_dotEscape'); + } + + protected function getSafeMapShareId() + { + return get_class($this).($this->_dotEscape ? '.dotEscape' : ''); + } + + protected function initSafeMap() + { + parent::initSafeMap(); + if ($this->_dotEscape) { + /* Encode . as =2e for buggy remote servers */ + unset($this->_safeMap[0x2e]); + } + } + + /** + * Encode stream $in to stream $out. + * + * QP encoded strings have a maximum line length of 76 characters. + * If the first line needs to be shorter, indicate the difference with + * $firstLineOffset. + * + * @param Swift_OutputByteStream $os output stream + * @param Swift_InputByteStream $is input stream + * @param int $firstLineOffset + * @param int $maxLineLength + */ + public function encodeByteStream(Swift_OutputByteStream $os, Swift_InputByteStream $is, $firstLineOffset = 0, $maxLineLength = 0) + { + if ($maxLineLength > 76 || $maxLineLength <= 0) { + $maxLineLength = 76; + } + + $thisLineLength = $maxLineLength - $firstLineOffset; + + $this->_charStream->flushContents(); + $this->_charStream->importByteStream($os); + + $currentLine = ''; + $prepend = ''; + $size = $lineLen = 0; + + while (false !== $bytes = $this->_nextSequence()) { + // If we're filtering the input + if (isset($this->_filter)) { + // If we can't filter because we need more bytes + while ($this->_filter->shouldBuffer($bytes)) { + // Then collect bytes into the buffer + if (false === $moreBytes = $this->_nextSequence(1)) { + break; + } + + foreach ($moreBytes as $b) { + $bytes[] = $b; + } + } + // And filter them + $bytes = $this->_filter->filter($bytes); + } + + $enc = $this->_encodeByteSequence($bytes, $size); + + $i = strpos($enc, '=0D=0A'); + $newLineLength = $lineLen + ($i === false ? $size : $i); + + if ($currentLine && $newLineLength >= $thisLineLength) { + $is->write($prepend.$this->_standardize($currentLine)); + $currentLine = ''; + $prepend = "=\r\n"; + $thisLineLength = $maxLineLength; + $lineLen = 0; + } + + $currentLine .= $enc; + + if ($i === false) { + $lineLen += $size; + } else { + // 6 is the length of '=0D=0A'. + $lineLen = $size - strrpos($enc, '=0D=0A') - 6; + } + } + if (strlen($currentLine)) { + $is->write($prepend.$this->_standardize($currentLine)); + } + } + + /** + * Get the name of this encoding scheme. + * Returns the string 'quoted-printable'. + * + * @return string + */ + public function getName() + { + return 'quoted-printable'; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoderProxy.php b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoderProxy.php new file mode 100644 index 0000000..3214e1c --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/QpContentEncoderProxy.php @@ -0,0 +1,98 @@ + + */ +class Swift_Mime_ContentEncoder_QpContentEncoderProxy implements Swift_Mime_ContentEncoder +{ + /** + * @var Swift_Mime_ContentEncoder_QpContentEncoder + */ + private $safeEncoder; + + /** + * @var Swift_Mime_ContentEncoder_NativeQpContentEncoder + */ + private $nativeEncoder; + + /** + * @var null|string + */ + private $charset; + + /** + * Constructor. + * + * @param Swift_Mime_ContentEncoder_QpContentEncoder $safeEncoder + * @param Swift_Mime_ContentEncoder_NativeQpContentEncoder $nativeEncoder + * @param string|null $charset + */ + public function __construct(Swift_Mime_ContentEncoder_QpContentEncoder $safeEncoder, Swift_Mime_ContentEncoder_NativeQpContentEncoder $nativeEncoder, $charset) + { + $this->safeEncoder = $safeEncoder; + $this->nativeEncoder = $nativeEncoder; + $this->charset = $charset; + } + + /** + * Make a deep copy of object. + */ + public function __clone() + { + $this->safeEncoder = clone $this->safeEncoder; + $this->nativeEncoder = clone $this->nativeEncoder; + } + + /** + * {@inheritdoc} + */ + public function charsetChanged($charset) + { + $this->charset = $charset; + $this->safeEncoder->charsetChanged($charset); + } + + /** + * {@inheritdoc} + */ + public function encodeByteStream(Swift_OutputByteStream $os, Swift_InputByteStream $is, $firstLineOffset = 0, $maxLineLength = 0) + { + $this->getEncoder()->encodeByteStream($os, $is, $firstLineOffset, $maxLineLength); + } + + /** + * {@inheritdoc} + */ + public function getName() + { + return 'quoted-printable'; + } + + /** + * {@inheritdoc} + */ + public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0) + { + return $this->getEncoder()->encodeString($string, $firstLineOffset, $maxLineLength); + } + + /** + * @return Swift_Mime_ContentEncoder + */ + private function getEncoder() + { + return 'utf-8' === $this->charset ? $this->nativeEncoder : $this->safeEncoder; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/RawContentEncoder.php b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/RawContentEncoder.php new file mode 100644 index 0000000..0b8526e --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/ContentEncoder/RawContentEncoder.php @@ -0,0 +1,64 @@ + + */ +class Swift_Mime_ContentEncoder_RawContentEncoder implements Swift_Mime_ContentEncoder +{ + /** + * Encode a given string to produce an encoded string. + * + * @param string $string + * @param int $firstLineOffset ignored + * @param int $maxLineLength ignored + * + * @return string + */ + public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0) + { + return $string; + } + + /** + * Encode stream $in to stream $out. + * + * @param Swift_OutputByteStream $in + * @param Swift_InputByteStream $out + * @param int $firstLineOffset ignored + * @param int $maxLineLength ignored + */ + public function encodeByteStream(Swift_OutputByteStream $os, Swift_InputByteStream $is, $firstLineOffset = 0, $maxLineLength = 0) + { + while (false !== ($bytes = $os->read(8192))) { + $is->write($bytes); + } + } + + /** + * Get the name of this encoding scheme. + * + * @return string + */ + public function getName() + { + return 'raw'; + } + + /** + * Not used. + */ + public function charsetChanged($charset) + { + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/EmbeddedFile.php b/lib/SwiftMailer/classes/Swift/Mime/EmbeddedFile.php new file mode 100644 index 0000000..6af7571 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/EmbeddedFile.php @@ -0,0 +1,45 @@ +setDisposition('inline'); + $this->setId($this->getId()); + } + + /** + * Get the nesting level of this EmbeddedFile. + * + * Returns {@see LEVEL_RELATED}. + * + * @return int + */ + public function getNestingLevel() + { + return self::LEVEL_RELATED; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/EncodingObserver.php b/lib/SwiftMailer/classes/Swift/Mime/EncodingObserver.php new file mode 100644 index 0000000..cc44a6e --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/EncodingObserver.php @@ -0,0 +1,24 @@ +init(); + } + + public function __wakeup() + { + $this->init(); + } + + protected function init() + { + if (count(self::$_specials) > 0) { + return; + } + + self::$_specials = array( + '(', ')', '<', '>', '[', ']', + ':', ';', '@', ',', '.', '"', + ); + + /*** Refer to RFC 2822 for ABNF grammar ***/ + + // All basic building blocks + self::$_grammar['NO-WS-CTL'] = '[\x01-\x08\x0B\x0C\x0E-\x19\x7F]'; + self::$_grammar['WSP'] = '[ \t]'; + self::$_grammar['CRLF'] = '(?:\r\n)'; + self::$_grammar['FWS'] = '(?:(?:'.self::$_grammar['WSP'].'*'. + self::$_grammar['CRLF'].')?'.self::$_grammar['WSP'].')'; + self::$_grammar['text'] = '[\x00-\x08\x0B\x0C\x0E-\x7F]'; + self::$_grammar['quoted-pair'] = '(?:\\\\'.self::$_grammar['text'].')'; + self::$_grammar['ctext'] = '(?:'.self::$_grammar['NO-WS-CTL']. + '|[\x21-\x27\x2A-\x5B\x5D-\x7E])'; + // Uses recursive PCRE (?1) -- could be a weak point?? + self::$_grammar['ccontent'] = '(?:'.self::$_grammar['ctext'].'|'. + self::$_grammar['quoted-pair'].'|(?1))'; + self::$_grammar['comment'] = '(\((?:'.self::$_grammar['FWS'].'|'. + self::$_grammar['ccontent'].')*'.self::$_grammar['FWS'].'?\))'; + self::$_grammar['CFWS'] = '(?:(?:'.self::$_grammar['FWS'].'?'. + self::$_grammar['comment'].')*(?:(?:'.self::$_grammar['FWS'].'?'. + self::$_grammar['comment'].')|'.self::$_grammar['FWS'].'))'; + self::$_grammar['qtext'] = '(?:'.self::$_grammar['NO-WS-CTL']. + '|[\x21\x23-\x5B\x5D-\x7E])'; + self::$_grammar['qcontent'] = '(?:'.self::$_grammar['qtext'].'|'. + self::$_grammar['quoted-pair'].')'; + self::$_grammar['quoted-string'] = '(?:'.self::$_grammar['CFWS'].'?"'. + '('.self::$_grammar['FWS'].'?'.self::$_grammar['qcontent'].')*'. + self::$_grammar['FWS'].'?"'.self::$_grammar['CFWS'].'?)'; + self::$_grammar['atext'] = '[a-zA-Z0-9!#\$%&\'\*\+\-\/=\?\^_`\{\}\|~]'; + self::$_grammar['atom'] = '(?:'.self::$_grammar['CFWS'].'?'. + self::$_grammar['atext'].'+'.self::$_grammar['CFWS'].'?)'; + self::$_grammar['dot-atom-text'] = '(?:'.self::$_grammar['atext'].'+'. + '(\.'.self::$_grammar['atext'].'+)*)'; + self::$_grammar['dot-atom'] = '(?:'.self::$_grammar['CFWS'].'?'. + self::$_grammar['dot-atom-text'].'+'.self::$_grammar['CFWS'].'?)'; + self::$_grammar['word'] = '(?:'.self::$_grammar['atom'].'|'. + self::$_grammar['quoted-string'].')'; + self::$_grammar['phrase'] = '(?:'.self::$_grammar['word'].'+?)'; + self::$_grammar['no-fold-quote'] = '(?:"(?:'.self::$_grammar['qtext']. + '|'.self::$_grammar['quoted-pair'].')*")'; + self::$_grammar['dtext'] = '(?:'.self::$_grammar['NO-WS-CTL']. + '|[\x21-\x5A\x5E-\x7E])'; + self::$_grammar['no-fold-literal'] = '(?:\[(?:'.self::$_grammar['dtext']. + '|'.self::$_grammar['quoted-pair'].')*\])'; + + // Message IDs + self::$_grammar['id-left'] = '(?:'.self::$_grammar['dot-atom-text'].'|'. + self::$_grammar['no-fold-quote'].')'; + self::$_grammar['id-right'] = '(?:'.self::$_grammar['dot-atom-text'].'|'. + self::$_grammar['no-fold-literal'].')'; + + // Addresses, mailboxes and paths + self::$_grammar['local-part'] = '(?:'.self::$_grammar['dot-atom'].'|'. + self::$_grammar['quoted-string'].')'; + self::$_grammar['dcontent'] = '(?:'.self::$_grammar['dtext'].'|'. + self::$_grammar['quoted-pair'].')'; + self::$_grammar['domain-literal'] = '(?:'.self::$_grammar['CFWS'].'?\[('. + self::$_grammar['FWS'].'?'.self::$_grammar['dcontent'].')*?'. + self::$_grammar['FWS'].'?\]'.self::$_grammar['CFWS'].'?)'; + self::$_grammar['domain'] = '(?:'.self::$_grammar['dot-atom'].'|'. + self::$_grammar['domain-literal'].')'; + self::$_grammar['addr-spec'] = '(?:'.self::$_grammar['local-part'].'@'. + self::$_grammar['domain'].')'; + } + + /** + * Get the grammar defined for $name token. + * + * @param string $name exactly as written in the RFC + * + * @return string + */ + public function getDefinition($name) + { + if (array_key_exists($name, self::$_grammar)) { + return self::$_grammar[$name]; + } + + throw new Swift_RfcComplianceException( + "No such grammar '".$name."' defined." + ); + } + + /** + * Returns the tokens defined in RFC 2822 (and some related RFCs). + * + * @return array + */ + public function getGrammarDefinitions() + { + return self::$_grammar; + } + + /** + * Returns the current special characters used in the syntax which need to be escaped. + * + * @return array + */ + public function getSpecials() + { + return self::$_specials; + } + + /** + * Escape special characters in a string (convert to quoted-pairs). + * + * @param string $token + * @param string[] $include additional chars to escape + * @param string[] $exclude chars from escaping + * + * @return string + */ + public function escapeSpecials($token, $include = array(), $exclude = array()) + { + foreach (array_merge(array('\\'), array_diff(self::$_specials, $exclude), $include) as $char) { + $token = str_replace($char, '\\'.$char, $token); + } + + return $token; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Header.php b/lib/SwiftMailer/classes/Swift/Mime/Header.php new file mode 100644 index 0000000..a8ddd27 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Header.php @@ -0,0 +1,93 @@ +getName(), "\r\n"); + mb_internal_encoding($old); + + return $newstring; + } + + return parent::encodeString($string, $firstLineOffset, $maxLineLength); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/HeaderEncoder/QpHeaderEncoder.php b/lib/SwiftMailer/classes/Swift/Mime/HeaderEncoder/QpHeaderEncoder.php new file mode 100644 index 0000000..510dd66 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/HeaderEncoder/QpHeaderEncoder.php @@ -0,0 +1,65 @@ +_safeMap[$byte] = chr($byte); + } + } + + /** + * Get the name of this encoding scheme. + * + * Returns the string 'Q'. + * + * @return string + */ + public function getName() + { + return 'Q'; + } + + /** + * Takes an unencoded string and produces a QP encoded string from it. + * + * @param string $string string to encode + * @param int $firstLineOffset optional + * @param int $maxLineLength optional, 0 indicates the default of 76 chars + * + * @return string + */ + public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0) + { + return str_replace(array(' ', '=20', "=\r\n"), array('_', '_', "\r\n"), + parent::encodeString($string, $firstLineOffset, $maxLineLength) + ); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/HeaderFactory.php b/lib/SwiftMailer/classes/Swift/Mime/HeaderFactory.php new file mode 100644 index 0000000..c65f26d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/HeaderFactory.php @@ -0,0 +1,78 @@ +setGrammar($grammar); + } + + /** + * Set the character set used in this Header. + * + * @param string $charset + */ + public function setCharset($charset) + { + $this->clearCachedValueIf($charset != $this->_charset); + $this->_charset = $charset; + if (isset($this->_encoder)) { + $this->_encoder->charsetChanged($charset); + } + } + + /** + * Get the character set used in this Header. + * + * @return string + */ + public function getCharset() + { + return $this->_charset; + } + + /** + * Set the language used in this Header. + * + * For example, for US English, 'en-us'. + * This can be unspecified. + * + * @param string $lang + */ + public function setLanguage($lang) + { + $this->clearCachedValueIf($this->_lang != $lang); + $this->_lang = $lang; + } + + /** + * Get the language used in this Header. + * + * @return string + */ + public function getLanguage() + { + return $this->_lang; + } + + /** + * Set the encoder used for encoding the header. + * + * @param Swift_Mime_HeaderEncoder $encoder + */ + public function setEncoder(Swift_Mime_HeaderEncoder $encoder) + { + $this->_encoder = $encoder; + $this->setCachedValue(null); + } + + /** + * Get the encoder used for encoding this Header. + * + * @return Swift_Mime_HeaderEncoder + */ + public function getEncoder() + { + return $this->_encoder; + } + + /** + * Set the grammar used for the header. + * + * @param Swift_Mime_Grammar $grammar + */ + public function setGrammar(Swift_Mime_Grammar $grammar) + { + $this->_grammar = $grammar; + $this->setCachedValue(null); + } + + /** + * Get the grammar used for this Header. + * + * @return Swift_Mime_Grammar + */ + public function getGrammar() + { + return $this->_grammar; + } + + /** + * Get the name of this header (e.g. charset). + * + * @return string + */ + public function getFieldName() + { + return $this->_name; + } + + /** + * Set the maximum length of lines in the header (excluding EOL). + * + * @param int $lineLength + */ + public function setMaxLineLength($lineLength) + { + $this->clearCachedValueIf($this->_lineLength != $lineLength); + $this->_lineLength = $lineLength; + } + + /** + * Get the maximum permitted length of lines in this Header. + * + * @return int + */ + public function getMaxLineLength() + { + return $this->_lineLength; + } + + /** + * Get this Header rendered as a RFC 2822 compliant string. + * + * @throws Swift_RfcComplianceException + * + * @return string + */ + public function toString() + { + return $this->_tokensToString($this->toTokens()); + } + + /** + * Returns a string representation of this object. + * + * @return string + * + * @see toString() + */ + public function __toString() + { + return $this->toString(); + } + + // -- Points of extension + + /** + * Set the name of this Header field. + * + * @param string $name + */ + protected function setFieldName($name) + { + $this->_name = $name; + } + + /** + * Produces a compliant, formatted RFC 2822 'phrase' based on the string given. + * + * @param Swift_Mime_Header $header + * @param string $string as displayed + * @param string $charset of the text + * @param Swift_Mime_HeaderEncoder $encoder + * @param bool $shorten the first line to make remove for header name + * + * @return string + */ + protected function createPhrase(Swift_Mime_Header $header, $string, $charset, Swift_Mime_HeaderEncoder $encoder = null, $shorten = false) + { + // Treat token as exactly what was given + $phraseStr = $string; + // If it's not valid + if (!preg_match('/^'.$this->getGrammar()->getDefinition('phrase').'$/D', $phraseStr)) { + // .. but it is just ascii text, try escaping some characters + // and make it a quoted-string + if (preg_match('/^'.$this->getGrammar()->getDefinition('text').'*$/D', $phraseStr)) { + $phraseStr = $this->getGrammar()->escapeSpecials( + $phraseStr, array('"'), $this->getGrammar()->getSpecials() + ); + $phraseStr = '"'.$phraseStr.'"'; + } else { + // ... otherwise it needs encoding + // Determine space remaining on line if first line + if ($shorten) { + $usedLength = strlen($header->getFieldName().': '); + } else { + $usedLength = 0; + } + $phraseStr = $this->encodeWords($header, $string, $usedLength); + } + } + + return $phraseStr; + } + + /** + * Encode needed word tokens within a string of input. + * + * @param Swift_Mime_Header $header + * @param string $input + * @param string $usedLength optional + * + * @return string + */ + protected function encodeWords(Swift_Mime_Header $header, $input, $usedLength = -1) + { + $value = ''; + + $tokens = $this->getEncodableWordTokens($input); + + foreach ($tokens as $token) { + // See RFC 2822, Sect 2.2 (really 2.2 ??) + if ($this->tokenNeedsEncoding($token)) { + // Don't encode starting WSP + $firstChar = substr($token, 0, 1); + switch ($firstChar) { + case ' ': + case "\t": + $value .= $firstChar; + $token = substr($token, 1); + } + + if (-1 == $usedLength) { + $usedLength = strlen($header->getFieldName().': ') + strlen($value); + } + $value .= $this->getTokenAsEncodedWord($token, $usedLength); + + $header->setMaxLineLength(76); // Forcefully override + } else { + $value .= $token; + } + } + + return $value; + } + + /** + * Test if a token needs to be encoded or not. + * + * @param string $token + * + * @return bool + */ + protected function tokenNeedsEncoding($token) + { + return preg_match('~[\x00-\x08\x10-\x19\x7F-\xFF\r\n]~', $token); + } + + /** + * Splits a string into tokens in blocks of words which can be encoded quickly. + * + * @param string $string + * + * @return string[] + */ + protected function getEncodableWordTokens($string) + { + $tokens = array(); + + $encodedToken = ''; + // Split at all whitespace boundaries + foreach (preg_split('~(?=[\t ])~', $string) as $token) { + if ($this->tokenNeedsEncoding($token)) { + $encodedToken .= $token; + } else { + if (strlen($encodedToken) > 0) { + $tokens[] = $encodedToken; + $encodedToken = ''; + } + $tokens[] = $token; + } + } + if (strlen($encodedToken)) { + $tokens[] = $encodedToken; + } + + return $tokens; + } + + /** + * Get a token as an encoded word for safe insertion into headers. + * + * @param string $token token to encode + * @param int $firstLineOffset optional + * + * @return string + */ + protected function getTokenAsEncodedWord($token, $firstLineOffset = 0) + { + // Adjust $firstLineOffset to account for space needed for syntax + $charsetDecl = $this->_charset; + if (isset($this->_lang)) { + $charsetDecl .= '*'.$this->_lang; + } + $encodingWrapperLength = strlen( + '=?'.$charsetDecl.'?'.$this->_encoder->getName().'??=' + ); + + if ($firstLineOffset >= 75) { + //Does this logic need to be here? + $firstLineOffset = 0; + } + + $encodedTextLines = explode("\r\n", + $this->_encoder->encodeString( + $token, $firstLineOffset, 75 - $encodingWrapperLength, $this->_charset + ) + ); + + if (strtolower($this->_charset) !== 'iso-2022-jp') { + // special encoding for iso-2022-jp using mb_encode_mimeheader + foreach ($encodedTextLines as $lineNum => $line) { + $encodedTextLines[$lineNum] = '=?'.$charsetDecl. + '?'.$this->_encoder->getName(). + '?'.$line.'?='; + } + } + + return implode("\r\n ", $encodedTextLines); + } + + /** + * Generates tokens from the given string which include CRLF as individual tokens. + * + * @param string $token + * + * @return string[] + */ + protected function generateTokenLines($token) + { + return preg_split('~(\r\n)~', $token, -1, PREG_SPLIT_DELIM_CAPTURE); + } + + /** + * Set a value into the cache. + * + * @param string $value + */ + protected function setCachedValue($value) + { + $this->_cachedValue = $value; + } + + /** + * Get the value in the cache. + * + * @return string + */ + protected function getCachedValue() + { + return $this->_cachedValue; + } + + /** + * Clear the cached value if $condition is met. + * + * @param bool $condition + */ + protected function clearCachedValueIf($condition) + { + if ($condition) { + $this->setCachedValue(null); + } + } + + /** + * Generate a list of all tokens in the final header. + * + * @param string $string The string to tokenize + * + * @return array An array of tokens as strings + */ + protected function toTokens($string = null) + { + if (is_null($string)) { + $string = $this->getFieldBody(); + } + + $tokens = array(); + + // Generate atoms; split at all invisible boundaries followed by WSP + foreach (preg_split('~(?=[ \t])~', $string) as $token) { + $newTokens = $this->generateTokenLines($token); + foreach ($newTokens as $newToken) { + $tokens[] = $newToken; + } + } + + return $tokens; + } + + /** + * Takes an array of tokens which appear in the header and turns them into + * an RFC 2822 compliant string, adding FWSP where needed. + * + * @param string[] $tokens + * + * @return string + */ + private function _tokensToString(array $tokens) + { + $lineCount = 0; + $headerLines = array(); + $headerLines[] = $this->_name.': '; + $currentLine = &$headerLines[$lineCount++]; + + // Build all tokens back into compliant header + foreach ($tokens as $i => $token) { + // Line longer than specified maximum or token was just a new line + if (("\r\n" == $token) || + ($i > 0 && strlen($currentLine.$token) > $this->_lineLength) + && 0 < strlen($currentLine)) { + $headerLines[] = ''; + $currentLine = &$headerLines[$lineCount++]; + } + + // Append token to the line + if ("\r\n" != $token) { + $currentLine .= $token; + } + } + + // Implode with FWS (RFC 2822, 2.2.3) + return implode("\r\n", $headerLines)."\r\n"; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Headers/DateHeader.php b/lib/SwiftMailer/classes/Swift/Mime/Headers/DateHeader.php new file mode 100644 index 0000000..4fd6674 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Headers/DateHeader.php @@ -0,0 +1,125 @@ + + * + * + * + * @param string $name of Header + * @param Swift_Mime_Grammar $grammar + */ + public function __construct($name, Swift_Mime_Grammar $grammar) + { + $this->setFieldName($name); + parent::__construct($grammar); + } + + /** + * Get the type of Header that this instance represents. + * + * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX + * @see TYPE_DATE, TYPE_ID, TYPE_PATH + * + * @return int + */ + public function getFieldType() + { + return self::TYPE_DATE; + } + + /** + * Set the model for the field body. + * + * This method takes a UNIX timestamp. + * + * @param int $model + */ + public function setFieldBodyModel($model) + { + $this->setTimestamp($model); + } + + /** + * Get the model for the field body. + * + * This method returns a UNIX timestamp. + * + * @return mixed + */ + public function getFieldBodyModel() + { + return $this->getTimestamp(); + } + + /** + * Get the UNIX timestamp of the Date in this Header. + * + * @return int + */ + public function getTimestamp() + { + return $this->_timestamp; + } + + /** + * Set the UNIX timestamp of the Date in this Header. + * + * @param int $timestamp + */ + public function setTimestamp($timestamp) + { + if (!is_null($timestamp)) { + $timestamp = (int) $timestamp; + } + $this->clearCachedValueIf($this->_timestamp != $timestamp); + $this->_timestamp = $timestamp; + } + + /** + * Get the string value of the body in this Header. + * + * This is not necessarily RFC 2822 compliant since folding white space will + * not be added at this stage (see {@link toString()} for that). + * + * @see toString() + * + * @return string + */ + public function getFieldBody() + { + if (!$this->getCachedValue()) { + if (isset($this->_timestamp)) { + $this->setCachedValue(date('r', $this->_timestamp)); + } + } + + return $this->getCachedValue(); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Headers/IdentificationHeader.php b/lib/SwiftMailer/classes/Swift/Mime/Headers/IdentificationHeader.php new file mode 100644 index 0000000..b114506 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Headers/IdentificationHeader.php @@ -0,0 +1,180 @@ +setFieldName($name); + parent::__construct($grammar); + } + + /** + * Get the type of Header that this instance represents. + * + * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX + * @see TYPE_DATE, TYPE_ID, TYPE_PATH + * + * @return int + */ + public function getFieldType() + { + return self::TYPE_ID; + } + + /** + * Set the model for the field body. + * + * This method takes a string ID, or an array of IDs. + * + * @param mixed $model + * + * @throws Swift_RfcComplianceException + */ + public function setFieldBodyModel($model) + { + $this->setId($model); + } + + /** + * Get the model for the field body. + * + * This method returns an array of IDs + * + * @return array + */ + public function getFieldBodyModel() + { + return $this->getIds(); + } + + /** + * Set the ID used in the value of this header. + * + * @param string|array $id + * + * @throws Swift_RfcComplianceException + */ + public function setId($id) + { + $this->setIds(is_array($id) ? $id : array($id)); + } + + /** + * Get the ID used in the value of this Header. + * + * If multiple IDs are set only the first is returned. + * + * @return string + */ + public function getId() + { + if (count($this->_ids) > 0) { + return $this->_ids[0]; + } + } + + /** + * Set a collection of IDs to use in the value of this Header. + * + * @param string[] $ids + * + * @throws Swift_RfcComplianceException + */ + public function setIds(array $ids) + { + $actualIds = array(); + + foreach ($ids as $id) { + $this->_assertValidId($id); + $actualIds[] = $id; + } + + $this->clearCachedValueIf($this->_ids != $actualIds); + $this->_ids = $actualIds; + } + + /** + * Get the list of IDs used in this Header. + * + * @return string[] + */ + public function getIds() + { + return $this->_ids; + } + + /** + * Get the string value of the body in this Header. + * + * This is not necessarily RFC 2822 compliant since folding white space will + * not be added at this stage (see {@see toString()} for that). + * + * @see toString() + * + * @throws Swift_RfcComplianceException + * + * @return string + */ + public function getFieldBody() + { + if (!$this->getCachedValue()) { + $angleAddrs = array(); + + foreach ($this->_ids as $id) { + $angleAddrs[] = '<'.$id.'>'; + } + + $this->setCachedValue(implode(' ', $angleAddrs)); + } + + return $this->getCachedValue(); + } + + /** + * Throws an Exception if the id passed does not comply with RFC 2822. + * + * @param string $id + * + * @throws Swift_RfcComplianceException + */ + private function _assertValidId($id) + { + if (!preg_match( + '/^'.$this->getGrammar()->getDefinition('id-left').'@'. + $this->getGrammar()->getDefinition('id-right').'$/D', + $id + )) { + throw new Swift_RfcComplianceException( + 'Invalid ID given <'.$id.'>' + ); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php b/lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php new file mode 100644 index 0000000..222a57c --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Headers/MailboxHeader.php @@ -0,0 +1,353 @@ +setFieldName($name); + $this->setEncoder($encoder); + parent::__construct($grammar); + } + + /** + * Get the type of Header that this instance represents. + * + * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX + * @see TYPE_DATE, TYPE_ID, TYPE_PATH + * + * @return int + */ + public function getFieldType() + { + return self::TYPE_MAILBOX; + } + + /** + * Set the model for the field body. + * + * This method takes a string, or an array of addresses. + * + * @param mixed $model + * + * @throws Swift_RfcComplianceException + */ + public function setFieldBodyModel($model) + { + $this->setNameAddresses($model); + } + + /** + * Get the model for the field body. + * + * This method returns an associative array like {@link getNameAddresses()} + * + * @throws Swift_RfcComplianceException + * + * @return array + */ + public function getFieldBodyModel() + { + return $this->getNameAddresses(); + } + + /** + * Set a list of mailboxes to be shown in this Header. + * + * The mailboxes can be a simple array of addresses, or an array of + * key=>value pairs where (email => personalName). + * Example: + * + * setNameAddresses(array( + * 'chris@swiftmailer.org' => 'Chris Corbyn', + * 'mark@swiftmailer.org' //No associated personal name + * )); + * ?> + * + * + * @see __construct() + * @see setAddresses() + * @see setValue() + * + * @param string|string[] $mailboxes + * + * @throws Swift_RfcComplianceException + */ + public function setNameAddresses($mailboxes) + { + $this->_mailboxes = $this->normalizeMailboxes((array) $mailboxes); + $this->setCachedValue(null); //Clear any cached value + } + + /** + * Get the full mailbox list of this Header as an array of valid RFC 2822 strings. + * + * Example: + * + * 'Chris Corbyn', + * 'mark@swiftmailer.org' => 'Mark Corbyn') + * ); + * print_r($header->getNameAddressStrings()); + * // array ( + * // 0 => Chris Corbyn , + * // 1 => Mark Corbyn + * // ) + * ?> + * + * + * @see getNameAddresses() + * @see toString() + * + * @throws Swift_RfcComplianceException + * + * @return string[] + */ + public function getNameAddressStrings() + { + return $this->_createNameAddressStrings($this->getNameAddresses()); + } + + /** + * Get all mailboxes in this Header as key=>value pairs. + * + * The key is the address and the value is the name (or null if none set). + * Example: + * + * 'Chris Corbyn', + * 'mark@swiftmailer.org' => 'Mark Corbyn') + * ); + * print_r($header->getNameAddresses()); + * // array ( + * // chris@swiftmailer.org => Chris Corbyn, + * // mark@swiftmailer.org => Mark Corbyn + * // ) + * ?> + * + * + * @see getAddresses() + * @see getNameAddressStrings() + * + * @return string[] + */ + public function getNameAddresses() + { + return $this->_mailboxes; + } + + /** + * Makes this Header represent a list of plain email addresses with no names. + * + * Example: + * + * setAddresses( + * array('one@domain.tld', 'two@domain.tld', 'three@domain.tld') + * ); + * ?> + * + * + * @see setNameAddresses() + * @see setValue() + * + * @param string[] $addresses + * + * @throws Swift_RfcComplianceException + */ + public function setAddresses($addresses) + { + $this->setNameAddresses(array_values((array) $addresses)); + } + + /** + * Get all email addresses in this Header. + * + * @see getNameAddresses() + * + * @return string[] + */ + public function getAddresses() + { + return array_keys($this->_mailboxes); + } + + /** + * Remove one or more addresses from this Header. + * + * @param string|string[] $addresses + */ + public function removeAddresses($addresses) + { + $this->setCachedValue(null); + foreach ((array) $addresses as $address) { + unset($this->_mailboxes[$address]); + } + } + + /** + * Get the string value of the body in this Header. + * + * This is not necessarily RFC 2822 compliant since folding white space will + * not be added at this stage (see {@link toString()} for that). + * + * @see toString() + * + * @throws Swift_RfcComplianceException + * + * @return string + */ + public function getFieldBody() + { + // Compute the string value of the header only if needed + if (is_null($this->getCachedValue())) { + $this->setCachedValue($this->createMailboxListString($this->_mailboxes)); + } + + return $this->getCachedValue(); + } + + // -- Points of extension + + /** + * Normalizes a user-input list of mailboxes into consistent key=>value pairs. + * + * @param string[] $mailboxes + * + * @return string[] + */ + protected function normalizeMailboxes(array $mailboxes) + { + $actualMailboxes = array(); + + foreach ($mailboxes as $key => $value) { + if (is_string($key)) { + //key is email addr + $address = $key; + $name = $value; + } else { + $address = $value; + $name = null; + } + $this->_assertValidAddress($address); + $actualMailboxes[$address] = $name; + } + + return $actualMailboxes; + } + + /** + * Produces a compliant, formatted display-name based on the string given. + * + * @param string $displayName as displayed + * @param bool $shorten the first line to make remove for header name + * + * @return string + */ + protected function createDisplayNameString($displayName, $shorten = false) + { + return $this->createPhrase($this, $displayName, $this->getCharset(), $this->getEncoder(), $shorten); + } + + /** + * Creates a string form of all the mailboxes in the passed array. + * + * @param string[] $mailboxes + * + * @throws Swift_RfcComplianceException + * + * @return string + */ + protected function createMailboxListString(array $mailboxes) + { + return implode(', ', $this->_createNameAddressStrings($mailboxes)); + } + + /** + * Redefine the encoding requirements for mailboxes. + * + * All "specials" must be encoded as the full header value will not be quoted + * + * @see RFC 2822 3.2.1 + * + * @param string $token + * + * @return bool + */ + protected function tokenNeedsEncoding($token) + { + return preg_match('/[()<>\[\]:;@\,."]/', $token) || parent::tokenNeedsEncoding($token); + } + + /** + * Return an array of strings conforming the the name-addr spec of RFC 2822. + * + * @param string[] $mailboxes + * + * @return string[] + */ + private function _createNameAddressStrings(array $mailboxes) + { + $strings = array(); + + foreach ($mailboxes as $email => $name) { + $mailboxStr = $email; + if (!is_null($name)) { + $nameStr = $this->createDisplayNameString($name, empty($strings)); + $mailboxStr = $nameStr.' <'.$mailboxStr.'>'; + } + $strings[] = $mailboxStr; + } + + return $strings; + } + + /** + * Throws an Exception if the address passed does not comply with RFC 2822. + * + * @param string $address + * + * @throws Swift_RfcComplianceException If invalid. + */ + private function _assertValidAddress($address) + { + if (!preg_match('/^'.$this->getGrammar()->getDefinition('addr-spec').'$/D', + $address)) { + throw new Swift_RfcComplianceException( + 'Address in mailbox given ['.$address. + '] does not comply with RFC 2822, 3.6.2.' + ); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Headers/OpenDKIMHeader.php b/lib/SwiftMailer/classes/Swift/Mime/Headers/OpenDKIMHeader.php new file mode 100644 index 0000000..d749550 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Headers/OpenDKIMHeader.php @@ -0,0 +1,133 @@ + + */ +class Swift_Mime_Headers_OpenDKIMHeader implements Swift_Mime_Header +{ + /** + * The value of this Header. + * + * @var string + */ + private $_value; + + /** + * The name of this Header. + * + * @var string + */ + private $_fieldName; + + /** + * @param string $name + */ + public function __construct($name) + { + $this->_fieldName = $name; + } + + /** + * Get the type of Header that this instance represents. + * + * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX + * @see TYPE_DATE, TYPE_ID, TYPE_PATH + * + * @return int + */ + public function getFieldType() + { + return self::TYPE_TEXT; + } + + /** + * Set the model for the field body. + * + * This method takes a string for the field value. + * + * @param string $model + */ + public function setFieldBodyModel($model) + { + $this->setValue($model); + } + + /** + * Get the model for the field body. + * + * This method returns a string. + * + * @return string + */ + public function getFieldBodyModel() + { + return $this->getValue(); + } + + /** + * Get the (unencoded) value of this header. + * + * @return string + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the (unencoded) value of this header. + * + * @param string $value + */ + public function setValue($value) + { + $this->_value = $value; + } + + /** + * Get the value of this header prepared for rendering. + * + * @return string + */ + public function getFieldBody() + { + return $this->_value; + } + + /** + * Get this Header rendered as a RFC 2822 compliant string. + * + * @return string + */ + public function toString() + { + return $this->_fieldName.': '.$this->_value; + } + + /** + * Set the Header FieldName. + * + * @see Swift_Mime_Header::getFieldName() + */ + public function getFieldName() + { + return $this->_fieldName; + } + + /** + * Ignored. + */ + public function setCharset($charset) + { + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Headers/ParameterizedHeader.php b/lib/SwiftMailer/classes/Swift/Mime/Headers/ParameterizedHeader.php new file mode 100644 index 0000000..c506dae --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Headers/ParameterizedHeader.php @@ -0,0 +1,258 @@ +_paramEncoder = $paramEncoder; + } + + /** + * Get the type of Header that this instance represents. + * + * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX + * @see TYPE_DATE, TYPE_ID, TYPE_PATH + * + * @return int + */ + public function getFieldType() + { + return self::TYPE_PARAMETERIZED; + } + + /** + * Set the character set used in this Header. + * + * @param string $charset + */ + public function setCharset($charset) + { + parent::setCharset($charset); + if (isset($this->_paramEncoder)) { + $this->_paramEncoder->charsetChanged($charset); + } + } + + /** + * Set the value of $parameter. + * + * @param string $parameter + * @param string $value + */ + public function setParameter($parameter, $value) + { + $this->setParameters(array_merge($this->getParameters(), array($parameter => $value))); + } + + /** + * Get the value of $parameter. + * + * @param string $parameter + * + * @return string + */ + public function getParameter($parameter) + { + $params = $this->getParameters(); + + return array_key_exists($parameter, $params) ? $params[$parameter] : null; + } + + /** + * Set an associative array of parameter names mapped to values. + * + * @param string[] $parameters + */ + public function setParameters(array $parameters) + { + $this->clearCachedValueIf($this->_params != $parameters); + $this->_params = $parameters; + } + + /** + * Returns an associative array of parameter names mapped to values. + * + * @return string[] + */ + public function getParameters() + { + return $this->_params; + } + + /** + * Get the value of this header prepared for rendering. + * + * @return string + */ + public function getFieldBody() //TODO: Check caching here + { + $body = parent::getFieldBody(); + foreach ($this->_params as $name => $value) { + if (!is_null($value)) { + // Add the parameter + $body .= '; '.$this->_createParameter($name, $value); + } + } + + return $body; + } + + /** + * Generate a list of all tokens in the final header. + * + * This doesn't need to be overridden in theory, but it is for implementation + * reasons to prevent potential breakage of attributes. + * + * @param string $string The string to tokenize + * + * @return array An array of tokens as strings + */ + protected function toTokens($string = null) + { + $tokens = parent::toTokens(parent::getFieldBody()); + + // Try creating any parameters + foreach ($this->_params as $name => $value) { + if (!is_null($value)) { + // Add the semi-colon separator + $tokens[count($tokens) - 1] .= ';'; + $tokens = array_merge($tokens, $this->generateTokenLines( + ' '.$this->_createParameter($name, $value) + )); + } + } + + return $tokens; + } + + /** + * Render a RFC 2047 compliant header parameter from the $name and $value. + * + * @param string $name + * @param string $value + * + * @return string + */ + private function _createParameter($name, $value) + { + $origValue = $value; + + $encoded = false; + // Allow room for parameter name, indices, "=" and DQUOTEs + $maxValueLength = $this->getMaxLineLength() - strlen($name.'=*N"";') - 1; + $firstLineOffset = 0; + + // If it's not already a valid parameter value... + if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) { + // TODO: text, or something else?? + // ... and it's not ascii + if (!preg_match('/^'.$this->getGrammar()->getDefinition('text').'*$/D', $value)) { + $encoded = true; + // Allow space for the indices, charset and language + $maxValueLength = $this->getMaxLineLength() - strlen($name.'*N*="";') - 1; + $firstLineOffset = strlen( + $this->getCharset()."'".$this->getLanguage()."'" + ); + } + } + + // Encode if we need to + if ($encoded || strlen($value) > $maxValueLength) { + if (isset($this->_paramEncoder)) { + $value = $this->_paramEncoder->encodeString( + $origValue, $firstLineOffset, $maxValueLength, $this->getCharset() + ); + } else { + // We have to go against RFC 2183/2231 in some areas for interoperability + $value = $this->getTokenAsEncodedWord($origValue); + $encoded = false; + } + } + + $valueLines = isset($this->_paramEncoder) ? explode("\r\n", $value) : array($value); + + // Need to add indices + if (count($valueLines) > 1) { + $paramLines = array(); + foreach ($valueLines as $i => $line) { + $paramLines[] = $name.'*'.$i. + $this->_getEndOfParameterValue($line, true, $i == 0); + } + + return implode(";\r\n ", $paramLines); + } else { + return $name.$this->_getEndOfParameterValue( + $valueLines[0], $encoded, true + ); + } + } + + /** + * Returns the parameter value from the "=" and beyond. + * + * @param string $value to append + * @param bool $encoded + * @param bool $firstLine + * + * @return string + */ + private function _getEndOfParameterValue($value, $encoded = false, $firstLine = false) + { + if (!preg_match('/^'.self::TOKEN_REGEX.'$/D', $value)) { + $value = '"'.$value.'"'; + } + $prepend = '='; + if ($encoded) { + $prepend = '*='; + if ($firstLine) { + $prepend = '*='.$this->getCharset()."'".$this->getLanguage(). + "'"; + } + } + + return $prepend.$value; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Headers/PathHeader.php b/lib/SwiftMailer/classes/Swift/Mime/Headers/PathHeader.php new file mode 100644 index 0000000..2fffc7b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Headers/PathHeader.php @@ -0,0 +1,143 @@ +setFieldName($name); + parent::__construct($grammar); + } + + /** + * Get the type of Header that this instance represents. + * + * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX + * @see TYPE_DATE, TYPE_ID, TYPE_PATH + * + * @return int + */ + public function getFieldType() + { + return self::TYPE_PATH; + } + + /** + * Set the model for the field body. + * This method takes a string for an address. + * + * @param string $model + * + * @throws Swift_RfcComplianceException + */ + public function setFieldBodyModel($model) + { + $this->setAddress($model); + } + + /** + * Get the model for the field body. + * This method returns a string email address. + * + * @return mixed + */ + public function getFieldBodyModel() + { + return $this->getAddress(); + } + + /** + * Set the Address which should appear in this Header. + * + * @param string $address + * + * @throws Swift_RfcComplianceException + */ + public function setAddress($address) + { + if (is_null($address)) { + $this->_address = null; + } elseif ('' == $address) { + $this->_address = ''; + } else { + $this->_assertValidAddress($address); + $this->_address = $address; + } + $this->setCachedValue(null); + } + + /** + * Get the address which is used in this Header (if any). + * + * Null is returned if no address is set. + * + * @return string + */ + public function getAddress() + { + return $this->_address; + } + + /** + * Get the string value of the body in this Header. + * + * This is not necessarily RFC 2822 compliant since folding white space will + * not be added at this stage (see {@link toString()} for that). + * + * @see toString() + * + * @return string + */ + public function getFieldBody() + { + if (!$this->getCachedValue()) { + if (isset($this->_address)) { + $this->setCachedValue('<'.$this->_address.'>'); + } + } + + return $this->getCachedValue(); + } + + /** + * Throws an Exception if the address passed does not comply with RFC 2822. + * + * @param string $address + * + * @throws Swift_RfcComplianceException If address is invalid + */ + private function _assertValidAddress($address) + { + if (!preg_match('/^'.$this->getGrammar()->getDefinition('addr-spec').'$/D', + $address)) { + throw new Swift_RfcComplianceException( + 'Address set in PathHeader does not comply with addr-spec of RFC 2822.' + ); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Headers/UnstructuredHeader.php b/lib/SwiftMailer/classes/Swift/Mime/Headers/UnstructuredHeader.php new file mode 100644 index 0000000..86177f1 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Headers/UnstructuredHeader.php @@ -0,0 +1,112 @@ +setFieldName($name); + $this->setEncoder($encoder); + parent::__construct($grammar); + } + + /** + * Get the type of Header that this instance represents. + * + * @see TYPE_TEXT, TYPE_PARAMETERIZED, TYPE_MAILBOX + * @see TYPE_DATE, TYPE_ID, TYPE_PATH + * + * @return int + */ + public function getFieldType() + { + return self::TYPE_TEXT; + } + + /** + * Set the model for the field body. + * + * This method takes a string for the field value. + * + * @param string $model + */ + public function setFieldBodyModel($model) + { + $this->setValue($model); + } + + /** + * Get the model for the field body. + * + * This method returns a string. + * + * @return string + */ + public function getFieldBodyModel() + { + return $this->getValue(); + } + + /** + * Get the (unencoded) value of this header. + * + * @return string + */ + public function getValue() + { + return $this->_value; + } + + /** + * Set the (unencoded) value of this header. + * + * @param string $value + */ + public function setValue($value) + { + $this->clearCachedValueIf($this->_value != $value); + $this->_value = $value; + } + + /** + * Get the value of this header prepared for rendering. + * + * @return string + */ + public function getFieldBody() + { + if (!$this->getCachedValue()) { + $this->setCachedValue( + $this->encodeWords($this, $this->_value) + ); + } + + return $this->getCachedValue(); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/Message.php b/lib/SwiftMailer/classes/Swift/Mime/Message.php new file mode 100644 index 0000000..9b36d21 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/Message.php @@ -0,0 +1,223 @@ + 'Real Name'). + * + * If the second parameter is provided and the first is a string, then $name + * is associated with the address. + * + * @param mixed $address + * @param string $name optional + */ + public function setSender($address, $name = null); + + /** + * Get the sender address for this message. + * + * This has a higher significance than the From address. + * + * @return string + */ + public function getSender(); + + /** + * Set the From address of this message. + * + * It is permissible for multiple From addresses to be set using an array. + * + * If multiple From addresses are used, you SHOULD set the Sender address and + * according to RFC 2822, MUST set the sender address. + * + * An array can be used if display names are to be provided: i.e. + * array('email@address.com' => 'Real Name'). + * + * If the second parameter is provided and the first is a string, then $name + * is associated with the address. + * + * @param mixed $addresses + * @param string $name optional + */ + public function setFrom($addresses, $name = null); + + /** + * Get the From address(es) of this message. + * + * This method always returns an associative array where the keys are the + * addresses. + * + * @return string[] + */ + public function getFrom(); + + /** + * Set the Reply-To address(es). + * + * Any replies from the receiver will be sent to this address. + * + * It is permissible for multiple reply-to addresses to be set using an array. + * + * This method has the same synopsis as {@link setFrom()} and {@link setTo()}. + * + * If the second parameter is provided and the first is a string, then $name + * is associated with the address. + * + * @param mixed $addresses + * @param string $name optional + */ + public function setReplyTo($addresses, $name = null); + + /** + * Get the Reply-To addresses for this message. + * + * This method always returns an associative array where the keys provide the + * email addresses. + * + * @return string[] + */ + public function getReplyTo(); + + /** + * Set the To address(es). + * + * Recipients set in this field will receive a copy of this message. + * + * This method has the same synopsis as {@link setFrom()} and {@link setCc()}. + * + * If the second parameter is provided and the first is a string, then $name + * is associated with the address. + * + * @param mixed $addresses + * @param string $name optional + */ + public function setTo($addresses, $name = null); + + /** + * Get the To addresses for this message. + * + * This method always returns an associative array, whereby the keys provide + * the actual email addresses. + * + * @return string[] + */ + public function getTo(); + + /** + * Set the Cc address(es). + * + * Recipients set in this field will receive a 'carbon-copy' of this message. + * + * This method has the same synopsis as {@link setFrom()} and {@link setTo()}. + * + * @param mixed $addresses + * @param string $name optional + */ + public function setCc($addresses, $name = null); + + /** + * Get the Cc addresses for this message. + * + * This method always returns an associative array, whereby the keys provide + * the actual email addresses. + * + * @return string[] + */ + public function getCc(); + + /** + * Set the Bcc address(es). + * + * Recipients set in this field will receive a 'blind-carbon-copy' of this + * message. + * + * In other words, they will get the message, but any other recipients of the + * message will have no such knowledge of their receipt of it. + * + * This method has the same synopsis as {@link setFrom()} and {@link setTo()}. + * + * @param mixed $addresses + * @param string $name optional + */ + public function setBcc($addresses, $name = null); + + /** + * Get the Bcc addresses for this message. + * + * This method always returns an associative array, whereby the keys provide + * the actual email addresses. + * + * @return string[] + */ + public function getBcc(); +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/MimeEntity.php b/lib/SwiftMailer/classes/Swift/Mime/MimeEntity.php new file mode 100644 index 0000000..30f460c --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/MimeEntity.php @@ -0,0 +1,117 @@ +setContentType('text/plain'); + if (!is_null($charset)) { + $this->setCharset($charset); + } + } + + /** + * Set the body of this entity, either as a string, or as an instance of + * {@link Swift_OutputByteStream}. + * + * @param mixed $body + * @param string $contentType optional + * @param string $charset optional + * + * @return Swift_Mime_MimePart + */ + public function setBody($body, $contentType = null, $charset = null) + { + if (isset($charset)) { + $this->setCharset($charset); + } + $body = $this->_convertString($body); + + parent::setBody($body, $contentType); + + return $this; + } + + /** + * Get the character set of this entity. + * + * @return string + */ + public function getCharset() + { + return $this->_getHeaderParameter('Content-Type', 'charset'); + } + + /** + * Set the character set of this entity. + * + * @param string $charset + * + * @return Swift_Mime_MimePart + */ + public function setCharset($charset) + { + $this->_setHeaderParameter('Content-Type', 'charset', $charset); + if ($charset !== $this->_userCharset) { + $this->_clearCache(); + } + $this->_userCharset = $charset; + parent::charsetChanged($charset); + + return $this; + } + + /** + * Get the format of this entity (i.e. flowed or fixed). + * + * @return string + */ + public function getFormat() + { + return $this->_getHeaderParameter('Content-Type', 'format'); + } + + /** + * Set the format of this entity (flowed or fixed). + * + * @param string $format + * + * @return Swift_Mime_MimePart + */ + public function setFormat($format) + { + $this->_setHeaderParameter('Content-Type', 'format', $format); + $this->_userFormat = $format; + + return $this; + } + + /** + * Test if delsp is being used for this entity. + * + * @return bool + */ + public function getDelSp() + { + return 'yes' == $this->_getHeaderParameter('Content-Type', 'delsp') ? true : false; + } + + /** + * Turn delsp on or off for this entity. + * + * @param bool $delsp + * + * @return Swift_Mime_MimePart + */ + public function setDelSp($delsp = true) + { + $this->_setHeaderParameter('Content-Type', 'delsp', $delsp ? 'yes' : null); + $this->_userDelSp = $delsp; + + return $this; + } + + /** + * Get the nesting level of this entity. + * + * @see LEVEL_TOP, LEVEL_ALTERNATIVE, LEVEL_MIXED, LEVEL_RELATED + * + * @return int + */ + public function getNestingLevel() + { + return $this->_nestingLevel; + } + + /** + * Receive notification that the charset has changed on this document, or a + * parent document. + * + * @param string $charset + */ + public function charsetChanged($charset) + { + $this->setCharset($charset); + } + + /** Fix the content-type and encoding of this entity */ + protected function _fixHeaders() + { + parent::_fixHeaders(); + if (count($this->getChildren())) { + $this->_setHeaderParameter('Content-Type', 'charset', null); + $this->_setHeaderParameter('Content-Type', 'format', null); + $this->_setHeaderParameter('Content-Type', 'delsp', null); + } else { + $this->setCharset($this->_userCharset); + $this->setFormat($this->_userFormat); + $this->setDelSp($this->_userDelSp); + } + } + + /** Set the nesting level of this entity */ + protected function _setNestingLevel($level) + { + $this->_nestingLevel = $level; + } + + /** Encode charset when charset is not utf-8 */ + protected function _convertString($string) + { + $charset = strtolower($this->getCharset()); + if (!in_array($charset, array('utf-8', 'iso-8859-1', 'iso-8859-15', ''))) { + // mb_convert_encoding must be the first one to check, since iconv cannot convert some words. + if (function_exists('mb_convert_encoding')) { + $string = mb_convert_encoding($string, $charset, 'utf-8'); + } elseif (function_exists('iconv')) { + $string = iconv('utf-8//TRANSLIT//IGNORE', $charset, $string); + } else { + throw new Swift_SwiftException('No suitable convert encoding function (use UTF-8 as your charset or install the mbstring or iconv extension).'); + } + + return $string; + } + + return $string; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/ParameterizedHeader.php b/lib/SwiftMailer/classes/Swift/Mime/ParameterizedHeader.php new file mode 100644 index 0000000..e15c6ef --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/ParameterizedHeader.php @@ -0,0 +1,34 @@ +_encoder = $encoder; + $this->_paramEncoder = $paramEncoder; + $this->_grammar = $grammar; + $this->_charset = $charset; + } + + /** + * Create a new Mailbox Header with a list of $addresses. + * + * @param string $name + * @param array|string|null $addresses + * + * @return Swift_Mime_Header + */ + public function createMailboxHeader($name, $addresses = null) + { + $header = new Swift_Mime_Headers_MailboxHeader($name, $this->_encoder, $this->_grammar); + if (isset($addresses)) { + $header->setFieldBodyModel($addresses); + } + $this->_setHeaderCharset($header); + + return $header; + } + + /** + * Create a new Date header using $timestamp (UNIX time). + * + * @param string $name + * @param int|null $timestamp + * + * @return Swift_Mime_Header + */ + public function createDateHeader($name, $timestamp = null) + { + $header = new Swift_Mime_Headers_DateHeader($name, $this->_grammar); + if (isset($timestamp)) { + $header->setFieldBodyModel($timestamp); + } + $this->_setHeaderCharset($header); + + return $header; + } + + /** + * Create a new basic text header with $name and $value. + * + * @param string $name + * @param string $value + * + * @return Swift_Mime_Header + */ + public function createTextHeader($name, $value = null) + { + $header = new Swift_Mime_Headers_UnstructuredHeader($name, $this->_encoder, $this->_grammar); + if (isset($value)) { + $header->setFieldBodyModel($value); + } + $this->_setHeaderCharset($header); + + return $header; + } + + /** + * Create a new ParameterizedHeader with $name, $value and $params. + * + * @param string $name + * @param string $value + * @param array $params + * + * @return Swift_Mime_ParameterizedHeader + */ + public function createParameterizedHeader($name, $value = null, + $params = array()) + { + $header = new Swift_Mime_Headers_ParameterizedHeader($name, $this->_encoder, strtolower($name) == 'content-disposition' ? $this->_paramEncoder : null, $this->_grammar); + if (isset($value)) { + $header->setFieldBodyModel($value); + } + foreach ($params as $k => $v) { + $header->setParameter($k, $v); + } + $this->_setHeaderCharset($header); + + return $header; + } + + /** + * Create a new ID header for Message-ID or Content-ID. + * + * @param string $name + * @param string|array $ids + * + * @return Swift_Mime_Header + */ + public function createIdHeader($name, $ids = null) + { + $header = new Swift_Mime_Headers_IdentificationHeader($name, $this->_grammar); + if (isset($ids)) { + $header->setFieldBodyModel($ids); + } + $this->_setHeaderCharset($header); + + return $header; + } + + /** + * Create a new Path header with an address (path) in it. + * + * @param string $name + * @param string $path + * + * @return Swift_Mime_Header + */ + public function createPathHeader($name, $path = null) + { + $header = new Swift_Mime_Headers_PathHeader($name, $this->_grammar); + if (isset($path)) { + $header->setFieldBodyModel($path); + } + $this->_setHeaderCharset($header); + + return $header; + } + + /** + * Notify this observer that the entity's charset has changed. + * + * @param string $charset + */ + public function charsetChanged($charset) + { + $this->_charset = $charset; + $this->_encoder->charsetChanged($charset); + $this->_paramEncoder->charsetChanged($charset); + } + + /** + * Make a deep copy of object. + */ + public function __clone() + { + $this->_encoder = clone $this->_encoder; + $this->_paramEncoder = clone $this->_paramEncoder; + } + + /** Apply the charset to the Header */ + private function _setHeaderCharset(Swift_Mime_Header $header) + { + if (isset($this->_charset)) { + $header->setCharset($this->_charset); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/SimpleHeaderSet.php b/lib/SwiftMailer/classes/Swift/Mime/SimpleHeaderSet.php new file mode 100644 index 0000000..e2d0e87 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/SimpleHeaderSet.php @@ -0,0 +1,414 @@ +_factory = $factory; + if (isset($charset)) { + $this->setCharset($charset); + } + } + + /** + * Set the charset used by these headers. + * + * @param string $charset + */ + public function setCharset($charset) + { + $this->_charset = $charset; + $this->_factory->charsetChanged($charset); + $this->_notifyHeadersOfCharset($charset); + } + + /** + * Add a new Mailbox Header with a list of $addresses. + * + * @param string $name + * @param array|string $addresses + */ + public function addMailboxHeader($name, $addresses = null) + { + $this->_storeHeader($name, + $this->_factory->createMailboxHeader($name, $addresses)); + } + + /** + * Add a new Date header using $timestamp (UNIX time). + * + * @param string $name + * @param int $timestamp + */ + public function addDateHeader($name, $timestamp = null) + { + $this->_storeHeader($name, + $this->_factory->createDateHeader($name, $timestamp)); + } + + /** + * Add a new basic text header with $name and $value. + * + * @param string $name + * @param string $value + */ + public function addTextHeader($name, $value = null) + { + $this->_storeHeader($name, + $this->_factory->createTextHeader($name, $value)); + } + + /** + * Add a new ParameterizedHeader with $name, $value and $params. + * + * @param string $name + * @param string $value + * @param array $params + */ + public function addParameterizedHeader($name, $value = null, $params = array()) + { + $this->_storeHeader($name, $this->_factory->createParameterizedHeader($name, $value, $params)); + } + + /** + * Add a new ID header for Message-ID or Content-ID. + * + * @param string $name + * @param string|array $ids + */ + public function addIdHeader($name, $ids = null) + { + $this->_storeHeader($name, $this->_factory->createIdHeader($name, $ids)); + } + + /** + * Add a new Path header with an address (path) in it. + * + * @param string $name + * @param string $path + */ + public function addPathHeader($name, $path = null) + { + $this->_storeHeader($name, $this->_factory->createPathHeader($name, $path)); + } + + /** + * Returns true if at least one header with the given $name exists. + * + * If multiple headers match, the actual one may be specified by $index. + * + * @param string $name + * @param int $index + * + * @return bool + */ + public function has($name, $index = 0) + { + $lowerName = strtolower($name); + + if (!array_key_exists($lowerName, $this->_headers)) { + return false; + } + + if (func_num_args() < 2) { + // index was not specified, so we only need to check that there is at least one header value set + return (bool) count($this->_headers[$lowerName]); + } + + return array_key_exists($index, $this->_headers[$lowerName]); + } + + /** + * Set a header in the HeaderSet. + * + * The header may be a previously fetched header via {@link get()} or it may + * be one that has been created separately. + * + * If $index is specified, the header will be inserted into the set at this + * offset. + * + * @param Swift_Mime_Header $header + * @param int $index + */ + public function set(Swift_Mime_Header $header, $index = 0) + { + $this->_storeHeader($header->getFieldName(), $header, $index); + } + + /** + * Get the header with the given $name. + * + * If multiple headers match, the actual one may be specified by $index. + * Returns NULL if none present. + * + * @param string $name + * @param int $index + * + * @return Swift_Mime_Header + */ + public function get($name, $index = 0) + { + $name = strtolower($name); + + if (func_num_args() < 2) { + if ($this->has($name)) { + $values = array_values($this->_headers[$name]); + + return array_shift($values); + } + } else { + if ($this->has($name, $index)) { + return $this->_headers[$name][$index]; + } + } + } + + /** + * Get all headers with the given $name. + * + * @param string $name + * + * @return array + */ + public function getAll($name = null) + { + if (!isset($name)) { + $headers = array(); + foreach ($this->_headers as $collection) { + $headers = array_merge($headers, $collection); + } + + return $headers; + } + + $lowerName = strtolower($name); + if (!array_key_exists($lowerName, $this->_headers)) { + return array(); + } + + return $this->_headers[$lowerName]; + } + + /** + * Return the name of all Headers. + * + * @return array + */ + public function listAll() + { + $headers = $this->_headers; + if ($this->_canSort()) { + uksort($headers, array($this, '_sortHeaders')); + } + + return array_keys($headers); + } + + /** + * Remove the header with the given $name if it's set. + * + * If multiple headers match, the actual one may be specified by $index. + * + * @param string $name + * @param int $index + */ + public function remove($name, $index = 0) + { + $lowerName = strtolower($name); + unset($this->_headers[$lowerName][$index]); + } + + /** + * Remove all headers with the given $name. + * + * @param string $name + */ + public function removeAll($name) + { + $lowerName = strtolower($name); + unset($this->_headers[$lowerName]); + } + + /** + * Create a new instance of this HeaderSet. + * + * @return Swift_Mime_HeaderSet + */ + public function newInstance() + { + return new self($this->_factory); + } + + /** + * Define a list of Header names as an array in the correct order. + * + * These Headers will be output in the given order where present. + * + * @param array $sequence + */ + public function defineOrdering(array $sequence) + { + $this->_order = array_flip(array_map('strtolower', $sequence)); + } + + /** + * Set a list of header names which must always be displayed when set. + * + * Usually headers without a field value won't be output unless set here. + * + * @param array $names + */ + public function setAlwaysDisplayed(array $names) + { + $this->_required = array_flip(array_map('strtolower', $names)); + } + + /** + * Notify this observer that the entity's charset has changed. + * + * @param string $charset + */ + public function charsetChanged($charset) + { + $this->setCharset($charset); + } + + /** + * Returns a string with a representation of all headers. + * + * @return string + */ + public function toString() + { + $string = ''; + $headers = $this->_headers; + if ($this->_canSort()) { + uksort($headers, array($this, '_sortHeaders')); + } + foreach ($headers as $collection) { + foreach ($collection as $header) { + if ($this->_isDisplayed($header) || $header->getFieldBody() != '') { + $string .= $header->toString(); + } + } + } + + return $string; + } + + /** + * Returns a string representation of this object. + * + * @return string + * + * @see toString() + */ + public function __toString() + { + return $this->toString(); + } + + /** Save a Header to the internal collection */ + private function _storeHeader($name, Swift_Mime_Header $header, $offset = null) + { + if (!isset($this->_headers[strtolower($name)])) { + $this->_headers[strtolower($name)] = array(); + } + if (!isset($offset)) { + $this->_headers[strtolower($name)][] = $header; + } else { + $this->_headers[strtolower($name)][$offset] = $header; + } + } + + /** Test if the headers can be sorted */ + private function _canSort() + { + return count($this->_order) > 0; + } + + /** uksort() algorithm for Header ordering */ + private function _sortHeaders($a, $b) + { + $lowerA = strtolower($a); + $lowerB = strtolower($b); + $aPos = array_key_exists($lowerA, $this->_order) ? $this->_order[$lowerA] : -1; + $bPos = array_key_exists($lowerB, $this->_order) ? $this->_order[$lowerB] : -1; + + if (-1 === $aPos && -1 === $bPos) { + // just be sure to be determinist here + return $a > $b ? -1 : 1; + } + + if ($aPos == -1) { + return 1; + } elseif ($bPos == -1) { + return -1; + } + + return $aPos < $bPos ? -1 : 1; + } + + /** Test if the given Header is always displayed */ + private function _isDisplayed(Swift_Mime_Header $header) + { + return array_key_exists(strtolower($header->getFieldName()), $this->_required); + } + + /** Notify all Headers of the new charset */ + private function _notifyHeadersOfCharset($charset) + { + foreach ($this->_headers as $headerGroup) { + foreach ($headerGroup as $header) { + $header->setCharset($charset); + } + } + } + + /** + * Make a deep copy of object. + */ + public function __clone() + { + $this->_factory = clone $this->_factory; + foreach ($this->_headers as $groupKey => $headerGroup) { + foreach ($headerGroup as $key => $header) { + $this->_headers[$groupKey][$key] = clone $header; + } + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/SimpleMessage.php b/lib/SwiftMailer/classes/Swift/Mime/SimpleMessage.php new file mode 100644 index 0000000..124644b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/SimpleMessage.php @@ -0,0 +1,649 @@ +getHeaders()->defineOrdering(array( + 'Return-Path', + 'Received', + 'DKIM-Signature', + 'DomainKey-Signature', + 'Sender', + 'Message-ID', + 'Date', + 'Subject', + 'From', + 'Reply-To', + 'To', + 'Cc', + 'Bcc', + 'MIME-Version', + 'Content-Type', + 'Content-Transfer-Encoding', + )); + $this->getHeaders()->setAlwaysDisplayed(array('Date', 'Message-ID', 'From')); + $this->getHeaders()->addTextHeader('MIME-Version', '1.0'); + $this->setDate(time()); + $this->setId($this->getId()); + $this->getHeaders()->addMailboxHeader('From'); + } + + /** + * Always returns {@link LEVEL_TOP} for a message instance. + * + * @return int + */ + public function getNestingLevel() + { + return self::LEVEL_TOP; + } + + /** + * Set the subject of this message. + * + * @param string $subject + * + * @return Swift_Mime_SimpleMessage + */ + public function setSubject($subject) + { + if (!$this->_setHeaderFieldModel('Subject', $subject)) { + $this->getHeaders()->addTextHeader('Subject', $subject); + } + + return $this; + } + + /** + * Get the subject of this message. + * + * @return string + */ + public function getSubject() + { + return $this->_getHeaderFieldModel('Subject'); + } + + /** + * Set the date at which this message was created. + * + * @param int $date + * + * @return Swift_Mime_SimpleMessage + */ + public function setDate($date) + { + if (!$this->_setHeaderFieldModel('Date', $date)) { + $this->getHeaders()->addDateHeader('Date', $date); + } + + return $this; + } + + /** + * Get the date at which this message was created. + * + * @return int + */ + public function getDate() + { + return $this->_getHeaderFieldModel('Date'); + } + + /** + * Set the return-path (the bounce address) of this message. + * + * @param string $address + * + * @return Swift_Mime_SimpleMessage + */ + public function setReturnPath($address) + { + if (!$this->_setHeaderFieldModel('Return-Path', $address)) { + $this->getHeaders()->addPathHeader('Return-Path', $address); + } + + return $this; + } + + /** + * Get the return-path (bounce address) of this message. + * + * @return string + */ + public function getReturnPath() + { + return $this->_getHeaderFieldModel('Return-Path'); + } + + /** + * Set the sender of this message. + * + * This does not override the From field, but it has a higher significance. + * + * @param string $address + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function setSender($address, $name = null) + { + if (!is_array($address) && isset($name)) { + $address = array($address => $name); + } + + if (!$this->_setHeaderFieldModel('Sender', (array) $address)) { + $this->getHeaders()->addMailboxHeader('Sender', (array) $address); + } + + return $this; + } + + /** + * Get the sender of this message. + * + * @return string + */ + public function getSender() + { + return $this->_getHeaderFieldModel('Sender'); + } + + /** + * Add a From: address to this message. + * + * If $name is passed this name will be associated with the address. + * + * @param string $address + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function addFrom($address, $name = null) + { + $current = $this->getFrom(); + $current[$address] = $name; + + return $this->setFrom($current); + } + + /** + * Set the from address of this message. + * + * You may pass an array of addresses if this message is from multiple people. + * + * If $name is passed and the first parameter is a string, this name will be + * associated with the address. + * + * @param string|array $addresses + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function setFrom($addresses, $name = null) + { + if (!is_array($addresses) && isset($name)) { + $addresses = array($addresses => $name); + } + + if (!$this->_setHeaderFieldModel('From', (array) $addresses)) { + $this->getHeaders()->addMailboxHeader('From', (array) $addresses); + } + + return $this; + } + + /** + * Get the from address of this message. + * + * @return mixed + */ + public function getFrom() + { + return $this->_getHeaderFieldModel('From'); + } + + /** + * Add a Reply-To: address to this message. + * + * If $name is passed this name will be associated with the address. + * + * @param string $address + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function addReplyTo($address, $name = null) + { + $current = $this->getReplyTo(); + $current[$address] = $name; + + return $this->setReplyTo($current); + } + + /** + * Set the reply-to address of this message. + * + * You may pass an array of addresses if replies will go to multiple people. + * + * If $name is passed and the first parameter is a string, this name will be + * associated with the address. + * + * @param mixed $addresses + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function setReplyTo($addresses, $name = null) + { + if (!is_array($addresses) && isset($name)) { + $addresses = array($addresses => $name); + } + + if (!$this->_setHeaderFieldModel('Reply-To', (array) $addresses)) { + $this->getHeaders()->addMailboxHeader('Reply-To', (array) $addresses); + } + + return $this; + } + + /** + * Get the reply-to address of this message. + * + * @return string + */ + public function getReplyTo() + { + return $this->_getHeaderFieldModel('Reply-To'); + } + + /** + * Add a To: address to this message. + * + * If $name is passed this name will be associated with the address. + * + * @param string $address + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function addTo($address, $name = null) + { + $current = $this->getTo(); + $current[$address] = $name; + + return $this->setTo($current); + } + + /** + * Set the to addresses of this message. + * + * If multiple recipients will receive the message an array should be used. + * Example: array('receiver@domain.org', 'other@domain.org' => 'A name') + * + * If $name is passed and the first parameter is a string, this name will be + * associated with the address. + * + * @param mixed $addresses + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function setTo($addresses, $name = null) + { + if (!is_array($addresses) && isset($name)) { + $addresses = array($addresses => $name); + } + + if (!$this->_setHeaderFieldModel('To', (array) $addresses)) { + $this->getHeaders()->addMailboxHeader('To', (array) $addresses); + } + + return $this; + } + + /** + * Get the To addresses of this message. + * + * @return array + */ + public function getTo() + { + return $this->_getHeaderFieldModel('To'); + } + + /** + * Add a Cc: address to this message. + * + * If $name is passed this name will be associated with the address. + * + * @param string $address + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function addCc($address, $name = null) + { + $current = $this->getCc(); + $current[$address] = $name; + + return $this->setCc($current); + } + + /** + * Set the Cc addresses of this message. + * + * If $name is passed and the first parameter is a string, this name will be + * associated with the address. + * + * @param mixed $addresses + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function setCc($addresses, $name = null) + { + if (!is_array($addresses) && isset($name)) { + $addresses = array($addresses => $name); + } + + if (!$this->_setHeaderFieldModel('Cc', (array) $addresses)) { + $this->getHeaders()->addMailboxHeader('Cc', (array) $addresses); + } + + return $this; + } + + /** + * Get the Cc address of this message. + * + * @return array + */ + public function getCc() + { + return $this->_getHeaderFieldModel('Cc'); + } + + /** + * Add a Bcc: address to this message. + * + * If $name is passed this name will be associated with the address. + * + * @param string $address + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function addBcc($address, $name = null) + { + $current = $this->getBcc(); + $current[$address] = $name; + + return $this->setBcc($current); + } + + /** + * Set the Bcc addresses of this message. + * + * If $name is passed and the first parameter is a string, this name will be + * associated with the address. + * + * @param mixed $addresses + * @param string $name optional + * + * @return Swift_Mime_SimpleMessage + */ + public function setBcc($addresses, $name = null) + { + if (!is_array($addresses) && isset($name)) { + $addresses = array($addresses => $name); + } + + if (!$this->_setHeaderFieldModel('Bcc', (array) $addresses)) { + $this->getHeaders()->addMailboxHeader('Bcc', (array) $addresses); + } + + return $this; + } + + /** + * Get the Bcc addresses of this message. + * + * @return array + */ + public function getBcc() + { + return $this->_getHeaderFieldModel('Bcc'); + } + + /** + * Set the priority of this message. + * + * The value is an integer where 1 is the highest priority and 5 is the lowest. + * + * @param int $priority + * + * @return Swift_Mime_SimpleMessage + */ + public function setPriority($priority) + { + $priorityMap = array( + 1 => 'Highest', + 2 => 'High', + 3 => 'Normal', + 4 => 'Low', + 5 => 'Lowest', + ); + $pMapKeys = array_keys($priorityMap); + if ($priority > max($pMapKeys)) { + $priority = max($pMapKeys); + } elseif ($priority < min($pMapKeys)) { + $priority = min($pMapKeys); + } + if (!$this->_setHeaderFieldModel('X-Priority', + sprintf('%d (%s)', $priority, $priorityMap[$priority]))) { + $this->getHeaders()->addTextHeader('X-Priority', + sprintf('%d (%s)', $priority, $priorityMap[$priority])); + } + + return $this; + } + + /** + * Get the priority of this message. + * + * The returned value is an integer where 1 is the highest priority and 5 + * is the lowest. + * + * @return int + */ + public function getPriority() + { + list($priority) = sscanf($this->_getHeaderFieldModel('X-Priority'), + '%[1-5]' + ); + + return isset($priority) ? $priority : 3; + } + + /** + * Ask for a delivery receipt from the recipient to be sent to $addresses. + * + * @param array $addresses + * + * @return Swift_Mime_SimpleMessage + */ + public function setReadReceiptTo($addresses) + { + if (!$this->_setHeaderFieldModel('Disposition-Notification-To', $addresses)) { + $this->getHeaders() + ->addMailboxHeader('Disposition-Notification-To', $addresses); + } + + return $this; + } + + /** + * Get the addresses to which a read-receipt will be sent. + * + * @return string + */ + public function getReadReceiptTo() + { + return $this->_getHeaderFieldModel('Disposition-Notification-To'); + } + + /** + * Attach a {@link Swift_Mime_MimeEntity} such as an Attachment or MimePart. + * + * @param Swift_Mime_MimeEntity $entity + * + * @return Swift_Mime_SimpleMessage + */ + public function attach(Swift_Mime_MimeEntity $entity) + { + $this->setChildren(array_merge($this->getChildren(), array($entity))); + + return $this; + } + + /** + * Remove an already attached entity. + * + * @param Swift_Mime_MimeEntity $entity + * + * @return Swift_Mime_SimpleMessage + */ + public function detach(Swift_Mime_MimeEntity $entity) + { + $newChildren = array(); + foreach ($this->getChildren() as $child) { + if ($entity !== $child) { + $newChildren[] = $child; + } + } + $this->setChildren($newChildren); + + return $this; + } + + /** + * Attach a {@link Swift_Mime_MimeEntity} and return it's CID source. + * This method should be used when embedding images or other data in a message. + * + * @param Swift_Mime_MimeEntity $entity + * + * @return string + */ + public function embed(Swift_Mime_MimeEntity $entity) + { + $this->attach($entity); + + return 'cid:'.$entity->getId(); + } + + /** + * Get this message as a complete string. + * + * @return string + */ + public function toString() + { + if (count($children = $this->getChildren()) > 0 && $this->getBody() != '') { + $this->setChildren(array_merge(array($this->_becomeMimePart()), $children)); + $string = parent::toString(); + $this->setChildren($children); + } else { + $string = parent::toString(); + } + + return $string; + } + + /** + * Returns a string representation of this object. + * + * @see toString() + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Write this message to a {@link Swift_InputByteStream}. + * + * @param Swift_InputByteStream $is + */ + public function toByteStream(Swift_InputByteStream $is) + { + if (count($children = $this->getChildren()) > 0 && $this->getBody() != '') { + $this->setChildren(array_merge(array($this->_becomeMimePart()), $children)); + parent::toByteStream($is); + $this->setChildren($children); + } else { + parent::toByteStream($is); + } + } + + /** @see Swift_Mime_SimpleMimeEntity::_getIdField() */ + protected function _getIdField() + { + return 'Message-ID'; + } + + /** Turn the body of this message into a child of itself if needed */ + protected function _becomeMimePart() + { + $part = new parent($this->getHeaders()->newInstance(), $this->getEncoder(), + $this->_getCache(), $this->_getGrammar(), $this->_userCharset + ); + $part->setContentType($this->_userContentType); + $part->setBody($this->getBody()); + $part->setFormat($this->_userFormat); + $part->setDelSp($this->_userDelSp); + $part->_setNestingLevel($this->_getTopNestingLevel()); + + return $part; + } + + /** Get the highest nesting level nested inside this message */ + private function _getTopNestingLevel() + { + $highestLevel = $this->getNestingLevel(); + foreach ($this->getChildren() as $child) { + $childLevel = $child->getNestingLevel(); + if ($highestLevel < $childLevel) { + $highestLevel = $childLevel; + } + } + + return $highestLevel; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Mime/SimpleMimeEntity.php b/lib/SwiftMailer/classes/Swift/Mime/SimpleMimeEntity.php new file mode 100644 index 0000000..0694ee1 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Mime/SimpleMimeEntity.php @@ -0,0 +1,843 @@ + array(self::LEVEL_TOP, self::LEVEL_MIXED), + 'multipart/alternative' => array(self::LEVEL_MIXED, self::LEVEL_ALTERNATIVE), + 'multipart/related' => array(self::LEVEL_ALTERNATIVE, self::LEVEL_RELATED), + ); + + /** A set of filter rules to define what level an entity should be nested at */ + private $_compoundLevelFilters = array(); + + /** The nesting level of this entity */ + private $_nestingLevel = self::LEVEL_ALTERNATIVE; + + /** A KeyCache instance used during encoding and streaming */ + private $_cache; + + /** Direct descendants of this entity */ + private $_immediateChildren = array(); + + /** All descendants of this entity */ + private $_children = array(); + + /** The maximum line length of the body of this entity */ + private $_maxLineLength = 78; + + /** The order in which alternative mime types should appear */ + private $_alternativePartOrder = array( + 'text/plain' => 1, + 'text/html' => 2, + 'multipart/related' => 3, + ); + + /** The CID of this entity */ + private $_id; + + /** The key used for accessing the cache */ + private $_cacheKey; + + protected $_userContentType; + + /** + * Create a new SimpleMimeEntity with $headers, $encoder and $cache. + * + * @param Swift_Mime_HeaderSet $headers + * @param Swift_Mime_ContentEncoder $encoder + * @param Swift_KeyCache $cache + * @param Swift_Mime_Grammar $grammar + */ + public function __construct(Swift_Mime_HeaderSet $headers, Swift_Mime_ContentEncoder $encoder, Swift_KeyCache $cache, Swift_Mime_Grammar $grammar) + { + $this->_cacheKey = md5(uniqid(getmypid().mt_rand(), true)); + $this->_cache = $cache; + $this->_headers = $headers; + $this->_grammar = $grammar; + $this->setEncoder($encoder); + $this->_headers->defineOrdering(array('Content-Type', 'Content-Transfer-Encoding')); + + // This array specifies that, when the entire MIME document contains + // $compoundLevel, then for each child within $level, if its Content-Type + // is $contentType then it should be treated as if it's level is + // $neededLevel instead. I tried to write that unambiguously! :-\ + // Data Structure: + // array ( + // $compoundLevel => array( + // $level => array( + // $contentType => $neededLevel + // ) + // ) + // ) + + $this->_compoundLevelFilters = array( + (self::LEVEL_ALTERNATIVE + self::LEVEL_RELATED) => array( + self::LEVEL_ALTERNATIVE => array( + 'text/plain' => self::LEVEL_ALTERNATIVE, + 'text/html' => self::LEVEL_RELATED, + ), + ), + ); + + $this->_id = $this->getRandomId(); + } + + /** + * Generate a new Content-ID or Message-ID for this MIME entity. + * + * @return string + */ + public function generateId() + { + $this->setId($this->getRandomId()); + + return $this->_id; + } + + /** + * Get the {@link Swift_Mime_HeaderSet} for this entity. + * + * @return Swift_Mime_HeaderSet + */ + public function getHeaders() + { + return $this->_headers; + } + + /** + * Get the nesting level of this entity. + * + * @see LEVEL_TOP, LEVEL_MIXED, LEVEL_RELATED, LEVEL_ALTERNATIVE + * + * @return int + */ + public function getNestingLevel() + { + return $this->_nestingLevel; + } + + /** + * Get the Content-type of this entity. + * + * @return string + */ + public function getContentType() + { + return $this->_getHeaderFieldModel('Content-Type'); + } + + /** + * Set the Content-type of this entity. + * + * @param string $type + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setContentType($type) + { + $this->_setContentTypeInHeaders($type); + // Keep track of the value so that if the content-type changes automatically + // due to added child entities, it can be restored if they are later removed + $this->_userContentType = $type; + + return $this; + } + + /** + * Get the CID of this entity. + * + * The CID will only be present in headers if a Content-ID header is present. + * + * @return string + */ + public function getId() + { + $tmp = (array) $this->_getHeaderFieldModel($this->_getIdField()); + + return $this->_headers->has($this->_getIdField()) ? current($tmp) : $this->_id; + } + + /** + * Set the CID of this entity. + * + * @param string $id + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setId($id) + { + if (!$this->_setHeaderFieldModel($this->_getIdField(), $id)) { + $this->_headers->addIdHeader($this->_getIdField(), $id); + } + $this->_id = $id; + + return $this; + } + + /** + * Get the description of this entity. + * + * This value comes from the Content-Description header if set. + * + * @return string + */ + public function getDescription() + { + return $this->_getHeaderFieldModel('Content-Description'); + } + + /** + * Set the description of this entity. + * + * This method sets a value in the Content-ID header. + * + * @param string $description + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setDescription($description) + { + if (!$this->_setHeaderFieldModel('Content-Description', $description)) { + $this->_headers->addTextHeader('Content-Description', $description); + } + + return $this; + } + + /** + * Get the maximum line length of the body of this entity. + * + * @return int + */ + public function getMaxLineLength() + { + return $this->_maxLineLength; + } + + /** + * Set the maximum line length of lines in this body. + * + * Though not enforced by the library, lines should not exceed 1000 chars. + * + * @param int $length + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setMaxLineLength($length) + { + $this->_maxLineLength = $length; + + return $this; + } + + /** + * Get all children added to this entity. + * + * @return Swift_Mime_MimeEntity[] + */ + public function getChildren() + { + return $this->_children; + } + + /** + * Set all children of this entity. + * + * @param Swift_Mime_MimeEntity[] $children + * @param int $compoundLevel For internal use only + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setChildren(array $children, $compoundLevel = null) + { + // TODO: Try to refactor this logic + + $compoundLevel = isset($compoundLevel) ? $compoundLevel : $this->_getCompoundLevel($children); + $immediateChildren = array(); + $grandchildren = array(); + $newContentType = $this->_userContentType; + + foreach ($children as $child) { + $level = $this->_getNeededChildLevel($child, $compoundLevel); + if (empty($immediateChildren)) { + //first iteration + $immediateChildren = array($child); + } else { + $nextLevel = $this->_getNeededChildLevel($immediateChildren[0], $compoundLevel); + if ($nextLevel == $level) { + $immediateChildren[] = $child; + } elseif ($level < $nextLevel) { + // Re-assign immediateChildren to grandchildren + $grandchildren = array_merge($grandchildren, $immediateChildren); + // Set new children + $immediateChildren = array($child); + } else { + $grandchildren[] = $child; + } + } + } + + if ($immediateChildren) { + $lowestLevel = $this->_getNeededChildLevel($immediateChildren[0], $compoundLevel); + + // Determine which composite media type is needed to accommodate the + // immediate children + foreach ($this->_compositeRanges as $mediaType => $range) { + if ($lowestLevel > $range[0] && $lowestLevel <= $range[1]) { + $newContentType = $mediaType; + + break; + } + } + + // Put any grandchildren in a subpart + if (!empty($grandchildren)) { + $subentity = $this->_createChild(); + $subentity->_setNestingLevel($lowestLevel); + $subentity->setChildren($grandchildren, $compoundLevel); + array_unshift($immediateChildren, $subentity); + } + } + + $this->_immediateChildren = $immediateChildren; + $this->_children = $children; + $this->_setContentTypeInHeaders($newContentType); + $this->_fixHeaders(); + $this->_sortChildren(); + + return $this; + } + + /** + * Get the body of this entity as a string. + * + * @return string + */ + public function getBody() + { + return $this->_body instanceof Swift_OutputByteStream ? $this->_readStream($this->_body) : $this->_body; + } + + /** + * Set the body of this entity, either as a string, or as an instance of + * {@link Swift_OutputByteStream}. + * + * @param mixed $body + * @param string $contentType optional + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setBody($body, $contentType = null) + { + if ($body !== $this->_body) { + $this->_clearCache(); + } + + $this->_body = $body; + if (isset($contentType)) { + $this->setContentType($contentType); + } + + return $this; + } + + /** + * Get the encoder used for the body of this entity. + * + * @return Swift_Mime_ContentEncoder + */ + public function getEncoder() + { + return $this->_encoder; + } + + /** + * Set the encoder used for the body of this entity. + * + * @param Swift_Mime_ContentEncoder $encoder + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setEncoder(Swift_Mime_ContentEncoder $encoder) + { + if ($encoder !== $this->_encoder) { + $this->_clearCache(); + } + + $this->_encoder = $encoder; + $this->_setEncoding($encoder->getName()); + $this->_notifyEncoderChanged($encoder); + + return $this; + } + + /** + * Get the boundary used to separate children in this entity. + * + * @return string + */ + public function getBoundary() + { + if (!isset($this->_boundary)) { + $this->_boundary = '_=_swift_v4_'.time().'_'.md5(getmypid().mt_rand().uniqid('', true)).'_=_'; + } + + return $this->_boundary; + } + + /** + * Set the boundary used to separate children in this entity. + * + * @param string $boundary + * + * @throws Swift_RfcComplianceException + * + * @return Swift_Mime_SimpleMimeEntity + */ + public function setBoundary($boundary) + { + $this->_assertValidBoundary($boundary); + $this->_boundary = $boundary; + + return $this; + } + + /** + * Receive notification that the charset of this entity, or a parent entity + * has changed. + * + * @param string $charset + */ + public function charsetChanged($charset) + { + $this->_notifyCharsetChanged($charset); + } + + /** + * Receive notification that the encoder of this entity or a parent entity + * has changed. + * + * @param Swift_Mime_ContentEncoder $encoder + */ + public function encoderChanged(Swift_Mime_ContentEncoder $encoder) + { + $this->_notifyEncoderChanged($encoder); + } + + /** + * Get this entire entity as a string. + * + * @return string + */ + public function toString() + { + $string = $this->_headers->toString(); + $string .= $this->_bodyToString(); + + return $string; + } + + /** + * Get this entire entity as a string. + * + * @return string + */ + protected function _bodyToString() + { + $string = ''; + + if (isset($this->_body) && empty($this->_immediateChildren)) { + if ($this->_cache->hasKey($this->_cacheKey, 'body')) { + $body = $this->_cache->getString($this->_cacheKey, 'body'); + } else { + $body = "\r\n".$this->_encoder->encodeString($this->getBody(), 0, $this->getMaxLineLength()); + $this->_cache->setString($this->_cacheKey, 'body', $body, Swift_KeyCache::MODE_WRITE); + } + $string .= $body; + } + + if (!empty($this->_immediateChildren)) { + foreach ($this->_immediateChildren as $child) { + $string .= "\r\n\r\n--".$this->getBoundary()."\r\n"; + $string .= $child->toString(); + } + $string .= "\r\n\r\n--".$this->getBoundary()."--\r\n"; + } + + return $string; + } + + /** + * Returns a string representation of this object. + * + * @see toString() + * + * @return string + */ + public function __toString() + { + return $this->toString(); + } + + /** + * Write this entire entity to a {@see Swift_InputByteStream}. + * + * @param Swift_InputByteStream + */ + public function toByteStream(Swift_InputByteStream $is) + { + $is->write($this->_headers->toString()); + $is->commit(); + + $this->_bodyToByteStream($is); + } + + /** + * Write this entire entity to a {@link Swift_InputByteStream}. + * + * @param Swift_InputByteStream + */ + protected function _bodyToByteStream(Swift_InputByteStream $is) + { + if (empty($this->_immediateChildren)) { + if (isset($this->_body)) { + if ($this->_cache->hasKey($this->_cacheKey, 'body')) { + $this->_cache->exportToByteStream($this->_cacheKey, 'body', $is); + } else { + $cacheIs = $this->_cache->getInputByteStream($this->_cacheKey, 'body'); + if ($cacheIs) { + $is->bind($cacheIs); + } + + $is->write("\r\n"); + + if ($this->_body instanceof Swift_OutputByteStream) { + $this->_body->setReadPointer(0); + + $this->_encoder->encodeByteStream($this->_body, $is, 0, $this->getMaxLineLength()); + } else { + $is->write($this->_encoder->encodeString($this->getBody(), 0, $this->getMaxLineLength())); + } + + if ($cacheIs) { + $is->unbind($cacheIs); + } + } + } + } + + if (!empty($this->_immediateChildren)) { + foreach ($this->_immediateChildren as $child) { + $is->write("\r\n\r\n--".$this->getBoundary()."\r\n"); + $child->toByteStream($is); + } + $is->write("\r\n\r\n--".$this->getBoundary()."--\r\n"); + } + } + + /** + * Get the name of the header that provides the ID of this entity. + */ + protected function _getIdField() + { + return 'Content-ID'; + } + + /** + * Get the model data (usually an array or a string) for $field. + */ + protected function _getHeaderFieldModel($field) + { + if ($this->_headers->has($field)) { + return $this->_headers->get($field)->getFieldBodyModel(); + } + } + + /** + * Set the model data for $field. + */ + protected function _setHeaderFieldModel($field, $model) + { + if ($this->_headers->has($field)) { + $this->_headers->get($field)->setFieldBodyModel($model); + + return true; + } + + return false; + } + + /** + * Get the parameter value of $parameter on $field header. + */ + protected function _getHeaderParameter($field, $parameter) + { + if ($this->_headers->has($field)) { + return $this->_headers->get($field)->getParameter($parameter); + } + } + + /** + * Set the parameter value of $parameter on $field header. + */ + protected function _setHeaderParameter($field, $parameter, $value) + { + if ($this->_headers->has($field)) { + $this->_headers->get($field)->setParameter($parameter, $value); + + return true; + } + + return false; + } + + /** + * Re-evaluate what content type and encoding should be used on this entity. + */ + protected function _fixHeaders() + { + if (count($this->_immediateChildren)) { + $this->_setHeaderParameter('Content-Type', 'boundary', + $this->getBoundary() + ); + $this->_headers->remove('Content-Transfer-Encoding'); + } else { + $this->_setHeaderParameter('Content-Type', 'boundary', null); + $this->_setEncoding($this->_encoder->getName()); + } + } + + /** + * Get the KeyCache used in this entity. + * + * @return Swift_KeyCache + */ + protected function _getCache() + { + return $this->_cache; + } + + /** + * Get the grammar used for validation. + * + * @return Swift_Mime_Grammar + */ + protected function _getGrammar() + { + return $this->_grammar; + } + + /** + * Empty the KeyCache for this entity. + */ + protected function _clearCache() + { + $this->_cache->clearKey($this->_cacheKey, 'body'); + } + + /** + * Returns a random Content-ID or Message-ID. + * + * @return string + */ + protected function getRandomId() + { + $idLeft = md5(getmypid().'.'.time().'.'.uniqid(mt_rand(), true)); + $idRight = !empty($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'swift.generated'; + $id = $idLeft.'@'.$idRight; + + try { + $this->_assertValidId($id); + } catch (Swift_RfcComplianceException $e) { + $id = $idLeft.'@swift.generated'; + } + + return $id; + } + + private function _readStream(Swift_OutputByteStream $os) + { + $string = ''; + while (false !== $bytes = $os->read(8192)) { + $string .= $bytes; + } + + $os->setReadPointer(0); + + return $string; + } + + private function _setEncoding($encoding) + { + if (!$this->_setHeaderFieldModel('Content-Transfer-Encoding', $encoding)) { + $this->_headers->addTextHeader('Content-Transfer-Encoding', $encoding); + } + } + + private function _assertValidBoundary($boundary) + { + if (!preg_match('/^[a-z0-9\'\(\)\+_\-,\.\/:=\?\ ]{0,69}[a-z0-9\'\(\)\+_\-,\.\/:=\?]$/Di', $boundary)) { + throw new Swift_RfcComplianceException('Mime boundary set is not RFC 2046 compliant.'); + } + } + + private function _setContentTypeInHeaders($type) + { + if (!$this->_setHeaderFieldModel('Content-Type', $type)) { + $this->_headers->addParameterizedHeader('Content-Type', $type); + } + } + + private function _setNestingLevel($level) + { + $this->_nestingLevel = $level; + } + + private function _getCompoundLevel($children) + { + $level = 0; + foreach ($children as $child) { + $level |= $child->getNestingLevel(); + } + + return $level; + } + + private function _getNeededChildLevel($child, $compoundLevel) + { + $filter = array(); + foreach ($this->_compoundLevelFilters as $bitmask => $rules) { + if (($compoundLevel & $bitmask) === $bitmask) { + $filter = $rules + $filter; + } + } + + $realLevel = $child->getNestingLevel(); + $lowercaseType = strtolower($child->getContentType()); + + if (isset($filter[$realLevel]) && isset($filter[$realLevel][$lowercaseType])) { + return $filter[$realLevel][$lowercaseType]; + } + + return $realLevel; + } + + private function _createChild() + { + return new self($this->_headers->newInstance(), $this->_encoder, $this->_cache, $this->_grammar); + } + + private function _notifyEncoderChanged(Swift_Mime_ContentEncoder $encoder) + { + foreach ($this->_immediateChildren as $child) { + $child->encoderChanged($encoder); + } + } + + private function _notifyCharsetChanged($charset) + { + $this->_encoder->charsetChanged($charset); + $this->_headers->charsetChanged($charset); + foreach ($this->_immediateChildren as $child) { + $child->charsetChanged($charset); + } + } + + private function _sortChildren() + { + $shouldSort = false; + foreach ($this->_immediateChildren as $child) { + // NOTE: This include alternative parts moved into a related part + if ($child->getNestingLevel() == self::LEVEL_ALTERNATIVE) { + $shouldSort = true; + break; + } + } + + // Sort in order of preference, if there is one + if ($shouldSort) { + usort($this->_immediateChildren, array($this, '_childSortAlgorithm')); + } + } + + private function _childSortAlgorithm($a, $b) + { + $typePrefs = array(); + $types = array(strtolower($a->getContentType()), strtolower($b->getContentType())); + + foreach ($types as $type) { + $typePrefs[] = array_key_exists($type, $this->_alternativePartOrder) ? $this->_alternativePartOrder[$type] : max($this->_alternativePartOrder) + 1; + } + + return $typePrefs[0] >= $typePrefs[1] ? 1 : -1; + } + + // -- Destructor + + /** + * Empties it's own contents from the cache. + */ + public function __destruct() + { + $this->_cache->clearAll($this->_cacheKey); + } + + /** + * Throws an Exception if the id passed does not comply with RFC 2822. + * + * @param string $id + * + * @throws Swift_RfcComplianceException + */ + private function _assertValidId($id) + { + if (!preg_match('/^'.$this->_grammar->getDefinition('id-left').'@'.$this->_grammar->getDefinition('id-right').'$/D', $id)) { + throw new Swift_RfcComplianceException('Invalid ID given <'.$id.'>'); + } + } + + /** + * Make a deep copy of object. + */ + public function __clone() + { + $this->_headers = clone $this->_headers; + $this->_encoder = clone $this->_encoder; + $this->_cacheKey = md5(uniqid(getmypid().mt_rand(), true)); + $children = array(); + foreach ($this->_children as $pos => $child) { + $children[$pos] = clone $child; + } + $this->setChildren($children); + } +} diff --git a/lib/SwiftMailer/classes/Swift/MimePart.php b/lib/SwiftMailer/classes/Swift/MimePart.php new file mode 100644 index 0000000..215f8db --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/MimePart.php @@ -0,0 +1,59 @@ +createDependenciesFor('mime.part') + ); + + if (!isset($charset)) { + $charset = Swift_DependencyContainer::getInstance() + ->lookup('properties.charset'); + } + $this->setBody($body); + $this->setCharset($charset); + if ($contentType) { + $this->setContentType($contentType); + } + } + + /** + * Create a new MimePart. + * + * @param string $body + * @param string $contentType + * @param string $charset + * + * @return Swift_Mime_MimePart + */ + public static function newInstance($body = null, $contentType = null, $charset = null) + { + return new self($body, $contentType, $charset); + } +} diff --git a/lib/SwiftMailer/classes/Swift/NullTransport.php b/lib/SwiftMailer/classes/Swift/NullTransport.php new file mode 100644 index 0000000..b38e1cf --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/NullTransport.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Pretends messages have been sent, but just ignores them. + * + * @author Fabien Potencier + */ +class Swift_NullTransport extends Swift_Transport_NullTransport +{ + /** + * Create a new NullTransport. + */ + public function __construct() + { + call_user_func_array( + array($this, 'Swift_Transport_NullTransport::__construct'), + Swift_DependencyContainer::getInstance() + ->createDependenciesFor('transport.null') + ); + } + + /** + * Create a new NullTransport instance. + * + * @return Swift_NullTransport + */ + public static function newInstance() + { + return new self(); + } +} diff --git a/lib/SwiftMailer/classes/Swift/OutputByteStream.php b/lib/SwiftMailer/classes/Swift/OutputByteStream.php new file mode 100644 index 0000000..1f26f9b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/OutputByteStream.php @@ -0,0 +1,46 @@ +setThreshold($threshold); + $this->setSleepTime($sleep); + $this->_sleeper = $sleeper; + } + + /** + * Set the number of emails to send before restarting. + * + * @param int $threshold + */ + public function setThreshold($threshold) + { + $this->_threshold = $threshold; + } + + /** + * Get the number of emails to send before restarting. + * + * @return int + */ + public function getThreshold() + { + return $this->_threshold; + } + + /** + * Set the number of seconds to sleep for during a restart. + * + * @param int $sleep time + */ + public function setSleepTime($sleep) + { + $this->_sleep = $sleep; + } + + /** + * Get the number of seconds to sleep for during a restart. + * + * @return int + */ + public function getSleepTime() + { + return $this->_sleep; + } + + /** + * Invoked immediately before the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + } + + /** + * Invoked immediately after the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + ++$this->_counter; + if ($this->_counter >= $this->_threshold) { + $transport = $evt->getTransport(); + $transport->stop(); + if ($this->_sleep) { + $this->sleep($this->_sleep); + } + $transport->start(); + $this->_counter = 0; + } + } + + /** + * Sleep for $seconds. + * + * @param int $seconds + */ + public function sleep($seconds) + { + if (isset($this->_sleeper)) { + $this->_sleeper->sleep($seconds); + } else { + sleep($seconds); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/BandwidthMonitorPlugin.php b/lib/SwiftMailer/classes/Swift/Plugins/BandwidthMonitorPlugin.php new file mode 100644 index 0000000..f7e18d0 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/BandwidthMonitorPlugin.php @@ -0,0 +1,164 @@ +getMessage(); + $message->toByteStream($this); + } + + /** + * Invoked immediately following a command being sent. + * + * @param Swift_Events_CommandEvent $evt + */ + public function commandSent(Swift_Events_CommandEvent $evt) + { + $command = $evt->getCommand(); + $this->_out += strlen($command); + } + + /** + * Invoked immediately following a response coming back. + * + * @param Swift_Events_ResponseEvent $evt + */ + public function responseReceived(Swift_Events_ResponseEvent $evt) + { + $response = $evt->getResponse(); + $this->_in += strlen($response); + } + + /** + * Called when a message is sent so that the outgoing counter can be increased. + * + * @param string $bytes + */ + public function write($bytes) + { + $this->_out += strlen($bytes); + foreach ($this->_mirrors as $stream) { + $stream->write($bytes); + } + } + + /** + * Not used. + */ + public function commit() + { + } + + /** + * Attach $is to this stream. + * + * The stream acts as an observer, receiving all data that is written. + * All {@link write()} and {@link flushBuffers()} operations will be mirrored. + * + * @param Swift_InputByteStream $is + */ + public function bind(Swift_InputByteStream $is) + { + $this->_mirrors[] = $is; + } + + /** + * Remove an already bound stream. + * + * If $is is not bound, no errors will be raised. + * If the stream currently has any buffered data it will be written to $is + * before unbinding occurs. + * + * @param Swift_InputByteStream $is + */ + public function unbind(Swift_InputByteStream $is) + { + foreach ($this->_mirrors as $k => $stream) { + if ($is === $stream) { + unset($this->_mirrors[$k]); + } + } + } + + /** + * Not used. + */ + public function flushBuffers() + { + foreach ($this->_mirrors as $stream) { + $stream->flushBuffers(); + } + } + + /** + * Get the total number of bytes sent to the server. + * + * @return int + */ + public function getBytesOut() + { + return $this->_out; + } + + /** + * Get the total number of bytes received from the server. + * + * @return int + */ + public function getBytesIn() + { + return $this->_in; + } + + /** + * Reset the internal counters to zero. + */ + public function reset() + { + $this->_out = 0; + $this->_in = 0; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Decorator/Replacements.php b/lib/SwiftMailer/classes/Swift/Plugins/Decorator/Replacements.php new file mode 100644 index 0000000..9f9f08b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Decorator/Replacements.php @@ -0,0 +1,31 @@ + + * $replacements = array( + * "address1@domain.tld" => array("{a}" => "b", "{c}" => "d"), + * "address2@domain.tld" => array("{a}" => "x", "{c}" => "y") + * ) + * + * + * When using an instance of {@link Swift_Plugins_Decorator_Replacements}, + * the object should return just the array of replacements for the address + * given to {@link Swift_Plugins_Decorator_Replacements::getReplacementsFor()}. + * + * @param mixed $replacements Array or Swift_Plugins_Decorator_Replacements + */ + public function __construct($replacements) + { + $this->setReplacements($replacements); + } + + /** + * Sets replacements. + * + * @param mixed $replacements Array or Swift_Plugins_Decorator_Replacements + * + * @see __construct() + */ + public function setReplacements($replacements) + { + if (!($replacements instanceof Swift_Plugins_Decorator_Replacements)) { + $this->_replacements = (array) $replacements; + } else { + $this->_replacements = $replacements; + } + } + + /** + * Invoked immediately before the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + $message = $evt->getMessage(); + $this->_restoreMessage($message); + $to = array_keys($message->getTo()); + $address = array_shift($to); + if ($replacements = $this->getReplacementsFor($address)) { + $body = $message->getBody(); + $search = array_keys($replacements); + $replace = array_values($replacements); + $bodyReplaced = str_replace( + $search, $replace, $body + ); + if ($body != $bodyReplaced) { + $this->_originalBody = $body; + $message->setBody($bodyReplaced); + } + + foreach ($message->getHeaders()->getAll() as $header) { + $body = $header->getFieldBodyModel(); + $count = 0; + if (is_array($body)) { + $bodyReplaced = array(); + foreach ($body as $key => $value) { + $count1 = 0; + $count2 = 0; + $key = is_string($key) ? str_replace($search, $replace, $key, $count1) : $key; + $value = is_string($value) ? str_replace($search, $replace, $value, $count2) : $value; + $bodyReplaced[$key] = $value; + + if (!$count && ($count1 || $count2)) { + $count = 1; + } + } + } else { + $bodyReplaced = str_replace($search, $replace, $body, $count); + } + + if ($count) { + $this->_originalHeaders[$header->getFieldName()] = $body; + $header->setFieldBodyModel($bodyReplaced); + } + } + + $children = (array) $message->getChildren(); + foreach ($children as $child) { + list($type) = sscanf($child->getContentType(), '%[^/]/%s'); + if ('text' == $type) { + $body = $child->getBody(); + $bodyReplaced = str_replace( + $search, $replace, $body + ); + if ($body != $bodyReplaced) { + $child->setBody($bodyReplaced); + $this->_originalChildBodies[$child->getId()] = $body; + } + } + } + $this->_lastMessage = $message; + } + } + + /** + * Find a map of replacements for the address. + * + * If this plugin was provided with a delegate instance of + * {@link Swift_Plugins_Decorator_Replacements} then the call will be + * delegated to it. Otherwise, it will attempt to find the replacements + * from the array provided in the constructor. + * + * If no replacements can be found, an empty value (NULL) is returned. + * + * @param string $address + * + * @return array + */ + public function getReplacementsFor($address) + { + if ($this->_replacements instanceof Swift_Plugins_Decorator_Replacements) { + return $this->_replacements->getReplacementsFor($address); + } + + return isset($this->_replacements[$address]) ? $this->_replacements[$address] : null; + } + + /** + * Invoked immediately after the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + $this->_restoreMessage($evt->getMessage()); + } + + /** Restore a changed message back to its original state */ + private function _restoreMessage(Swift_Mime_Message $message) + { + if ($this->_lastMessage === $message) { + if (isset($this->_originalBody)) { + $message->setBody($this->_originalBody); + $this->_originalBody = null; + } + if (!empty($this->_originalHeaders)) { + foreach ($message->getHeaders()->getAll() as $header) { + if (array_key_exists($header->getFieldName(), $this->_originalHeaders)) { + $header->setFieldBodyModel($this->_originalHeaders[$header->getFieldName()]); + } + } + $this->_originalHeaders = array(); + } + if (!empty($this->_originalChildBodies)) { + $children = (array) $message->getChildren(); + foreach ($children as $child) { + $id = $child->getId(); + if (array_key_exists($id, $this->_originalChildBodies)) { + $child->setBody($this->_originalChildBodies[$id]); + } + } + $this->_originalChildBodies = array(); + } + $this->_lastMessage = null; + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/ImpersonatePlugin.php b/lib/SwiftMailer/classes/Swift/Plugins/ImpersonatePlugin.php new file mode 100644 index 0000000..7552b67 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/ImpersonatePlugin.php @@ -0,0 +1,69 @@ +_sender = $sender; + } + + /** + * Invoked immediately before the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + $message = $evt->getMessage(); + $headers = $message->getHeaders(); + + // save current recipients + $headers->addPathHeader('X-Swift-Return-Path', $message->getReturnPath()); + + // replace them with the one to send to + $message->setReturnPath($this->_sender); + } + + /** + * Invoked immediately after the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + $message = $evt->getMessage(); + + // restore original headers + $headers = $message->getHeaders(); + + if ($headers->has('X-Swift-Return-Path')) { + $message->setReturnPath($headers->get('X-Swift-Return-Path')->getAddress()); + $headers->removeAll('X-Swift-Return-Path'); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Logger.php b/lib/SwiftMailer/classes/Swift/Plugins/Logger.php new file mode 100644 index 0000000..d9bce89 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Logger.php @@ -0,0 +1,36 @@ +_logger = $logger; + } + + /** + * Add a log entry. + * + * @param string $entry + */ + public function add($entry) + { + $this->_logger->add($entry); + } + + /** + * Clear the log contents. + */ + public function clear() + { + $this->_logger->clear(); + } + + /** + * Get this log as a string. + * + * @return string + */ + public function dump() + { + return $this->_logger->dump(); + } + + /** + * Invoked immediately following a command being sent. + * + * @param Swift_Events_CommandEvent $evt + */ + public function commandSent(Swift_Events_CommandEvent $evt) + { + $command = $evt->getCommand(); + $this->_logger->add(sprintf('>> %s', $command)); + } + + /** + * Invoked immediately following a response coming back. + * + * @param Swift_Events_ResponseEvent $evt + */ + public function responseReceived(Swift_Events_ResponseEvent $evt) + { + $response = $evt->getResponse(); + $this->_logger->add(sprintf('<< %s', $response)); + } + + /** + * Invoked just before a Transport is started. + * + * @param Swift_Events_TransportChangeEvent $evt + */ + public function beforeTransportStarted(Swift_Events_TransportChangeEvent $evt) + { + $transportName = get_class($evt->getSource()); + $this->_logger->add(sprintf('++ Starting %s', $transportName)); + } + + /** + * Invoked immediately after the Transport is started. + * + * @param Swift_Events_TransportChangeEvent $evt + */ + public function transportStarted(Swift_Events_TransportChangeEvent $evt) + { + $transportName = get_class($evt->getSource()); + $this->_logger->add(sprintf('++ %s started', $transportName)); + } + + /** + * Invoked just before a Transport is stopped. + * + * @param Swift_Events_TransportChangeEvent $evt + */ + public function beforeTransportStopped(Swift_Events_TransportChangeEvent $evt) + { + $transportName = get_class($evt->getSource()); + $this->_logger->add(sprintf('++ Stopping %s', $transportName)); + } + + /** + * Invoked immediately after the Transport is stopped. + * + * @param Swift_Events_TransportChangeEvent $evt + */ + public function transportStopped(Swift_Events_TransportChangeEvent $evt) + { + $transportName = get_class($evt->getSource()); + $this->_logger->add(sprintf('++ %s stopped', $transportName)); + } + + /** + * Invoked as a TransportException is thrown in the Transport system. + * + * @param Swift_Events_TransportExceptionEvent $evt + */ + public function exceptionThrown(Swift_Events_TransportExceptionEvent $evt) + { + $e = $evt->getException(); + $message = $e->getMessage(); + $code = $e->getCode(); + $this->_logger->add(sprintf('!! %s (code: %s)', $message, $code)); + $message .= PHP_EOL; + $message .= 'Log data:'.PHP_EOL; + $message .= $this->_logger->dump(); + $evt->cancelBubble(); + throw new Swift_TransportException($message, $code, $e->getPrevious()); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Loggers/ArrayLogger.php b/lib/SwiftMailer/classes/Swift/Plugins/Loggers/ArrayLogger.php new file mode 100644 index 0000000..865bb0a --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Loggers/ArrayLogger.php @@ -0,0 +1,72 @@ +_size = $size; + } + + /** + * Add a log entry. + * + * @param string $entry + */ + public function add($entry) + { + $this->_log[] = $entry; + while (count($this->_log) > $this->_size) { + array_shift($this->_log); + } + } + + /** + * Clear the log contents. + */ + public function clear() + { + $this->_log = array(); + } + + /** + * Get this log as a string. + * + * @return string + */ + public function dump() + { + return implode(PHP_EOL, $this->_log); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Loggers/EchoLogger.php b/lib/SwiftMailer/classes/Swift/Plugins/Loggers/EchoLogger.php new file mode 100644 index 0000000..3583297 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Loggers/EchoLogger.php @@ -0,0 +1,58 @@ +_isHtml = $isHtml; + } + + /** + * Add a log entry. + * + * @param string $entry + */ + public function add($entry) + { + if ($this->_isHtml) { + printf('%s%s%s', htmlspecialchars($entry, ENT_QUOTES), '
      ', PHP_EOL); + } else { + printf('%s%s', $entry, PHP_EOL); + } + } + + /** + * Not implemented. + */ + public function clear() + { + } + + /** + * Not implemented. + */ + public function dump() + { + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/MessageLogger.php b/lib/SwiftMailer/classes/Swift/Plugins/MessageLogger.php new file mode 100644 index 0000000..e622cb3 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/MessageLogger.php @@ -0,0 +1,74 @@ +messages = array(); + } + + /** + * Get the message list. + * + * @return array + */ + public function getMessages() + { + return $this->messages; + } + + /** + * Get the message count. + * + * @return int count + */ + public function countMessages() + { + return count($this->messages); + } + + /** + * Empty the message list. + */ + public function clear() + { + $this->messages = array(); + } + + /** + * Invoked immediately before the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + $this->messages[] = clone $evt->getMessage(); + } + + /** + * Invoked immediately after the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Pop/Pop3Connection.php b/lib/SwiftMailer/classes/Swift/Plugins/Pop/Pop3Connection.php new file mode 100644 index 0000000..fb99e4c --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Pop/Pop3Connection.php @@ -0,0 +1,31 @@ +_host = $host; + $this->_port = $port; + $this->_crypto = $crypto; + } + + /** + * Create a new PopBeforeSmtpPlugin for $host and $port. + * + * @param string $host + * @param int $port + * @param string $crypto as "tls" or "ssl" + * + * @return Swift_Plugins_PopBeforeSmtpPlugin + */ + public static function newInstance($host, $port = 110, $crypto = null) + { + return new self($host, $port, $crypto); + } + + /** + * Set a Pop3Connection to delegate to instead of connecting directly. + * + * @param Swift_Plugins_Pop_Pop3Connection $connection + * + * @return Swift_Plugins_PopBeforeSmtpPlugin + */ + public function setConnection(Swift_Plugins_Pop_Pop3Connection $connection) + { + $this->_connection = $connection; + + return $this; + } + + /** + * Bind this plugin to a specific SMTP transport instance. + * + * @param Swift_Transport + */ + public function bindSmtp(Swift_Transport $smtp) + { + $this->_transport = $smtp; + } + + /** + * Set the connection timeout in seconds (default 10). + * + * @param int $timeout + * + * @return Swift_Plugins_PopBeforeSmtpPlugin + */ + public function setTimeout($timeout) + { + $this->_timeout = (int) $timeout; + + return $this; + } + + /** + * Set the username to use when connecting (if needed). + * + * @param string $username + * + * @return Swift_Plugins_PopBeforeSmtpPlugin + */ + public function setUsername($username) + { + $this->_username = $username; + + return $this; + } + + /** + * Set the password to use when connecting (if needed). + * + * @param string $password + * + * @return Swift_Plugins_PopBeforeSmtpPlugin + */ + public function setPassword($password) + { + $this->_password = $password; + + return $this; + } + + /** + * Connect to the POP3 host and authenticate. + * + * @throws Swift_Plugins_Pop_Pop3Exception if connection fails + */ + public function connect() + { + if (isset($this->_connection)) { + $this->_connection->connect(); + } else { + if (!isset($this->_socket)) { + if (!$socket = fsockopen( + $this->_getHostString(), $this->_port, $errno, $errstr, $this->_timeout)) { + throw new Swift_Plugins_Pop_Pop3Exception( + sprintf('Failed to connect to POP3 host [%s]: %s', $this->_host, $errstr) + ); + } + $this->_socket = $socket; + + if (false === $greeting = fgets($this->_socket)) { + throw new Swift_Plugins_Pop_Pop3Exception( + sprintf('Failed to connect to POP3 host [%s]', trim($greeting)) + ); + } + + $this->_assertOk($greeting); + + if ($this->_username) { + $this->_command(sprintf("USER %s\r\n", $this->_username)); + $this->_command(sprintf("PASS %s\r\n", $this->_password)); + } + } + } + } + + /** + * Disconnect from the POP3 host. + */ + public function disconnect() + { + if (isset($this->_connection)) { + $this->_connection->disconnect(); + } else { + $this->_command("QUIT\r\n"); + if (!fclose($this->_socket)) { + throw new Swift_Plugins_Pop_Pop3Exception( + sprintf('POP3 host [%s] connection could not be stopped', $this->_host) + ); + } + $this->_socket = null; + } + } + + /** + * Invoked just before a Transport is started. + * + * @param Swift_Events_TransportChangeEvent $evt + */ + public function beforeTransportStarted(Swift_Events_TransportChangeEvent $evt) + { + if (isset($this->_transport)) { + if ($this->_transport !== $evt->getTransport()) { + return; + } + } + + $this->connect(); + $this->disconnect(); + } + + /** + * Not used. + */ + public function transportStarted(Swift_Events_TransportChangeEvent $evt) + { + } + + /** + * Not used. + */ + public function beforeTransportStopped(Swift_Events_TransportChangeEvent $evt) + { + } + + /** + * Not used. + */ + public function transportStopped(Swift_Events_TransportChangeEvent $evt) + { + } + + private function _command($command) + { + if (!fwrite($this->_socket, $command)) { + throw new Swift_Plugins_Pop_Pop3Exception( + sprintf('Failed to write command [%s] to POP3 host', trim($command)) + ); + } + + if (false === $response = fgets($this->_socket)) { + throw new Swift_Plugins_Pop_Pop3Exception( + sprintf('Failed to read from POP3 host after command [%s]', trim($command)) + ); + } + + $this->_assertOk($response); + + return $response; + } + + private function _assertOk($response) + { + if (substr($response, 0, 3) != '+OK') { + throw new Swift_Plugins_Pop_Pop3Exception( + sprintf('POP3 command failed [%s]', trim($response)) + ); + } + } + + private function _getHostString() + { + $host = $this->_host; + switch (strtolower($this->_crypto)) { + case 'ssl': + $host = 'ssl://'.$host; + break; + + case 'tls': + $host = 'tls://'.$host; + break; + } + + return $host; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/RedirectingPlugin.php b/lib/SwiftMailer/classes/Swift/Plugins/RedirectingPlugin.php new file mode 100644 index 0000000..c3a1f86 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/RedirectingPlugin.php @@ -0,0 +1,213 @@ +_recipient = $recipient; + $this->_whitelist = $whitelist; + } + + /** + * Set the recipient of all messages. + * + * @param mixed $recipient + */ + public function setRecipient($recipient) + { + $this->_recipient = $recipient; + } + + /** + * Get the recipient of all messages. + * + * @return mixed + */ + public function getRecipient() + { + return $this->_recipient; + } + + /** + * Set a list of regular expressions to whitelist certain recipients. + * + * @param array $whitelist + */ + public function setWhitelist(array $whitelist) + { + $this->_whitelist = $whitelist; + } + + /** + * Get the whitelist. + * + * @return array + */ + public function getWhitelist() + { + return $this->_whitelist; + } + + /** + * Invoked immediately before the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + $message = $evt->getMessage(); + $headers = $message->getHeaders(); + + // conditionally save current recipients + + if ($headers->has('to')) { + $headers->addMailboxHeader('X-Swift-To', $message->getTo()); + } + + if ($headers->has('cc')) { + $headers->addMailboxHeader('X-Swift-Cc', $message->getCc()); + } + + if ($headers->has('bcc')) { + $headers->addMailboxHeader('X-Swift-Bcc', $message->getBcc()); + } + + // Filter remaining headers against whitelist + $this->_filterHeaderSet($headers, 'To'); + $this->_filterHeaderSet($headers, 'Cc'); + $this->_filterHeaderSet($headers, 'Bcc'); + + // Add each hard coded recipient + $to = $message->getTo(); + if (null === $to) { + $to = array(); + } + + foreach ((array) $this->_recipient as $recipient) { + if (!array_key_exists($recipient, $to)) { + $message->addTo($recipient); + } + } + } + + /** + * Filter header set against a whitelist of regular expressions. + * + * @param Swift_Mime_HeaderSet $headerSet + * @param string $type + */ + private function _filterHeaderSet(Swift_Mime_HeaderSet $headerSet, $type) + { + foreach ($headerSet->getAll($type) as $headers) { + $headers->setNameAddresses($this->_filterNameAddresses($headers->getNameAddresses())); + } + } + + /** + * Filtered list of addresses => name pairs. + * + * @param array $recipients + * + * @return array + */ + private function _filterNameAddresses(array $recipients) + { + $filtered = array(); + + foreach ($recipients as $address => $name) { + if ($this->_isWhitelisted($address)) { + $filtered[$address] = $name; + } + } + + return $filtered; + } + + /** + * Matches address against whitelist of regular expressions. + * + * @param $recipient + * + * @return bool + */ + protected function _isWhitelisted($recipient) + { + if (in_array($recipient, (array) $this->_recipient)) { + return true; + } + + foreach ($this->_whitelist as $pattern) { + if (preg_match($pattern, $recipient)) { + return true; + } + } + + return false; + } + + /** + * Invoked immediately after the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + $this->_restoreMessage($evt->getMessage()); + } + + private function _restoreMessage(Swift_Mime_Message $message) + { + // restore original headers + $headers = $message->getHeaders(); + + if ($headers->has('X-Swift-To')) { + $message->setTo($headers->get('X-Swift-To')->getNameAddresses()); + $headers->removeAll('X-Swift-To'); + } else { + $message->setTo(null); + } + + if ($headers->has('X-Swift-Cc')) { + $message->setCc($headers->get('X-Swift-Cc')->getNameAddresses()); + $headers->removeAll('X-Swift-Cc'); + } + + if ($headers->has('X-Swift-Bcc')) { + $message->setBcc($headers->get('X-Swift-Bcc')->getNameAddresses()); + $headers->removeAll('X-Swift-Bcc'); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Reporter.php b/lib/SwiftMailer/classes/Swift/Plugins/Reporter.php new file mode 100644 index 0000000..0f21b7d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Reporter.php @@ -0,0 +1,32 @@ +_reporter = $reporter; + } + + /** + * Not used. + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + } + + /** + * Invoked immediately after the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + $message = $evt->getMessage(); + $failures = array_flip($evt->getFailedRecipients()); + foreach ((array) $message->getTo() as $address => $null) { + $this->_reporter->notify($message, $address, array_key_exists($address, $failures) ? Swift_Plugins_Reporter::RESULT_FAIL : Swift_Plugins_Reporter::RESULT_PASS); + } + foreach ((array) $message->getCc() as $address => $null) { + $this->_reporter->notify($message, $address, array_key_exists($address, $failures) ? Swift_Plugins_Reporter::RESULT_FAIL : Swift_Plugins_Reporter::RESULT_PASS); + } + foreach ((array) $message->getBcc() as $address => $null) { + $this->_reporter->notify($message, $address, array_key_exists($address, $failures) ? Swift_Plugins_Reporter::RESULT_FAIL : Swift_Plugins_Reporter::RESULT_PASS); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Reporters/HitReporter.php b/lib/SwiftMailer/classes/Swift/Plugins/Reporters/HitReporter.php new file mode 100644 index 0000000..cad9d16 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Reporters/HitReporter.php @@ -0,0 +1,59 @@ +_failures_cache[$address])) { + $this->_failures[] = $address; + $this->_failures_cache[$address] = true; + } + } + + /** + * Get an array of addresses for which delivery failed. + * + * @return array + */ + public function getFailedRecipients() + { + return $this->_failures; + } + + /** + * Clear the buffer (empty the list). + */ + public function clear() + { + $this->_failures = $this->_failures_cache = array(); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Reporters/HtmlReporter.php b/lib/SwiftMailer/classes/Swift/Plugins/Reporters/HtmlReporter.php new file mode 100644 index 0000000..c625935 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Reporters/HtmlReporter.php @@ -0,0 +1,39 @@ +'.PHP_EOL; + echo 'PASS '.$address.PHP_EOL; + echo ''.PHP_EOL; + flush(); + } else { + echo '
      '.PHP_EOL; + echo 'FAIL '.$address.PHP_EOL; + echo '
      '.PHP_EOL; + flush(); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Sleeper.php b/lib/SwiftMailer/classes/Swift/Plugins/Sleeper.php new file mode 100644 index 0000000..595c0f6 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Sleeper.php @@ -0,0 +1,24 @@ +_rate = $rate; + $this->_mode = $mode; + $this->_sleeper = $sleeper; + $this->_timer = $timer; + } + + /** + * Invoked immediately before the Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function beforeSendPerformed(Swift_Events_SendEvent $evt) + { + $time = $this->getTimestamp(); + if (!isset($this->_start)) { + $this->_start = $time; + } + $duration = $time - $this->_start; + + switch ($this->_mode) { + case self::BYTES_PER_MINUTE : + $sleep = $this->_throttleBytesPerMinute($duration); + break; + case self::MESSAGES_PER_SECOND : + $sleep = $this->_throttleMessagesPerSecond($duration); + break; + case self::MESSAGES_PER_MINUTE : + $sleep = $this->_throttleMessagesPerMinute($duration); + break; + default : + $sleep = 0; + break; + } + + if ($sleep > 0) { + $this->sleep($sleep); + } + } + + /** + * Invoked when a Message is sent. + * + * @param Swift_Events_SendEvent $evt + */ + public function sendPerformed(Swift_Events_SendEvent $evt) + { + parent::sendPerformed($evt); + ++$this->_messages; + } + + /** + * Sleep for $seconds. + * + * @param int $seconds + */ + public function sleep($seconds) + { + if (isset($this->_sleeper)) { + $this->_sleeper->sleep($seconds); + } else { + sleep($seconds); + } + } + + /** + * Get the current UNIX timestamp. + * + * @return int + */ + public function getTimestamp() + { + if (isset($this->_timer)) { + return $this->_timer->getTimestamp(); + } + + return time(); + } + + /** + * Get a number of seconds to sleep for. + * + * @param int $timePassed + * + * @return int + */ + private function _throttleBytesPerMinute($timePassed) + { + $expectedDuration = $this->getBytesOut() / ($this->_rate / 60); + + return (int) ceil($expectedDuration - $timePassed); + } + + /** + * Get a number of seconds to sleep for. + * + * @param int $timePassed + * + * @return int + */ + private function _throttleMessagesPerSecond($timePassed) + { + $expectedDuration = $this->_messages / ($this->_rate); + + return (int) ceil($expectedDuration - $timePassed); + } + + /** + * Get a number of seconds to sleep for. + * + * @param int $timePassed + * + * @return int + */ + private function _throttleMessagesPerMinute($timePassed) + { + $expectedDuration = $this->_messages / ($this->_rate / 60); + + return (int) ceil($expectedDuration - $timePassed); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Plugins/Timer.php b/lib/SwiftMailer/classes/Swift/Plugins/Timer.php new file mode 100644 index 0000000..9c8deb3 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Plugins/Timer.php @@ -0,0 +1,24 @@ +register('properties.charset')->asValue($charset); + + return $this; + } + + /** + * Set the directory where temporary files can be saved. + * + * @param string $dir + * + * @return Swift_Preferences + */ + public function setTempDir($dir) + { + Swift_DependencyContainer::getInstance() + ->register('tempdir')->asValue($dir); + + return $this; + } + + /** + * Set the type of cache to use (i.e. "disk" or "array"). + * + * @param string $type + * + * @return Swift_Preferences + */ + public function setCacheType($type) + { + Swift_DependencyContainer::getInstance() + ->register('cache')->asAliasOf(sprintf('cache.%s', $type)); + + return $this; + } + + /** + * Set the QuotedPrintable dot escaper preference. + * + * @param bool $dotEscape + * + * @return Swift_Preferences + */ + public function setQPDotEscape($dotEscape) + { + $dotEscape = !empty($dotEscape); + Swift_DependencyContainer::getInstance() + ->register('mime.qpcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoder') + ->withDependencies(array('mime.charstream', 'mime.bytecanonicalizer')) + ->addConstructorValue($dotEscape); + + return $this; + } +} diff --git a/lib/SwiftMailer/classes/Swift/ReplacementFilterFactory.php b/lib/SwiftMailer/classes/Swift/ReplacementFilterFactory.php new file mode 100644 index 0000000..2897474 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/ReplacementFilterFactory.php @@ -0,0 +1,27 @@ +createDependenciesFor('transport.sendmail') + ); + + $this->setCommand($command); + } + + /** + * Create a new SendmailTransport instance. + * + * @param string $command + * + * @return Swift_SendmailTransport + */ + public static function newInstance($command = '/usr/sbin/sendmail -bs') + { + return new self($command); + } +} diff --git a/lib/SwiftMailer/classes/Swift/SignedMessage.php b/lib/SwiftMailer/classes/Swift/SignedMessage.php new file mode 100644 index 0000000..2e7a872 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/SignedMessage.php @@ -0,0 +1,23 @@ + + * + * @deprecated + */ +class Swift_SignedMessage extends Swift_Message +{ +} diff --git a/lib/SwiftMailer/classes/Swift/Signer.php b/lib/SwiftMailer/classes/Swift/Signer.php new file mode 100644 index 0000000..2d8176d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Signer.php @@ -0,0 +1,20 @@ + + */ +interface Swift_Signer +{ + public function reset(); +} diff --git a/lib/SwiftMailer/classes/Swift/Signers/BodySigner.php b/lib/SwiftMailer/classes/Swift/Signers/BodySigner.php new file mode 100644 index 0000000..9ffcef3 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Signers/BodySigner.php @@ -0,0 +1,33 @@ + + */ +interface Swift_Signers_BodySigner extends Swift_Signer +{ + /** + * Change the Swift_Signed_Message to apply the singing. + * + * @param Swift_Message $message + * + * @return Swift_Signers_BodySigner + */ + public function signMessage(Swift_Message $message); + + /** + * Return the list of header a signer might tamper. + * + * @return array + */ + public function getAlteredHeaders(); +} diff --git a/lib/SwiftMailer/classes/Swift/Signers/DKIMSigner.php b/lib/SwiftMailer/classes/Swift/Signers/DKIMSigner.php new file mode 100644 index 0000000..b7a6209 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Signers/DKIMSigner.php @@ -0,0 +1,698 @@ + + */ +class Swift_Signers_DKIMSigner implements Swift_Signers_HeaderSigner +{ + /** + * PrivateKey. + * + * @var string + */ + protected $_privateKey; + + /** + * DomainName. + * + * @var string + */ + protected $_domainName; + + /** + * Selector. + * + * @var string + */ + protected $_selector; + + /** + * Hash algorithm used. + * + * @var string + */ + protected $_hashAlgorithm = 'rsa-sha1'; + + /** + * Body canon method. + * + * @var string + */ + protected $_bodyCanon = 'simple'; + + /** + * Header canon method. + * + * @var string + */ + protected $_headerCanon = 'simple'; + + /** + * Headers not being signed. + * + * @var array + */ + protected $_ignoredHeaders = array('return-path' => true); + + /** + * Signer identity. + * + * @var string + */ + protected $_signerIdentity; + + /** + * BodyLength. + * + * @var int + */ + protected $_bodyLen = 0; + + /** + * Maximum signedLen. + * + * @var int + */ + protected $_maxLen = PHP_INT_MAX; + + /** + * Embbed bodyLen in signature. + * + * @var bool + */ + protected $_showLen = false; + + /** + * When the signature has been applied (true means time()), false means not embedded. + * + * @var mixed + */ + protected $_signatureTimestamp = true; + + /** + * When will the signature expires false means not embedded, if sigTimestamp is auto + * Expiration is relative, otherwhise it's absolute. + * + * @var int + */ + protected $_signatureExpiration = false; + + /** + * Must we embed signed headers? + * + * @var bool + */ + protected $_debugHeaders = false; + + // work variables + /** + * Headers used to generate hash. + * + * @var array + */ + protected $_signedHeaders = array(); + + /** + * If debugHeaders is set store debugDatas here. + * + * @var string + */ + private $_debugHeadersData = ''; + + /** + * Stores the bodyHash. + * + * @var string + */ + private $_bodyHash = ''; + + /** + * Stores the signature header. + * + * @var Swift_Mime_Headers_ParameterizedHeader + */ + protected $_dkimHeader; + + private $_bodyHashHandler; + + private $_headerHash; + + private $_headerCanonData = ''; + + private $_bodyCanonEmptyCounter = 0; + + private $_bodyCanonIgnoreStart = 2; + + private $_bodyCanonSpace = false; + + private $_bodyCanonLastChar = null; + + private $_bodyCanonLine = ''; + + private $_bound = array(); + + /** + * Constructor. + * + * @param string $privateKey + * @param string $domainName + * @param string $selector + */ + public function __construct($privateKey, $domainName, $selector) + { + $this->_privateKey = $privateKey; + $this->_domainName = $domainName; + $this->_signerIdentity = '@'.$domainName; + $this->_selector = $selector; + } + + /** + * Instanciate DKIMSigner. + * + * @param string $privateKey + * @param string $domainName + * @param string $selector + * + * @return Swift_Signers_DKIMSigner + */ + public static function newInstance($privateKey, $domainName, $selector) + { + return new static($privateKey, $domainName, $selector); + } + + /** + * Reset the Signer. + * + * @see Swift_Signer::reset() + */ + public function reset() + { + $this->_headerHash = null; + $this->_signedHeaders = array(); + $this->_bodyHash = null; + $this->_bodyHashHandler = null; + $this->_bodyCanonIgnoreStart = 2; + $this->_bodyCanonEmptyCounter = 0; + $this->_bodyCanonLastChar = null; + $this->_bodyCanonSpace = false; + } + + /** + * Writes $bytes to the end of the stream. + * + * Writing may not happen immediately if the stream chooses to buffer. If + * you want to write these bytes with immediate effect, call {@link commit()} + * after calling write(). + * + * This method returns the sequence ID of the write (i.e. 1 for first, 2 for + * second, etc etc). + * + * @param string $bytes + * + * @throws Swift_IoException + * + * @return int + */ + public function write($bytes) + { + $this->_canonicalizeBody($bytes); + foreach ($this->_bound as $is) { + $is->write($bytes); + } + } + + /** + * For any bytes that are currently buffered inside the stream, force them + * off the buffer. + * + * @throws Swift_IoException + */ + public function commit() + { + // Nothing to do + return; + } + + /** + * Attach $is to this stream. + * The stream acts as an observer, receiving all data that is written. + * All {@link write()} and {@link flushBuffers()} operations will be mirrored. + * + * @param Swift_InputByteStream $is + */ + public function bind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + $this->_bound[] = $is; + + return; + } + + /** + * Remove an already bound stream. + * If $is is not bound, no errors will be raised. + * If the stream currently has any buffered data it will be written to $is + * before unbinding occurs. + * + * @param Swift_InputByteStream $is + */ + public function unbind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + foreach ($this->_bound as $k => $stream) { + if ($stream === $is) { + unset($this->_bound[$k]); + + return; + } + } + + return; + } + + /** + * Flush the contents of the stream (empty it) and set the internal pointer + * to the beginning. + * + * @throws Swift_IoException + */ + public function flushBuffers() + { + $this->reset(); + } + + /** + * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1 defaults to rsa-sha256. + * + * @param string $hash + * + * @return Swift_Signers_DKIMSigner + */ + public function setHashAlgorithm($hash) + { + // Unable to sign with rsa-sha256 + if ($hash == 'rsa-sha1') { + $this->_hashAlgorithm = 'rsa-sha1'; + } else { + $this->_hashAlgorithm = 'rsa-sha256'; + } + + return $this; + } + + /** + * Set the body canonicalization algorithm. + * + * @param string $canon + * + * @return Swift_Signers_DKIMSigner + */ + public function setBodyCanon($canon) + { + if ($canon == 'relaxed') { + $this->_bodyCanon = 'relaxed'; + } else { + $this->_bodyCanon = 'simple'; + } + + return $this; + } + + /** + * Set the header canonicalization algorithm. + * + * @param string $canon + * + * @return Swift_Signers_DKIMSigner + */ + public function setHeaderCanon($canon) + { + if ($canon == 'relaxed') { + $this->_headerCanon = 'relaxed'; + } else { + $this->_headerCanon = 'simple'; + } + + return $this; + } + + /** + * Set the signer identity. + * + * @param string $identity + * + * @return Swift_Signers_DKIMSigner + */ + public function setSignerIdentity($identity) + { + $this->_signerIdentity = $identity; + + return $this; + } + + /** + * Set the length of the body to sign. + * + * @param mixed $len (bool or int) + * + * @return Swift_Signers_DKIMSigner + */ + public function setBodySignedLen($len) + { + if ($len === true) { + $this->_showLen = true; + $this->_maxLen = PHP_INT_MAX; + } elseif ($len === false) { + $this->_showLen = false; + $this->_maxLen = PHP_INT_MAX; + } else { + $this->_showLen = true; + $this->_maxLen = (int) $len; + } + + return $this; + } + + /** + * Set the signature timestamp. + * + * @param int $time A timestamp + * + * @return Swift_Signers_DKIMSigner + */ + public function setSignatureTimestamp($time) + { + $this->_signatureTimestamp = $time; + + return $this; + } + + /** + * Set the signature expiration timestamp. + * + * @param int $time A timestamp + * + * @return Swift_Signers_DKIMSigner + */ + public function setSignatureExpiration($time) + { + $this->_signatureExpiration = $time; + + return $this; + } + + /** + * Enable / disable the DebugHeaders. + * + * @param bool $debug + * + * @return Swift_Signers_DKIMSigner + */ + public function setDebugHeaders($debug) + { + $this->_debugHeaders = (bool) $debug; + + return $this; + } + + /** + * Start Body. + */ + public function startBody() + { + // Init + switch ($this->_hashAlgorithm) { + case 'rsa-sha256' : + $this->_bodyHashHandler = hash_init('sha256'); + break; + case 'rsa-sha1' : + $this->_bodyHashHandler = hash_init('sha1'); + break; + } + $this->_bodyCanonLine = ''; + } + + /** + * End Body. + */ + public function endBody() + { + $this->_endOfBody(); + } + + /** + * Returns the list of Headers Tampered by this plugin. + * + * @return array + */ + public function getAlteredHeaders() + { + if ($this->_debugHeaders) { + return array('DKIM-Signature', 'X-DebugHash'); + } else { + return array('DKIM-Signature'); + } + } + + /** + * Adds an ignored Header. + * + * @param string $header_name + * + * @return Swift_Signers_DKIMSigner + */ + public function ignoreHeader($header_name) + { + $this->_ignoredHeaders[strtolower($header_name)] = true; + + return $this; + } + + /** + * Set the headers to sign. + * + * @param Swift_Mime_HeaderSet $headers + * + * @return Swift_Signers_DKIMSigner + */ + public function setHeaders(Swift_Mime_HeaderSet $headers) + { + $this->_headerCanonData = ''; + // Loop through Headers + $listHeaders = $headers->listAll(); + foreach ($listHeaders as $hName) { + // Check if we need to ignore Header + if (!isset($this->_ignoredHeaders[strtolower($hName)])) { + if ($headers->has($hName)) { + $tmp = $headers->getAll($hName); + foreach ($tmp as $header) { + if ($header->getFieldBody() != '') { + $this->_addHeader($header->toString()); + $this->_signedHeaders[] = $header->getFieldName(); + } + } + } + } + } + + return $this; + } + + /** + * Add the signature to the given Headers. + * + * @param Swift_Mime_HeaderSet $headers + * + * @return Swift_Signers_DKIMSigner + */ + public function addSignature(Swift_Mime_HeaderSet $headers) + { + // Prepare the DKIM-Signature + $params = array('v' => '1', 'a' => $this->_hashAlgorithm, 'bh' => base64_encode($this->_bodyHash), 'd' => $this->_domainName, 'h' => implode(': ', $this->_signedHeaders), 'i' => $this->_signerIdentity, 's' => $this->_selector); + if ($this->_bodyCanon != 'simple') { + $params['c'] = $this->_headerCanon.'/'.$this->_bodyCanon; + } elseif ($this->_headerCanon != 'simple') { + $params['c'] = $this->_headerCanon; + } + if ($this->_showLen) { + $params['l'] = $this->_bodyLen; + } + if ($this->_signatureTimestamp === true) { + $params['t'] = time(); + if ($this->_signatureExpiration !== false) { + $params['x'] = $params['t'] + $this->_signatureExpiration; + } + } else { + if ($this->_signatureTimestamp !== false) { + $params['t'] = $this->_signatureTimestamp; + } + if ($this->_signatureExpiration !== false) { + $params['x'] = $this->_signatureExpiration; + } + } + if ($this->_debugHeaders) { + $params['z'] = implode('|', $this->_debugHeadersData); + } + $string = ''; + foreach ($params as $k => $v) { + $string .= $k.'='.$v.'; '; + } + $string = trim($string); + $headers->addTextHeader('DKIM-Signature', $string); + // Add the last DKIM-Signature + $tmp = $headers->getAll('DKIM-Signature'); + $this->_dkimHeader = end($tmp); + $this->_addHeader(trim($this->_dkimHeader->toString())."\r\n b=", true); + $this->_endOfHeaders(); + if ($this->_debugHeaders) { + $headers->addTextHeader('X-DebugHash', base64_encode($this->_headerHash)); + } + $this->_dkimHeader->setValue($string.' b='.trim(chunk_split(base64_encode($this->_getEncryptedHash()), 73, ' '))); + + return $this; + } + + /* Private helpers */ + + protected function _addHeader($header, $is_sig = false) + { + switch ($this->_headerCanon) { + case 'relaxed' : + // Prepare Header and cascade + $exploded = explode(':', $header, 2); + $name = strtolower(trim($exploded[0])); + $value = str_replace("\r\n", '', $exploded[1]); + $value = preg_replace("/[ \t][ \t]+/", ' ', $value); + $header = $name.':'.trim($value).($is_sig ? '' : "\r\n"); + case 'simple' : + // Nothing to do + } + $this->_addToHeaderHash($header); + } + + /** + * @deprecated This method is currently useless in this class but it must be + * kept for BC reasons due to its "protected" scope. This method + * might be overriden by custom client code. + */ + protected function _endOfHeaders() + { + } + + protected function _canonicalizeBody($string) + { + $len = strlen($string); + $canon = ''; + $method = ($this->_bodyCanon == 'relaxed'); + for ($i = 0; $i < $len; ++$i) { + if ($this->_bodyCanonIgnoreStart > 0) { + --$this->_bodyCanonIgnoreStart; + continue; + } + switch ($string[$i]) { + case "\r" : + $this->_bodyCanonLastChar = "\r"; + break; + case "\n" : + if ($this->_bodyCanonLastChar == "\r") { + if ($method) { + $this->_bodyCanonSpace = false; + } + if ($this->_bodyCanonLine == '') { + ++$this->_bodyCanonEmptyCounter; + } else { + $this->_bodyCanonLine = ''; + $canon .= "\r\n"; + } + } else { + // Wooops Error + // todo handle it but should never happen + } + break; + case ' ' : + case "\t" : + if ($method) { + $this->_bodyCanonSpace = true; + break; + } + default : + if ($this->_bodyCanonEmptyCounter > 0) { + $canon .= str_repeat("\r\n", $this->_bodyCanonEmptyCounter); + $this->_bodyCanonEmptyCounter = 0; + } + if ($this->_bodyCanonSpace) { + $this->_bodyCanonLine .= ' '; + $canon .= ' '; + $this->_bodyCanonSpace = false; + } + $this->_bodyCanonLine .= $string[$i]; + $canon .= $string[$i]; + } + } + $this->_addToBodyHash($canon); + } + + protected function _endOfBody() + { + // Add trailing Line return if last line is non empty + if (strlen($this->_bodyCanonLine) > 0) { + $this->_addToBodyHash("\r\n"); + } + $this->_bodyHash = hash_final($this->_bodyHashHandler, true); + } + + private function _addToBodyHash($string) + { + $len = strlen($string); + if ($len > ($new_len = ($this->_maxLen - $this->_bodyLen))) { + $string = substr($string, 0, $new_len); + $len = $new_len; + } + hash_update($this->_bodyHashHandler, $string); + $this->_bodyLen += $len; + } + + private function _addToHeaderHash($header) + { + if ($this->_debugHeaders) { + $this->_debugHeadersData[] = trim($header); + } + $this->_headerCanonData .= $header; + } + + /** + * @throws Swift_SwiftException + * + * @return string + */ + private function _getEncryptedHash() + { + $signature = ''; + switch ($this->_hashAlgorithm) { + case 'rsa-sha1': + $algorithm = OPENSSL_ALGO_SHA1; + break; + case 'rsa-sha256': + $algorithm = OPENSSL_ALGO_SHA256; + break; + } + $pkeyId = openssl_get_privatekey($this->_privateKey); + if (!$pkeyId) { + throw new Swift_SwiftException('Unable to load DKIM Private Key ['.openssl_error_string().']'); + } + if (openssl_sign($this->_headerCanonData, $signature, $pkeyId, $algorithm)) { + return $signature; + } + throw new Swift_SwiftException('Unable to sign DKIM Hash ['.openssl_error_string().']'); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Signers/DomainKeySigner.php b/lib/SwiftMailer/classes/Swift/Signers/DomainKeySigner.php new file mode 100644 index 0000000..43210f0 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Signers/DomainKeySigner.php @@ -0,0 +1,525 @@ + + */ +class Swift_Signers_DomainKeySigner implements Swift_Signers_HeaderSigner +{ + /** + * PrivateKey. + * + * @var string + */ + protected $_privateKey; + + /** + * DomainName. + * + * @var string + */ + protected $_domainName; + + /** + * Selector. + * + * @var string + */ + protected $_selector; + + /** + * Hash algorithm used. + * + * @var string + */ + protected $_hashAlgorithm = 'rsa-sha1'; + + /** + * Canonisation method. + * + * @var string + */ + protected $_canon = 'simple'; + + /** + * Headers not being signed. + * + * @var array + */ + protected $_ignoredHeaders = array(); + + /** + * Signer identity. + * + * @var string + */ + protected $_signerIdentity; + + /** + * Must we embed signed headers? + * + * @var bool + */ + protected $_debugHeaders = false; + + // work variables + /** + * Headers used to generate hash. + * + * @var array + */ + private $_signedHeaders = array(); + + /** + * Stores the signature header. + * + * @var Swift_Mime_Headers_ParameterizedHeader + */ + protected $_domainKeyHeader; + + /** + * Hash Handler. + * + * @var resource|null + */ + private $_hashHandler; + + private $_hash; + + private $_canonData = ''; + + private $_bodyCanonEmptyCounter = 0; + + private $_bodyCanonIgnoreStart = 2; + + private $_bodyCanonSpace = false; + + private $_bodyCanonLastChar = null; + + private $_bodyCanonLine = ''; + + private $_bound = array(); + + /** + * Constructor. + * + * @param string $privateKey + * @param string $domainName + * @param string $selector + */ + public function __construct($privateKey, $domainName, $selector) + { + $this->_privateKey = $privateKey; + $this->_domainName = $domainName; + $this->_signerIdentity = '@'.$domainName; + $this->_selector = $selector; + } + + /** + * Instanciate DomainKeySigner. + * + * @param string $privateKey + * @param string $domainName + * @param string $selector + * + * @return Swift_Signers_DomainKeySigner + */ + public static function newInstance($privateKey, $domainName, $selector) + { + return new static($privateKey, $domainName, $selector); + } + + /** + * Resets internal states. + * + * @return Swift_Signers_DomainKeySigner + */ + public function reset() + { + $this->_hash = null; + $this->_hashHandler = null; + $this->_bodyCanonIgnoreStart = 2; + $this->_bodyCanonEmptyCounter = 0; + $this->_bodyCanonLastChar = null; + $this->_bodyCanonSpace = false; + + return $this; + } + + /** + * Writes $bytes to the end of the stream. + * + * Writing may not happen immediately if the stream chooses to buffer. If + * you want to write these bytes with immediate effect, call {@link commit()} + * after calling write(). + * + * This method returns the sequence ID of the write (i.e. 1 for first, 2 for + * second, etc etc). + * + * @param string $bytes + * + * @throws Swift_IoException + * + * @return int + * @return Swift_Signers_DomainKeySigner + */ + public function write($bytes) + { + $this->_canonicalizeBody($bytes); + foreach ($this->_bound as $is) { + $is->write($bytes); + } + + return $this; + } + + /** + * For any bytes that are currently buffered inside the stream, force them + * off the buffer. + * + * @throws Swift_IoException + * + * @return Swift_Signers_DomainKeySigner + */ + public function commit() + { + // Nothing to do + return $this; + } + + /** + * Attach $is to this stream. + * The stream acts as an observer, receiving all data that is written. + * All {@link write()} and {@link flushBuffers()} operations will be mirrored. + * + * @param Swift_InputByteStream $is + * + * @return Swift_Signers_DomainKeySigner + */ + public function bind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + $this->_bound[] = $is; + + return $this; + } + + /** + * Remove an already bound stream. + * If $is is not bound, no errors will be raised. + * If the stream currently has any buffered data it will be written to $is + * before unbinding occurs. + * + * @param Swift_InputByteStream $is + * + * @return Swift_Signers_DomainKeySigner + */ + public function unbind(Swift_InputByteStream $is) + { + // Don't have to mirror anything + foreach ($this->_bound as $k => $stream) { + if ($stream === $is) { + unset($this->_bound[$k]); + + return; + } + } + + return $this; + } + + /** + * Flush the contents of the stream (empty it) and set the internal pointer + * to the beginning. + * + * @throws Swift_IoException + * + * @return Swift_Signers_DomainKeySigner + */ + public function flushBuffers() + { + $this->reset(); + + return $this; + } + + /** + * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1 defaults to rsa-sha256. + * + * @param string $hash + * + * @return Swift_Signers_DomainKeySigner + */ + public function setHashAlgorithm($hash) + { + $this->_hashAlgorithm = 'rsa-sha1'; + + return $this; + } + + /** + * Set the canonicalization algorithm. + * + * @param string $canon simple | nofws defaults to simple + * + * @return Swift_Signers_DomainKeySigner + */ + public function setCanon($canon) + { + if ($canon == 'nofws') { + $this->_canon = 'nofws'; + } else { + $this->_canon = 'simple'; + } + + return $this; + } + + /** + * Set the signer identity. + * + * @param string $identity + * + * @return Swift_Signers_DomainKeySigner + */ + public function setSignerIdentity($identity) + { + $this->_signerIdentity = $identity; + + return $this; + } + + /** + * Enable / disable the DebugHeaders. + * + * @param bool $debug + * + * @return Swift_Signers_DomainKeySigner + */ + public function setDebugHeaders($debug) + { + $this->_debugHeaders = (bool) $debug; + + return $this; + } + + /** + * Start Body. + */ + public function startBody() + { + } + + /** + * End Body. + */ + public function endBody() + { + $this->_endOfBody(); + } + + /** + * Returns the list of Headers Tampered by this plugin. + * + * @return array + */ + public function getAlteredHeaders() + { + if ($this->_debugHeaders) { + return array('DomainKey-Signature', 'X-DebugHash'); + } + + return array('DomainKey-Signature'); + } + + /** + * Adds an ignored Header. + * + * @param string $header_name + * + * @return Swift_Signers_DomainKeySigner + */ + public function ignoreHeader($header_name) + { + $this->_ignoredHeaders[strtolower($header_name)] = true; + + return $this; + } + + /** + * Set the headers to sign. + * + * @param Swift_Mime_HeaderSet $headers + * + * @return Swift_Signers_DomainKeySigner + */ + public function setHeaders(Swift_Mime_HeaderSet $headers) + { + $this->_startHash(); + $this->_canonData = ''; + // Loop through Headers + $listHeaders = $headers->listAll(); + foreach ($listHeaders as $hName) { + // Check if we need to ignore Header + if (!isset($this->_ignoredHeaders[strtolower($hName)])) { + if ($headers->has($hName)) { + $tmp = $headers->getAll($hName); + foreach ($tmp as $header) { + if ($header->getFieldBody() != '') { + $this->_addHeader($header->toString()); + $this->_signedHeaders[] = $header->getFieldName(); + } + } + } + } + } + $this->_endOfHeaders(); + + return $this; + } + + /** + * Add the signature to the given Headers. + * + * @param Swift_Mime_HeaderSet $headers + * + * @return Swift_Signers_DomainKeySigner + */ + public function addSignature(Swift_Mime_HeaderSet $headers) + { + // Prepare the DomainKey-Signature Header + $params = array('a' => $this->_hashAlgorithm, 'b' => chunk_split(base64_encode($this->_getEncryptedHash()), 73, ' '), 'c' => $this->_canon, 'd' => $this->_domainName, 'h' => implode(': ', $this->_signedHeaders), 'q' => 'dns', 's' => $this->_selector); + $string = ''; + foreach ($params as $k => $v) { + $string .= $k.'='.$v.'; '; + } + $string = trim($string); + $headers->addTextHeader('DomainKey-Signature', $string); + + return $this; + } + + /* Private helpers */ + + protected function _addHeader($header) + { + switch ($this->_canon) { + case 'nofws' : + // Prepare Header and cascade + $exploded = explode(':', $header, 2); + $name = strtolower(trim($exploded[0])); + $value = str_replace("\r\n", '', $exploded[1]); + $value = preg_replace("/[ \t][ \t]+/", ' ', $value); + $header = $name.':'.trim($value)."\r\n"; + case 'simple' : + // Nothing to do + } + $this->_addToHash($header); + } + + protected function _endOfHeaders() + { + $this->_bodyCanonEmptyCounter = 1; + } + + protected function _canonicalizeBody($string) + { + $len = strlen($string); + $canon = ''; + $nofws = ($this->_canon == 'nofws'); + for ($i = 0; $i < $len; ++$i) { + if ($this->_bodyCanonIgnoreStart > 0) { + --$this->_bodyCanonIgnoreStart; + continue; + } + switch ($string[$i]) { + case "\r" : + $this->_bodyCanonLastChar = "\r"; + break; + case "\n" : + if ($this->_bodyCanonLastChar == "\r") { + if ($nofws) { + $this->_bodyCanonSpace = false; + } + if ($this->_bodyCanonLine == '') { + ++$this->_bodyCanonEmptyCounter; + } else { + $this->_bodyCanonLine = ''; + $canon .= "\r\n"; + } + } else { + // Wooops Error + throw new Swift_SwiftException('Invalid new line sequence in mail found \n without preceding \r'); + } + break; + case ' ' : + case "\t" : + case "\x09": //HTAB + if ($nofws) { + $this->_bodyCanonSpace = true; + break; + } + default : + if ($this->_bodyCanonEmptyCounter > 0) { + $canon .= str_repeat("\r\n", $this->_bodyCanonEmptyCounter); + $this->_bodyCanonEmptyCounter = 0; + } + $this->_bodyCanonLine .= $string[$i]; + $canon .= $string[$i]; + } + } + $this->_addToHash($canon); + } + + protected function _endOfBody() + { + if (strlen($this->_bodyCanonLine) > 0) { + $this->_addToHash("\r\n"); + } + $this->_hash = hash_final($this->_hashHandler, true); + } + + private function _addToHash($string) + { + $this->_canonData .= $string; + hash_update($this->_hashHandler, $string); + } + + private function _startHash() + { + // Init + switch ($this->_hashAlgorithm) { + case 'rsa-sha1' : + $this->_hashHandler = hash_init('sha1'); + break; + } + $this->_bodyCanonLine = ''; + } + + /** + * @throws Swift_SwiftException + * + * @return string + */ + private function _getEncryptedHash() + { + $signature = ''; + $pkeyId = openssl_get_privatekey($this->_privateKey); + if (!$pkeyId) { + throw new Swift_SwiftException('Unable to load DomainKey Private Key ['.openssl_error_string().']'); + } + if (openssl_sign($this->_canonData, $signature, $pkeyId, OPENSSL_ALGO_SHA1)) { + return $signature; + } + throw new Swift_SwiftException('Unable to sign DomainKey Hash ['.openssl_error_string().']'); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Signers/HeaderSigner.php b/lib/SwiftMailer/classes/Swift/Signers/HeaderSigner.php new file mode 100644 index 0000000..c75cb08 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Signers/HeaderSigner.php @@ -0,0 +1,65 @@ + + */ +interface Swift_Signers_HeaderSigner extends Swift_Signer, Swift_InputByteStream +{ + /** + * Exclude an header from the signed headers. + * + * @param string $header_name + * + * @return Swift_Signers_HeaderSigner + */ + public function ignoreHeader($header_name); + + /** + * Prepare the Signer to get a new Body. + * + * @return Swift_Signers_HeaderSigner + */ + public function startBody(); + + /** + * Give the signal that the body has finished streaming. + * + * @return Swift_Signers_HeaderSigner + */ + public function endBody(); + + /** + * Give the headers already given. + * + * @param Swift_Mime_SimpleHeaderSet $headers + * + * @return Swift_Signers_HeaderSigner + */ + public function setHeaders(Swift_Mime_HeaderSet $headers); + + /** + * Add the header(s) to the headerSet. + * + * @param Swift_Mime_HeaderSet $headers + * + * @return Swift_Signers_HeaderSigner + */ + public function addSignature(Swift_Mime_HeaderSet $headers); + + /** + * Return the list of header a signer might tamper. + * + * @return array + */ + public function getAlteredHeaders(); +} diff --git a/lib/SwiftMailer/classes/Swift/Signers/OpenDKIMSigner.php b/lib/SwiftMailer/classes/Swift/Signers/OpenDKIMSigner.php new file mode 100644 index 0000000..3a35ad5 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Signers/OpenDKIMSigner.php @@ -0,0 +1,190 @@ + + */ +class Swift_Signers_OpenDKIMSigner extends Swift_Signers_DKIMSigner +{ + private $_peclLoaded = false; + + private $_dkimHandler = null; + + private $dropFirstLF = true; + + const CANON_RELAXED = 1; + const CANON_SIMPLE = 2; + const SIG_RSA_SHA1 = 3; + const SIG_RSA_SHA256 = 4; + + public function __construct($privateKey, $domainName, $selector) + { + if (!extension_loaded('opendkim')) { + throw new Swift_SwiftException('php-opendkim extension not found'); + } + + $this->_peclLoaded = true; + + parent::__construct($privateKey, $domainName, $selector); + } + + public static function newInstance($privateKey, $domainName, $selector) + { + return new static($privateKey, $domainName, $selector); + } + + public function addSignature(Swift_Mime_HeaderSet $headers) + { + $header = new Swift_Mime_Headers_OpenDKIMHeader('DKIM-Signature'); + $headerVal = $this->_dkimHandler->getSignatureHeader(); + if (!$headerVal) { + throw new Swift_SwiftException('OpenDKIM Error: '.$this->_dkimHandler->getError()); + } + $header->setValue($headerVal); + $headers->set($header); + + return $this; + } + + public function setHeaders(Swift_Mime_HeaderSet $headers) + { + $bodyLen = $this->_bodyLen; + if (is_bool($bodyLen)) { + $bodyLen = -1; + } + $hash = $this->_hashAlgorithm == 'rsa-sha1' ? OpenDKIMSign::ALG_RSASHA1 : OpenDKIMSign::ALG_RSASHA256; + $bodyCanon = $this->_bodyCanon == 'simple' ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED; + $headerCanon = $this->_headerCanon == 'simple' ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED; + $this->_dkimHandler = new OpenDKIMSign($this->_privateKey, $this->_selector, $this->_domainName, $headerCanon, $bodyCanon, $hash, $bodyLen); + // Hardcode signature Margin for now + $this->_dkimHandler->setMargin(78); + + if (!is_numeric($this->_signatureTimestamp)) { + OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, time()); + } else { + if (!OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, $this->_signatureTimestamp)) { + throw new Swift_SwiftException('Unable to force signature timestamp ['.openssl_error_string().']'); + } + } + if (isset($this->_signerIdentity)) { + $this->_dkimHandler->setSigner($this->_signerIdentity); + } + $listHeaders = $headers->listAll(); + foreach ($listHeaders as $hName) { + // Check if we need to ignore Header + if (!isset($this->_ignoredHeaders[strtolower($hName)])) { + $tmp = $headers->getAll($hName); + if ($headers->has($hName)) { + foreach ($tmp as $header) { + if ($header->getFieldBody() != '') { + $htosign = $header->toString(); + $this->_dkimHandler->header($htosign); + $this->_signedHeaders[] = $header->getFieldName(); + } + } + } + } + } + + return $this; + } + + public function startBody() + { + if (!$this->_peclLoaded) { + return parent::startBody(); + } + $this->dropFirstLF = true; + $this->_dkimHandler->eoh(); + + return $this; + } + + public function endBody() + { + if (!$this->_peclLoaded) { + return parent::endBody(); + } + $this->_dkimHandler->eom(); + + return $this; + } + + public function reset() + { + $this->_dkimHandler = null; + parent::reset(); + + return $this; + } + + /** + * Set the signature timestamp. + * + * @param int $time + * + * @return Swift_Signers_DKIMSigner + */ + public function setSignatureTimestamp($time) + { + $this->_signatureTimestamp = $time; + + return $this; + } + + /** + * Set the signature expiration timestamp. + * + * @param int $time + * + * @return Swift_Signers_DKIMSigner + */ + public function setSignatureExpiration($time) + { + $this->_signatureExpiration = $time; + + return $this; + } + + /** + * Enable / disable the DebugHeaders. + * + * @param bool $debug + * + * @return Swift_Signers_DKIMSigner + */ + public function setDebugHeaders($debug) + { + $this->_debugHeaders = (bool) $debug; + + return $this; + } + + // Protected + + protected function _canonicalizeBody($string) + { + if (!$this->_peclLoaded) { + return parent::_canonicalizeBody($string); + } + if (false && $this->dropFirstLF === true) { + if ($string[0] == "\r" && $string[1] == "\n") { + $string = substr($string, 2); + } + } + $this->dropFirstLF = false; + if (strlen($string)) { + $this->_dkimHandler->body($string); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Signers/SMimeSigner.php b/lib/SwiftMailer/classes/Swift/Signers/SMimeSigner.php new file mode 100644 index 0000000..b267099 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Signers/SMimeSigner.php @@ -0,0 +1,436 @@ + + */ +class Swift_Signers_SMimeSigner implements Swift_Signers_BodySigner +{ + protected $signCertificate; + protected $signPrivateKey; + protected $encryptCert; + protected $signThenEncrypt = true; + protected $signLevel; + protected $encryptLevel; + protected $signOptions; + protected $encryptOptions; + protected $encryptCipher; + protected $extraCerts = null; + + /** + * @var Swift_StreamFilters_StringReplacementFilterFactory + */ + protected $replacementFactory; + + /** + * @var Swift_Mime_HeaderFactory + */ + protected $headerFactory; + + /** + * Constructor. + * + * @param string|null $signCertificate + * @param string|null $signPrivateKey + * @param string|null $encryptCertificate + */ + public function __construct($signCertificate = null, $signPrivateKey = null, $encryptCertificate = null) + { + if (null !== $signPrivateKey) { + $this->setSignCertificate($signCertificate, $signPrivateKey); + } + + if (null !== $encryptCertificate) { + $this->setEncryptCertificate($encryptCertificate); + } + + $this->replacementFactory = Swift_DependencyContainer::getInstance() + ->lookup('transport.replacementfactory'); + + $this->signOptions = PKCS7_DETACHED; + + // Supported since php5.4 + if (defined('OPENSSL_CIPHER_AES_128_CBC')) { + $this->encryptCipher = OPENSSL_CIPHER_AES_128_CBC; + } else { + $this->encryptCipher = OPENSSL_CIPHER_RC2_128; + } + } + + /** + * Returns an new Swift_Signers_SMimeSigner instance. + * + * @param string $certificate + * @param string $privateKey + * + * @return Swift_Signers_SMimeSigner + */ + public static function newInstance($certificate = null, $privateKey = null) + { + return new self($certificate, $privateKey); + } + + /** + * Set the certificate location to use for signing. + * + * @link http://www.php.net/manual/en/openssl.pkcs7.flags.php + * + * @param string $certificate + * @param string|array $privateKey If the key needs an passphrase use array('file-location', 'passphrase') instead + * @param int $signOptions Bitwise operator options for openssl_pkcs7_sign() + * @param string $extraCerts A file containing intermediate certificates needed by the signing certificate + * + * @return Swift_Signers_SMimeSigner + */ + public function setSignCertificate($certificate, $privateKey = null, $signOptions = PKCS7_DETACHED, $extraCerts = null) + { + $this->signCertificate = 'file://'.str_replace('\\', '/', realpath($certificate)); + + if (null !== $privateKey) { + if (is_array($privateKey)) { + $this->signPrivateKey = $privateKey; + $this->signPrivateKey[0] = 'file://'.str_replace('\\', '/', realpath($privateKey[0])); + } else { + $this->signPrivateKey = 'file://'.str_replace('\\', '/', realpath($privateKey)); + } + } + + $this->signOptions = $signOptions; + if (null !== $extraCerts) { + $this->extraCerts = str_replace('\\', '/', realpath($extraCerts)); + } + + return $this; + } + + /** + * Set the certificate location to use for encryption. + * + * @link http://www.php.net/manual/en/openssl.pkcs7.flags.php + * @link http://nl3.php.net/manual/en/openssl.ciphers.php + * + * @param string|array $recipientCerts Either an single X.509 certificate, or an assoc array of X.509 certificates. + * @param int $cipher + * + * @return Swift_Signers_SMimeSigner + */ + public function setEncryptCertificate($recipientCerts, $cipher = null) + { + if (is_array($recipientCerts)) { + $this->encryptCert = array(); + + foreach ($recipientCerts as $cert) { + $this->encryptCert[] = 'file://'.str_replace('\\', '/', realpath($cert)); + } + } else { + $this->encryptCert = 'file://'.str_replace('\\', '/', realpath($recipientCerts)); + } + + if (null !== $cipher) { + $this->encryptCipher = $cipher; + } + + return $this; + } + + /** + * @return string + */ + public function getSignCertificate() + { + return $this->signCertificate; + } + + /** + * @return string + */ + public function getSignPrivateKey() + { + return $this->signPrivateKey; + } + + /** + * Set perform signing before encryption. + * + * The default is to first sign the message and then encrypt. + * But some older mail clients, namely Microsoft Outlook 2000 will work when the message first encrypted. + * As this goes against the official specs, its recommended to only use 'encryption -> signing' when specifically targeting these 'broken' clients. + * + * @param bool $signThenEncrypt + * + * @return Swift_Signers_SMimeSigner + */ + public function setSignThenEncrypt($signThenEncrypt = true) + { + $this->signThenEncrypt = $signThenEncrypt; + + return $this; + } + + /** + * @return bool + */ + public function isSignThenEncrypt() + { + return $this->signThenEncrypt; + } + + /** + * Resets internal states. + * + * @return Swift_Signers_SMimeSigner + */ + public function reset() + { + return $this; + } + + /** + * Change the Swift_Message to apply the signing. + * + * @param Swift_Message $message + * + * @return Swift_Signers_SMimeSigner + */ + public function signMessage(Swift_Message $message) + { + if (null === $this->signCertificate && null === $this->encryptCert) { + return $this; + } + + // Store the message using ByteStream to a file{1} + // Remove all Children + // Sign file{1}, parse the new MIME headers and set them on the primary MimeEntity + // Set the singed-body as the new body (without boundary) + + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $this->toSMimeByteStream($messageStream, $message); + $message->setEncoder(Swift_DependencyContainer::getInstance()->lookup('mime.rawcontentencoder')); + + $message->setChildren(array()); + $this->streamToMime($messageStream, $message); + } + + /** + * Return the list of header a signer might tamper. + * + * @return array + */ + public function getAlteredHeaders() + { + return array('Content-Type', 'Content-Transfer-Encoding', 'Content-Disposition'); + } + + /** + * @param Swift_InputByteStream $inputStream + * @param Swift_Message $mimeEntity + */ + protected function toSMimeByteStream(Swift_InputByteStream $inputStream, Swift_Message $message) + { + $mimeEntity = $this->createMessage($message); + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + $mimeEntity->toByteStream($messageStream); + $messageStream->commit(); + + if (null !== $this->signCertificate && null !== $this->encryptCert) { + $temporaryStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if ($this->signThenEncrypt) { + $this->messageStreamToSignedByteStream($messageStream, $temporaryStream); + $this->messageStreamToEncryptedByteStream($temporaryStream, $inputStream); + } else { + $this->messageStreamToEncryptedByteStream($messageStream, $temporaryStream); + $this->messageStreamToSignedByteStream($temporaryStream, $inputStream); + } + } elseif ($this->signCertificate !== null) { + $this->messageStreamToSignedByteStream($messageStream, $inputStream); + } else { + $this->messageStreamToEncryptedByteStream($messageStream, $inputStream); + } + } + + /** + * @param Swift_Message $message + * + * @return Swift_Message + */ + protected function createMessage(Swift_Message $message) + { + $mimeEntity = new Swift_Message('', $message->getBody(), $message->getContentType(), $message->getCharset()); + $mimeEntity->setChildren($message->getChildren()); + + $messageHeaders = $mimeEntity->getHeaders(); + $messageHeaders->remove('Message-ID'); + $messageHeaders->remove('Date'); + $messageHeaders->remove('Subject'); + $messageHeaders->remove('MIME-Version'); + $messageHeaders->remove('To'); + $messageHeaders->remove('From'); + + return $mimeEntity; + } + + /** + * @param Swift_FileStream $outputStream + * @param Swift_InputByteStream $inputStream + * + * @throws Swift_IoException + */ + protected function messageStreamToSignedByteStream(Swift_FileStream $outputStream, Swift_InputByteStream $inputStream) + { + $signedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + $args = array($outputStream->getPath(), $signedMessageStream->getPath(), $this->signCertificate, $this->signPrivateKey, array(), $this->signOptions); + if (null !== $this->extraCerts) { + $args[] = $this->extraCerts; + } + + if (!call_user_func_array('openssl_pkcs7_sign', $args)) { + throw new Swift_IoException(sprintf('Failed to sign S/Mime message. Error: "%s".', openssl_error_string())); + } + + $this->copyFromOpenSSLOutput($signedMessageStream, $inputStream); + } + + /** + * @param Swift_FileStream $outputStream + * @param Swift_InputByteStream $is + * + * @throws Swift_IoException + */ + protected function messageStreamToEncryptedByteStream(Swift_FileStream $outputStream, Swift_InputByteStream $is) + { + $encryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream(); + + if (!openssl_pkcs7_encrypt($outputStream->getPath(), $encryptedMessageStream->getPath(), $this->encryptCert, array(), 0, $this->encryptCipher)) { + throw new Swift_IoException(sprintf('Failed to encrypt S/Mime message. Error: "%s".', openssl_error_string())); + } + + $this->copyFromOpenSSLOutput($encryptedMessageStream, $is); + } + + /** + * @param Swift_OutputByteStream $fromStream + * @param Swift_InputByteStream $toStream + */ + protected function copyFromOpenSSLOutput(Swift_OutputByteStream $fromStream, Swift_InputByteStream $toStream) + { + $bufferLength = 4096; + $filteredStream = new Swift_ByteStream_TemporaryFileByteStream(); + $filteredStream->addFilter($this->replacementFactory->createFilter("\r\n", "\n"), 'CRLF to LF'); + $filteredStream->addFilter($this->replacementFactory->createFilter("\n", "\r\n"), 'LF to CRLF'); + + while (false !== ($buffer = $fromStream->read($bufferLength))) { + $filteredStream->write($buffer); + } + + $filteredStream->flushBuffers(); + + while (false !== ($buffer = $filteredStream->read($bufferLength))) { + $toStream->write($buffer); + } + + $toStream->commit(); + } + + /** + * Merges an OutputByteStream to Swift_Message. + * + * @param Swift_OutputByteStream $fromStream + * @param Swift_Message $message + */ + protected function streamToMime(Swift_OutputByteStream $fromStream, Swift_Message $message) + { + $bufferLength = 78; + $headerData = ''; + + $fromStream->setReadPointer(0); + + while (($buffer = $fromStream->read($bufferLength)) !== false) { + $headerData .= $buffer; + + if (false !== strpos($buffer, "\r\n\r\n")) { + break; + } + } + + $headersPosEnd = strpos($headerData, "\r\n\r\n"); + $headerData = trim($headerData); + $headerData = substr($headerData, 0, $headersPosEnd); + $headerLines = explode("\r\n", $headerData); + unset($headerData); + + $headers = array(); + $currentHeaderName = ''; + + foreach ($headerLines as $headerLine) { + // Line separated + if (ctype_space($headerLines[0]) || false === strpos($headerLine, ':')) { + $headers[$currentHeaderName] .= ' '.trim($headerLine); + continue; + } + + $header = explode(':', $headerLine, 2); + $currentHeaderName = strtolower($header[0]); + $headers[$currentHeaderName] = trim($header[1]); + } + + $messageStream = new Swift_ByteStream_TemporaryFileByteStream(); + $messageStream->addFilter($this->replacementFactory->createFilter("\r\n", "\n"), 'CRLF to LF'); + $messageStream->addFilter($this->replacementFactory->createFilter("\n", "\r\n"), 'LF to CRLF'); + + $messageHeaders = $message->getHeaders(); + + // No need to check for 'application/pkcs7-mime', as this is always base64 + if ('multipart/signed;' === substr($headers['content-type'], 0, 17)) { + if (!preg_match('/boundary=("[^"]+"|(?:[^\s]+|$))/is', $headers['content-type'], $contentTypeData)) { + throw new Swift_SwiftException('Failed to find Boundary parameter'); + } + + $boundary = trim($contentTypeData['1'], '"'); + + // Skip the header and CRLF CRLF + $fromStream->setReadPointer($headersPosEnd + 4); + + while (false !== ($buffer = $fromStream->read($bufferLength))) { + $messageStream->write($buffer); + } + + $messageStream->commit(); + + $messageHeaders->remove('Content-Transfer-Encoding'); + $message->setContentType($headers['content-type']); + $message->setBoundary($boundary); + $message->setBody($messageStream); + } else { + $fromStream->setReadPointer($headersPosEnd + 4); + + if (null === $this->headerFactory) { + $this->headerFactory = Swift_DependencyContainer::getInstance()->lookup('mime.headerfactory'); + } + + $message->setContentType($headers['content-type']); + $messageHeaders->set($this->headerFactory->createTextHeader('Content-Transfer-Encoding', $headers['content-transfer-encoding'])); + $messageHeaders->set($this->headerFactory->createTextHeader('Content-Disposition', $headers['content-disposition'])); + + while (false !== ($buffer = $fromStream->read($bufferLength))) { + $messageStream->write($buffer); + } + + $messageStream->commit(); + $message->setBody($messageStream); + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/SmtpTransport.php b/lib/SwiftMailer/classes/Swift/SmtpTransport.php new file mode 100644 index 0000000..6251611 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/SmtpTransport.php @@ -0,0 +1,58 @@ +createDependenciesFor('transport.smtp') + ); + + $this->setHost($host); + $this->setPort($port); + $this->setEncryption($security); + } + + /** + * Create a new SmtpTransport instance. + * + * @param string $host + * @param int $port + * @param string $security + * + * @return Swift_SmtpTransport + */ + public static function newInstance($host = 'localhost', $port = 25, $security = null) + { + return new self($host, $port, $security); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Spool.php b/lib/SwiftMailer/classes/Swift/Spool.php new file mode 100644 index 0000000..c16ab4b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Spool.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Interface for spools. + * + * @author Fabien Potencier + */ +interface Swift_Spool +{ + /** + * Starts this Spool mechanism. + */ + public function start(); + + /** + * Stops this Spool mechanism. + */ + public function stop(); + + /** + * Tests if this Spool mechanism has started. + * + * @return bool + */ + public function isStarted(); + + /** + * Queues a message. + * + * @param Swift_Mime_Message $message The message to store + * + * @return bool Whether the operation has succeeded + */ + public function queueMessage(Swift_Mime_Message $message); + + /** + * Sends messages using the given transport instance. + * + * @param Swift_Transport $transport A transport instance + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent emails + */ + public function flushQueue(Swift_Transport $transport, &$failedRecipients = null); +} diff --git a/lib/SwiftMailer/classes/Swift/SpoolTransport.php b/lib/SwiftMailer/classes/Swift/SpoolTransport.php new file mode 100644 index 0000000..cf9bf78 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/SpoolTransport.php @@ -0,0 +1,47 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Stores Messages in a queue. + * + * @author Fabien Potencier + */ +class Swift_SpoolTransport extends Swift_Transport_SpoolTransport +{ + /** + * Create a new SpoolTransport. + * + * @param Swift_Spool $spool + */ + public function __construct(Swift_Spool $spool) + { + $arguments = Swift_DependencyContainer::getInstance() + ->createDependenciesFor('transport.spool'); + + $arguments[] = $spool; + + call_user_func_array( + array($this, 'Swift_Transport_SpoolTransport::__construct'), + $arguments + ); + } + + /** + * Create a new SpoolTransport instance. + * + * @param Swift_Spool $spool + * + * @return Swift_SpoolTransport + */ + public static function newInstance(Swift_Spool $spool) + { + return new self($spool); + } +} diff --git a/lib/SwiftMailer/classes/Swift/StreamFilter.php b/lib/SwiftMailer/classes/Swift/StreamFilter.php new file mode 100644 index 0000000..362be2e --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/StreamFilter.php @@ -0,0 +1,35 @@ +_search = $search; + $this->_index = array(); + $this->_tree = array(); + $this->_replace = array(); + $this->_repSize = array(); + + $tree = null; + $i = null; + $last_size = $size = 0; + foreach ($search as $i => $search_element) { + if ($tree !== null) { + $tree[-1] = min(count($replace) - 1, $i - 1); + $tree[-2] = $last_size; + } + $tree = &$this->_tree; + if (is_array($search_element)) { + foreach ($search_element as $k => $char) { + $this->_index[$char] = true; + if (!isset($tree[$char])) { + $tree[$char] = array(); + } + $tree = &$tree[$char]; + } + $last_size = $k + 1; + $size = max($size, $last_size); + } else { + $last_size = 1; + if (!isset($tree[$search_element])) { + $tree[$search_element] = array(); + } + $tree = &$tree[$search_element]; + $size = max($last_size, $size); + $this->_index[$search_element] = true; + } + } + if ($i !== null) { + $tree[-1] = min(count($replace) - 1, $i); + $tree[-2] = $last_size; + $this->_treeMaxLen = $size; + } + foreach ($replace as $rep) { + if (!is_array($rep)) { + $rep = array($rep); + } + $this->_replace[] = $rep; + } + for ($i = count($this->_replace) - 1; $i >= 0; --$i) { + $this->_replace[$i] = $rep = $this->filter($this->_replace[$i], $i); + $this->_repSize[$i] = count($rep); + } + } + + /** + * Returns true if based on the buffer passed more bytes should be buffered. + * + * @param array $buffer + * + * @return bool + */ + public function shouldBuffer($buffer) + { + $endOfBuffer = end($buffer); + + return isset($this->_index[$endOfBuffer]); + } + + /** + * Perform the actual replacements on $buffer and return the result. + * + * @param array $buffer + * @param int $_minReplaces + * + * @return array + */ + public function filter($buffer, $_minReplaces = -1) + { + if ($this->_treeMaxLen == 0) { + return $buffer; + } + + $newBuffer = array(); + $buf_size = count($buffer); + $last_size = 0; + for ($i = 0; $i < $buf_size; ++$i) { + $search_pos = $this->_tree; + $last_found = PHP_INT_MAX; + // We try to find if the next byte is part of a search pattern + for ($j = 0; $j <= $this->_treeMaxLen; ++$j) { + // We have a new byte for a search pattern + if (isset($buffer [$p = $i + $j]) && isset($search_pos[$buffer[$p]])) { + $search_pos = $search_pos[$buffer[$p]]; + // We have a complete pattern, save, in case we don't find a better match later + if (isset($search_pos[-1]) && $search_pos[-1] < $last_found + && $search_pos[-1] > $_minReplaces) { + $last_found = $search_pos[-1]; + $last_size = $search_pos[-2]; + } + } + // We got a complete pattern + elseif ($last_found !== PHP_INT_MAX) { + // Adding replacement datas to output buffer + $rep_size = $this->_repSize[$last_found]; + for ($j = 0; $j < $rep_size; ++$j) { + $newBuffer[] = $this->_replace[$last_found][$j]; + } + // We Move cursor forward + $i += $last_size - 1; + // Edge Case, last position in buffer + if ($i >= $buf_size) { + $newBuffer[] = $buffer[$i]; + } + + // We start the next loop + continue 2; + } else { + // this byte is not in a pattern and we haven't found another pattern + break; + } + } + // Normal byte, move it to output buffer + $newBuffer[] = $buffer[$i]; + } + + return $newBuffer; + } +} diff --git a/lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilter.php b/lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilter.php new file mode 100644 index 0000000..d0db8b9 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilter.php @@ -0,0 +1,66 @@ +_search = $search; + $this->_replace = $replace; + } + + /** + * Returns true if based on the buffer passed more bytes should be buffered. + * + * @param string $buffer + * + * @return bool + */ + public function shouldBuffer($buffer) + { + $endOfBuffer = substr($buffer, -1); + foreach ((array) $this->_search as $needle) { + if (false !== strpos($needle, $endOfBuffer)) { + return true; + } + } + + return false; + } + + /** + * Perform the actual replacements on $buffer and return the result. + * + * @param string $buffer + * + * @return string + */ + public function filter($buffer) + { + return str_replace($this->_search, $this->_replace, $buffer); + } +} diff --git a/lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilterFactory.php b/lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilterFactory.php new file mode 100644 index 0000000..e98240b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/StreamFilters/StringReplacementFilterFactory.php @@ -0,0 +1,45 @@ +_filters[$search][$replace])) { + if (!isset($this->_filters[$search])) { + $this->_filters[$search] = array(); + } + + if (!isset($this->_filters[$search][$replace])) { + $this->_filters[$search][$replace] = array(); + } + + $this->_filters[$search][$replace] = new Swift_StreamFilters_StringReplacementFilter($search, $replace); + } + + return $this->_filters[$search][$replace]; + } +} diff --git a/lib/SwiftMailer/classes/Swift/SwiftException.php b/lib/SwiftMailer/classes/Swift/SwiftException.php new file mode 100644 index 0000000..db3d310 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/SwiftException.php @@ -0,0 +1,29 @@ +_eventDispatcher = $dispatcher; + $this->_buffer = $buf; + $this->_lookupHostname(); + } + + /** + * Set the name of the local domain which Swift will identify itself as. + * + * This should be a fully-qualified domain name and should be truly the domain + * you're using. + * + * If your server doesn't have a domain name, use the IP in square + * brackets (i.e. [127.0.0.1]). + * + * @param string $domain + * + * @return Swift_Transport_AbstractSmtpTransport + */ + public function setLocalDomain($domain) + { + $this->_domain = $domain; + + return $this; + } + + /** + * Get the name of the domain Swift will identify as. + * + * @return string + */ + public function getLocalDomain() + { + return $this->_domain; + } + + /** + * Sets the source IP. + * + * @param string $source + */ + public function setSourceIp($source) + { + $this->_sourceIp = $source; + } + + /** + * Returns the IP used to connect to the destination. + * + * @return string + */ + public function getSourceIp() + { + return $this->_sourceIp; + } + + /** + * Start the SMTP connection. + */ + public function start() + { + if (!$this->_started) { + if ($evt = $this->_eventDispatcher->createTransportChangeEvent($this)) { + $this->_eventDispatcher->dispatchEvent($evt, 'beforeTransportStarted'); + if ($evt->bubbleCancelled()) { + return; + } + } + + try { + $this->_buffer->initialize($this->_getBufferParams()); + } catch (Swift_TransportException $e) { + $this->_throwException($e); + } + $this->_readGreeting(); + $this->_doHeloCommand(); + + if ($evt) { + $this->_eventDispatcher->dispatchEvent($evt, 'transportStarted'); + } + + $this->_started = true; + } + } + + /** + * Test if an SMTP connection has been established. + * + * @return bool + */ + public function isStarted() + { + return $this->_started; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients who were accepted for delivery. + * + * @param Swift_Mime_Message $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_Message $message, &$failedRecipients = null) + { + $sent = 0; + $failedRecipients = (array) $failedRecipients; + + if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) { + $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + if (!$reversePath = $this->_getReversePath($message)) { + $this->_throwException(new Swift_TransportException( + 'Cannot send message without a sender address' + ) + ); + } + + $to = (array) $message->getTo(); + $cc = (array) $message->getCc(); + $tos = array_merge($to, $cc); + $bcc = (array) $message->getBcc(); + + $message->setBcc(array()); + + try { + $sent += $this->_sendTo($message, $reversePath, $tos, $failedRecipients); + $sent += $this->_sendBcc($message, $reversePath, $bcc, $failedRecipients); + } catch (Exception $e) { + $message->setBcc($bcc); + throw $e; + } + + $message->setBcc($bcc); + + if ($evt) { + if ($sent == count($to) + count($cc) + count($bcc)) { + $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS); + } elseif ($sent > 0) { + $evt->setResult(Swift_Events_SendEvent::RESULT_TENTATIVE); + } else { + $evt->setResult(Swift_Events_SendEvent::RESULT_FAILED); + } + $evt->setFailedRecipients($failedRecipients); + $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + $message->generateId(); //Make sure a new Message ID is used + + return $sent; + } + + /** + * Stop the SMTP connection. + */ + public function stop() + { + if ($this->_started) { + if ($evt = $this->_eventDispatcher->createTransportChangeEvent($this)) { + $this->_eventDispatcher->dispatchEvent($evt, 'beforeTransportStopped'); + if ($evt->bubbleCancelled()) { + return; + } + } + + try { + $this->executeCommand("QUIT\r\n", array(221)); + } catch (Swift_TransportException $e) { + } + + try { + $this->_buffer->terminate(); + + if ($evt) { + $this->_eventDispatcher->dispatchEvent($evt, 'transportStopped'); + } + } catch (Swift_TransportException $e) { + $this->_throwException($e); + } + } + $this->_started = false; + } + + /** + * Register a plugin. + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->_eventDispatcher->bindEventListener($plugin); + } + + /** + * Reset the current mail transaction. + */ + public function reset() + { + $this->executeCommand("RSET\r\n", array(250)); + } + + /** + * Get the IoBuffer where read/writes are occurring. + * + * @return Swift_Transport_IoBuffer + */ + public function getBuffer() + { + return $this->_buffer; + } + + /** + * Run a command against the buffer, expecting the given response codes. + * + * If no response codes are given, the response will not be validated. + * If codes are given, an exception will be thrown on an invalid response. + * + * @param string $command + * @param int[] $codes + * @param string[] $failures An array of failures by-reference + * + * @return string + */ + public function executeCommand($command, $codes = array(), &$failures = null) + { + $failures = (array) $failures; + $seq = $this->_buffer->write($command); + $response = $this->_getFullResponse($seq); + if ($evt = $this->_eventDispatcher->createCommandEvent($this, $command, $codes)) { + $this->_eventDispatcher->dispatchEvent($evt, 'commandSent'); + } + $this->_assertResponseCode($response, $codes); + + return $response; + } + + /** Read the opening SMTP greeting */ + protected function _readGreeting() + { + $this->_assertResponseCode($this->_getFullResponse(0), array(220)); + } + + /** Send the HELO welcome */ + protected function _doHeloCommand() + { + $this->executeCommand( + sprintf("HELO %s\r\n", $this->_domain), array(250) + ); + } + + /** Send the MAIL FROM command */ + protected function _doMailFromCommand($address) + { + $this->executeCommand( + sprintf("MAIL FROM:<%s>\r\n", $address), array(250) + ); + } + + /** Send the RCPT TO command */ + protected function _doRcptToCommand($address) + { + $this->executeCommand( + sprintf("RCPT TO:<%s>\r\n", $address), array(250, 251, 252) + ); + } + + /** Send the DATA command */ + protected function _doDataCommand() + { + $this->executeCommand("DATA\r\n", array(354)); + } + + /** Stream the contents of the message over the buffer */ + protected function _streamMessage(Swift_Mime_Message $message) + { + $this->_buffer->setWriteTranslations(array("\r\n." => "\r\n..")); + try { + $message->toByteStream($this->_buffer); + $this->_buffer->flushBuffers(); + } catch (Swift_TransportException $e) { + $this->_throwException($e); + } + $this->_buffer->setWriteTranslations(array()); + $this->executeCommand("\r\n.\r\n", array(250)); + } + + /** Determine the best-use reverse path for this message */ + protected function _getReversePath(Swift_Mime_Message $message) + { + $return = $message->getReturnPath(); + $sender = $message->getSender(); + $from = $message->getFrom(); + $path = null; + if (!empty($return)) { + $path = $return; + } elseif (!empty($sender)) { + // Don't use array_keys + reset($sender); // Reset Pointer to first pos + $path = key($sender); // Get key + } elseif (!empty($from)) { + reset($from); // Reset Pointer to first pos + $path = key($from); // Get key + } + + return $path; + } + + /** Throw a TransportException, first sending it to any listeners */ + protected function _throwException(Swift_TransportException $e) + { + if ($evt = $this->_eventDispatcher->createTransportExceptionEvent($this, $e)) { + $this->_eventDispatcher->dispatchEvent($evt, 'exceptionThrown'); + if (!$evt->bubbleCancelled()) { + throw $e; + } + } else { + throw $e; + } + } + + /** Throws an Exception if a response code is incorrect */ + protected function _assertResponseCode($response, $wanted) + { + list($code) = sscanf($response, '%3d'); + $valid = (empty($wanted) || in_array($code, $wanted)); + + if ($evt = $this->_eventDispatcher->createResponseEvent($this, $response, + $valid)) { + $this->_eventDispatcher->dispatchEvent($evt, 'responseReceived'); + } + + if (!$valid) { + $this->_throwException( + new Swift_TransportException( + 'Expected response code '.implode('/', $wanted).' but got code '. + '"'.$code.'", with message "'.$response.'"', + $code) + ); + } + } + + /** Get an entire multi-line response using its sequence number */ + protected function _getFullResponse($seq) + { + $response = ''; + try { + do { + $line = $this->_buffer->readLine($seq); + $response .= $line; + } while (null !== $line && false !== $line && ' ' != $line{3}); + } catch (Swift_TransportException $e) { + $this->_throwException($e); + } catch (Swift_IoException $e) { + $this->_throwException( + new Swift_TransportException( + $e->getMessage()) + ); + } + + return $response; + } + + /** Send an email to the given recipients from the given reverse path */ + private function _doMailTransaction($message, $reversePath, array $recipients, array &$failedRecipients) + { + $sent = 0; + $this->_doMailFromCommand($reversePath); + foreach ($recipients as $forwardPath) { + try { + $this->_doRcptToCommand($forwardPath); + ++$sent; + } catch (Swift_TransportException $e) { + $failedRecipients[] = $forwardPath; + } + } + + if ($sent != 0) { + $this->_doDataCommand(); + $this->_streamMessage($message); + } else { + $this->reset(); + } + + return $sent; + } + + /** Send a message to the given To: recipients */ + private function _sendTo(Swift_Mime_Message $message, $reversePath, array $to, array &$failedRecipients) + { + if (empty($to)) { + return 0; + } + + return $this->_doMailTransaction($message, $reversePath, array_keys($to), + $failedRecipients); + } + + /** Send a message to all Bcc: recipients */ + private function _sendBcc(Swift_Mime_Message $message, $reversePath, array $bcc, array &$failedRecipients) + { + $sent = 0; + foreach ($bcc as $forwardPath => $name) { + $message->setBcc(array($forwardPath => $name)); + $sent += $this->_doMailTransaction( + $message, $reversePath, array($forwardPath), $failedRecipients + ); + } + + return $sent; + } + + /** Try to determine the hostname of the server this is run on */ + private function _lookupHostname() + { + if (!empty($_SERVER['SERVER_NAME']) && $this->_isFqdn($_SERVER['SERVER_NAME'])) { + $this->_domain = $_SERVER['SERVER_NAME']; + } elseif (!empty($_SERVER['SERVER_ADDR'])) { + // Set the address literal tag (See RFC 5321, section: 4.1.3) + if (false === strpos($_SERVER['SERVER_ADDR'], ':')) { + $prefix = ''; // IPv4 addresses are not tagged. + } else { + $prefix = 'IPv6:'; // Adding prefix in case of IPv6. + } + + $this->_domain = sprintf('[%s%s]', $prefix, $_SERVER['SERVER_ADDR']); + } + } + + /** Determine is the $hostname is a fully-qualified name */ + private function _isFqdn($hostname) + { + // We could do a really thorough check, but there's really no point + if (false !== $dotPos = strpos($hostname, '.')) { + return ($dotPos > 0) && ($dotPos != strlen($hostname) - 1); + } + + return false; + } + + /** + * Destructor. + */ + public function __destruct() + { + $this->stop(); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php new file mode 100644 index 0000000..53f721d --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/CramMd5Authenticator.php @@ -0,0 +1,81 @@ +executeCommand("AUTH CRAM-MD5\r\n", array(334)); + $challenge = base64_decode(substr($challenge, 4)); + $message = base64_encode( + $username.' '.$this->_getResponse($password, $challenge) + ); + $agent->executeCommand(sprintf("%s\r\n", $message), array(235)); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", array(250)); + + return false; + } + } + + /** + * Generate a CRAM-MD5 response from a server challenge. + * + * @param string $secret + * @param string $challenge + * + * @return string + */ + private function _getResponse($secret, $challenge) + { + if (strlen($secret) > 64) { + $secret = pack('H32', md5($secret)); + } + + if (strlen($secret) < 64) { + $secret = str_pad($secret, 64, chr(0)); + } + + $k_ipad = substr($secret, 0, 64) ^ str_repeat(chr(0x36), 64); + $k_opad = substr($secret, 0, 64) ^ str_repeat(chr(0x5C), 64); + + $inner = pack('H32', md5($k_ipad.$challenge)); + $digest = md5($k_opad.$inner); + + return $digest; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php new file mode 100644 index 0000000..6ab6e33 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/LoginAuthenticator.php @@ -0,0 +1,51 @@ +executeCommand("AUTH LOGIN\r\n", array(334)); + $agent->executeCommand(sprintf("%s\r\n", base64_encode($username)), array(334)); + $agent->executeCommand(sprintf("%s\r\n", base64_encode($password)), array(235)); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", array(250)); + + return false; + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php new file mode 100644 index 0000000..eb04acf --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/NTLMAuthenticator.php @@ -0,0 +1,720 @@ + + */ +class Swift_Transport_Esmtp_Auth_NTLMAuthenticator implements Swift_Transport_Esmtp_Authenticator +{ + const NTLMSIG = "NTLMSSP\x00"; + const DESCONST = 'KGS!@#$%'; + + /** + * Get the name of the AUTH mechanism this Authenticator handles. + * + * @return string + */ + public function getAuthKeyword() + { + return 'NTLM'; + } + + /** + * Try to authenticate the user with $username and $password. + * + * @param Swift_Transport_SmtpAgent $agent + * @param string $username + * @param string $password + * + * @return bool + */ + public function authenticate(Swift_Transport_SmtpAgent $agent, $username, $password) + { + if (!function_exists('openssl_random_pseudo_bytes') || !function_exists('openssl_encrypt')) { + throw new LogicException('The OpenSSL extension must be enabled to use the NTLM authenticator.'); + } + + if (!function_exists('bcmul')) { + throw new LogicException('The BCMath functions must be enabled to use the NTLM authenticator.'); + } + + try { + // execute AUTH command and filter out the code at the beginning + // AUTH NTLM xxxx + $response = base64_decode(substr(trim($this->sendMessage1($agent)), 4)); + + // extra parameters for our unit cases + $timestamp = func_num_args() > 3 ? func_get_arg(3) : $this->getCorrectTimestamp(bcmul(microtime(true), '1000')); + $client = func_num_args() > 4 ? func_get_arg(4) : $this->getRandomBytes(8); + + // Message 3 response + $this->sendMessage3($response, $username, $password, $timestamp, $client, $agent); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", array(250)); + + return false; + } + } + + protected function si2bin($si, $bits = 32) + { + $bin = null; + if ($si >= -pow(2, $bits - 1) && ($si <= pow(2, $bits - 1))) { + // positive or zero + if ($si >= 0) { + $bin = base_convert($si, 10, 2); + // pad to $bits bit + $bin_length = strlen($bin); + if ($bin_length < $bits) { + $bin = str_repeat('0', $bits - $bin_length).$bin; + } + } else { + // negative + $si = -$si - pow(2, $bits); + $bin = base_convert($si, 10, 2); + $bin_length = strlen($bin); + if ($bin_length > $bits) { + $bin = str_repeat('1', $bits - $bin_length).$bin; + } + } + } + + return $bin; + } + + /** + * Send our auth message and returns the response. + * + * @param Swift_Transport_SmtpAgent $agent + * + * @return string SMTP Response + */ + protected function sendMessage1(Swift_Transport_SmtpAgent $agent) + { + $message = $this->createMessage1(); + + return $agent->executeCommand(sprintf("AUTH %s %s\r\n", $this->getAuthKeyword(), base64_encode($message)), array(334)); + } + + /** + * Fetch all details of our response (message 2). + * + * @param string $response + * + * @return array our response parsed + */ + protected function parseMessage2($response) + { + $responseHex = bin2hex($response); + $length = floor(hexdec(substr($responseHex, 28, 4)) / 256) * 2; + $offset = floor(hexdec(substr($responseHex, 32, 4)) / 256) * 2; + $challenge = $this->hex2bin(substr($responseHex, 48, 16)); + $context = $this->hex2bin(substr($responseHex, 64, 16)); + $targetInfoH = $this->hex2bin(substr($responseHex, 80, 16)); + $targetName = $this->hex2bin(substr($responseHex, $offset, $length)); + $offset = floor(hexdec(substr($responseHex, 88, 4)) / 256) * 2; + $targetInfoBlock = substr($responseHex, $offset); + list($domainName, $serverName, $DNSDomainName, $DNSServerName, $terminatorByte) = $this->readSubBlock($targetInfoBlock); + + return array( + $challenge, + $context, + $targetInfoH, + $targetName, + $domainName, + $serverName, + $DNSDomainName, + $DNSServerName, + $this->hex2bin($targetInfoBlock), + $terminatorByte, + ); + } + + /** + * Read the blob information in from message2. + * + * @param $block + * + * @return array + */ + protected function readSubBlock($block) + { + // remove terminatorByte cause it's always the same + $block = substr($block, 0, -8); + + $length = strlen($block); + $offset = 0; + $data = array(); + while ($offset < $length) { + $blockLength = hexdec(substr(substr($block, $offset, 8), -4)) / 256; + $offset += 8; + $data[] = $this->hex2bin(substr($block, $offset, $blockLength * 2)); + $offset += $blockLength * 2; + } + + if (count($data) == 3) { + $data[] = $data[2]; + $data[2] = ''; + } + + $data[] = $this->createByte('00'); + + return $data; + } + + /** + * Send our final message with all our data. + * + * @param string $response Message 1 response (message 2) + * @param string $username + * @param string $password + * @param string $timestamp + * @param string $client + * @param Swift_Transport_SmtpAgent $agent + * @param bool $v2 Use version2 of the protocol + * + * @return string + */ + protected function sendMessage3($response, $username, $password, $timestamp, $client, Swift_Transport_SmtpAgent $agent, $v2 = true) + { + list($domain, $username) = $this->getDomainAndUsername($username); + //$challenge, $context, $targetInfoH, $targetName, $domainName, $workstation, $DNSDomainName, $DNSServerName, $blob, $ter + list($challenge, , , , , $workstation, , , $blob) = $this->parseMessage2($response); + + if (!$v2) { + // LMv1 + $lmResponse = $this->createLMPassword($password, $challenge); + // NTLMv1 + $ntlmResponse = $this->createNTLMPassword($password, $challenge); + } else { + // LMv2 + $lmResponse = $this->createLMv2Password($password, $username, $domain, $challenge, $client); + // NTLMv2 + $ntlmResponse = $this->createNTLMv2Hash($password, $username, $domain, $challenge, $blob, $timestamp, $client); + } + + $message = $this->createMessage3($domain, $username, $workstation, $lmResponse, $ntlmResponse); + + return $agent->executeCommand(sprintf("%s\r\n", base64_encode($message)), array(235)); + } + + /** + * Create our message 1. + * + * @return string + */ + protected function createMessage1() + { + return self::NTLMSIG + .$this->createByte('01') // Message 1 +.$this->createByte('0702'); // Flags + } + + /** + * Create our message 3. + * + * @param string $domain + * @param string $username + * @param string $workstation + * @param string $lmResponse + * @param string $ntlmResponse + * + * @return string + */ + protected function createMessage3($domain, $username, $workstation, $lmResponse, $ntlmResponse) + { + // Create security buffers + $domainSec = $this->createSecurityBuffer($domain, 64); + $domainInfo = $this->readSecurityBuffer(bin2hex($domainSec)); + $userSec = $this->createSecurityBuffer($username, ($domainInfo[0] + $domainInfo[1]) / 2); + $userInfo = $this->readSecurityBuffer(bin2hex($userSec)); + $workSec = $this->createSecurityBuffer($workstation, ($userInfo[0] + $userInfo[1]) / 2); + $workInfo = $this->readSecurityBuffer(bin2hex($workSec)); + $lmSec = $this->createSecurityBuffer($lmResponse, ($workInfo[0] + $workInfo[1]) / 2, true); + $lmInfo = $this->readSecurityBuffer(bin2hex($lmSec)); + $ntlmSec = $this->createSecurityBuffer($ntlmResponse, ($lmInfo[0] + $lmInfo[1]) / 2, true); + + return self::NTLMSIG + .$this->createByte('03') // TYPE 3 message +.$lmSec // LM response header +.$ntlmSec // NTLM response header +.$domainSec // Domain header +.$userSec // User header +.$workSec // Workstation header +.$this->createByte('000000009a', 8) // session key header (empty) +.$this->createByte('01020000') // FLAGS +.$this->convertTo16bit($domain) // domain name +.$this->convertTo16bit($username) // username +.$this->convertTo16bit($workstation) // workstation +.$lmResponse + .$ntlmResponse; + } + + /** + * @param string $timestamp Epoch timestamp in microseconds + * @param string $client Random bytes + * @param string $targetInfo + * + * @return string + */ + protected function createBlob($timestamp, $client, $targetInfo) + { + return $this->createByte('0101') + .$this->createByte('00') + .$timestamp + .$client + .$this->createByte('00') + .$targetInfo + .$this->createByte('00'); + } + + /** + * Get domain and username from our username. + * + * @example DOMAIN\username + * + * @param string $name + * + * @return array + */ + protected function getDomainAndUsername($name) + { + if (strpos($name, '\\') !== false) { + return explode('\\', $name); + } + + list($user, $domain) = explode('@', $name); + + return array($domain, $user); + } + + /** + * Create LMv1 response. + * + * @param string $password + * @param string $challenge + * + * @return string + */ + protected function createLMPassword($password, $challenge) + { + // FIRST PART + $password = $this->createByte(strtoupper($password), 14, false); + list($key1, $key2) = str_split($password, 7); + + $desKey1 = $this->createDesKey($key1); + $desKey2 = $this->createDesKey($key2); + + $constantDecrypt = $this->createByte($this->desEncrypt(self::DESCONST, $desKey1).$this->desEncrypt(self::DESCONST, $desKey2), 21, false); + + // SECOND PART + list($key1, $key2, $key3) = str_split($constantDecrypt, 7); + + $desKey1 = $this->createDesKey($key1); + $desKey2 = $this->createDesKey($key2); + $desKey3 = $this->createDesKey($key3); + + return $this->desEncrypt($challenge, $desKey1).$this->desEncrypt($challenge, $desKey2).$this->desEncrypt($challenge, $desKey3); + } + + /** + * Create NTLMv1 response. + * + * @param string $password + * @param string $challenge + * + * @return string + */ + protected function createNTLMPassword($password, $challenge) + { + // FIRST PART + $ntlmHash = $this->createByte($this->md4Encrypt($password), 21, false); + list($key1, $key2, $key3) = str_split($ntlmHash, 7); + + $desKey1 = $this->createDesKey($key1); + $desKey2 = $this->createDesKey($key2); + $desKey3 = $this->createDesKey($key3); + + return $this->desEncrypt($challenge, $desKey1).$this->desEncrypt($challenge, $desKey2).$this->desEncrypt($challenge, $desKey3); + } + + /** + * Convert a normal timestamp to a tenth of a microtime epoch time. + * + * @param string $time + * + * @return string + */ + protected function getCorrectTimestamp($time) + { + // Get our timestamp (tricky!) + bcscale(0); + + $time = number_format($time, 0, '.', ''); // save microtime to string + $time = bcadd($time, '11644473600000'); // add epoch time + $time = bcmul($time, 10000); // tenths of a microsecond. + + $binary = $this->si2bin($time, 64); // create 64 bit binary string + $timestamp = ''; + for ($i = 0; $i < 8; ++$i) { + $timestamp .= chr(bindec(substr($binary, -(($i + 1) * 8), 8))); + } + + return $timestamp; + } + + /** + * Create LMv2 response. + * + * @param string $password + * @param string $username + * @param string $domain + * @param string $challenge NTLM Challenge + * @param string $client Random string + * + * @return string + */ + protected function createLMv2Password($password, $username, $domain, $challenge, $client) + { + $lmPass = '00'; // by default 00 + // if $password > 15 than we can't use this method + if (strlen($password) <= 15) { + $ntlmHash = $this->md4Encrypt($password); + $ntml2Hash = $this->md5Encrypt($ntlmHash, $this->convertTo16bit(strtoupper($username).$domain)); + + $lmPass = bin2hex($this->md5Encrypt($ntml2Hash, $challenge.$client).$client); + } + + return $this->createByte($lmPass, 24); + } + + /** + * Create NTLMv2 response. + * + * @param string $password + * @param string $username + * @param string $domain + * @param string $challenge Hex values + * @param string $targetInfo Hex values + * @param string $timestamp + * @param string $client Random bytes + * + * @return string + * + * @see http://davenport.sourceforge.net/ntlm.html#theNtlmResponse + */ + protected function createNTLMv2Hash($password, $username, $domain, $challenge, $targetInfo, $timestamp, $client) + { + $ntlmHash = $this->md4Encrypt($password); + $ntml2Hash = $this->md5Encrypt($ntlmHash, $this->convertTo16bit(strtoupper($username).$domain)); + + // create blob + $blob = $this->createBlob($timestamp, $client, $targetInfo); + + $ntlmv2Response = $this->md5Encrypt($ntml2Hash, $challenge.$blob); + + return $ntlmv2Response.$blob; + } + + protected function createDesKey($key) + { + $material = array(bin2hex($key[0])); + $len = strlen($key); + for ($i = 1; $i < $len; ++$i) { + list($high, $low) = str_split(bin2hex($key[$i])); + $v = $this->castToByte(ord($key[$i - 1]) << (7 + 1 - $i) | $this->uRShift(hexdec(dechex(hexdec($high) & 0xf).dechex(hexdec($low) & 0xf)), $i)); + $material[] = str_pad(substr(dechex($v), -2), 2, '0', STR_PAD_LEFT); // cast to byte + } + $material[] = str_pad(substr(dechex($this->castToByte(ord($key[6]) << 1)), -2), 2, '0'); + + // odd parity + foreach ($material as $k => $v) { + $b = $this->castToByte(hexdec($v)); + $needsParity = (($this->uRShift($b, 7) ^ $this->uRShift($b, 6) ^ $this->uRShift($b, 5) + ^ $this->uRShift($b, 4) ^ $this->uRShift($b, 3) ^ $this->uRShift($b, 2) + ^ $this->uRShift($b, 1)) & 0x01) == 0; + + list($high, $low) = str_split($v); + if ($needsParity) { + $material[$k] = dechex(hexdec($high) | 0x0).dechex(hexdec($low) | 0x1); + } else { + $material[$k] = dechex(hexdec($high) & 0xf).dechex(hexdec($low) & 0xe); + } + } + + return $this->hex2bin(implode('', $material)); + } + + /** HELPER FUNCTIONS */ + /** + * Create our security buffer depending on length and offset. + * + * @param string $value Value we want to put in + * @param int $offset start of value + * @param bool $is16 Do we 16bit string or not? + * + * @return string + */ + protected function createSecurityBuffer($value, $offset, $is16 = false) + { + $length = strlen(bin2hex($value)); + $length = $is16 ? $length / 2 : $length; + $length = $this->createByte(str_pad(dechex($length), 2, '0', STR_PAD_LEFT), 2); + + return $length.$length.$this->createByte(dechex($offset), 4); + } + + /** + * Read our security buffer to fetch length and offset of our value. + * + * @param string $value Securitybuffer in hex + * + * @return array array with length and offset + */ + protected function readSecurityBuffer($value) + { + $length = floor(hexdec(substr($value, 0, 4)) / 256) * 2; + $offset = floor(hexdec(substr($value, 8, 4)) / 256) * 2; + + return array($length, $offset); + } + + /** + * Cast to byte java equivalent to (byte). + * + * @param int $v + * + * @return int + */ + protected function castToByte($v) + { + return (($v + 128) % 256) - 128; + } + + /** + * Java unsigned right bitwise + * $a >>> $b. + * + * @param int $a + * @param int $b + * + * @return int + */ + protected function uRShift($a, $b) + { + if ($b == 0) { + return $a; + } + + return ($a >> $b) & ~(1 << (8 * PHP_INT_SIZE - 1) >> ($b - 1)); + } + + /** + * Right padding with 0 to certain length. + * + * @param string $input + * @param int $bytes Length of bytes + * @param bool $isHex Did we provided hex value + * + * @return string + */ + protected function createByte($input, $bytes = 4, $isHex = true) + { + if ($isHex) { + $byte = $this->hex2bin(str_pad($input, $bytes * 2, '00')); + } else { + $byte = str_pad($input, $bytes, "\x00"); + } + + return $byte; + } + + /** + * Create random bytes. + * + * @param $length + * + * @return string + */ + protected function getRandomBytes($length) + { + $bytes = openssl_random_pseudo_bytes($length, $strong); + + if (false !== $bytes && true === $strong) { + return $bytes; + } + + throw new RuntimeException('OpenSSL did not produce a secure random number.'); + } + + /** ENCRYPTION ALGORITHMS */ + /** + * DES Encryption. + * + * @param string $value An 8-byte string + * @param string $key + * + * @return string + */ + protected function desEncrypt($value, $key) + { + // 1 == OPENSSL_RAW_DATA - but constant is only available as of PHP 5.4. + return substr(openssl_encrypt($value, 'DES-ECB', $key, 1), 0, 8); + } + + /** + * MD5 Encryption. + * + * @param string $key Encryption key + * @param string $msg Message to encrypt + * + * @return string + */ + protected function md5Encrypt($key, $msg) + { + $blocksize = 64; + if (strlen($key) > $blocksize) { + $key = pack('H*', md5($key)); + } + + $key = str_pad($key, $blocksize, "\0"); + $ipadk = $key ^ str_repeat("\x36", $blocksize); + $opadk = $key ^ str_repeat("\x5c", $blocksize); + + return pack('H*', md5($opadk.pack('H*', md5($ipadk.$msg)))); + } + + /** + * MD4 Encryption. + * + * @param string $input + * + * @return string + * + * @see http://php.net/manual/en/ref.hash.php + */ + protected function md4Encrypt($input) + { + $input = $this->convertTo16bit($input); + + return function_exists('hash') ? $this->hex2bin(hash('md4', $input)) : mhash(MHASH_MD4, $input); + } + + /** + * Convert UTF-8 to UTF-16. + * + * @param string $input + * + * @return string + */ + protected function convertTo16bit($input) + { + return iconv('UTF-8', 'UTF-16LE', $input); + } + + /** + * Hex2bin replacement for < PHP 5.4. + * + * @param string $hex + * + * @return string Binary + */ + protected function hex2bin($hex) + { + if (function_exists('hex2bin')) { + return hex2bin($hex); + } else { + return pack('H*', $hex); + } + } + + /** + * @param string $message + */ + protected function debug($message) + { + $message = bin2hex($message); + $messageId = substr($message, 16, 8); + echo substr($message, 0, 16)." NTLMSSP Signature
      \n"; + echo $messageId." Type Indicator
      \n"; + + if ($messageId == '02000000') { + $map = array( + 'Challenge', + 'Context', + 'Target Information Security Buffer', + 'Target Name Data', + 'NetBIOS Domain Name', + 'NetBIOS Server Name', + 'DNS Domain Name', + 'DNS Server Name', + 'BLOB', + 'Target Information Terminator', + ); + + $data = $this->parseMessage2($this->hex2bin($message)); + + foreach ($map as $key => $value) { + echo bin2hex($data[$key]).' - '.$data[$key].' ||| '.$value."
      \n"; + } + } elseif ($messageId == '03000000') { + $i = 0; + $data[$i++] = substr($message, 24, 16); + list($lmLength, $lmOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 40, 16); + list($ntmlLength, $ntmlOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 56, 16); + list($targetLength, $targetOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 72, 16); + list($userLength, $userOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 88, 16); + list($workLength, $workOffset) = $this->readSecurityBuffer($data[$i - 1]); + + $data[$i++] = substr($message, 104, 16); + $data[$i++] = substr($message, 120, 8); + $data[$i++] = substr($message, $targetOffset, $targetLength); + $data[$i++] = substr($message, $userOffset, $userLength); + $data[$i++] = substr($message, $workOffset, $workLength); + $data[$i++] = substr($message, $lmOffset, $lmLength); + $data[$i] = substr($message, $ntmlOffset, $ntmlLength); + + $map = array( + 'LM Response Security Buffer', + 'NTLM Response Security Buffer', + 'Target Name Security Buffer', + 'User Name Security Buffer', + 'Workstation Name Security Buffer', + 'Session Key Security Buffer', + 'Flags', + 'Target Name Data', + 'User Name Data', + 'Workstation Name Data', + 'LM Response Data', + 'NTLM Response Data', + ); + + foreach ($map as $key => $value) { + echo $data[$key].' - '.$this->hex2bin($data[$key]).' ||| '.$value."
      \n"; + } + } + + echo '

      '; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php new file mode 100644 index 0000000..43219f9 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/PlainAuthenticator.php @@ -0,0 +1,50 @@ +executeCommand(sprintf("AUTH PLAIN %s\r\n", $message), array(235)); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", array(250)); + + return false; + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php new file mode 100644 index 0000000..ca35e7b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Auth/XOAuth2Authenticator.php @@ -0,0 +1,70 @@ + + * $transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 587, 'tls') + * ->setAuthMode('XOAUTH2') + * ->setUsername('YOUR_EMAIL_ADDRESS') + * ->setPassword('YOUR_ACCESS_TOKEN'); + * + * + * @author xu.li + * + * @see https://developers.google.com/google-apps/gmail/xoauth2_protocol + */ +class Swift_Transport_Esmtp_Auth_XOAuth2Authenticator implements Swift_Transport_Esmtp_Authenticator +{ + /** + * Get the name of the AUTH mechanism this Authenticator handles. + * + * @return string + */ + public function getAuthKeyword() + { + return 'XOAUTH2'; + } + + /** + * Try to authenticate the user with $email and $token. + * + * @param Swift_Transport_SmtpAgent $agent + * @param string $email + * @param string $token + * + * @return bool + */ + public function authenticate(Swift_Transport_SmtpAgent $agent, $email, $token) + { + try { + $param = $this->constructXOAuth2Params($email, $token); + $agent->executeCommand('AUTH XOAUTH2 '.$param."\r\n", array(235)); + + return true; + } catch (Swift_TransportException $e) { + $agent->executeCommand("RSET\r\n", array(250)); + + return false; + } + } + + /** + * Construct the auth parameter. + * + * @see https://developers.google.com/google-apps/gmail/xoauth2_protocol#the_sasl_xoauth2_mechanism + */ + protected function constructXOAuth2Params($email, $token) + { + return base64_encode("user=$email\1auth=Bearer $token\1\1"); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/Esmtp/AuthHandler.php b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/AuthHandler.php new file mode 100644 index 0000000..cb36133 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/AuthHandler.php @@ -0,0 +1,263 @@ +setAuthenticators($authenticators); + } + + /** + * Set the Authenticators which can process a login request. + * + * @param Swift_Transport_Esmtp_Authenticator[] $authenticators + */ + public function setAuthenticators(array $authenticators) + { + $this->_authenticators = $authenticators; + } + + /** + * Get the Authenticators which can process a login request. + * + * @return Swift_Transport_Esmtp_Authenticator[] + */ + public function getAuthenticators() + { + return $this->_authenticators; + } + + /** + * Set the username to authenticate with. + * + * @param string $username + */ + public function setUsername($username) + { + $this->_username = $username; + } + + /** + * Get the username to authenticate with. + * + * @return string + */ + public function getUsername() + { + return $this->_username; + } + + /** + * Set the password to authenticate with. + * + * @param string $password + */ + public function setPassword($password) + { + $this->_password = $password; + } + + /** + * Get the password to authenticate with. + * + * @return string + */ + public function getPassword() + { + return $this->_password; + } + + /** + * Set the auth mode to use to authenticate. + * + * @param string $mode + */ + public function setAuthMode($mode) + { + $this->_auth_mode = $mode; + } + + /** + * Get the auth mode to use to authenticate. + * + * @return string + */ + public function getAuthMode() + { + return $this->_auth_mode; + } + + /** + * Get the name of the ESMTP extension this handles. + * + * @return bool + */ + public function getHandledKeyword() + { + return 'AUTH'; + } + + /** + * Set the parameters which the EHLO greeting indicated. + * + * @param string[] $parameters + */ + public function setKeywordParams(array $parameters) + { + $this->_esmtpParams = $parameters; + } + + /** + * Runs immediately after a EHLO has been issued. + * + * @param Swift_Transport_SmtpAgent $agent to read/write + */ + public function afterEhlo(Swift_Transport_SmtpAgent $agent) + { + if ($this->_username) { + $count = 0; + foreach ($this->_getAuthenticatorsForAgent() as $authenticator) { + if (in_array(strtolower($authenticator->getAuthKeyword()), + array_map('strtolower', $this->_esmtpParams))) { + ++$count; + if ($authenticator->authenticate($agent, $this->_username, $this->_password)) { + return; + } + } + } + throw new Swift_TransportException( + 'Failed to authenticate on SMTP server with username "'. + $this->_username.'" using '.$count.' possible authenticators' + ); + } + } + + /** + * Not used. + */ + public function getMailParams() + { + return array(); + } + + /** + * Not used. + */ + public function getRcptParams() + { + return array(); + } + + /** + * Not used. + */ + public function onCommand(Swift_Transport_SmtpAgent $agent, $command, $codes = array(), &$failedRecipients = null, &$stop = false) + { + } + + /** + * Returns +1, -1 or 0 according to the rules for usort(). + * + * This method is called to ensure extensions can be execute in an appropriate order. + * + * @param string $esmtpKeyword to compare with + * + * @return int + */ + public function getPriorityOver($esmtpKeyword) + { + return 0; + } + + /** + * Returns an array of method names which are exposed to the Esmtp class. + * + * @return string[] + */ + public function exposeMixinMethods() + { + return array('setUsername', 'getUsername', 'setPassword', 'getPassword', 'setAuthMode', 'getAuthMode'); + } + + /** + * Not used. + */ + public function resetState() + { + } + + /** + * Returns the authenticator list for the given agent. + * + * @param Swift_Transport_SmtpAgent $agent + * + * @return array + */ + protected function _getAuthenticatorsForAgent() + { + if (!$mode = strtolower($this->_auth_mode)) { + return $this->_authenticators; + } + + foreach ($this->_authenticators as $authenticator) { + if (strtolower($authenticator->getAuthKeyword()) == $mode) { + return array($authenticator); + } + } + + throw new Swift_TransportException('Auth mode '.$mode.' is invalid'); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Authenticator.php b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Authenticator.php new file mode 100644 index 0000000..12a9abf --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/Esmtp/Authenticator.php @@ -0,0 +1,35 @@ +. + * + * @return string[] + */ + public function getMailParams(); + + /** + * Get params which are appended to RCPT TO:<>. + * + * @return string[] + */ + public function getRcptParams(); + + /** + * Runs when a command is due to be sent. + * + * @param Swift_Transport_SmtpAgent $agent to read/write + * @param string $command to send + * @param int[] $codes expected in response + * @param string[] $failedRecipients to collect failures + * @param bool $stop to be set true by-reference if the command is now sent + */ + public function onCommand(Swift_Transport_SmtpAgent $agent, $command, $codes = array(), &$failedRecipients = null, &$stop = false); + + /** + * Returns +1, -1 or 0 according to the rules for usort(). + * + * This method is called to ensure extensions can be execute in an appropriate order. + * + * @param string $esmtpKeyword to compare with + * + * @return int + */ + public function getPriorityOver($esmtpKeyword); + + /** + * Returns an array of method names which are exposed to the Esmtp class. + * + * @return string[] + */ + public function exposeMixinMethods(); + + /** + * Tells this handler to clear any buffers and reset its state. + */ + public function resetState(); +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/EsmtpTransport.php b/lib/SwiftMailer/classes/Swift/Transport/EsmtpTransport.php new file mode 100644 index 0000000..a220e6f --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/EsmtpTransport.php @@ -0,0 +1,413 @@ + 'tcp', + 'host' => 'localhost', + 'port' => 25, + 'timeout' => 30, + 'blocking' => 1, + 'tls' => false, + 'type' => Swift_Transport_IoBuffer::TYPE_SOCKET, + 'stream_context_options' => array(), + ); + + /** + * Creates a new EsmtpTransport using the given I/O buffer. + * + * @param Swift_Transport_IoBuffer $buf + * @param Swift_Transport_EsmtpHandler[] $extensionHandlers + * @param Swift_Events_EventDispatcher $dispatcher + */ + public function __construct(Swift_Transport_IoBuffer $buf, array $extensionHandlers, Swift_Events_EventDispatcher $dispatcher) + { + parent::__construct($buf, $dispatcher); + $this->setExtensionHandlers($extensionHandlers); + } + + /** + * Set the host to connect to. + * + * @param string $host + * + * @return Swift_Transport_EsmtpTransport + */ + public function setHost($host) + { + $this->_params['host'] = $host; + + return $this; + } + + /** + * Get the host to connect to. + * + * @return string + */ + public function getHost() + { + return $this->_params['host']; + } + + /** + * Set the port to connect to. + * + * @param int $port + * + * @return Swift_Transport_EsmtpTransport + */ + public function setPort($port) + { + $this->_params['port'] = (int) $port; + + return $this; + } + + /** + * Get the port to connect to. + * + * @return int + */ + public function getPort() + { + return $this->_params['port']; + } + + /** + * Set the connection timeout. + * + * @param int $timeout seconds + * + * @return Swift_Transport_EsmtpTransport + */ + public function setTimeout($timeout) + { + $this->_params['timeout'] = (int) $timeout; + $this->_buffer->setParam('timeout', (int) $timeout); + + return $this; + } + + /** + * Get the connection timeout. + * + * @return int + */ + public function getTimeout() + { + return $this->_params['timeout']; + } + + /** + * Set the encryption type (tls or ssl). + * + * @param string $encryption + * + * @return Swift_Transport_EsmtpTransport + */ + public function setEncryption($encryption) + { + $encryption = strtolower($encryption); + if ('tls' == $encryption) { + $this->_params['protocol'] = 'tcp'; + $this->_params['tls'] = true; + } else { + $this->_params['protocol'] = $encryption; + $this->_params['tls'] = false; + } + + return $this; + } + + /** + * Get the encryption type. + * + * @return string + */ + public function getEncryption() + { + return $this->_params['tls'] ? 'tls' : $this->_params['protocol']; + } + + /** + * Sets the stream context options. + * + * @param array $options + * + * @return Swift_Transport_EsmtpTransport + */ + public function setStreamOptions($options) + { + $this->_params['stream_context_options'] = $options; + + return $this; + } + + /** + * Returns the stream context options. + * + * @return array + */ + public function getStreamOptions() + { + return $this->_params['stream_context_options']; + } + + /** + * Sets the source IP. + * + * @param string $source + * + * @return Swift_Transport_EsmtpTransport + */ + public function setSourceIp($source) + { + $this->_params['sourceIp'] = $source; + + return $this; + } + + /** + * Returns the IP used to connect to the destination. + * + * @return string + */ + public function getSourceIp() + { + return isset($this->_params['sourceIp']) ? $this->_params['sourceIp'] : null; + } + + /** + * Set ESMTP extension handlers. + * + * @param Swift_Transport_EsmtpHandler[] $handlers + * + * @return Swift_Transport_EsmtpTransport + */ + public function setExtensionHandlers(array $handlers) + { + $assoc = array(); + foreach ($handlers as $handler) { + $assoc[$handler->getHandledKeyword()] = $handler; + } + + @uasort($assoc, array($this, '_sortHandlers')); + $this->_handlers = $assoc; + $this->_setHandlerParams(); + + return $this; + } + + /** + * Get ESMTP extension handlers. + * + * @return Swift_Transport_EsmtpHandler[] + */ + public function getExtensionHandlers() + { + return array_values($this->_handlers); + } + + /** + * Run a command against the buffer, expecting the given response codes. + * + * If no response codes are given, the response will not be validated. + * If codes are given, an exception will be thrown on an invalid response. + * + * @param string $command + * @param int[] $codes + * @param string[] $failures An array of failures by-reference + * + * @return string + */ + public function executeCommand($command, $codes = array(), &$failures = null) + { + $failures = (array) $failures; + $stopSignal = false; + $response = null; + foreach ($this->_getActiveHandlers() as $handler) { + $response = $handler->onCommand( + $this, $command, $codes, $failures, $stopSignal + ); + if ($stopSignal) { + return $response; + } + } + + return parent::executeCommand($command, $codes, $failures); + } + + // -- Mixin invocation code + + /** Mixin handling method for ESMTP handlers */ + public function __call($method, $args) + { + foreach ($this->_handlers as $handler) { + if (in_array(strtolower($method), + array_map('strtolower', (array) $handler->exposeMixinMethods()) + )) { + $return = call_user_func_array(array($handler, $method), $args); + // Allow fluid method calls + if (is_null($return) && substr($method, 0, 3) == 'set') { + return $this; + } else { + return $return; + } + } + } + trigger_error('Call to undefined method '.$method, E_USER_ERROR); + } + + /** Get the params to initialize the buffer */ + protected function _getBufferParams() + { + return $this->_params; + } + + /** Overridden to perform EHLO instead */ + protected function _doHeloCommand() + { + try { + $response = $this->executeCommand( + sprintf("EHLO %s\r\n", $this->_domain), array(250) + ); + } catch (Swift_TransportException $e) { + return parent::_doHeloCommand(); + } + + if ($this->_params['tls']) { + try { + $this->executeCommand("STARTTLS\r\n", array(220)); + + if (!$this->_buffer->startTLS()) { + throw new Swift_TransportException('Unable to connect with TLS encryption'); + } + + try { + $response = $this->executeCommand( + sprintf("EHLO %s\r\n", $this->_domain), array(250) + ); + } catch (Swift_TransportException $e) { + return parent::_doHeloCommand(); + } + } catch (Swift_TransportException $e) { + $this->_throwException($e); + } + } + + $this->_capabilities = $this->_getCapabilities($response); + $this->_setHandlerParams(); + foreach ($this->_getActiveHandlers() as $handler) { + $handler->afterEhlo($this); + } + } + + /** Overridden to add Extension support */ + protected function _doMailFromCommand($address) + { + $handlers = $this->_getActiveHandlers(); + $params = array(); + foreach ($handlers as $handler) { + $params = array_merge($params, (array) $handler->getMailParams()); + } + $paramStr = !empty($params) ? ' '.implode(' ', $params) : ''; + $this->executeCommand( + sprintf("MAIL FROM:<%s>%s\r\n", $address, $paramStr), array(250) + ); + } + + /** Overridden to add Extension support */ + protected function _doRcptToCommand($address) + { + $handlers = $this->_getActiveHandlers(); + $params = array(); + foreach ($handlers as $handler) { + $params = array_merge($params, (array) $handler->getRcptParams()); + } + $paramStr = !empty($params) ? ' '.implode(' ', $params) : ''; + $this->executeCommand( + sprintf("RCPT TO:<%s>%s\r\n", $address, $paramStr), array(250, 251, 252) + ); + } + + /** Determine ESMTP capabilities by function group */ + private function _getCapabilities($ehloResponse) + { + $capabilities = array(); + $ehloResponse = trim($ehloResponse); + $lines = explode("\r\n", $ehloResponse); + array_shift($lines); + foreach ($lines as $line) { + if (preg_match('/^[0-9]{3}[ -]([A-Z0-9-]+)((?:[ =].*)?)$/Di', $line, $matches)) { + $keyword = strtoupper($matches[1]); + $paramStr = strtoupper(ltrim($matches[2], ' =')); + $params = !empty($paramStr) ? explode(' ', $paramStr) : array(); + $capabilities[$keyword] = $params; + } + } + + return $capabilities; + } + + /** Set parameters which are used by each extension handler */ + private function _setHandlerParams() + { + foreach ($this->_handlers as $keyword => $handler) { + if (array_key_exists($keyword, $this->_capabilities)) { + $handler->setKeywordParams($this->_capabilities[$keyword]); + } + } + } + + /** Get ESMTP handlers which are currently ok to use */ + private function _getActiveHandlers() + { + $handlers = array(); + foreach ($this->_handlers as $keyword => $handler) { + if (array_key_exists($keyword, $this->_capabilities)) { + $handlers[] = $handler; + } + } + + return $handlers; + } + + /** Custom sort for extension handler ordering */ + private function _sortHandlers($a, $b) + { + return $a->getPriorityOver($b->getHandledKeyword()); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/FailoverTransport.php b/lib/SwiftMailer/classes/Swift/Transport/FailoverTransport.php new file mode 100644 index 0000000..311a0f2 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/FailoverTransport.php @@ -0,0 +1,88 @@ +_transports); + $sent = 0; + $this->_lastUsedTransport = null; + + for ($i = 0; $i < $maxTransports + && $transport = $this->_getNextTransport(); ++$i) { + try { + if (!$transport->isStarted()) { + $transport->start(); + } + + if ($sent = $transport->send($message, $failedRecipients)) { + $this->_lastUsedTransport = $transport; + + return $sent; + } + } catch (Swift_TransportException $e) { + $this->_killCurrentTransport(); + } + } + + if (count($this->_transports) == 0) { + throw new Swift_TransportException( + 'All Transports in FailoverTransport failed, or no Transports available' + ); + } + + return $sent; + } + + protected function _getNextTransport() + { + if (!isset($this->_currentTransport)) { + $this->_currentTransport = parent::_getNextTransport(); + } + + return $this->_currentTransport; + } + + protected function _killCurrentTransport() + { + $this->_currentTransport = null; + parent::_killCurrentTransport(); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/IoBuffer.php b/lib/SwiftMailer/classes/Swift/Transport/IoBuffer.php new file mode 100644 index 0000000..af97adf --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/IoBuffer.php @@ -0,0 +1,67 @@ +_transports = $transports; + $this->_deadTransports = array(); + } + + /** + * Get $transports to delegate to. + * + * @return Swift_Transport[] + */ + public function getTransports() + { + return array_merge($this->_transports, $this->_deadTransports); + } + + /** + * Get the Transport used in the last successful send operation. + * + * @return Swift_Transport + */ + public function getLastUsedTransport() + { + return $this->_lastUsedTransport; + } + + /** + * Test if this Transport mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return count($this->_transports) > 0; + } + + /** + * Start this Transport mechanism. + */ + public function start() + { + $this->_transports = array_merge($this->_transports, $this->_deadTransports); + } + + /** + * Stop this Transport mechanism. + */ + public function stop() + { + foreach ($this->_transports as $transport) { + $transport->stop(); + } + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients who were accepted for delivery. + * + * @param Swift_Mime_Message $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_Message $message, &$failedRecipients = null) + { + $maxTransports = count($this->_transports); + $sent = 0; + $this->_lastUsedTransport = null; + + for ($i = 0; $i < $maxTransports + && $transport = $this->_getNextTransport(); ++$i) { + try { + if (!$transport->isStarted()) { + $transport->start(); + } + if ($sent = $transport->send($message, $failedRecipients)) { + $this->_lastUsedTransport = $transport; + break; + } + } catch (Swift_TransportException $e) { + $this->_killCurrentTransport(); + } + } + + if (count($this->_transports) == 0) { + throw new Swift_TransportException( + 'All Transports in LoadBalancedTransport failed, or no Transports available' + ); + } + + return $sent; + } + + /** + * Register a plugin. + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + foreach ($this->_transports as $transport) { + $transport->registerPlugin($plugin); + } + } + + /** + * Rotates the transport list around and returns the first instance. + * + * @return Swift_Transport + */ + protected function _getNextTransport() + { + if ($next = array_shift($this->_transports)) { + $this->_transports[] = $next; + } + + return $next; + } + + /** + * Tag the currently used (top of stack) transport as dead/useless. + */ + protected function _killCurrentTransport() + { + if ($transport = array_pop($this->_transports)) { + try { + $transport->stop(); + } catch (Exception $e) { + } + $this->_deadTransports[] = $transport; + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/MailInvoker.php b/lib/SwiftMailer/classes/Swift/Transport/MailInvoker.php new file mode 100644 index 0000000..77489ce --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/MailInvoker.php @@ -0,0 +1,32 @@ +_invoker = $invoker; + $this->_eventDispatcher = $eventDispatcher; + } + + /** + * Not used. + */ + public function isStarted() + { + return false; + } + + /** + * Not used. + */ + public function start() + { + } + + /** + * Not used. + */ + public function stop() + { + } + + /** + * Set the additional parameters used on the mail() function. + * + * This string is formatted for sprintf() where %s is the sender address. + * + * @param string $params + * + * @return Swift_Transport_MailTransport + */ + public function setExtraParams($params) + { + $this->_extraParams = $params; + + return $this; + } + + /** + * Get the additional parameters used on the mail() function. + * + * This string is formatted for sprintf() where %s is the sender address. + * + * @return string + */ + public function getExtraParams() + { + return $this->_extraParams; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * The return value is the number of recipients who were accepted for delivery. + * + * @param Swift_Mime_Message $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_Message $message, &$failedRecipients = null) + { + $failedRecipients = (array) $failedRecipients; + + if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) { + $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + $count = ( + count((array) $message->getTo()) + + count((array) $message->getCc()) + + count((array) $message->getBcc()) + ); + + $toHeader = $message->getHeaders()->get('To'); + $subjectHeader = $message->getHeaders()->get('Subject'); + + if (0 === $count) { + $this->_throwException(new Swift_TransportException('Cannot send message without a recipient')); + } + $to = $toHeader ? $toHeader->getFieldBody() : ''; + $subject = $subjectHeader ? $subjectHeader->getFieldBody() : ''; + + $reversePath = $this->_getReversePath($message); + + // Remove headers that would otherwise be duplicated + $message->getHeaders()->remove('To'); + $message->getHeaders()->remove('Subject'); + + $messageStr = $message->toString(); + + if ($toHeader) { + $message->getHeaders()->set($toHeader); + } + $message->getHeaders()->set($subjectHeader); + + // Separate headers from body + if (false !== $endHeaders = strpos($messageStr, "\r\n\r\n")) { + $headers = substr($messageStr, 0, $endHeaders)."\r\n"; //Keep last EOL + $body = substr($messageStr, $endHeaders + 4); + } else { + $headers = $messageStr."\r\n"; + $body = ''; + } + + unset($messageStr); + + if ("\r\n" != PHP_EOL) { + // Non-windows (not using SMTP) + $headers = str_replace("\r\n", PHP_EOL, $headers); + $subject = str_replace("\r\n", PHP_EOL, $subject); + $body = str_replace("\r\n", PHP_EOL, $body); + } else { + // Windows, using SMTP + $headers = str_replace("\r\n.", "\r\n..", $headers); + $subject = str_replace("\r\n.", "\r\n..", $subject); + $body = str_replace("\r\n.", "\r\n..", $body); + } + + if ($this->_invoker->mail($to, $subject, $body, $headers, $this->_formatExtraParams($this->_extraParams, $reversePath))) { + if ($evt) { + $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS); + $evt->setFailedRecipients($failedRecipients); + $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + } else { + $failedRecipients = array_merge( + $failedRecipients, + array_keys((array) $message->getTo()), + array_keys((array) $message->getCc()), + array_keys((array) $message->getBcc()) + ); + + if ($evt) { + $evt->setResult(Swift_Events_SendEvent::RESULT_FAILED); + $evt->setFailedRecipients($failedRecipients); + $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + $message->generateId(); + + $count = 0; + } + + return $count; + } + + /** + * Register a plugin. + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->_eventDispatcher->bindEventListener($plugin); + } + + /** Throw a TransportException, first sending it to any listeners */ + protected function _throwException(Swift_TransportException $e) + { + if ($evt = $this->_eventDispatcher->createTransportExceptionEvent($this, $e)) { + $this->_eventDispatcher->dispatchEvent($evt, 'exceptionThrown'); + if (!$evt->bubbleCancelled()) { + throw $e; + } + } else { + throw $e; + } + } + + /** Determine the best-use reverse path for this message */ + private function _getReversePath(Swift_Mime_Message $message) + { + $return = $message->getReturnPath(); + $sender = $message->getSender(); + $from = $message->getFrom(); + $path = null; + if (!empty($return)) { + $path = $return; + } elseif (!empty($sender)) { + $keys = array_keys($sender); + $path = array_shift($keys); + } elseif (!empty($from)) { + $keys = array_keys($from); + $path = array_shift($keys); + } + + return $path; + } + + /** + * Return php mail extra params to use for invoker->mail. + * + * @param $extraParams + * @param $reversePath + * + * @return string|null + */ + private function _formatExtraParams($extraParams, $reversePath) + { + if (false !== strpos($extraParams, '-f%s')) { + $extraParams = empty($reversePath) ? str_replace('-f%s', '', $extraParams) : sprintf($extraParams, escapeshellarg($reversePath)); + } + + return !empty($extraParams) ? $extraParams : null; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/NullTransport.php b/lib/SwiftMailer/classes/Swift/Transport/NullTransport.php new file mode 100644 index 0000000..ad20e0e --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/NullTransport.php @@ -0,0 +1,93 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Pretends messages have been sent, but just ignores them. + * + * @author Fabien Potencier + */ +class Swift_Transport_NullTransport implements Swift_Transport +{ + /** The event dispatcher from the plugin API */ + private $_eventDispatcher; + + /** + * Constructor. + */ + public function __construct(Swift_Events_EventDispatcher $eventDispatcher) + { + $this->_eventDispatcher = $eventDispatcher; + } + + /** + * Tests if this Transport mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return true; + } + + /** + * Starts this Transport mechanism. + */ + public function start() + { + } + + /** + * Stops this Transport mechanism. + */ + public function stop() + { + } + + /** + * Sends the given message. + * + * @param Swift_Mime_Message $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent emails + */ + public function send(Swift_Mime_Message $message, &$failedRecipients = null) + { + if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) { + $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + if ($evt) { + $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS); + $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + $count = ( + count((array) $message->getTo()) + + count((array) $message->getCc()) + + count((array) $message->getBcc()) + ); + + return $count; + } + + /** + * Register a plugin. + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->_eventDispatcher->bindEventListener($plugin); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/SendmailTransport.php b/lib/SwiftMailer/classes/Swift/Transport/SendmailTransport.php new file mode 100644 index 0000000..34ac4ce --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/SendmailTransport.php @@ -0,0 +1,160 @@ + 30, + 'blocking' => 1, + 'command' => '/usr/sbin/sendmail -bs', + 'type' => Swift_Transport_IoBuffer::TYPE_PROCESS, + ); + + /** + * Create a new SendmailTransport with $buf for I/O. + * + * @param Swift_Transport_IoBuffer $buf + * @param Swift_Events_EventDispatcher $dispatcher + */ + public function __construct(Swift_Transport_IoBuffer $buf, Swift_Events_EventDispatcher $dispatcher) + { + parent::__construct($buf, $dispatcher); + } + + /** + * Start the standalone SMTP session if running in -bs mode. + */ + public function start() + { + if (false !== strpos($this->getCommand(), ' -bs')) { + parent::start(); + } + } + + /** + * Set the command to invoke. + * + * If using -t mode you are strongly advised to include -oi or -i in the flags. + * For example: /usr/sbin/sendmail -oi -t + * Swift will append a -f flag if one is not present. + * + * The recommended mode is "-bs" since it is interactive and failure notifications + * are hence possible. + * + * @param string $command + * + * @return Swift_Transport_SendmailTransport + */ + public function setCommand($command) + { + $this->_params['command'] = $command; + + return $this; + } + + /** + * Get the sendmail command which will be invoked. + * + * @return string + */ + public function getCommand() + { + return $this->_params['command']; + } + + /** + * Send the given Message. + * + * Recipient/sender data will be retrieved from the Message API. + * + * The return value is the number of recipients who were accepted for delivery. + * NOTE: If using 'sendmail -t' you will not be aware of any failures until + * they bounce (i.e. send() will always return 100% success). + * + * @param Swift_Mime_Message $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int + */ + public function send(Swift_Mime_Message $message, &$failedRecipients = null) + { + $failedRecipients = (array) $failedRecipients; + $command = $this->getCommand(); + $buffer = $this->getBuffer(); + $count = 0; + + if (false !== strpos($command, ' -t')) { + if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) { + $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + if (false === strpos($command, ' -f')) { + $command .= ' -f'.escapeshellarg($this->_getReversePath($message)); + } + + $buffer->initialize(array_merge($this->_params, array('command' => $command))); + + if (false === strpos($command, ' -i') && false === strpos($command, ' -oi')) { + $buffer->setWriteTranslations(array("\r\n" => "\n", "\n." => "\n..")); + } else { + $buffer->setWriteTranslations(array("\r\n" => "\n")); + } + + $count = count((array) $message->getTo()) + + count((array) $message->getCc()) + + count((array) $message->getBcc()) + ; + $message->toByteStream($buffer); + $buffer->flushBuffers(); + $buffer->setWriteTranslations(array()); + $buffer->terminate(); + + if ($evt) { + $evt->setResult(Swift_Events_SendEvent::RESULT_SUCCESS); + $evt->setFailedRecipients($failedRecipients); + $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + $message->generateId(); + } elseif (false !== strpos($command, ' -bs')) { + $count = parent::send($message, $failedRecipients); + } else { + $this->_throwException(new Swift_TransportException( + 'Unsupported sendmail command flags ['.$command.']. '. + 'Must be one of "-bs" or "-t" but can include additional flags.' + )); + } + + return $count; + } + + /** Get the params to initialize the buffer */ + protected function _getBufferParams() + { + return $this->_params; + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/SimpleMailInvoker.php b/lib/SwiftMailer/classes/Swift/Transport/SimpleMailInvoker.php new file mode 100644 index 0000000..4cab66b --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/SimpleMailInvoker.php @@ -0,0 +1,39 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/** + * Stores Messages in a queue. + * + * @author Fabien Potencier + */ +class Swift_Transport_SpoolTransport implements Swift_Transport +{ + /** The spool instance */ + private $_spool; + + /** The event dispatcher from the plugin API */ + private $_eventDispatcher; + + /** + * Constructor. + */ + public function __construct(Swift_Events_EventDispatcher $eventDispatcher, Swift_Spool $spool = null) + { + $this->_eventDispatcher = $eventDispatcher; + $this->_spool = $spool; + } + + /** + * Sets the spool object. + * + * @param Swift_Spool $spool + * + * @return Swift_Transport_SpoolTransport + */ + public function setSpool(Swift_Spool $spool) + { + $this->_spool = $spool; + + return $this; + } + + /** + * Get the spool object. + * + * @return Swift_Spool + */ + public function getSpool() + { + return $this->_spool; + } + + /** + * Tests if this Transport mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return true; + } + + /** + * Starts this Transport mechanism. + */ + public function start() + { + } + + /** + * Stops this Transport mechanism. + */ + public function stop() + { + } + + /** + * Sends the given message. + * + * @param Swift_Mime_Message $message + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent e-mail's + */ + public function send(Swift_Mime_Message $message, &$failedRecipients = null) + { + if ($evt = $this->_eventDispatcher->createSendEvent($this, $message)) { + $this->_eventDispatcher->dispatchEvent($evt, 'beforeSendPerformed'); + if ($evt->bubbleCancelled()) { + return 0; + } + } + + $success = $this->_spool->queueMessage($message); + + if ($evt) { + $evt->setResult($success ? Swift_Events_SendEvent::RESULT_SPOOLED : Swift_Events_SendEvent::RESULT_FAILED); + $this->_eventDispatcher->dispatchEvent($evt, 'sendPerformed'); + } + + return 1; + } + + /** + * Register a plugin. + * + * @param Swift_Events_EventListener $plugin + */ + public function registerPlugin(Swift_Events_EventListener $plugin) + { + $this->_eventDispatcher->bindEventListener($plugin); + } +} diff --git a/lib/SwiftMailer/classes/Swift/Transport/StreamBuffer.php b/lib/SwiftMailer/classes/Swift/Transport/StreamBuffer.php new file mode 100644 index 0000000..32ec97c --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/Transport/StreamBuffer.php @@ -0,0 +1,334 @@ +_replacementFactory = $replacementFactory; + } + + /** + * Perform any initialization needed, using the given $params. + * + * Parameters will vary depending upon the type of IoBuffer used. + * + * @param array $params + */ + public function initialize(array $params) + { + $this->_params = $params; + switch ($params['type']) { + case self::TYPE_PROCESS: + $this->_establishProcessConnection(); + break; + case self::TYPE_SOCKET: + default: + $this->_establishSocketConnection(); + break; + } + } + + /** + * Set an individual param on the buffer (e.g. switching to SSL). + * + * @param string $param + * @param mixed $value + */ + public function setParam($param, $value) + { + if (isset($this->_stream)) { + switch ($param) { + case 'timeout': + if ($this->_stream) { + stream_set_timeout($this->_stream, $value); + } + break; + + case 'blocking': + if ($this->_stream) { + stream_set_blocking($this->_stream, 1); + } + + } + } + $this->_params[$param] = $value; + } + + public function startTLS() + { + return stream_socket_enable_crypto($this->_stream, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); + } + + /** + * Perform any shutdown logic needed. + */ + public function terminate() + { + if (isset($this->_stream)) { + switch ($this->_params['type']) { + case self::TYPE_PROCESS: + fclose($this->_in); + fclose($this->_out); + proc_close($this->_stream); + break; + case self::TYPE_SOCKET: + default: + fclose($this->_stream); + break; + } + } + $this->_stream = null; + $this->_out = null; + $this->_in = null; + } + + /** + * Set an array of string replacements which should be made on data written + * to the buffer. + * + * This could replace LF with CRLF for example. + * + * @param string[] $replacements + */ + public function setWriteTranslations(array $replacements) + { + foreach ($this->_translations as $search => $replace) { + if (!isset($replacements[$search])) { + $this->removeFilter($search); + unset($this->_translations[$search]); + } + } + + foreach ($replacements as $search => $replace) { + if (!isset($this->_translations[$search])) { + $this->addFilter( + $this->_replacementFactory->createFilter($search, $replace), $search + ); + $this->_translations[$search] = true; + } + } + } + + /** + * Get a line of output (including any CRLF). + * + * The $sequence number comes from any writes and may or may not be used + * depending upon the implementation. + * + * @param int $sequence of last write to scan from + * + * @throws Swift_IoException + * + * @return string + */ + public function readLine($sequence) + { + if (isset($this->_out) && !feof($this->_out)) { + $line = fgets($this->_out); + if (strlen($line) == 0) { + $metas = stream_get_meta_data($this->_out); + if ($metas['timed_out']) { + throw new Swift_IoException( + 'Connection to '. + $this->_getReadConnectionDescription(). + ' Timed Out' + ); + } + } + + return $line; + } + } + + /** + * Reads $length bytes from the stream into a string and moves the pointer + * through the stream by $length. + * + * If less bytes exist than are requested the remaining bytes are given instead. + * If no bytes are remaining at all, boolean false is returned. + * + * @param int $length + * + * @throws Swift_IoException + * + * @return string|bool + */ + public function read($length) + { + if (isset($this->_out) && !feof($this->_out)) { + $ret = fread($this->_out, $length); + if (strlen($ret) == 0) { + $metas = stream_get_meta_data($this->_out); + if ($metas['timed_out']) { + throw new Swift_IoException( + 'Connection to '. + $this->_getReadConnectionDescription(). + ' Timed Out' + ); + } + } + + return $ret; + } + } + + /** Not implemented */ + public function setReadPointer($byteOffset) + { + } + + /** Flush the stream contents */ + protected function _flush() + { + if (isset($this->_in)) { + fflush($this->_in); + } + } + + /** Write this bytes to the stream */ + protected function _commit($bytes) + { + if (isset($this->_in)) { + $bytesToWrite = strlen($bytes); + $totalBytesWritten = 0; + + while ($totalBytesWritten < $bytesToWrite) { + $bytesWritten = fwrite($this->_in, substr($bytes, $totalBytesWritten)); + if (false === $bytesWritten || 0 === $bytesWritten) { + break; + } + + $totalBytesWritten += $bytesWritten; + } + + if ($totalBytesWritten > 0) { + return ++$this->_sequence; + } + } + } + + /** + * Establishes a connection to a remote server. + */ + private function _establishSocketConnection() +{ + + $host = $this->_params['host']; + if (!empty($this->_params['protocol'])) { + $host = $this->_params['protocol'].'://'.$host; + } + + $timeout = 15; + if (!empty($this->_params['timeout'])) { + $timeout = $this->_params['timeout']; + } + + $options = array(); + if (!empty($this->_params['sourceIp'])) { + $options['socket']['bindto'] = $this->_params['sourceIp'].':0'; + } + + if (isset($this->_params['stream_context_options'])) { + $options = array_merge($options, $this->_params['stream_context_options']); + } + +$options['ssl']['verify_peer'] = FALSE; +$options['ssl']['verify_peer_name'] = FALSE; + + $streamContext = stream_context_create($options); + + $this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext); + if (false === $this->_stream) { + throw new Swift_TransportException( + 'Connection could not be established with host '.$this->_params['host']. + ' ['.$errstr.' #'.$errno.']' + ); + } + if (!empty($this->_params['blocking'])) { + stream_set_blocking($this->_stream, 1); + } else { + stream_set_blocking($this->_stream, 0); + } + stream_set_timeout($this->_stream, $timeout); + $this->_in = &$this->_stream; + $this->_out = &$this->_stream; +} + + /** + * Opens a process for input/output. + */ + private function _establishProcessConnection() + { + $command = $this->_params['command']; + $descriptorSpec = array( + 0 => array('pipe', 'r'), + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w'), + ); + $this->_stream = proc_open($command, $descriptorSpec, $pipes); + stream_set_blocking($pipes[2], 0); + if ($err = stream_get_contents($pipes[2])) { + throw new Swift_TransportException( + 'Process could not be started ['.$err.']' + ); + } + $this->_in = &$pipes[0]; + $this->_out = &$pipes[1]; + } + + private function _getReadConnectionDescription() + { + switch ($this->_params['type']) { + case self::TYPE_PROCESS: + return 'Process '.$this->_params['command']; + break; + + case self::TYPE_SOCKET: + default: + $host = $this->_params['host']; + if (!empty($this->_params['protocol'])) { + $host = $this->_params['protocol'].'://'.$host; + } + $host .= ':'.$this->_params['port']; + + return $host; + break; + } + } +} diff --git a/lib/SwiftMailer/classes/Swift/TransportException.php b/lib/SwiftMailer/classes/Swift/TransportException.php new file mode 100644 index 0000000..4ae2412 --- /dev/null +++ b/lib/SwiftMailer/classes/Swift/TransportException.php @@ -0,0 +1,29 @@ + + */ +class Swift_Validate +{ + /** + * Grammar Object. + * + * @var Swift_Mime_Grammar + */ + private static $grammar = null; + + /** + * Checks if an e-mail address matches the current grammars. + * + * @param string $email + * + * @return bool + */ + public static function email($email) + { + if (self::$grammar === null) { + self::$grammar = Swift_DependencyContainer::getInstance() + ->lookup('mime.grammar'); + } + + return (bool) preg_match( + '/^'.self::$grammar->getDefinition('addr-spec').'$/D', + $email + ); + } +} diff --git a/lib/SwiftMailer/dependency_maps/cache_deps.php b/lib/SwiftMailer/dependency_maps/cache_deps.php new file mode 100644 index 0000000..6023448 --- /dev/null +++ b/lib/SwiftMailer/dependency_maps/cache_deps.php @@ -0,0 +1,23 @@ +register('cache') + ->asAliasOf('cache.array') + + ->register('tempdir') + ->asValue('/tmp') + + ->register('cache.null') + ->asSharedInstanceOf('Swift_KeyCache_NullKeyCache') + + ->register('cache.array') + ->asSharedInstanceOf('Swift_KeyCache_ArrayKeyCache') + ->withDependencies(array('cache.inputstream')) + + ->register('cache.disk') + ->asSharedInstanceOf('Swift_KeyCache_DiskKeyCache') + ->withDependencies(array('cache.inputstream', 'tempdir')) + + ->register('cache.inputstream') + ->asNewInstanceOf('Swift_KeyCache_SimpleKeyCacheInputStream') +; diff --git a/lib/SwiftMailer/dependency_maps/message_deps.php b/lib/SwiftMailer/dependency_maps/message_deps.php new file mode 100644 index 0000000..64d69d2 --- /dev/null +++ b/lib/SwiftMailer/dependency_maps/message_deps.php @@ -0,0 +1,9 @@ +register('message.message') + ->asNewInstanceOf('Swift_Message') + + ->register('message.mimepart') + ->asNewInstanceOf('Swift_MimePart') +; diff --git a/lib/SwiftMailer/dependency_maps/mime_deps.php b/lib/SwiftMailer/dependency_maps/mime_deps.php new file mode 100644 index 0000000..56169c9 --- /dev/null +++ b/lib/SwiftMailer/dependency_maps/mime_deps.php @@ -0,0 +1,123 @@ +register('properties.charset') + ->asValue('utf-8') + + ->register('mime.grammar') + ->asSharedInstanceOf('Swift_Mime_Grammar') + + ->register('mime.message') + ->asNewInstanceOf('Swift_Mime_SimpleMessage') + ->withDependencies(array( + 'mime.headerset', + 'mime.qpcontentencoder', + 'cache', + 'mime.grammar', + 'properties.charset', + )) + + ->register('mime.part') + ->asNewInstanceOf('Swift_Mime_MimePart') + ->withDependencies(array( + 'mime.headerset', + 'mime.qpcontentencoder', + 'cache', + 'mime.grammar', + 'properties.charset', + )) + + ->register('mime.attachment') + ->asNewInstanceOf('Swift_Mime_Attachment') + ->withDependencies(array( + 'mime.headerset', + 'mime.base64contentencoder', + 'cache', + 'mime.grammar', + )) + ->addConstructorValue($swift_mime_types) + + ->register('mime.embeddedfile') + ->asNewInstanceOf('Swift_Mime_EmbeddedFile') + ->withDependencies(array( + 'mime.headerset', + 'mime.base64contentencoder', + 'cache', + 'mime.grammar', + )) + ->addConstructorValue($swift_mime_types) + + ->register('mime.headerfactory') + ->asNewInstanceOf('Swift_Mime_SimpleHeaderFactory') + ->withDependencies(array( + 'mime.qpheaderencoder', + 'mime.rfc2231encoder', + 'mime.grammar', + 'properties.charset', + )) + + ->register('mime.headerset') + ->asNewInstanceOf('Swift_Mime_SimpleHeaderSet') + ->withDependencies(array('mime.headerfactory', 'properties.charset')) + + ->register('mime.qpheaderencoder') + ->asNewInstanceOf('Swift_Mime_HeaderEncoder_QpHeaderEncoder') + ->withDependencies(array('mime.charstream')) + + ->register('mime.base64headerencoder') + ->asNewInstanceOf('Swift_Mime_HeaderEncoder_Base64HeaderEncoder') + ->withDependencies(array('mime.charstream')) + + ->register('mime.charstream') + ->asNewInstanceOf('Swift_CharacterStream_NgCharacterStream') + ->withDependencies(array('mime.characterreaderfactory', 'properties.charset')) + + ->register('mime.bytecanonicalizer') + ->asSharedInstanceOf('Swift_StreamFilters_ByteArrayReplacementFilter') + ->addConstructorValue(array(array(0x0D, 0x0A), array(0x0D), array(0x0A))) + ->addConstructorValue(array(array(0x0A), array(0x0A), array(0x0D, 0x0A))) + + ->register('mime.characterreaderfactory') + ->asSharedInstanceOf('Swift_CharacterReaderFactory_SimpleCharacterReaderFactory') + + ->register('mime.safeqpcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoder') + ->withDependencies(array('mime.charstream', 'mime.bytecanonicalizer')) + + ->register('mime.rawcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_RawContentEncoder') + + ->register('mime.nativeqpcontentencoder') + ->withDependencies(array('properties.charset')) + ->asNewInstanceOf('Swift_Mime_ContentEncoder_NativeQpContentEncoder') + + ->register('mime.qpcontentencoderproxy') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_QpContentEncoderProxy') + ->withDependencies(array('mime.safeqpcontentencoder', 'mime.nativeqpcontentencoder', 'properties.charset')) + + ->register('mime.7bitcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_PlainContentEncoder') + ->addConstructorValue('7bit') + ->addConstructorValue(true) + + ->register('mime.8bitcontentencoder') + ->asNewInstanceOf('Swift_Mime_ContentEncoder_PlainContentEncoder') + ->addConstructorValue('8bit') + ->addConstructorValue(true) + + ->register('mime.base64contentencoder') + ->asSharedInstanceOf('Swift_Mime_ContentEncoder_Base64ContentEncoder') + + ->register('mime.rfc2231encoder') + ->asNewInstanceOf('Swift_Encoder_Rfc2231Encoder') + ->withDependencies(array('mime.charstream')) + + // As of PHP 5.4.7, the quoted_printable_encode() function behaves correctly. + // see https://github.com/php/php-src/commit/18bb426587d62f93c54c40bf8535eb8416603629 + ->register('mime.qpcontentencoder') + ->asAliasOf(version_compare(phpversion(), '5.4.7', '>=') ? 'mime.qpcontentencoderproxy' : 'mime.safeqpcontentencoder') +; + +unset($swift_mime_types); diff --git a/lib/SwiftMailer/dependency_maps/transport_deps.php b/lib/SwiftMailer/dependency_maps/transport_deps.php new file mode 100644 index 0000000..77e432c --- /dev/null +++ b/lib/SwiftMailer/dependency_maps/transport_deps.php @@ -0,0 +1,76 @@ +register('transport.smtp') + ->asNewInstanceOf('Swift_Transport_EsmtpTransport') + ->withDependencies(array( + 'transport.buffer', + array('transport.authhandler'), + 'transport.eventdispatcher', + )) + + ->register('transport.sendmail') + ->asNewInstanceOf('Swift_Transport_SendmailTransport') + ->withDependencies(array( + 'transport.buffer', + 'transport.eventdispatcher', + )) + + ->register('transport.mail') + ->asNewInstanceOf('Swift_Transport_MailTransport') + ->withDependencies(array('transport.mailinvoker', 'transport.eventdispatcher')) + + ->register('transport.loadbalanced') + ->asNewInstanceOf('Swift_Transport_LoadBalancedTransport') + + ->register('transport.failover') + ->asNewInstanceOf('Swift_Transport_FailoverTransport') + + ->register('transport.spool') + ->asNewInstanceOf('Swift_Transport_SpoolTransport') + ->withDependencies(array('transport.eventdispatcher')) + + ->register('transport.null') + ->asNewInstanceOf('Swift_Transport_NullTransport') + ->withDependencies(array('transport.eventdispatcher')) + + ->register('transport.mailinvoker') + ->asSharedInstanceOf('Swift_Transport_SimpleMailInvoker') + + ->register('transport.buffer') + ->asNewInstanceOf('Swift_Transport_StreamBuffer') + ->withDependencies(array('transport.replacementfactory')) + + ->register('transport.authhandler') + ->asNewInstanceOf('Swift_Transport_Esmtp_AuthHandler') + ->withDependencies(array( + array( + 'transport.crammd5auth', + 'transport.loginauth', + 'transport.plainauth', + 'transport.ntlmauth', + 'transport.xoauth2auth', + ), + )) + + ->register('transport.crammd5auth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_CramMd5Authenticator') + + ->register('transport.loginauth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_LoginAuthenticator') + + ->register('transport.plainauth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_PlainAuthenticator') + + ->register('transport.xoauth2auth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_XOAuth2Authenticator') + + ->register('transport.ntlmauth') + ->asNewInstanceOf('Swift_Transport_Esmtp_Auth_NTLMAuthenticator') + + ->register('transport.eventdispatcher') + ->asNewInstanceOf('Swift_Events_SimpleEventDispatcher') + + ->register('transport.replacementfactory') + ->asSharedInstanceOf('Swift_StreamFilters_StringReplacementFilterFactory') +; diff --git a/lib/SwiftMailer/mime_types.php b/lib/SwiftMailer/mime_types.php new file mode 100644 index 0000000..2d7b98d --- /dev/null +++ b/lib/SwiftMailer/mime_types.php @@ -0,0 +1,1007 @@ + 'text/vnd.in3d.3dml', + '3ds' => 'image/x-3ds', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gpp', + '7z' => 'application/x-7z-compressed', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-aac', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/pkix-attr-cert', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'apk' => 'application/vnd.android.package-archive', + 'appcache' => 'text/cache-manifest', + 'apr' => 'application/vnd.lotus-approach', + 'aps' => 'application/postscript', + 'arc' => 'application/x-freearc', + 'asc' => 'application/pgp-signature', + 'asf' => 'video/x-ms-asf', + 'asm' => 'text/x-asm', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/basic', + 'avi' => 'video/x-msvideo', + 'aw' => 'application/applixware', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azw' => 'application/vnd.amazon.ebook', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'blb' => 'application/x-blorb', + 'blorb' => 'application/x-blorb', + 'bmi' => 'application/vnd.bmi', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'btif' => 'image/prs.btif', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'cab' => 'application/vnd.ms-cab-compressed', + 'caf' => 'audio/x-caf', + 'cap' => 'application/vnd.tcpdump.pcap', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cb7' => 'application/x-cbr', + 'cba' => 'application/x-cbr', + 'cbr' => 'application/x-cbr', + 'cbt' => 'application/x-cbr', + 'cbz' => 'application/x-cbr', + 'cc' => 'text/x-c', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfs' => 'application/x-cfs-compressed', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/java-vm', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'csh' => 'application/x-csh', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dart' => 'application/vnd.dart', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dbk' => 'application/docbook+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dgc' => 'application/x-dgc-compressed', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/x-msdownload', + 'dmg' => 'application/x-apple-diskimage', + 'dmp' => 'application/vnd.tcpdump.pcap', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.document.macroenabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroenabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvb' => 'video/vnd.dvb.file', + 'dvi' => 'application/x-dvi', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'emf' => 'application/x-msmetafile', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'emz' => 'application/x-msmetafile', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es3' => 'application/vnd.eszigno3+xml', + 'esa' => 'application/vnd.osgi.subsystem', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'eva' => 'application/x-eva', + 'evy' => 'application/x-envoy', + 'exe' => 'application/x-msdownload', + 'exi' => 'application/exi', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/x-f4v', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'flac' => 'audio/x-flac', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gam' => 'application/x-tads', + 'gbr' => 'application/rpki-ghostbusters', + 'gca' => 'application/x-gca-compressed', + 'gdl' => 'model/vnd.gdl', + 'geo' => 'application/vnd.dynageo', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'gml' => 'application/gml+xml', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gph' => 'application/vnd.flographit', + 'gpx' => 'application/gpx+xml', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gramps' => 'application/x-gramps-xml', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxf' => 'application/gxf', + 'gxt' => 'application/vnd.geonext', + 'gz' => 'application/x-gzip', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hdf' => 'application/x-hdf', + 'hh' => 'text/x-c', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ink' => 'application/inkml+xml', + 'inkml' => 'application/inkml+xml', + 'install' => 'application/x-install-instructions', + 'iota' => 'application/vnd.astraea-software.iota', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/x-iso9660-image', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'java' => 'text/x-java-source', + 'jisp' => 'application/vnd.jisp', + 'jlt' => 'application/vnd.hp-jlyt', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jpm' => 'video/jpm', + 'js' => 'application/javascript', + 'json' => 'application/json', + 'jsonml' => 'application/jsonml+json', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'kpxx' => 'application/vnd.ds-keypoint', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'lha' => 'application/x-lzh-compressed', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'lnk' => 'application/x-ms-shortcut', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/x-lzh-compressed', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm1v' => 'video/mpeg', + 'm21' => 'application/mp21', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'audio/x-mpegurl', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/mp4', + 'm4u' => 'video/vnd.mpegurl', + 'm4v' => 'video/x-m4v', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'mar' => 'application/octet-stream', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'metalink' => 'application/metalink+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mft' => 'application/rpki-manifest', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mie' => 'application/x-mie', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mk3d' => 'video/x-matroska', + 'mka' => 'audio/x-matroska', + 'mks' => 'video/x-matroska', + 'mkv' => 'video/x-matroska', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mng' => 'video/x-mng', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp21' => 'application/mp21', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msty' => 'application/vnd.muvee.style', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'nfo' => 'text/x-nfo', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nitf' => 'application/vnd.nitf', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nsc' => 'application/x-conference', + 'nsf' => 'application/vnd.lotus-notes', + 'ntf' => 'application/vnd.nitf', + 'nzb' => 'application/x-nzb', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'obj' => 'application/x-tgif', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'omdoc' => 'application/omdoc+xml', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'opml' => 'text/x-opml', + 'oprc' => 'application/vnd.palm', + 'org' => 'application/vnd.lotus-organizer', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'application/x-font-otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oxps' => 'application/oxps', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p10' => 'application/pkcs10', + 'p12' => 'application/x-pkcs12', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcap' => 'application/vnd.tcpdump.pcap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/vnd.palm', + 'pdf' => 'application/pdf', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp-encrypted', + 'php' => 'application/x-php', + 'php3' => 'application/x-php', + 'php4' => 'application/x-php', + 'php5' => 'application/x-php', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.template.macroenabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroenabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroenabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroenabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'application/x-mobipocket-ebook', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'image/vnd.adobe.photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-pn-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rar' => 'application/x-rar-compressed', + 'ras' => 'image/x-cmu-raster', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'ris' => 'application/x-research-info-systems', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'application/vnd.rn-realmedia', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rmvb' => 'application/vnd.rn-realmedia-vbr', + 'rnc' => 'application/relax-ng-compact-syntax', + 'roa' => 'application/rpki-roa', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsd' => 'application/rsd+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'application/rtf', + 'rtx' => 'text/richtext', + 's' => 'text/x-asm', + 's3m' => 'audio/s3m', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sfv' => 'text/x-sfv', + 'sgi' => 'image/sgi', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shf' => 'application/shf+xml', + 'sid' => 'image/x-mrsid-image', + 'sig' => 'application/pgp-signature', + 'sil' => 'audio/silk', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil+xml', + 'smil' => 'application/smil+xml', + 'smv' => 'video/x-smv', + 'smzip' => 'application/vnd.stepmania.package', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'sql' => 'application/x-sql', + 'src' => 'application/x-wais-source', + 'srt' => 'application/x-subrip', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'ssdl' => 'application/ssdl+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'application/vnd.ms-pki.stl', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'sub' => 'text/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 't3' => 'application/x-t3vm-image', + 'taglet' => 'application/vnd.mynfc', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'tga' => 'image/x-tga', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tmo' => 'application/vnd.tmobile-livetv', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trm' => 'application/x-msterminal', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'application/x-font-ttf', + 'ttf' => 'application/x-font-ttf', + 'ttl' => 'text/turtle', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u32' => 'application/x-authorware-bin', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'ulx' => 'application/x-glulx', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvvz' => 'application/vnd.dece.zip', + 'uvx' => 'application/vnd.dece.unspecified', + 'uvz' => 'application/vnd.dece.zip', + 'vcard' => 'text/vcard', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vob' => 'video/x-ms-vob', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'wdp' => 'image/vnd.ms-photo', + 'weba' => 'audio/webm', + 'webm' => 'video/webm', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'application/x-msmetafile', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-msmetafile', + 'woff' => 'application/font-woff', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x32' => 'application/x-authorware-bin', + 'x3d' => 'model/x3d+xml', + 'x3db' => 'model/x3d+binary', + 'x3dbz' => 'model/x3d+binary', + 'x3dv' => 'model/x3d+vrml', + 'x3dvz' => 'model/x3d+vrml', + 'x3dz' => 'model/x3d+xml', + 'xaml' => 'application/xaml+xml', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroenabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlf' => 'application/x-xliff+xml', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroenabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroenabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroenabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xm' => 'audio/xm', + 'xml' => 'application/xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpl' => 'application/xproc+xml', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'xz' => 'application/x-xz', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'z1' => 'application/x-zmachine', + 'z2' => 'application/x-zmachine', + 'z3' => 'application/x-zmachine', + 'z4' => 'application/x-zmachine', + 'z5' => 'application/x-zmachine', + 'z6' => 'application/x-zmachine', + 'z7' => 'application/x-zmachine', + 'z8' => 'application/x-zmachine', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml', + '123' => 'application/vnd.lotus-1-2-3', +); diff --git a/lib/SwiftMailer/preferences.php b/lib/SwiftMailer/preferences.php new file mode 100644 index 0000000..e519501 --- /dev/null +++ b/lib/SwiftMailer/preferences.php @@ -0,0 +1,25 @@ +setCharset('utf-8'); + +// Without these lines the default caching mechanism is "array" but this uses a lot of memory. +// If possible, use a disk cache to enable attaching large attachments etc. +// You can override the default temporary directory by setting the TMPDIR environment variable. +if (@is_writable($tmpDir = sys_get_temp_dir())) { + $preferences->setTempDir($tmpDir)->setCacheType('disk'); +} + +// this should only be done when Swiftmailer won't use the native QP content encoder +// see mime_deps.php +if (version_compare(phpversion(), '5.4.7', '<')) { + $preferences->setQPDotEscape(false); +} diff --git a/lib/SwiftMailer/swift_init.php b/lib/SwiftMailer/swift_init.php new file mode 100644 index 0000000..ff71963 --- /dev/null +++ b/lib/SwiftMailer/swift_init.php @@ -0,0 +1,28 @@ + 'application/x-php', + 'php3' => 'application/x-php', + 'php4' => 'application/x-php', + 'php5' => 'application/x-php', + 'zip' => 'application/zip', + 'gif' => 'image/gif', + 'png' => 'image/png', + 'css' => 'text/css', + 'js' => 'text/javascript', + 'txt' => 'text/plain', + 'aif' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'avi' => 'video/avi', + 'bmp' => 'image/bmp', + 'bz2' => 'application/x-bz2', + 'csv' => 'text/csv', + 'dmg' => 'application/x-apple-diskimage', + 'doc' => 'application/msword', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'eml' => 'message/rfc822', + 'aps' => 'application/postscript', + 'exe' => 'application/x-ms-dos-executable', + 'flv' => 'video/x-flv', + 'gz' => 'application/x-gzip', + 'hqx' => 'application/stuffit', + 'htm' => 'text/html', + 'html' => 'text/html', + 'jar' => 'application/x-java-archive', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'm3u' => 'audio/x-mpegurl', + 'm4a' => 'audio/mp4', + 'mdb' => 'application/x-msaccess', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mov' => 'video/quicktime', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'odg' => 'vnd.oasis.opendocument.graphics', + 'odp' => 'vnd.oasis.opendocument.presentation', + 'odt' => 'vnd.oasis.opendocument.text', + 'ods' => 'vnd.oasis.opendocument.spreadsheet', + 'ogg' => 'audio/ogg', + 'pdf' => 'application/pdf', + 'ppt' => 'application/vnd.ms-powerpoint', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'ps' => 'application/postscript', + 'rar' => 'application/x-rar-compressed', + 'rtf' => 'application/rtf', + 'tar' => 'application/x-tar', + 'sit' => 'application/x-stuffit', + 'svg' => 'image/svg+xml', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'ttf' => 'application/x-font-truetype', + 'vcf' => 'text/x-vcard', + 'wav' => 'audio/wav', + 'wma' => 'audio/x-ms-wma', + 'wmv' => 'audio/x-ms-wmv', + 'xls' => 'application/excel', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xml' => 'application/xml', + ); + + // wrap array for generating file + foreach ($valid_mime_types_preset as $extension => $mime_type) { + // generate array for mimetype to extension resolver (only first match) + $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'"; + } + + // collect extensions + $valid_extensions = array(); + + // all extensions from second match + foreach ($matches[2] as $i => $extensions) { + // explode multiple extensions from string + $extensions = explode(' ', strtolower($extensions)); + + // force array for foreach + if (!is_array($extensions)) { + $extensions = array($extensions); + } + + foreach ($extensions as $extension) { + // get mime type + $mime_type = $matches[1][$i]; + + // check if string length lower than 10 + if (strlen($extension) < 10) { + // add extension + $valid_extensions[] = $extension; + + if (!isset($valid_mime_types[$mime_type])) { + // generate array for mimetype to extension resolver (only first match) + $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'"; + } + } + } + } + } + + $xml = simplexml_load_string($mime_xml); + + foreach ($xml as $node) { + // check if there is no pattern + if (!isset($node->glob['pattern'])) { + continue; + } + + // get all matching extensions from match + foreach ((array) $node->glob['pattern'] as $extension) { + // skip none glob extensions + if (strpos($extension, '.') === false) { + continue; + } + + // remove get only last part + $extension = explode('.', strtolower($extension)); + $extension = end($extension); + + // maximum length in database column + if (strlen($extension) <= 9) { + $valid_extensions[] = $extension; + } + } + + if (isset($node->glob['pattern'][0])) { + // mime type + $mime_type = strtolower((string) $node['type']); + + // get first extension + $extension = strtolower(trim($node->glob['ddpattern'][0], '*.')); + + // skip none glob extensions and check if string length between 1 and 10 + if (strpos($extension, '.') !== false || strlen($extension) < 1 || strlen($extension) > 9) { + continue; + } + + // check if string length lower than 10 + if (!isset($valid_mime_types[$mime_type])) { + // generate array for mimetype to extension resolver (only first match) + $valid_mime_types[$extension] = "'{$extension}' => '{$mime_type}'"; + } + } + } + + // full list of valid extensions only + $valid_mime_types = array_unique($valid_mime_types); + ksort($valid_mime_types); + + // combine mime types and extensions array + $output = "$preamble\$swift_mime_types = array(\n ".implode($valid_mime_types, ",\n ")."\n);"; + + // write mime_types.php config file + @file_put_contents('./mime_types.php', $output); +} + +generateUpToDateMimeArray(); diff --git a/lib/SwiftMailer/version.txt b/lib/SwiftMailer/version.txt new file mode 100644 index 0000000..c0e6041 --- /dev/null +++ b/lib/SwiftMailer/version.txt @@ -0,0 +1 @@ +5.4.2 + fix для php 5.5, 5.6.x \ No newline at end of file diff --git a/lib/bootstrap/css/bootstrap-theme.css b/lib/bootstrap/css/bootstrap-theme.css new file mode 100644 index 0000000..31d8882 --- /dev/null +++ b/lib/bootstrap/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/lib/bootstrap/css/bootstrap-theme.css.map b/lib/bootstrap/css/bootstrap-theme.css.map new file mode 100644 index 0000000..d876f60 --- /dev/null +++ b/lib/bootstrap/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/lib/bootstrap/css/bootstrap-theme.min.css b/lib/bootstrap/css/bootstrap-theme.min.css new file mode 100644 index 0000000..5e39401 --- /dev/null +++ b/lib/bootstrap/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/lib/bootstrap/css/bootstrap-theme.min.css.map b/lib/bootstrap/css/bootstrap-theme.min.css.map new file mode 100644 index 0000000..94813e9 --- /dev/null +++ b/lib/bootstrap/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/lib/bootstrap/css/bootstrap.css b/lib/bootstrap/css/bootstrap.css new file mode 100644 index 0000000..6167622 --- /dev/null +++ b/lib/bootstrap/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +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-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]: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; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .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; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.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 > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.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; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.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 { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.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: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 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: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.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; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.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: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + 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-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.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; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.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 { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + 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, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-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 { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.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: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/lib/bootstrap/css/bootstrap.css.map b/lib/bootstrap/css/bootstrap.css.map new file mode 100644 index 0000000..f010c82 --- /dev/null +++ b/lib/bootstrap/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;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ukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBA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","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n 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);\n 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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n 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);\n 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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n 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);\n 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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n 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);\n 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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on